Как в 1С:Розница 2.3 реализовать получение товара по EAN13 и веса по CODE39 с одной этикетки?

Программист 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

В практике автоматизации розничной торговли часто встречаются нестандартные задачи по маркировке весового товара. Типовой механизм 1С предполагает, что весовой товар кодируется одним штрихкодом EAN13, где по определенному шаблону зашиты и код (или SKU) товара, и его вес. Однако возникают ситуации, когда на этикетке печатаются два отдельных штрихкода: EAN13 для идентификации номенклатуры и CODE39 для передачи точного веса. Рассмотрим подробнее, как реализовать поддержку такой схемы в конфигурации «1С:Розница 2.3».

Анализ проблемы и выбор пути решения

Стандартная логика работы РМК (Рабочего места кассира) в 1С настроена на то, что каждое событие сканирования является завершенным действием: система получает код, ищет товар и добавляет его в корзину. В нашем случае одно сканирование дает только половину информации. Если мы просто считаем EAN13, программа добавит товар с весом 1 (или запросит ввод веса вручную), а если считаем CODE39 — программа вообще не поймет, к какому товару относится этот вес.

Для решения задачи нам необходимо внедрить механизм «состояния ожидания» или «буферизации». Проанализируем технические шаги, которые для этого потребуются:

  1. Перехват события сканирования в форме РМК.
  2. Идентификация типа считанного штрихкода.
  3. Логика связки: если считан EAN13 весового товара, система должна «замереть» и ждать ввода веса из второго кода.
  4. Разбор формата CODE39 и преобразование строки в числовой формат веса.

Реализация через механизм «Буфера» в расширении

Чтобы не снимать конфигурацию с поддержки, крайне рекомендуется вносить изменения через расширение. Нам нужно модифицировать модуль формы РМК (обычно это ФормаРМК в обработке РМКУправляемыйРежим).

Выясним причину, по которой типовой механизм не подходит: он не умеет хранить контекст между двумя независимыми событиями сканирования. Мы добавим в расширение формы новую переменную (реквизит формы) ОжидаемыйОбъектВеса. Рассмотрим алгоритм обработки события:


&НаКлиенте
Процедура Расш_ОбработкаШтрихкодовПосле(ДанныеШтрихкодов, Отказ)
    
    Для Каждого ДанныеШтрихкода Из ДанныеШтрихкодов Цикл
        
        // 1. Проверяем, не ждем ли мы сейчас вес для уже выбранного товара
        Если ЗначениеЗаполнено(Объект.ОжидаемыйОбъектВеса) Тогда
            // Проверяем, является ли текущий код кодом CODE39 с весом
            Если ДанныеШтрихкода.ТипШтрихкода = ТипыШтрихкодов.Code39 Тогда
                ВесЧислом = Расш_РазобратьВесИзCode39(ДанныеШтрихкода.Штрихкод);
                ДобавитьТоварВКорзину(Объект.ОжидаемыйОбъектВеса, ВесЧислом);
                // Сбрасываем буфер
                Объект.ОжидаемыйОбъектВеса = Неопределено;
                Возврат;
            КонецЕсли;
        КонецЕсли;

        // 2. Стандартный поиск товара по EAN13
        ТоварСсылка = ПоискТовараПоШтрихкоду(ДанныеШтрихкода.Штрихкод);
        
        Если ТоварСсылка.Весовой Тогда
            // Вместо добавления, запоминаем товар и просим считать вес
            Объект.ОжидаемыйОбъектВеса = ТоварСсылка;
            ПоказатьОповещениеПользователя("Считайте штрихкод с ВЕСОМ (CODE39)");
        Иначе
            // Обычный товар — добавляем как обычно
            СтандартнаяОбработкаДобавления(ТоварСсылка);
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Особенности разбора штрихкода CODE39

Разберем по шагам, как правильно извлечь числовое значение из кода CODE39. Этот формат часто содержит служебные символы, такие как «звездочки» (*) в начале и конце строки. Кроме того, вес может быть записан в граммах без разделителя. Например, строка *00550* должна превратиться в число 0,550 кг.

Проанализируем функцию разбора:


&НаКлиенте
Функция Расш_РазобратьВесИзCode39(Знач ИсходныйШтрихкод)
    // Удаляем лишние символы, которые может передать драйвер
    ЧистаяСтрока = СтрЗаменить(ИсходныйШтрихкод, "*", "");
    
    // Преобразуем в число. Предполагаем, что вес в граммах (5 знаков)
    Попытка
        ВесГраммы = Число(ЧистаяСтрока);
        Возврат ВесГраммы / 1000; // Возвращаем в килограммах для 1С
    Исключение
        Возврат 0;
    КонецПопытки;
КонецФункции

Настройка торгового оборудования

Работа с двумя последовательными штрихкодами накладывает определенные требования к настройке сканера. Посмотрим на критически важные моменты:

Обработка исключительных ситуаций

В процессе работы кассир может совершить ошибку. Рассмотрим ситуацию «забытого сканирования»: кассир считал EAN13 весового товара, но вместо CODE39 считал EAN13 другого товара.

Важно предусмотреть: если система находится в состоянии Ожидание веса, но повторно приходит код типа EAN13, программа должна сбросить предыдущее ожидание и начать процесс заново для новой номенклатуры. Это исключит ситуацию, когда вес от «яблок» привяжется к «колбасе».

Альтернативное решение: GS1 DataBar

Если ваша компания имеет возможность влиять на дизайн этикеток, рекомендуем рассмотреть переход на штрихкод GS1 DataBar Expanded Stacked. Рассмотрим его преимущества:

  1. Компактность: Он занимает не больше места, чем CODE39, но вмещает в себя гораздо больше информации.
  2. Единый стандарт: В одном коде сразу зашифрован и GTIN (аналог EAN13), и вес, и даже срок годности или номер партии.
  3. Отсутствие доработок: Современные версии 1С:Розница и БПО (Библиотека подключаемого оборудования) умеют разбирать GS1 DataBar «из коробки» с помощью стандартных шаблонов штрихкодов.

Подводя итог, можно сказать, что задача раздельного получения номенклатуры и веса вполне решаема через небольшую доработку логики РМК в расширении. Главное — четко контролировать состояние системы и корректно очищать буфер ожидания при любых нештатных действиях пользователя.

← На главную