При работе с торговым оборудованием в старых конфигурациях 1С, таких как Управление торговлей 10.4 на обычных формах, программисты часто сталкиваются с ситуацией, когда сканер штрихкода отлично считывает данные с экрана монитора, но полностью игнорирует бумажные носители, или же событие сканирования попросту не доходит до программы. Рассмотрим подробно, почему это происходит и как настроить систему для стабильной работы.
Для начала разберем, как 1С понимает, что был отсканирован штрихкод. В обычных формах за это отвечает процедура ВнешнееСобытие. Она вызывается драйвером торгового оборудования только в том случае, если сканер подключен правильно и работает в определенном режиме. Проанализируем стандартный код обработки, который часто используют разработчики:
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Лев(Данные, 2) = "№№" или Лев(Данные, 2) = "##" Тогда
// Логика поиска и открытия документа
ПодборДокументаПоШтрихКоду(Данные);
Иначе
// Обработка других типов штрихкодов
КонецЕсли;
КонецПроцедуры
Если этот код срабатывает при «сканировании» с экрана (когда форма документа открыта) и не работает с бумаги в журнале документов, значит, проблема кроется не в самом алгоритме обработки данных, а в состоянии подключения сканера в конкретный момент времени.
Выясним фундаментальное различие в режимах работы сканера. Это критически важный момент для понимания работы ВнешнееСобытие.
ВнешнееСобытие не генерируется. Если в журнале документов не выбрано поле ввода, данные уходят «в никуда».ВнешнееСобытие, независимо от того, где находится курсор.Решение: Если вы хотите, чтобы сканирование работало «фоном» при открытом журнале, необходимо перевести сканер в режим COM-порта. Для этого нужно найти инструкцию к вашему сканеру и отсканировать специальный управляющий штрихкод (обычно называется Enable USB Serial Emulation). После этого в диспетчере устройств Windows появится новый COM-порт, который нужно будет указать в настройках торгового оборудования 1С.
Проанализируем ситуацию, когда сканер работает в одной форме, но «молчит» в другой. В обычных формах подключение торгового оборудования (ТО) часто происходит в модуле конкретной формы. Если в форме Заказа прописана инициализация сканера, а в форме Журнала документов — нет, то при открытом журнале сканер будет просто пищать, не передавая данные в 1С.
Посмотрим на пример того, как должно выглядеть подключение в модуле формы:
Процедура ПриОткрытии()
// Проверяем, подключено ли оборудование
Если ПолучитьСерверТО() <> Неопределено Тогда
Результат = ПолучитьСерверТО().ПодключитьОборудование(Перечисления.ВидыТорговогоОборудования.СканерШтрихКода, ЭтаФорма);
Если Не Результат Тогда
Сообщить("Не удалось подключить сканер штрихкода!");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ПриЗакрытии()
// Обязательно отключаем при закрытии формы
Если ПолучитьСерверТО() <> Неопределено Тогда
ПолучитьСерверТО().ОтключитьОборудование(Перечисления.ВидыТорговогоОборудования.СканерШтрихКода, ЭтаФорма);
КонецЕсли;
КонецПроцедуры
Рассмотрим подробнее: если вы открываете журнал и процедура ПодключитьОборудование не вызывается, то 1С не будет «слушать» порт сканера. Убедитесь, что в форме вашего журнала есть аналогичный код подключения.
QR-коды могут содержать большой объем данных и спецсимволы. Выясним, почему условие Лев(Данные, 2) = "##" может не проходить проверку при сканировании с бумаги.
Часто драйвер сканера добавляет к считанным данным префиксы или суффиксы. Например, если сканер настроен добавлять символ возврата каретки (Enter) или идентификатор типа штрихкода (AIM ID), то в переменной Данные вместо ожидаемого "##12345" может оказаться "Q##12345" или "#13##12345".
Как проверить: Воспользуйтесь «советом из блокнота». Откройте обычный Windows Notepad и отсканируйте QR-код туда. Вы увидите реальную строку, которую выдает сканер. Если перед вашими символами ## есть что-то еще — это и есть причина, по которой условие в коде не срабатывает.
Разберем по шагам, что нужно сделать программисту для локализации проблемы:
ВнешнееСобытие. Отсканируйте код. Если 1С не «остановилась» на этой строке — значит, событие вообще не доходит до формы (проблема в подключении драйвера или режиме сканера).Если по каким-то причинам вы не можете перевести сканер в режим COM-порта (например, из-за ограничений драйверов в старой ОС), можно рассмотреть альтернативный вариант. Разместим на форме журнала документов невидимое текстовое поле и при открытии формы будем программно устанавливать на него фокус через ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.ПолеВводаСканера;.
В событии ПриИзменении этого поля можно прописать логику:
Процедура ПолеВводаСканераПриИзменении(Элемент)
Данные = СокрЛП(Элемент.Значение);
Если Лев(Данные, 2) = "##" Тогда
ПодборДокументаПоШтрихКоду(Данные);
КонецЕсли;
// Очищаем поле для следующего сканирования
Элемент.Значение = "";
КонецПроцедуры
Важно: Этот метод крайне нестабилен, так как пользователь может случайно кликнуть мышкой в другое место, и фокус уйдет с «секретного» поля. Поэтому настройка ВнешнееСобытие через драйвер является единственным профессиональным решением.
Проанализировав ситуацию, мы выяснили, что отсутствие реакции на сканирование с бумаги при работе в журнале документов чаще всего связано с тем, что форма журнала не зарегистрирована в системе как приемник событий торгового оборудования. Проверьте настройки драйвера (режим эмуляции COM-порта), убедитесь в наличии кода ПодключитьОборудование в модуле формы журнала и проверьте наличие лишних префиксов в считанных данных через отладчик.