При автоматизации складского учета и оптово-розничной торговли часто возникает ситуация, когда сканер считывает двумерный код (QR-код или DataMatrix) либо составной штрихкод стандарта GS1, содержащий не только основной код товара (EAN-13 / GTIN), но и дополнительную информацию (партию, срок годности, серийный номер или количество в упаковке). Если в учетной системе номенклатура привязана к обычному 13-значному штрихкоду, программа не находит товар и выдает ошибку. Разберем подробно механизм взаимодействия с торговым оборудованием в конфигурации «1С:Управление торговлей 10.3» на обычных формах, определим цепочку вызовов процедур и рассмотрим варианты нормализации данных.
Проанализируем, как устроен типовой процесс передачи данных от сканера штрихкодов в форму документа (например, РеализацияТоваровУслуг, ПоступлениеТоваровУслуг или ПеремещениеТоваров):
ВнешнееСобытие:
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Не ВводДоступен() Тогда
Возврат;
КонецЕсли;
ПолучитьСерверТО().ОбработатьВнешнееСобытие(Источник, Событие, Данные, ЭтаФорма);
КонецПроцедуры
ПолучитьСерверТО() возвращает ссылку на глобальный объект управления торговым оборудованием — обработку ТОСервер:
Функция ПолучитьСерверТО() Экспорт
Если глСерверТО = Неопределено Тогда
глСерверТО = Обработки.ТОСервер.Создать();
КонецЕсли;
Возврат глСерверТО;
КонецФункции
ОбработатьВнешнееСобытие, которая расшифровывает полученное сообщение, валидирует входящие параметры и передает данные в обработчики конкретного документа или общего модуля РаботаСТорговымОборудованием.Рассмотрим, как изменить алгоритм обработки штрихкода, если требуется принудительно отсекать служебные символы и оставлять только первые 13 знаков.
В модуле объекта обработки ТОСервер (или в функции ОбработатьВведенныйШтрихкод / ОбработатьВнешнееСобытие) перед поиском номенклатуры в регистре сведений Штрихкоды добавим проверку длины строки:
// Проверяем длину входящего штрихкода
Если СтрДлина(ШК) > 13 Тогда
ШК = Лев(ШК, 13);
КонецЕсли;
Если в документе используется ручной ввод штрихкода по кнопке с панели инструментов, обратим внимание на процедуру КоманднаяПанельТоварыПоискПоШтрихКоду. Заменим типовой вызов на передачу усеченной строки:
Процедура КоманднаяПанельТоварыПоискПоШтрихКоду(Кнопка)
Результат = РаботаСТорговымОборудованием.ВвестиШтрихкод();
Если Не ПустаяСтрока(Результат) Тогда
// Передаем первые 13 символов
ПолучитьСерверТО().ОбработатьВведенныйШтрихкод(Лев(Результат, 13), ЭтаФорма);
КонецЕсли;
КонецПроцедуры
Важное предостережение: жесткое усечение Лев(ШК, 13) может нарушить работу с другими типами кодов — короткими штрихкодами (EAN-8), дисконтными картами или кодами маркировки «Честный Знак». Рекомендуется выполнять обрезку не безусловно, а только при совпадении определенных условий (например, проверка конкретной длины, маски или типа считанного кода).
Если конфигурация доработана или вызовы распределены по нетиповым модулям, выясним точное место обработки события с помощью отладчика:
ТОСервер или РаботаСТорговымОборудованием, установим точку останова и детально исследуем стек вызовов.Разберем альтернативное решение, которое позволяет не вносить изменения в конфигурацию 1С и сохранить ее на полной типовой поддержке.
(37), отвечающую за количество).