При работе с маркированной продукцией в программе «1С:Розница» пользователи иногда сталкиваются со странным поведением системы: при сканировании первой единицы товара в документе «Реализация товаров» устанавливается количество 1, но при сканировании второй марки (того же самого товара) количество внезапно прыгает до 3. При этом в интерфейсе РМК (рабочее место кассира) всё работает корректно (там даже доступно присвоение кодов маркировки путем сканирования). Рассмотрим подробнее, почему возникает этот программный сбой и как его исправить.
Прежде всего, проанализируем ситуацию: почему ошибка проявляется именно в документе реализации, а не в РМК? Ответ кроется в различных механизмах обработки событий торгового оборудования. В РМК используется специализированный «движок» обработки ввода, который жестко контролирует каждый считанный символ. В обычном же документе (оптовая отгрузка) задействуется стандартная Библиотека стандартных подсистем (БСП) и Библиотека интеграции с ГИС МТ (БИГИС).
Когда вы сканируете код DataMatrix, система должна выполнить несколько действий: опознать штрихкод, найти номенклатуру, проверить статус марки и добавить строку в таблицу. Если логика этих процессов дублируется, возникает «лишняя единица».
Выясним наиболее вероятную причину — работу сканера в режиме эмуляции клавиатуры (Keyboard Wedge). Это самый «проблемный» режим для маркировки. Рассмотрим, что происходит «под капотом»:
ВнешнееСобытие или перехват ввода, и в документ добавляется 1 единица товара.Решение: Нам необходимо перевести сканер в режим эмуляции COM-порта (VCP). Проанализируем, как это сделать:
В режиме COM-порта данные передаются единым пакетом, что исключает двойную интерпретацию события системой.
Если перевод на COM-порт не помог, проанализируем версию конфигурации. В релизах «Розницы» версий 2.3.11–2.3.15 наблюдалась программная ошибка в процедурах обработки сканирования для документов оптовой торговли.
Система считывает код, ищет номенклатуру по GTIN (извлеченному из марки) и добавляет строку. Однако процедура проверки марки не «привязывается» корректно к текущей строке, а создает конфликт в оперативной памяти, из-за чего счетчик увеличивается некорректно.
Рассмотрим, что нужно сделать:
EF_..., в описании которых упоминается «Маркировка» или «Обработка сканирования».Посмотрим на ситуацию со стороны драйвера. Если сканер после передачи данных марки посылает символ возврата каретки (CR или Enter, код #13), 1С в обычном документе может интерпретировать это как команду завершения ввода. В некоторых случаях это заставляет систему дважды заходить в процедуру поиска товара в табличной части.
Попробуем изменить настройки:
13.Иногда проблема носит не программный, а логический характер. Выясним, нет ли в базе дублирующих записей. Если один и тот же GTIN (содержащийся в марке) привязан к номенклатуре несколько раз в разных регистрах, система при сканировании марки может найти две связи и попытаться обработать каждую из них по отдельности.
Проанализируем состояние регистров:
ШтрихкодыНоменклатуры и регистр ШтрихкодыУпаковок. При работе с табаком часто требуется предварительное сопоставление марок с номенклатурой.В настройках сканирования для документов может быть активна опция автоматической фиксации кода маркировки. Рассмотрим следующий алгоритм:
Если при сканировании марки у вас открывается модальное окно проверки (где нужно подтвердить марку), а в это время в основной табличной части за окном уже изменилось количество — это явный признак конфликта. Иногда это происходит из-за настроек, устанавливающих запрет продажи при отсутствии ответа от Честного знака. Код отработал в «фоне» как обычный штрихкод и в «активном окне» как марка.
Посмотрим, как это исправить:
Если вы имеете доступ к конфигуратору, проанализируйте процедуру обработки оповещения в форме документа. Обычно это ВнешнееСобытиеОборудования. Обратите внимание на то, как вызывается обработка штрихкода:
// В формах документов часто встречается подобный вызов:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Не ВводДоступен() Тогда
Возврат;
КонецЕсли;
// Если здесь происходит вызов общего модуля обработки маркировки
// и одновременно стандартной обработки штрихкода БСП,
// количество может задвоиться.
ОбработатьСканирование(Данные);
КонецПроцедуры
В случае с маркировкой, функция ОбработатьСканирование должна четко разделять: если считан ТипШтрихкода.DataMatrix, то поиск по обычному штрихкоду должен быть блокирован. В РМК эта логика реализована более глубоко, в то время как в формах обычных документов она может требовать ручной корректировки или установки тех самых патчей от 1С.
Чтобы решить проблему с «количеством 3» при сканировании второй марки, выполните следующие действия в строгом порядке:
#13).Как правило, переход на COM-интерфейс решает 90% подобных проблем, так как он позволяет программе однозначно идентифицировать источник данных и тип события, не смешивая его с клавиатурным вводом.