Как перехватить сигнал сканера штрихкода в 1С:УТ и реализовать свою логику обработки?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В типовых конфигурациях 1С, таких как «Управление торговлей 11», работа с торговым оборудованием построена на базе БПО (Библиотеки подключаемого оборудования). Часто возникает задача изменить стандартное поведение системы: например, вместо автоматического добавления товара в табличную часть при сканировании, необходимо просто заполнить текстовый реквизит или выполнить иное специфическое действие — для этого подойдёт расширение для контроля сканирования кодов маркировки и товаров. В этой статье мы подробно разберем, как «поймать» сигнал от сканера и направить его по нужному нам алгоритму.

Механизм обработки внешнего события в управляемых формах

Для начала проанализируем, как 1С понимает, что данные пришли именно от сканера. Когда устройство (настроенное через драйвер) считывает штрихкод, оно генерирует внешнее событие. В управляемой форме это событие попадает в процедуру-обработчик ОбработкаОповещения. Рассмотрим структуру этого обработчика, которая обычно уже присутствует в формах документов, таких как «Заказ клиента».

Основным идентификатором того, что событие пришло от оборудования, является параметр ИмяСобытия со значением "ScanData". Рассмотрим стандартный фрагмент кода в форме:


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
    // ПодключаемоеОборудование
    Если Источник = "ПодключаемоеОборудование" И ВводДоступен() Тогда
        Если ИмяСобытия = "ScanData" Тогда
            // Проверяем наличие необработанных событий через менеджер оборудования
            Если МенеджерОборудованияУТКлиент.ЕстьНеобработанноеСобытие Тогда
                // Получаем данные в удобном виде (массив структур)
                ДанныеСканера = МенеджерОборудованияУТКлиент.ПреобразоватьДанныеСоСканераВМассив(Параметр);
                ОбработатьШтрихкоды(ДанныеСканера);
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    // Конец ПодключаемоеОборудование
    
КонецПроцедуры

Здесь ключевым моментом является вызов процедуры ОбработатьШтрихкоды. Если мы хотим полностью переопределить логику, нам нужно вмешаться именно на этом этапе — для этого подойдёт конструктор сценариев обработки штрихкодов и QR-кодов.

Разбор данных, полученных со сканера

Метод ПреобразоватьДанныеСоСканераВМассив(Параметр) возвращает не просто строку с цифрами штрихкода, а массив структур. Каждая структура содержит важные поля:

Это крайне важно, так как мы можем разграничить логику обработки в зависимости от типа кода. Например, если пришел DataMatrix, мы можем отправить его в модуль маркировки (поможет автоматизация сканирования и сохранения кодов маркировки), а если обычный EAN13 — в наш кастомный реквизит.

Способ 1: Использование фокуса ввода (ТекущийЭлемент)

Самый простой способ решить задачу автора (вставить штрихкод в конкретный реквизит вместо поиска товара) — это проверка текущего фокуса (удобно через поиск и подстановку дисконтных карт по штрихкоду). Выясним, в каком поле находится курсор пользователя в момент сканирования. Если курсор стоит в нашем специальном поле, мы записываем данные туда и прерываем выполнение стандартного поиска.


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "ScanData" Тогда
        Данные = МенеджерОборудованияУТКлиент.ПреобразоватьДанныеСоСканераВМассив(Параметр);
        
        // Проверяем, стоит ли курсор в нашем реквизите
        Если ТекущийЭлемент.Имя = "МойСпецифичныйРеквизит" Тогда
            // Предположим, что считан один код
            Объект.МойСпецифичныйРеквизит = Данные[0].Значение;
            // Важно: не вызываем стандартную процедуру ОбработатьШтрихкоды!
            Возврат; 
        КонецЕсли;
        
        // Если фокус не в нашем поле, работаем по стандарту
        ОбработатьШтрихкоды(Данные);
    КонецЕсли;
КонецПроцедуры

Способ 2: Разграничение по префиксам штрихкода

Если нам нужно, чтобы система автоматически понимала, что сканируется не товар, а, например, сервисный код или код документа, можно использовать механизм префиксов. В этом случае мы анализируем первые символы считанного значения. Рассмотрим пример кода в процедуре ОбработатьШтрихкоды (или непосредственно в ОбработкаОповещения):


&НаКлиенте
Процедура МояОбработкаШтрихкодов(МассивШтрихкодов)
    Для Каждого ТекущийШК Из МассивШтрихкодов Цикл
        // Допустим, наши спец. коды всегда начинаются на "99"
        Если Лев(ТекущийШК.Значение, 2) = "99" Тогда
            // Реализуем свою логику
            Сообщить("Считан спецкод: " + ТекущийШК.Значение);
            // Заполняем реквизит или выполняем команду
        Иначе
            // Стандартный поиск товара через типовые механизмы УТ
            // Например, вызов модуля ШтрихкодированиеОбъектовКлиент
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Способ 3: Глобальный перехват (Переопределяемый модуль)

Если задачу нужно решить не в одной форме «Заказа клиента», а для всей системы в целом, проанализируем возможности общих модулей. В типовой конфигурации существует модуль МенеджерОборудованияКлиентПереопределяемый и его процедура ПриОбработкеСобытияОтУстройства. Редактирование кода здесь позволяет внедрить логику фильтрации штрихкодов на глобальном уровне еще до того, как событие будет передано в активную форму. Однако следует помнить, что это усложнит обновление конфигурации, поэтому расширения — предпочтительный вариант для таких правок — есть готовое универсальное расширение для распознавания собственных штрихкодов.

Особенности режима работы сканера (COM vs Клавиатура)

Разберем важный технический аспект, упомянутый в обсуждении. Существует два основных режима работы сканера:

  1. В разрыв клавиатуры (HID): Сканер просто эмулирует быстрый ввод символов. Если драйвер не установлен, 1С не увидит событие ScanData, и данные просто «влетят» в поле, где стоит курсор. Чтобы 1С воспринимала такой ввод как сканирование, в настройках оборудования нужно указать «Таймаут клавиатурного сканера».
  2. Режим эмуляции COM-порта: Это наиболее стабильный вариант для 1С. Сканер работает через драйвер, и система четко генерирует внешнее событие, которое мы перехватываем в коде.

Если сканер работает «в разрыв клавиатуры», но настроен через драйвер, он всё равно будет генерировать ScanData. Это позволяет программно управлять данными, даже если курсор находится вообще вне полей ввода.

Асинхронность в современных версиях платформы

В новых релизах «1С:Управление торговлей» на платформе 8.3.15+ работа с оборудованием часто переведена на асинхронные вызовы. Вместо ожидания внешнего события могут использоваться ОписаниеОповещения. При глубокой кастомизации следует проверить, не используется ли в вашей версии метод НачатьПолучениеСобытия. Если вы переопределяете стандартные механизмы БПО, убедитесь, что вы не нарушаете цепочку асинхронных вызовов, иначе оборудование может «зависнуть» для системы до перезагрузки формы.

Резюме и рекомендации

Чтобы реализовать заполнение собственного реквизита при сканировании в 1С:УТ:

Таким образом, мы сохраняем типовой функционал для обычных товаров и внедряем гибкую логику для своих задач.

← На главную