Почему не срабатывает сканирование QR-кода с бумажного документа в 1С:УТ 10.4 и как это исправить

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

При работе с торговым оборудованием в старых конфигурациях 1С, таких как Управление торговлей 10.4 на обычных формах, программисты часто сталкиваются с ситуацией, когда сканер штрихкода отлично считывает данные с экрана монитора, но полностью игнорирует бумажные носители, или же событие сканирования попросту не доходит до программы. Рассмотрим подробно, почему это происходит и как настроить систему для стабильной работы.

Анализ механизма «Внешнее событие» в обычных формах

Для начала разберем, как 1С понимает, что был отсканирован штрихкод. В обычных формах за это отвечает процедура ВнешнееСобытие. Она вызывается драйвером торгового оборудования только в том случае, если сканер подключен правильно и работает в определенном режиме. Проанализируем стандартный код обработки, который часто используют разработчики:


Процедура ВнешнееСобытие(Источник, Событие, Данные)
    Если Лев(Данные, 2) = "№№" или Лев(Данные, 2) = "##" Тогда 
        // Логика поиска и открытия документа
        ПодборДокументаПоШтрихКоду(Данные); 
    Иначе 
        // Обработка других типов штрихкодов
    КонецЕсли;
КонецПроцедуры

Если этот код срабатывает при «сканировании» с экрана (когда форма документа открыта) и не работает с бумаги в журнале документов, значит, проблема кроется не в самом алгоритме обработки данных, а в состоянии подключения сканера в конкретный момент времени.

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

Выясним фундаментальное различие в режимах работы сканера. Это критически важный момент для понимания работы ВнешнееСобытие.

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

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

Причина 2: Подключение оборудования в форме журнала

Проанализируем ситуацию, когда сканер работает в одной форме, но «молчит» в другой. В обычных формах подключение торгового оборудования (ТО) часто происходит в модуле конкретной формы. Если в форме Заказа прописана инициализация сканера, а в форме Журнала документов — нет, то при открытом журнале сканер будет просто пищать, не передавая данные в 1С.

Посмотрим на пример того, как должно выглядеть подключение в модуле формы:


Процедура ПриОткрытии()
    // Проверяем, подключено ли оборудование
    Если ПолучитьСерверТО() <> Неопределено Тогда
        Результат = ПолучитьСерверТО().ПодключитьОборудование(Перечисления.ВидыТорговогоОборудования.СканерШтрихКода, ЭтаФорма);
        Если Не Результат Тогда
            Сообщить("Не удалось подключить сканер штрихкода!");
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Процедура ПриЗакрытии()
    // Обязательно отключаем при закрытии формы
    Если ПолучитьСерверТО() <> Неопределено Тогда
        ПолучитьСерверТО().ОтключитьОборудование(Перечисления.ВидыТорговогоОборудования.СканерШтрихКода, ЭтаФорма);
    КонецЕсли;
КонецПроцедуры

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

Причина 3: Специфика QR-кодов и префиксы/суффиксы

QR-коды могут содержать большой объем данных и спецсимволы. Выясним, почему условие Лев(Данные, 2) = "##" может не проходить проверку при сканировании с бумаги.

Часто драйвер сканера добавляет к считанным данным префиксы или суффиксы. Например, если сканер настроен добавлять символ возврата каретки (Enter) или идентификатор типа штрихкода (AIM ID), то в переменной Данные вместо ожидаемого "##12345" может оказаться "Q##12345" или "#13##12345".

Как проверить: Воспользуйтесь «советом из блокнота». Откройте обычный Windows Notepad и отсканируйте QR-код туда. Вы увидите реальную строку, которую выдает сканер. Если перед вашими символами ## есть что-то еще — это и есть причина, по которой условие в коде не срабатывает.

Практические шаги по отладке

Разберем по шагам, что нужно сделать программисту для локализации проблемы:

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

Использование невидимого поля ввода (Костыль)

Если по каким-то причинам вы не можете перевести сканер в режим COM-порта (например, из-за ограничений драйверов в старой ОС), можно рассмотреть альтернативный вариант. Разместим на форме журнала документов невидимое текстовое поле и при открытии формы будем программно устанавливать на него фокус через ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ПолеВводаСканера;.

В событии ПриИзменении этого поля можно прописать логику:


Процедура ПолеВводаСканераПриИзменении(Элемент)
    Данные = СокрЛП(Элемент.Значение);
    Если Лев(Данные, 2) = "##" Тогда
        ПодборДокументаПоШтрихКоду(Данные);
    КонецЕсли;
    // Очищаем поле для следующего сканирования
    Элемент.Значение = "";
КонецПроцедуры

Важно: Этот метод крайне нестабилен, так как пользователь может случайно кликнуть мышкой в другое место, и фокус уйдет с «секретного» поля. Поэтому настройка ВнешнееСобытие через драйвер является единственным профессиональным решением.

Резюме

Проанализировав ситуацию, мы выяснили, что отсутствие реакции на сканирование с бумаги при работе в журнале документов чаще всего связано с тем, что форма журнала не зарегистрирована в системе как приемник событий торгового оборудования. Проверьте настройки драйвера (режим эмуляции COM-порта), убедитесь в наличии кода ПодключитьОборудование в модуле формы журнала и проверьте наличие лишних префиксов в считанных данных через отладчик.

← На главную