В типовых конфигурациях 1С, таких как «Управление торговлей 11», работа с торговым оборудованием построена на базе БПО (Библиотеки подключаемого оборудования). Часто возникает задача изменить стандартное поведение системы: например, вместо автоматического добавления товара в табличную часть при сканировании, необходимо просто заполнить текстовый реквизит или выполнить иное специфическое действие — для этого подойдёт расширение для контроля сканирования кодов маркировки и товаров. В этой статье мы подробно разберем, как «поймать» сигнал от сканера и направить его по нужному нам алгоритму.
Для начала проанализируем, как 1С понимает, что данные пришли именно от сканера. Когда устройство (настроенное через драйвер) считывает штрихкод, оно генерирует внешнее событие. В управляемой форме это событие попадает в процедуру-обработчик ОбработкаОповещения. Рассмотрим структуру этого обработчика, которая обычно уже присутствует в формах документов, таких как «Заказ клиента».
Основным идентификатором того, что событие пришло от оборудования, является параметр ИмяСобытия со значением "ScanData". Рассмотрим стандартный фрагмент кода в форме:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
// ПодключаемоеОборудование
Если Источник = "ПодключаемоеОборудование" И ВводДоступен() Тогда
Если ИмяСобытия = "ScanData" Тогда
// Проверяем наличие необработанных событий через менеджер оборудования
Если МенеджерОборудованияУТКлиент.ЕстьНеобработанноеСобытие Тогда
// Получаем данные в удобном виде (массив структур)
ДанныеСканера = МенеджерОборудованияУТКлиент.ПреобразоватьДанныеСоСканераВМассив(Параметр);
ОбработатьШтрихкоды(ДанныеСканера);
КонецЕсли;
КонецЕсли;
КонецЕсли;
// Конец ПодключаемоеОборудование
КонецПроцедуры
Здесь ключевым моментом является вызов процедуры ОбработатьШтрихкоды. Если мы хотим полностью переопределить логику, нам нужно вмешаться именно на этом этапе — для этого подойдёт конструктор сценариев обработки штрихкодов и QR-кодов.
Метод ПреобразоватьДанныеСоСканераВМассив(Параметр) возвращает не просто строку с цифрами штрихкода, а массив структур. Каждая структура содержит важные поля:
Это крайне важно, так как мы можем разграничить логику обработки в зависимости от типа кода. Например, если пришел DataMatrix, мы можем отправить его в модуль маркировки (поможет автоматизация сканирования и сохранения кодов маркировки), а если обычный EAN13 — в наш кастомный реквизит.
Самый простой способ решить задачу автора (вставить штрихкод в конкретный реквизит вместо поиска товара) — это проверка текущего фокуса (удобно через поиск и подстановку дисконтных карт по штрихкоду). Выясним, в каком поле находится курсор пользователя в момент сканирования. Если курсор стоит в нашем специальном поле, мы записываем данные туда и прерываем выполнение стандартного поиска.
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ScanData" Тогда
Данные = МенеджерОборудованияУТКлиент.ПреобразоватьДанныеСоСканераВМассив(Параметр);
// Проверяем, стоит ли курсор в нашем реквизите
Если ТекущийЭлемент.Имя = "МойСпецифичныйРеквизит" Тогда
// Предположим, что считан один код
Объект.МойСпецифичныйРеквизит = Данные[0].Значение;
// Важно: не вызываем стандартную процедуру ОбработатьШтрихкоды!
Возврат;
КонецЕсли;
// Если фокус не в нашем поле, работаем по стандарту
ОбработатьШтрихкоды(Данные);
КонецЕсли;
КонецПроцедуры
Если нам нужно, чтобы система автоматически понимала, что сканируется не товар, а, например, сервисный код или код документа, можно использовать механизм префиксов. В этом случае мы анализируем первые символы считанного значения. Рассмотрим пример кода в процедуре ОбработатьШтрихкоды (или непосредственно в ОбработкаОповещения):
&НаКлиенте
Процедура МояОбработкаШтрихкодов(МассивШтрихкодов)
Для Каждого ТекущийШК Из МассивШтрихкодов Цикл
// Допустим, наши спец. коды всегда начинаются на "99"
Если Лев(ТекущийШК.Значение, 2) = "99" Тогда
// Реализуем свою логику
Сообщить("Считан спецкод: " + ТекущийШК.Значение);
// Заполняем реквизит или выполняем команду
Иначе
// Стандартный поиск товара через типовые механизмы УТ
// Например, вызов модуля ШтрихкодированиеОбъектовКлиент
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Если задачу нужно решить не в одной форме «Заказа клиента», а для всей системы в целом, проанализируем возможности общих модулей. В типовой конфигурации существует модуль МенеджерОборудованияКлиентПереопределяемый и его процедура ПриОбработкеСобытияОтУстройства. Редактирование кода здесь позволяет внедрить логику фильтрации штрихкодов на глобальном уровне еще до того, как событие будет передано в активную форму. Однако следует помнить, что это усложнит обновление конфигурации, поэтому расширения — предпочтительный вариант для таких правок — есть готовое универсальное расширение для распознавания собственных штрихкодов.
Разберем важный технический аспект, упомянутый в обсуждении. Существует два основных режима работы сканера:
ScanData, и данные просто «влетят» в поле, где стоит курсор. Чтобы 1С воспринимала такой ввод как сканирование, в настройках оборудования нужно указать «Таймаут клавиатурного сканера».Если сканер работает «в разрыв клавиатуры», но настроен через драйвер, он всё равно будет генерировать ScanData. Это позволяет программно управлять данными, даже если курсор находится вообще вне полей ввода.
В новых релизах «1С:Управление торговлей» на платформе 8.3.15+ работа с оборудованием часто переведена на асинхронные вызовы. Вместо ожидания внешнего события могут использоваться ОписаниеОповещения. При глубокой кастомизации следует проверить, не используется ли в вашей версии метод НачатьПолучениеСобытия. Если вы переопределяете стандартные механизмы БПО, убедитесь, что вы не нарушаете цепочку асинхронных вызовов, иначе оборудование может «зависнуть» для системы до перезагрузки формы.
Чтобы реализовать заполнение собственного реквизита при сканировании в 1С:УТ:
ОбработатьШтрихкоды.Таким образом, мы сохраняем типовой функционал для обычных товаров и внедряем гибкую логику для своих задач.