При автоматизации складского учета или розничных продаж часто возникает задача: необходимо быстро заполнить поле Серийный номер или Штрихкод в документе, не используя ручной ввод. Если в типовом рабочем месте кассира (РМК) сканер работает «из коробки», то в самописных документах или специфических формах программисту часто приходится настраивать этот механизм самостоятельно. Разберем детально, как заставить программу принимать данные от сканера и записывать их в конкретный реквизит.
Прежде чем переходить к коду, давайте проанализируем, в каком режиме работает ваше устройство. От этого зависит стратегия разработки.
В рассматриваемой ситуации автор использует режим Native Api (COM-порт). Это означает, что просто поставить курсор в поле недостаточно — нужно написать обработчик события.
Рассмотрим по шагам один из самых простых и надежных способов, который подходит для начинающих разработчиков. Суть метода заключается в создании небольшой формы, которая «слушает» сканер и возвращает результат в основной документ.
Шаг 1. Создание кнопки вызова. На основной форме документа создадим кнопку «Ввести серийный номер». В процедуре нажатия этой кнопки мы будем открывать вспомогательную форму.
Шаг 2. Настройка обработки внешнего события. Во вспомогательной форме нам понадобится обработчик ВнешнееСобытие. Рассмотрим пример кода для этой формы:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
// Проанализируем, что событие пришло именно от сканера штрихкода
Если Событие = "Barcode" Или Событие = "Штрихкод" Тогда
// Получаем считанный штрихкод из переменной Данные
СчитанныйШтрихкод = СокрЛП(Данные);
// Закрываем форму и передаем результат обратно
Закрыть(СчитанныйШтрихкод);
КонецЕсли;
КонецПроцедуры
Шаг 3. Обработка результата в основном документе. Теперь нам нужно поймать этот результат и записать его в реквизит объекта.
&НаКлиенте
Процедура КомандаВвестиСерийныйНомер(Команда)
// Открываем форму ввода, указывая описание оповещения о закрытии
Оповещение = Новый ОписаниеОповещения("ОбработатьВводСерийногоНомера", ЭтотОбъект);
ОткрытьФорму("Обработка.ВводШтрихкода.Форма.ФормаВвода", , ЭтотОбъект, , , , Оповещение, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
КонецПроцедуры
&НаКлиенте
Процедура ОбработатьВводСерийногоНомера(Результат, ДополнительныеПараметры) Экспорт
Если ЗначениеЗаполнено(Результат) Тогда
// Записываем полученные данные в нужный реквизит на форме
Объект.СерийныйНомер = Результат;
КонецЕсли;
КонецПроцедуры
В современных конфигурациях (например, УТ 11, Розница 2/3, ERP) рекомендуется использовать стандартные механизмы БПО. Это позволяет избежать проблем с драйверами и делает работу со сканером универсальной. Рассмотрим, как это реализовать.
Выясним причину, почему это удобнее: БПО сама управляет подключением и отключением устройства при активации или деактивации формы. Нам не нужно вручную прописывать работу с COM-портом.
В модуле формы документа необходимо инициализировать работу с оборудованием:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем сканер через менеджер оборудования
ПоддерживаемыеТипы = Новый Массив;
ПоддерживаемыеТипы.Добавить("СканерШтрихкода");
МенеджерОборудованияКлиент.ПодключитьОборудованиеПоТипу(УникальныйИдентификатор,
ПоддерживаемыеТипы, ОповещениеПриПодключении);
КонецПроцедуры
После этого все данные от сканера будут попадать в процедуру ОбработкаОповещения. Проанализируем пример кода для обработки данных:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
// Проверяем, является ли событие сканированием штрихкода
Если Источник = "ПодключаемоеОборудование" И ИмяСобытия = "Штрихкод" Тогда
// Данные от БПО обычно приходят в виде массива структур
// Параметр[0] - это считанный штрихкод
Если Параметр <> Неопределено Тогда
Штрихкод = СокрЛП(Параметр[0]);
// Если фокус стоит в строке табличной части, можно добавить логику поиска
// В данном случае просто записываем в реквизит
Объект.СерийныйНомер = Штрихкод;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию, когда сканер вроде бы подключен, но 1С «молчит». Часто это связано с неверными настройками самого устройства или драйвера в 1С.
CR (код 13) или LF (код 10). Проверьте в настройках драйвера в 1С, что поле Суффикс заполнено значением #13 или #10. Если в самом сканере суффикс не настроен, 1С будет ждать продолжения ввода и не сгенерирует внешнее событие.СерийныйНомер уже заполнен, программа должна выдать предупреждение или спросить о перезаписи, чтобы избежать случайного затирания данных при повторном сканировании.Используя предложенные методы, вы сможете реализовать удобный и быстрый ввод данных, исключив ошибки ручного набора цифр пользователями.