Как реализовать подбор по штрихкоду в произвольной форме 1С:УНФ?

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

При разработке собственных обработок или нестандартных документов часто возникает задача: как заполнять табличную часть номенклатурой путем сканирования штрихкодов? Рассмотрим ситуацию на примере конфигурации 1С:Управление нашей фирмой (УНФ). У нас есть форма с табличной частью, содержащей колонки Номенклатура, Количество и Продукция. Разберем по шагам, как правильно перехватывать данные со сканера и почему иногда поведение платформы кажется неочевидным (например, пустой стек вызовов при отладке).

Проанализируем два основных подхода к решению этой задачи: использование виртуального поля ввода (костыльный метод для клавиатурных сканеров) и использование стандартных механизмов Библиотеки подключаемого оборудования (БПО).

Способ 1: Использование текстового поля для сканеров в режиме «разрыв клавиатуры»

Если сканер работает в режиме эмуляции клавиатуры (USB-Keyboard), он просто очень быстро «печатает» цифры штрихкода и в конце посылает символ возврата каретки (Enter). В этом случае мы можем добавить на форму обычный строковый реквизит Штрихкод.

Давайте посмотрим на простой вариант реализации через событие ПриИзменении. Идея состоит в том, чтобы сканировать данные в поле, а затем очищать его и возвращать фокус обратно для следующего сканирования.


&НаКлиенте
Процедура ШтрихкодПриИзменении(Элемент)
    Штрихкод = Элементы.Штрихкод.ТекстРедактирования;
    ТекШтрихкод = Новый Структура;
    ТекШтрихкод.Вставить("Штрихкод", Штрихкод);
    ТекШтрихкод.Вставить("Количество", 1);
    
    РазвернутьМассив(ТекШтрихкод);
    
    Штрихкод = "";
    Элементы.Штрихкод.ОбновитьТекстРедактирования;
    ПодключитьОбработчикОжидания("ВернутьКурсорНаПолеВвода", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ВернутьКурсорНаПолеВвода()
    ЭтаФорма.ТекущийЭлемент = Элементы.Штрихкод;
КонецПроцедуры

&НаСервере
Процедура РазвернутьМассив(ТекШтрихкод)
    // Преобразование и поиск номенклатуры по штрихкоду
    МассивШтрихкодов = Новый Массив;
    МассивШтрихкодов.Добавить(ТекШтрихкод);
    
    ДанныеПоШтрихкодам = РегистрыСведений.ШтрихкодыНоменклатуры.ПолучитьДанныеПоШтрихкодам(МассивШтрихкодов);
    ДанныеШтрихкода = ДанныеПоШтрихкодам[ТекШтрихкод.Штрихкод];
    
    Если НЕ ЗначениеЗаполнено(ДанныеШтрихкода) Тогда
        Сообщить("Такого штрих-кода не существует в базе!");
        Возврат;
    КонецЕсли;
    
    // Заполнение табличной части...
КонецПроцедуры

Важное замечание: При быстрой потоковой работе или медленном отклике платформы смена активного элемента (фокуса) в событии ПриИзменении может приводить к сбоям интерфейса. Более стабильным и универсальным вариантом является использование события ОкончаниеВводаТекста.

Рассмотрим улучшенный вариант кода для непрерывного чтения штрихкодов:


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

&НаКлиенте
Процедура ПозиционированиеВводНовыйШК()
    СтрокаШК = "";
    ЭтаФорма.ТекущийЭлемент = Элементы.СтрокаШК;
    
    #Если МобильноеПриложениеКлиент Тогда
        ЭтаФорма.НачатьРедактированиеЭлемента();
    #КонецЕсли
КонецПроцедуры

&НаСервере
Процедура ОбработатьСчитанныйШК(Текст)
    // Серверная логика поиска и добавления строки
КонецПроцедуры

Способ 2: Использование штатных механизмов БПО (рекомендуемый)

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

Разберем алгоритм действий при стандартном подходе:

  1. В процедуре ПриОткрытии формы необходимо вызвать метод менеджера оборудования: МенеджерОборудованияКлиент.НачатьПодключениеОборудованиеПриОткрытииФормы(...).
  2. В процедуре ПриЗакрытии формы вызывается метод отключения оборудования, чтобы освободить порт сканера для других окон.
  3. Перехват самого штрихкода осуществляется в предопределенной процедуре формы ОбработкаОповещения (или через ВнешнееСобытие). При сканировании штрихкод «прилетает» напрямую туда, минуя элементы формы.

Для стабильной работы этого механизма рекомендуется перевести сам физический сканер в режим эмуляции COM-порта (USB-COM), считав специальный штрихкод из инструкции к аппарату. В паре с драйвером 1С:Сканеры штрихкода (NativeApi) платформа начинает перехватывать данные аппаратно. Проблема с «прыгающим» курсором или активностью полей отпадает полностью.

Почему серверная процедура отрабатывает без контекста и с пустым стеком?

Часто разработчики удивляются: почему при отладке серверная процедура (например, ПолучитьДанныеПоШтрихКодам) срабатывает как бы сама по себе, без вызова из клиентской процедуры, а в стеке вызовов видна всего одна строка? Выясним причину.

Особенно ярко это проявляется при работе через веб-клиент. Причина кроется в асинхронной архитектуре современной платформы 1С и драйверов NativeApi:

Особенности мобильной платформы

Если вы разрабатываете под мобильный клиент 1С или терминал сбора данных (ТСД), использование поля ввода тем более неактуально. Для мобильных клиентов существует подсистема 1С:Библиотека подключаемого оборудования для мобильных приложений (МБПО).

В этой подсистеме работа с аппаратными кнопками сканирования на ТСД или встроенной камерой устройства реализована на уровне драйверов NativeApi. Данные обрабатываются исключительно через глобальные оповещения формы, поэтому штатный механизм БПО (Способ 2) является единственным верным решением для кроссплатформенной разработки.

← На главную