Ссылка на статью //infostart.ru/public/203591/ (сейчас она несколько устарела).
В 2018 году процесс подключения сканера штрихкода стал существенно проще.
В разделе «Администрирование» есть пункт «Подключаемое оборудование» и в ней есть закладка «Сканеры штрихкода». Тут все просто. Нажимаем «Создать», выбираем тип оборудования «Сканеры штрихкоды» и драйвер. Например, «1С:Сканеры штрихкода (NativeApi)». Если драйвер еще не установлен будет выдано предложение сделать это сейчас и база сама зарегистрирует нужную компоненту.
Для проверки нажимаем (в этой же форме) «Настроить» и «Тест устройства». Сканер я предварительно перевел в режим virtual COM и установил драйвер виртуального COM порта. В окне теста сразу видно, что доступен порт COM3. После считывания штрихкода данные отображаются в окне. Значит, 1С получает событие от сканера.
Следующий шаг — описать, как база должна реагировать на событие сканирования штрихкода.
Коротко напомню как все устроено в типовых конфигурациях.
У форм документов нет обработчика события «Внешнее событие». Все реализовано через событие управляемого приложения.
Его обработчик получает все события, определяет от какого оборудования они пришли.
Передача управления обработчикам формы выполняется через механизм оповещения.
Реакция системы на штрихкод описывается уже в модуле формы в обработчике события ОбработкаОповещения.
Поиск по конфигурации не порадовал. «Из коробки» штрих код работает только в трех видах документов.
Поскольку конфигурация на поддержке изменения будем вносить через расширение.
Реализуем 2 сценария — привязка штрихкода к карточке номенклатуры и обработка считывания штрихкода для длокумента «Перемещение товаров».
Начнем с номенклатуры.
Чтобы форма элемента получала оповещения от драйвера подключаемого оборудования необходимо добавить обработчики событий ПриОткрытии и ПриЗакрытии (оба с вызовом После).
&НаКлиенте
Процедура Расш1_ПриОткрытииПосле(Отказ)
ТипыПО = Новый Массив();
ТипыПО.Добавить("СканерШтрихкода");
ОповещениеПриПодключении = Новый ОписаниеОповещения("ПодключениеОборудованияЗавершено", ЭтотОбъект);
МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПоТипу(ОповещениеПриПодключении, УникальныйИдентификатор, ТипыПО);
КонецПроцедуры
&НаКлиенте
Процедура ПодключениеОборудованияЗавершено(РезультатВыполнения, Параметры) Экспорт
Если Не РезультатВыполнения.Результат Тогда
ТекстСообщения = НСтр( "ru = 'При подключении оборудования произошла ошибка:""%ОписаниеОшибки%"".'");
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ОписаниеОшибки%" , РезультатВыполнения.ОписаниеОшибки);
Сообщить(ТекстСообщения);
Иначе
ТекстСообщения = НСтр("ru = 'Оборудование подключено.'" );
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Расш1_ПриЗакрытииПосле(ЗавершениеРаботы)
ТипыПО = Новый Массив();
ТипыПО.Добавить("СканерШтрихкода");
ОповещениеПриОтключении = Новый ОписаниеОповещения("ОтключениеОборудованияЗавершено", ЭтотОбъект);
МенеджерОборудованияКлиент.НачатьОтключениеОборудованиеПоТипу(ОповещениеПриОтключении, УникальныйИдентификатор, ТипыПО);
КонецПроцедуры
&НаКлиенте
Процедура ОтключениеОборудованияЗавершено(РезультатВыполнения, Параметры) Экспорт
Если Не РезультатВыполнения.Результат Тогда
ТекстСообщения = НСтр( "ru = 'При отключении оборудования произошла ошибка:""%ОписаниеОшибки%"".'");
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ОписаниеОшибки%" , РезультатВыполнения.ОписаниеОшибки);
Сообщить(ТекстСообщения);
Иначе
ТекстСообщения = НСтр("ru = 'Оборудование подключено.'" );
КонецЕсли;
КонецПроцедуры
Если код вызывает вопросы — напишите в комментарии — отвечу.
Далее создадим обработчик события ОбработкаОповещения (вызов также После).
&НаКлиенте
Процедура Расш1_ОбработкаОповещенияПосле(ИмяСобытия, Параметр, Источник)
Если Источник = "ПодключаемоеОборудование" Тогда
Если ИмяСобытия = "ScanData" Тогда
Если Параметр[1] = Неопределено Тогда
ТекущийКод = Параметр[0];
Иначе
ТекущийКод = Параметр[1][1];
КонецЕсли;
Номенклатура = "";
Если ЕстьНоменклатураПоШтрихкоду(ТекущийКод, Номенклатура) Тогда
ТекстСообщения = НСтр("ru = 'Штрихкоду %Штрихкод% уже сопоставлена номенклатура %Номенклатура%'" );
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Штрихкод%" , ТекущийКод);
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Номенклатура%" , Номенклатура);
СообщениеПользователю = Новый СообщениеПользователю;
СообщениеПользователю.Текст = ТекстСообщения;
СообщениеПользователю.Сообщить();
Иначе
ВопросСоздатьНоменклатуруЗавершение = Новый ОписаниеОповещения("ПривязатьШтрихкодКНоменклатуреПослеВопроса", ЭтаФорма, ТекущийКод);
ТекстСообщения = НСтр("ru = 'Привязать штрихкод %Штрихкод% к номенклатуре %Номенклатура%?'" );
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Штрихкод%" , ТекущийКод);
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Номенклатура%" , Объект.Наименование);
ПоказатьВопрос(ВопросСоздатьНоменклатуруЗавершение, ТекстСообщения, РежимДиалогаВопрос.ДаНет, 30, КодВозвратаДиалога.Нет);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ЕстьНоменклатураПоШтрихкоду(Штрихкод, Номенклатура)
Рез = Ложь;
ТаблицаНоменклатурыПоШтрихкоду = РегистрыСведений.ШтрихкодыНоменклатуры.НоменклатураПоШтрихкоду(Штрихкод);
Если ТаблицаНоменклатурыПоШтрихкоду.Количество() > 0 Тогда
Номенклатура = ТаблицаНоменклатурыПоШтрихкоду[0].Номенклатура;
Рез = Истина;
КонецЕсли;
Возврат Рез;
КонецФункции
&НаКлиенте
Процедура ПривязатьШтрихкодКНоменклатуреПослеВопроса(Результат, Параметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ПривязатьШтрихкодКНоменклатуре(Параметры);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПривязатьШтрихкодКНоменклатуре(Штрихкод) Экспорт
НовыйШК = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
НовыйШК.Штрихкод = Штрихкод;
НовыйШК.Номенклатура = Объект.Ссылка;
НовыйШК.Записать();
КонецПроцедуры
Обработчик проверяет, что пришло событие именно со сканера штрихкода. Далее выполняется поиск номенклатуры по штрихкоду. Если номенклатура найдена выдается сообщение пользователю, что штрихкод уже сопоставлен с другой номенклатурой. В противном случае создается запись в регистре сведений ШтрихкодыНоменклатуры (после уточняющего вопроса пользователю).
Со справочником на этом все.
Переходим к документу.
Аналогично добавляем код для событий ПриОткрытии и ПриЗакрытии для подключения (и отключения) подписки на получение событий от подключаемого оборудования.
В обработчике ОбработкаОповещения размещаем код
&НаКлиенте
Процедура Расш1_ОбработкаОповещенияПосле(ИмяСобытия, Параметр, Источник)
Если Источник = "ПодключаемоеОборудование" И ВводДоступен() Тогда
Если ИмяСобытия = "ScanData" Тогда
Если Параметр[1] = Неопределено Тогда
ТекущийКод = Параметр[0];
Иначе
ТекущийКод = Параметр[1][1];
КонецЕсли;
ДобавитьПоШтрихкодуНаСервере(ТекущийКод);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ДобавитьПоШтрихкодуНаСервере выполняет поиск номенклатуры сопоставленной с штрихкодов. Если номенклатура не найдена выдает сообщение пользователю. Иначе — добавляет строку в документ. Добавление строки реализовано по аналогии с документом ПоступлениеТоваровУслуг.
&НаСервере
Функция ДобавитьПоШтрихкодуНаСервере(Штрихкод)
ТаблицаНоменклатурыПоШтрихкоду = РегистрыСведений.ШтрихкодыНоменклатуры.НоменклатураПоШтрихкоду(Штрихкод);
Если ТаблицаНоменклатурыПоШтрихкоду.Количество() = 1 Тогда
ДобавитьНоменклатуруНаСервере(ТаблицаНоменклатурыПоШтрихкоду[0].Номенклатура);
Иначе
ТекстСообщения = НСтр("ru = 'Штрихкоду %Штрихкод% не сопоставлена ни одна номенклатура'" );
ТекстСообщения = СтрЗаменить(ТекстСообщения, "%Штрихкод%" , Штрихкод);
СообщениеПользователю = Новый СообщениеПользователю;
СообщениеПользователю.Текст = ТекстСообщения;
СообщениеПользователю.Сообщить();
КонецЕсли;
КонецФункции
&НаСервере
Процедура ДобавитьНоменклатуруНаСервере(Номенклатура)
ПараметрыОтбора = Новый Структура("Номенклатура", Номенклатура);
мСтрок = Объект.Товары.НайтиСтроки(ПараметрыОтбора);
Если мСтрок.Количество() = 0 Тогда
ТаблицаТовары = Новый ТаблицаЗначений;
ТаблицаТовары.Колонки.Добавить("Номенклатура");
ТаблицаТовары.Колонки.Добавить("Количество");
ТаблицаТовары.Колонки.Добавить("Цена");
СтрокаТаблицаТовары = ТаблицаТовары.Добавить();
СтрокаТаблицаТовары.Номенклатура = Номенклатура;
СтрокаТаблицаТовары.Количество = 1;
СтрокаТаблицаТовары.Цена = 0;
Значение = Новый Структура("АдресПодобраннойНоменклатурыВХранилище, КоличествоДобавленныхСтрок", ПоместитьВоВременноеХранилище(ТаблицаТовары, УникальныйИдентификатор));
ОбработкаВыбораПодборВставкаИзБуфераНаСервере(Значение, "Товары");
Иначе
СтрокаТовары = мСтрок[0];
СтрокаТовары.Количество = СтрокаТовары.Количество + 1;
КонецЕсли;
КонецПроцедуры
На этом всё.
Взаимодействие сканера с другими документами выполняется аналогичным образом.