Как реализовать ввод серийного номера со сканера штрихкодов в 1С

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

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

Различие режимов работы сканера: Клавиатура vs COM-порт

Прежде чем переходить к коду, давайте проанализируем, в каком режиме работает ваше устройство. От этого зависит стратегия разработки.

  1. Режим эмуляции клавиатуры (HID): Сканер работает как обычная клавиатура. Когда вы считываете код, данные просто «печатаются» в то поле, где сейчас находится курсор. Если курсор не установлен в нужное поле, данные уйдут «в никуда».
  2. Режим эмуляции COM-порта (Native Api / RS-232): Это более профессиональный и надежный метод. Сканер посылает данные напрямую в операционную систему, а 1С перехватывает их с помощью специального события. При этом неважно, где находится курсор и открыто ли какое-то текстовое поле — программа увидит событие сканирования в любом случае.

В рассматриваемой ситуации автор использует режим Native Api (COM-порт). Это означает, что просто поставить курсор в поле недостаточно — нужно написать обработчик события.

Решение 1: Использование вспомогательной формы для ввода данных

Рассмотрим по шагам один из самых простых и надежных способов, который подходит для начинающих разработчиков. Суть метода заключается в создании небольшой формы, которая «слушает» сканер и возвращает результат в основной документ.

Шаг 1. Создание кнопки вызова. На основной форме документа создадим кнопку «Ввести серийный номер». В процедуре нажатия этой кнопки мы будем открывать вспомогательную форму.

Шаг 2. Настройка обработки внешнего события. Во вспомогательной форме нам понадобится обработчик ВнешнееСобытие. Рассмотрим пример кода для этой формы:


&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
    
    // Проанализируем, что событие пришло именно от сканера штрихкода
    Если Событие = "Barcode" Или Событие = "Штрихкод" Тогда
        
        // Получаем считанный штрихкод из переменной Данные
        СчитанныйШтрихкод = СокрЛП(Данные);
        
        // Закрываем форму и передаем результат обратно
        Закрыть(СчитанныйШтрихкод);
        
    КонецЕсли;
    
КонецПроцедуры

Шаг 3. Обработка результата в основном документе. Теперь нам нужно поймать этот результат и записать его в реквизит объекта.


&НаКлиенте
Процедура КомандаВвестиСерийныйНомер(Команда)
    
    // Открываем форму ввода, указывая описание оповещения о закрытии
    Оповещение = Новый ОписаниеОповещения("ОбработатьВводСерийногоНомера", ЭтотОбъект);
    ОткрытьФорму("Обработка.ВводШтрихкода.Форма.ФормаВвода", , ЭтотОбъект, , , , Оповещение, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
    
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьВводСерийногоНомера(Результат, ДополнительныеПараметры) Экспорт
    
    Если ЗначениеЗаполнено(Результат) Тогда
        // Записываем полученные данные в нужный реквизит на форме
        Объект.СерийныйНомер = Результат;
    КонецЕсли;
    
КонецПроцедуры

Решение 2: Работа через Библиотеку подключаемого оборудования (БПО)

В современных конфигурациях (например, УТ 11, Розница 2/3, ERP) рекомендуется использовать стандартные механизмы БПО. Это позволяет избежать проблем с драйверами и делает работу со сканером универсальной. Рассмотрим, как это реализовать.

Выясним причину, почему это удобнее: БПО сама управляет подключением и отключением устройства при активации или деактивации формы. Нам не нужно вручную прописывать работу с COM-портом.

В модуле формы документа необходимо инициализировать работу с оборудованием:


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

После этого все данные от сканера будут попадать в процедуру ОбработкаОповещения. Проанализируем пример кода для обработки данных:


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    
    // Проверяем, является ли событие сканированием штрихкода
    Если Источник = "ПодключаемоеОборудование" И ИмяСобытия = "Штрихкод" Тогда
        
        // Данные от БПО обычно приходят в виде массива структур
        // Параметр[0] - это считанный штрихкод
        Если Параметр <> Неопределено Тогда
            Штрихкод = СокрЛП(Параметр[0]);
            
            // Если фокус стоит в строке табличной части, можно добавить логику поиска
            // В данном случае просто записываем в реквизит
            Объект.СерийныйНомер = Штрихкод;
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

Важные технические нюансы настройки

Проанализируем ситуацию, когда сканер вроде бы подключен, но 1С «молчит». Часто это связано с неверными настройками самого устройства или драйвера в 1С.

  1. Суффиксы и префиксы. Для того чтобы программа поняла, что передача кода завершена, сканер должен посылать «символ окончания строки». Обычно это CR (код 13) или LF (код 10). Проверьте в настройках драйвера в 1С, что поле Суффикс заполнено значением #13 или #10. Если в самом сканере суффикс не настроен, 1С будет ждать продолжения ввода и не сгенерирует внешнее событие.
  2. Установка драйвера. При использовании Native Api убедитесь, что компонента драйвера (например, от 1С или АТОЛ) успешно установлена и прошла тест в настройках торгового оборудования.
  3. Чувствительность к фокусу. В режиме COM-порта данные придут в обработчик, даже если курсор находится в поле комментария. Рекомендуем добавить проверку: если реквизит СерийныйНомер уже заполнен, программа должна выдать предупреждение или спросить о перезаписи, чтобы избежать случайного затирания данных при повторном сканировании.

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

← На главную