При обновлении конфигурации или переходе с «1С:Розница 1.0» на «1С:Розница 2.2» администраторы и специалисты нередко сталкиваются с ситуацией: сканер штрихкодов в рабочем месте кассира (РМК) безошибочно подбирает позиции номенклатуры, но при попытке отсканировать дисконтную карту покупателя или карту авторизации кассира система выдает предупреждение: «Данные по коду не найдены». При этом ручной ввод через окно по комбинации клавиш Alt+F7 со сканера вовсе не работает.
Разберем детально механизм возникновения этой неполадки, особенности работы оборудования и практические способы решения проблемы без повторной маркировки всей номенклатуры и перевыпуска карт клиентов.
Выясним причину, почему оборудование успешно обрабатывает одни штрихкоды и выдает ошибку на других. Оборудование здесь ни при чем — сканер добросовестно передает считанную последовательность символов в порт или поток клавиатуры. Проблема кроется во внутренней логике конфигурации «1С:Розница 2.2».
Рассмотрим алгоритм обработки входящего штрихкода формата EAN-13:
2. С этой же цифры обычно начинаются штрихкоды фасованной продукции, весового товара, а также информационных карт (дисконтных, бонусных, регистрационных).ПрефиксШтрихкодаВесовогоТовара и ПрефиксШтрихкодаШтучногоФасованногоТовара.21 или 23), алгоритм программы считает, что кассир отсканировал весовой или фасованный товар. Строка принудительно расщепляется по схеме: Префикс (2 знака) + SKU номенклатуры (5 знаков) + Вес/Количество (5 знаков) + Контрольный символ.Главная сложность заключается в том, что проверка префиксов весовых и фасованных товаров выполняется алгоритмами 1С всегда, если в константах заданы их значения по умолчанию, даже если флаг весового учета снят в настройках программы.
Разберем поведение сканера при попытке вызвать модальное окно «Ввод штрихкода» по нажатию Alt+F7. Данный диалог предназначен исключительно для ручного набора символов с клавиатуры кассиром, если этикетка повреждена.
Если торговое оборудование подключено через встроенный драйвер 1С:NativeApi или работает в режиме эмуляции COM-порта, сканер генерирует системное событие платформы ВнешнееСобытие. Модальное окно ручного ввода не способно перехватывать такие события драйвера — оно ожидает клавиатурный поток. При корректной работе системы открывать это окно для сканера не требуется: считывание бэйджа сотрудника или карты скидок должно происходить прямо в основном окне РМК.
Самое быстрое и безопасное решение, не требующее программных доработок и переклейки ценников, — изменить конфликтующие префиксы в настройках программы. Если предприятие не продает весовой товар, префиксы нужно перенести в диапазон, который заведомо не пересекается с картами лояльности и товарами.
Рассмотрим порядок действий по шагам:
98 или 99).ПрефиксШтрихкодаВесовогоТовара и ПрефиксШтрихкодаШтучногоФасованногоТовара.После корректировки префиксов система перестанет расщеплять штрихкоды карт, и поиск в РМК начнет работать штатно.
Если изменение префиксов не помогло, проанализируем параметры самих информационных карт. При переносе данных из предыдущих версий конфигураций структура карт могла перенестись некорректно.
В ситуациях, когда в торговой точке одновременно используются весовые товары и информационные карты со схожими диапазонами номеров, изменение префиксов может нарушить работу весов с печатью этикеток. В этом случае добавим предварительную проверку через механизм расширений (CFE), не снимая конфигурацию с поддержки.
Переопределим логику обработки входящего события от сканера: перед тем как передавать строку в стандартный модуль разбора весового товара, выполним поиск в регистре информационных карт.
Посмотрим на пример реализации перехвата штрихкода:
&Вместо("ОбработатьШтрихкод")
Функция Расш1_ОбработатьШтрихкод(ДанныеШтрихкода)
Штрихкод = ДанныеШтрихкода.Штрихкод;
// Проверяем наличие считанного штрихкода среди информационных карт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| ИнформационныеКарты.Ссылка КАК Карта
|ИЗ
| Справочник.ИнформационныеКарты КАК ИнформационныеКарты
|ГДЕ
| ИнформационныеКарты.КодКарты = &Штрихкод";
Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
// Код принадлежит карте: передаем напрямую в алгоритм обработки карт,
// минуя разбор шаблонов весовых и штучных товаров
Возврат ОбработатьКартуПользователя(Штрихкод);
КонецЕсли;
// Если карта не обнаружена, продолжаем стандартный типовой разбор
Возврат ПродолжитьВызов(ДанныеШтрихкода);
КонецФункции
Использование предварительной проверки позволяет полностью исключить ложное срабатывание весового парсера и сохраняет стабильность работы кассового узла при любых префиксах.