В свое время писал статью про подключение сканера к 1С БП 2.0. Тема оказалась очень актуальной. На сегодняшний день довелось мне подключаться к БП 3.0. Ситуация другая, поэтому делюсь опять же своим опытом.
Итак, управляемые формы, 1С 8.3. За основу брал конфигурации:
Бухгалтерия предприятия, редакция 3.0 (3.0.43.124)
Библиотека подключаемого оборудования, редакция 1.2 (1.2.3.4)
В бухгалтерии включаем возможность изменения у общих модулей МенеджерОборудованияКлиентПереопределяемый и МенеджерОборудованияВызовСервераПереопределяемый.
Объединяем с конфигурацией из библиотеки подключаемого оборудования. Я убрал все галки и проставлял нужные мне вручную. Надо поставить галку на объединении с модулями МенеджерОборудованияКлиентПереопределяемый, МенеджерОборудованияВызовСервераПереопределяемый и отфильтровать по нужной подсистеме. В данном случае я отфильтровал(правильнее будет отметил) по подсистеме СканерыШтрихкода. Правда почему-то в моей версии БПО при фильтрации по СканерамШтрихкода не отметился общий модуль ПодключаемоеОборудованиеСканкодСканерыШтрихкодаКлиент(при том что макет с соответствующим драйвером отметился). Пришлось отметить его вручную.
В итоге наша конфигурация дополняется несколькими общими модулями, формами, макетами и картинками, которые связаны с работой сканера штрих кода.
В модуле МенеджерОборудованияКлиентПереопределяемый подправляем функцию ПолучитьОбработчикДрайвера, чтобы убрать лишнее. Мне нужен был только сканер, поэтому я оставил лишь:
Функция ПолучитьОбработчикДрайвера(ОбработчикДрайвера, ЗагружаемыйДрайвер) Экспорт // Используем универсальный обработчик драйвера по стандарту "1С:Совместимо". #Если ВебКлиент Тогда Результат = ПодключаемоеОборудованиеУниверсальныйДрайверАсинхронноКлиент; #Иначе Результат = ПодключаемоеОборудованиеУниверсальныйДрайверКлиент; #КонецЕсли // Обработчики драйверов не удовлетворяющие стандарту "1С:Совместимо". Если Не ЗагружаемыйДрайвер И ОбработчикДрайвера <> Неопределено Тогда // Сканеры штрихкода Если ОбработчикДрайвера = ПредопределенноеЗначение("Перечисление.ОбработчикиДрайверовПодключаемогоОборудования.Обработчик1ССканерыШтрихкода") Тогда Возврат ПодключаемоеОборудование1ССканерыШтрихкодаКлиент; ИначеЕсли ОбработчикДрайвера = ПредопределенноеЗначение("Перечисление.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикСканкодСканерыШтрихкода") Тогда Возврат ПодключаемоеОборудованиеСканкодСканерыШтрихкодаКлиент; ИначеЕсли ОбработчикДрайвера = ПредопределенноеЗначение("Перечисление.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикАтолСканерыШтрихкода") Тогда Возврат ПодключаемоеОборудованиеАтолСканерыШтрихкодаКлиент; КонецЕсли; // Конец Сканеры штрихкода // Фискальные регистраторы Если ОбработчикДрайвера = ПредопределенноеЗначение("Перечисление.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикАтолФискальныеРегистраторы") Тогда Возврат ПодключаемоеОборудованиеАтолФискальныеРегистраторыКлиент; ИначеЕсли ОбработчикДрайвера = ПредопределенноеЗначение("Перечисление.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикВерсияТФискальныеРегистраторы") Тогда Возврат ПодключаемоеОборудованиеВерсияТФискальныеРегистраторыКлиент; ИначеЕсли ОбработчикДрайвера = ПредопределенноеЗначение("Перечисление.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикККСФискальныеРегистраторы") Тогда Возврат ПодключаемоеОборудованиеККСФискальныеРегистраторыКлиент; ИначеЕсли ОбработчикДрайвера = ПредопределенноеЗначение("Перечисление.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикШтрихМФискальныеРегистраторы") Тогда Возврат ПодключаемоеОборудованиеШтрихМФискальныеРегистраторыКлиент; ИначеЕсли ОбработчикДрайвера = ПредопределенноеЗначение("Перечисление.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикОРИОНФискальныеРегистраторы") Тогда Возврат ПодключаемоеОборудованиеОРИОНФискальныеРегистраторыКлиент; КонецЕсли; // Конец Фискальные регистраторы. КонецЕсли; Возврат Результат; КонецФункции
Кроме того оставляем строки касаемые фискальника, т.к. он заложен в бухгалтерии.
В модуле МенеджерОборудованияВызовСервераПереопределяемый при объединении я не стал заменять функцию ДоступноИспользованиеРазделенныхДанных.
Подчистил в этом модуле процедуру ОбновитьПоставляемыеДрайвера. Я оставил опять же только то, что касается сканера (плюс фискальник):
Процедура ОбновитьПоставляемыеДрайвера() Экспорт // Сканеры штрихкода Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикСканкодСканерыШтрихкода, "AddIn.ScancodeScanner", "ДрайверСканкодСканерШтрихкода", Истина); Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикАтолСканерыШтрихкода, "AddIn.Scaner45", , Истина); Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.Обработчик1ССканерыШтрихкода, "AddIn.Scanner", "Драйвер1ССканерШтрихкода", Ложь); Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.Обработчик1ССканерыШтрихкодаNative, "AddIn.InputDevice", "Драйвер1СУстройстваВводаNative", Ложь); Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикГексагонСканерыШтрихкода, "AddIn.ProtonScanner", "ДрайверГексагонСканерШтрихкода", Ложь); // Конец Сканеры штрихкода // Фискальные регистраторы Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.Обработчик1СФискальныйРегистраторЭмулятор, "AddIn.EmulatorFP1C", "Драйвер1СФискальныйРегистратор", Ложь); Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.Обработчик1СРарусФискальныеРегистраторыФеликс, "AddIn.fr_feliksRMK1c82", "Драйвер1СРарусФискальныеРегистраторыФеликс", Ложь); Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.Обработчик1СРарусФискальныеРегистраторыМебиус, "AddIn.fr_moebius1c82", "Драйвер1СРарусФискальныеРегистраторыМебиус", Ложь); Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикАтолФискальныеРегистраторы, "AddIn.ATOL_KKM_1C", , Истина, , Истина); Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикАтолФискальныеРегистраторыУниверсальный, "AddIn.ATOL_KKM_1C82", "ДрайверАТОЛФискальныеРегистраторы", Ложь, , Истина); Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикАтолФискальныеРегистраторы8X, "AddIn.ATOL_KKM_1C82", "ДрайверАТОЛФискальныеРегистраторы8X", Ложь); Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикВерсияТФискальныеРегистраторы, "AddIn.KSBFR1K1C", "ДрайверВерсияТФискальныеРегистраторы", Истина); Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикККСФискальныеРегистраторы, "AddIn.SparkTF", "ДрайверККСФискальныеРегистраторы", Ложь); Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикШтрихМФискальныеРегистраторы, "AddIn.DrvFR1C", , Истина, , Истина); Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикШтрихМФискальныеРегистраторыУниверсальный, "AddIn.SMDrvFR1C", "ДрайверШтрихМФискальныеРегистраторы", Ложь); Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикОРИОНФискальныеРегистраторы, "AddIn.OrionFR_1C8", "ДрайверОРИОНФискальныеРегистраторы", Истина); Справочники.ДрайверыОборудования.ЗаполнитьПредопределенныйЭлемент(Перечисления.ОбработчикиДрайверовПодключаемогоОборудования.ОбработчикКристаллСервисФискальныеРегистраторыPirit, "AddIn.PiritK", "ДрайверКристаллСервисФискальныеРегистраторыPirit", Ложь); // Конец Фискальные регистраторы. КонецПроцедуры
А так же функцию ПолучитьДоступныеТипыОборудования
Функция ПолучитьДоступныеТипыОборудования() Экспорт СписокОборудования = Новый Массив; // Сканеры штрихкода СписокОборудования.Добавить(Перечисления.ТипыПодключаемогоОборудования.СканерШтрихкода); // Конец Сканеры штрихкода // Фискальные регистраторы СписокОборудования.Добавить(Перечисления.ТипыПодключаемогоОборудования.ФискальныйРегистратор); // Конец Фискальные регистраторы. Возврат СписокОборудования; КонецФункции
Для того, чтобы в пользовательском режиме появились необходимые драйверы надо выполнить команду:
МенеджерОборудованияВызовСервераПереопределяемый.ОбновлениеБиблиотеки();
Это можно сделать, допустим, во внешней обработке.
После запуска этой команды можно будет в разделе Подключаемое оборудование подключить сканер.
Далее надо организовать работу сканера. Для этого в форму, в которой должен работать сканер помещаем процедуры:
&НаКлиенте Процедура ПриОткрытии(Отказ) ПоддерживаемыеТипыВО = Новый Массив(); ПоддерживаемыеТипыВО.Добавить("СканерШтрихкода"); ОповещенияПриПодключении = Новый ОписаниеОповещения("ПодключитьОборудованиеЗавершение", ЭтотОбъект); МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПоТипу(ОповещенияПриПодключении, УникальныйИдентификатор, ПоддерживаемыеТипыВО); КонецПроцедуры &НаКлиенте Процедура ПодключитьОборудованиеЗавершение(РезультатВыполнения, Параметры) Экспорт Если Не РезультатВыполнения.Результат Тогда ТекстСообщения = НСтр( "ru = 'При подключении оборудования произошла ошибка:""%ОписаниеОшибки%"".'"); ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ОписаниеОшибки%" , РезультатВыполнения.ОписаниеОшибки); Сообщить(ТекстСообщения); Иначе ТекстСообщения = НСтр("ru = 'Оборудование подключено.'" ); //Сообщить(ТекстСообщения); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура ПриЗакрытии() ПоддерживаемыеТипыВО = Новый Массив(); ПоддерживаемыеТипыВО.Добавить("СканерШтрихкода"); ОповещенияПриПодключении = Новый ОписаниеОповещения("ОтключитьОборудованиеЗавершение", ЭтотОбъект); МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПоТипу(ОповещенияПриПодключении, УникальныйИдентификатор, ПоддерживаемыеТипыВО); КонецПроцедуры &НаКлиенте Процедура ОтключитьОборудованиеЗавершение(РезультатВыполнения, Параметры) Экспорт Если Не РезультатВыполнения.Результат Тогда ТекстСообщения = НСтр( "ru = 'При отключении оборудования произошла ошибка: ""%ОписаниеОшибки%"".'"); ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ОписаниеОшибки%" , РезультатВыполнения.ОписаниеОшибки); Сообщить(ТекстСообщения); Иначе ТекстСообщения = НСтр("ru = 'Оборудование отключено.'" ); //Сообщить(ТекстСообщения); КонецЕсли; КонецПроцедуры
Не забываем прописать процедуры ПриОткрытии и ПриЗакрытии в свойствах формы. После этого в данной форме можно ловить ВнешнееСобытие формы.
В типовых конфигурациях и в той же БПО ловится не ВнешнееСобытие, а процедура ОбработкаОповещения. Чтобы работать через ОбработкаОповещения надо в модуле управляемого приложения добавить процедуру из БПО:
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные) // ПодключаемоеОборудование // Подготовить данные ОписаниеСобытия = Новый Структура(); ОписаниеОшибки = ""; ОписаниеСобытия.Вставить("Источник", Источник); ОписаниеСобытия.Вставить("Событие", Событие); ОписаниеСобытия.Вставить("Данные", Данные); // Передать на обработку данные. Результат = МенеджерОборудованияКлиент.ОбработатьСобытиеОтУстройства(ОписаниеСобытия, ОписаниеОшибки); Если Не Результат Тогда ОбщегоНазначенияКлиентСервер.СообщитьПользователю(НСтр("ru='При обработке внешнего события от устройства произошла ошибка.'") + Символы.ПС + ОписаниеОшибки); КонецЕсли; // Конец ПодключаемоеОборудование КонецПроцедуры
При сканировании сначала вызывается процедура ВнешнееСобытие в форме, потом процедура ОбработкаВнешнегоСобытия в модуле приложения и после этого срабатывает ОбработкаОповещения.
Лично я не стал заморачиваться и трогать типовой модуль бухгалтерии и остановился просто на внешнем событии формы.
Добрый день! Сообщите мне на электронку ваш адрес е-майл, есть некоторые вопросы..
Можете написать в разделе контакты.
Спасибо огромное!
Пожалуйста, вот только статья писалась давно и сейчас работа со сканером уже встроена в Бухгалтерию, поэтому данную информацию нужно использовать уже для каких-то других своих нужд.
Да. Искал изначально информацию касательно проблемы связанной с тем, что не удавалось отловить точку останова в процедуре "ВнешнееСобытие", после сканирования устройством штрих кода. Бился над вопросом 2 дня. При помощи вашей статьи и подсказки на счёт программной активации сканера в модуле формы в процедуре "ПриОткрытии", проблему удалось решить. Спасибо ещё раз огромное.
Отправить комментарий