При работе в программе 1С:Розница 2.3 пользователи часто сталкиваются с ситуацией: в карточке товара задан SKU, в настройках указаны префиксы весового товара, весы печатают этикетку, но при сканировании в РМК система выдает ошибку "Данные по коду не найдены". В этой статье мы подробно проанализируем причины этой проблемы — от ошибок в настройках до программного бага в типовых релизах — и разберем способы их устранения.
Прежде чем приступать к исправлению программного кода, давайте проверим, правильно ли сформирован сам штрихкод. Для весового товара в системе 1С принят стандарт разбора 13-значного кода (например, 2100102015501). Давайте посмотрим, из чего он состоит:
SKU (код товара). Важно, чтобы количество знаков здесь соответствовало настройке "Верхняя граница диапазона SKU".Если структура вашего штрихкода отличается, система просто не сможет выделить из него SKU для поиска в базе.
Рассмотрим по шагам настройки номенклатуры, которые напрямую влияют на поиск. Перейдем в раздел Администрирование — Настройки номенклатуры — Настройки штрихкодирования.
Проанализируем следующие параметры:
99999. Система рассчитывает длину кода на основе этого числа с помощью функции СтрДлина(Формат(ВерхняяГраница, "ЧГ = 0")).Теперь перейдем к технической части. Процесс поиска товара при сканировании происходит в общем модуле ПодключаемоеОборудованиеРТ в функции ДанныеПоискаПоШтрихкоду. Давайте разберем, как система "отрезает" части штрихкода, чтобы найти товар.
Посмотрим на пример кода, который отвечает за разбор штрихкода:
ПрефиксВнутреннегоШтрихкодаВесовогоТовара = ЗначениеНастроекПовтИсп.ПолучитьЗначениеКонстанты("ПрефиксВнутреннегоШтрихкодаВесовогоТовара");
ДлинаКодаВесовогоТовара = СтрДлина(Формат(ЗначениеНастроекПовтИсп.ПолучитьЗначениеКонстанты("ВерхняяГраницаДиапазонаSKUВесовогоТовара"), "ЧГ = 0"));
ПрефиксКода = Лев(Штрихкод, 2);
ПрефиксВесовой = "2" + ПрефиксВнутреннегоШтрихкодаВесовогоТовара;
ЭтоВесовой = (ПрефиксКода = ПрефиксВесовой);
Если ЭтоВесовой Тогда
// Выделяем SKU из середины штрихкода
КодТовара = Число(Сред(Штрихкод, 3, ДлинаКодаВесовогоТовара));
// Выделяем вес (остаток строки до контрольного символа)
КоличествоТовара = Число(Сред(Штрихкод, 3 + ДлинаКодаВесовогоТовара, 10 - ДлинаКодаВесовогоТовара));
КоличествоТовара = КоличествоТовара / 1000; // Переводим граммы в килограммы
КонецЕсли;
В некоторых релизах Розницы 2.3 (например, 2.3.6.17) наблюдается программная ошибка: после того как ТекстЗапроса сформирован, система может не выполнить его или не заполнить таблицу результатов поиска, оставляя переменную НеизвестныеДанныеПО в значении Истина. Это приводит к тому, что 1С сообщает о ненахождении данных, хотя SKU в базе существует.
Важно понимать, что поиск весового товара ведется не по полю "Код" в справочнике Номенклатура, а по регистру сведений КодыТоваровSKU. Выясним причину, по которой товар может не находиться, даже если код кажется верным:
SKU должен быть присвоен каждой конкретной характеристике.КодыТоваровSKU действительно существует. Если вы переносили данные из другой программы, этот регистр мог остаться пустым.Если вы убедились, что настройки верны, штрихкод соответствует стандарту, а записи в регистре SKU есть, значит, вы столкнулись с ошибкой релиза. Рассмотрим варианты решения:
1. Установка патча:
Для исправлений ошибок работы со штрихкодами в Рознице 2.3 был выпущен официальный патч EF_00_00331529_3 (или более свежие версии в зависимости от вашего релиза). Рекомендуем обновить конфигурацию до версии 2.3.8.24 или выше, где эти ошибки уже исправлены в основном коде. При обслуживании нескольких информационных баз этот процесс можно упростить, если настроить автоматическое обновление по расписанию.
2. Использование расширения:
Если оперативное обновление невозможно, мы можем подправить логику поиска через расширение. Нам необходимо перехватить процедуру ДанныеПоискаПоШтрихкоду и убедиться, что запрос к регистру КодыТоваровSKU выполняется корректно. Пример части исправленного запроса, который должен быть выполнен:
Запрос.Текст =
"ВЫБРАТЬ
| КодыТоваровSKU.Номенклатура КАК Владелец,
| КодыТоваровSKU.Характеристика КАК Характеристика,
| КодыТоваровSKU.Упаковка КАК Упаковка,
| &КоличествоТовара КАК Количество
|ИЗ
| РегистрСведений.КодыТоваровSKU КАК КодыТоваровSKU
|ГДЕ
| КодыТоваровSKU.SKU = &Код";
Запрос.УстановитьПараметр("Код", КодТовара);
Запрос.УстановитьПараметр("КоличествоТовара", КоличествоТовара);
РезультатЗапроса = Запрос.Выполнить();
После выполнения этого запроса необходимо обработать выборку и заполнить структуру ДанныеПоиска. Именно этот этап часто "пропускается" в проблемных релизах.
Проанализируем ситуацию, когда сканер штрихкодов настроен неверно. Если сканер работает в режиме эмуляции клавиатуры (Keyboard Wedge), он может добавлять лишние символы в начало кода. Попробуйте просканировать штрихкод в обычный текстовый документ (Блокнот). Если перед цифрой "2" появляются какие-то символы или буквы, значит, сканер настроен некорректно и функция 1С Лев(Штрихкод, 2) не может правильно определить префикс.
В таком случае необходимо сбросить настройки сканера до заводских или настроить корректный суффикс (обычно CR - возврат каретки) в драйвере подключаемого оборудования 1С.