В практике автоматизации розничной торговли часто встречаются нестандартные задачи по маркировке весового товара. Типовой механизм 1С предполагает, что весовой товар кодируется одним штрихкодом EAN13, где по определенному шаблону зашиты и код (или SKU) товара, и его вес. Однако возникают ситуации, когда на этикетке печатаются два отдельных штрихкода: EAN13 для идентификации номенклатуры и CODE39 для передачи точного веса. Рассмотрим подробнее, как реализовать поддержку такой схемы в конфигурации «1С:Розница 2.3».
Стандартная логика работы РМК (Рабочего места кассира) в 1С настроена на то, что каждое событие сканирования является завершенным действием: система получает код, ищет товар и добавляет его в корзину. В нашем случае одно сканирование дает только половину информации. Если мы просто считаем EAN13, программа добавит товар с весом 1 (или запросит ввод веса вручную), а если считаем CODE39 — программа вообще не поймет, к какому товару относится этот вес.
Для решения задачи нам необходимо внедрить механизм «состояния ожидания» или «буферизации». Проанализируем технические шаги, которые для этого потребуются:
Чтобы не снимать конфигурацию с поддержки, крайне рекомендуется вносить изменения через расширение. Нам нужно модифицировать модуль формы РМК (обычно это ФормаРМК в обработке РМКУправляемыйРежим).
Выясним причину, по которой типовой механизм не подходит: он не умеет хранить контекст между двумя независимыми событиями сканирования. Мы добавим в расширение формы новую переменную (реквизит формы) ОжидаемыйОбъектВеса. Рассмотрим алгоритм обработки события:
&НаКлиенте
Процедура Расш_ОбработкаШтрихкодовПосле(ДанныеШтрихкодов, Отказ)
Для Каждого ДанныеШтрихкода Из ДанныеШтрихкодов Цикл
// 1. Проверяем, не ждем ли мы сейчас вес для уже выбранного товара
Если ЗначениеЗаполнено(Объект.ОжидаемыйОбъектВеса) Тогда
// Проверяем, является ли текущий код кодом CODE39 с весом
Если ДанныеШтрихкода.ТипШтрихкода = ТипыШтрихкодов.Code39 Тогда
ВесЧислом = Расш_РазобратьВесИзCode39(ДанныеШтрихкода.Штрихкод);
ДобавитьТоварВКорзину(Объект.ОжидаемыйОбъектВеса, ВесЧислом);
// Сбрасываем буфер
Объект.ОжидаемыйОбъектВеса = Неопределено;
Возврат;
КонецЕсли;
КонецЕсли;
// 2. Стандартный поиск товара по EAN13
ТоварСсылка = ПоискТовараПоШтрихкоду(ДанныеШтрихкода.Штрихкод);
Если ТоварСсылка.Весовой Тогда
// Вместо добавления, запоминаем товар и просим считать вес
Объект.ОжидаемыйОбъектВеса = ТоварСсылка;
ПоказатьОповещениеПользователя("Считайте штрихкод с ВЕСОМ (CODE39)");
Иначе
// Обычный товар — добавляем как обычно
СтандартнаяОбработкаДобавления(ТоварСсылка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Разберем по шагам, как правильно извлечь числовое значение из кода CODE39. Этот формат часто содержит служебные символы, такие как «звездочки» (*) в начале и конце строки. Кроме того, вес может быть записан в граммах без разделителя. Например, строка *00550* должна превратиться в число 0,550 кг.
Проанализируем функцию разбора:
&НаКлиенте
Функция Расш_РазобратьВесИзCode39(Знач ИсходныйШтрихкод)
// Удаляем лишние символы, которые может передать драйвер
ЧистаяСтрока = СтрЗаменить(ИсходныйШтрихкод, "*", "");
// Преобразуем в число. Предполагаем, что вес в граммах (5 знаков)
Попытка
ВесГраммы = Число(ЧистаяСтрока);
Возврат ВесГраммы / 1000; // Возвращаем в килограммах для 1С
Исключение
Возврат 0;
КонецПопытки;
КонецФункции
Работа с двумя последовательными штрихкодами накладывает определенные требования к настройке сканера. Посмотрим на критически важные моменты:
В процессе работы кассир может совершить ошибку. Рассмотрим ситуацию «забытого сканирования»: кассир считал EAN13 весового товара, но вместо CODE39 считал EAN13 другого товара.
Важно предусмотреть: если система находится в состоянии Ожидание веса, но повторно приходит код типа EAN13, программа должна сбросить предыдущее ожидание и начать процесс заново для новой номенклатуры. Это исключит ситуацию, когда вес от «яблок» привяжется к «колбасе».
Если ваша компания имеет возможность влиять на дизайн этикеток, рекомендуем рассмотреть переход на штрихкод GS1 DataBar Expanded Stacked. Рассмотрим его преимущества:
Подводя итог, можно сказать, что задача раздельного получения номенклатуры и веса вполне решаема через небольшую доработку логики РМК в расширении. Главное — четко контролировать состояние системы и корректно очищать буфер ожидания при любых нештатных действиях пользователя.