Как настроить поиск весового товара по артикулу в штрихкоде EAN-13 в 1С:Розница 2.2

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

В розничной торговле нередко возникает требование использовать артикул номенклатуры в качестве идентификатора весового товара при формировании этикеток на фасовочных весах. Разберем практическую задачу: штрихкод стандарта EAN-13 формируется весами по схеме, где первые 5 символов отводятся под артикул позиции, а последующие знаки кодируют вес. Рассмотрим, какими путями можно решить эту задачу в 1С:Розница 2.2 — с изменением программного кода и штатным архитектурным методом без модификации типовых процедур.

Анализ структуры штрихкода EAN-13 и ограничений платформы

Прежде чем приступать к доработкам, проанализируем структуру штрихкода формата EAN-13. Полный штрихкод содержит ровно 13 цифр:

  1. 13-й символ всегда является контрольной цифрой, вычисляемой автоматически по алгоритму Modulo 10. По этой причине значащими данными могут являться только первые 12 символов.
  2. Если первые 5 символов отдаются под артикул (например, с 1-й по 5-ю позицию), то под вес остается ровно 7 символов (с 6-й по 12-ю позицию). В весовом значении 4 знака определяют целую часть, а 3 знака — дробную (граммы). Попытка включить 13-й символ в значение веса приведет к искажению количества при сканировании.
  3. В типовой конфигурации реквизит Артикул справочника Номенклатура имеет строковый тип, а контроль уникальности на уровне платформы для него не установлен. Если в базе окажутся товары с одинаковыми артикулами, запрос вернет первую попавшуюся позицию, что создаст пересорт на кассовом узле.
  4. В типовом решении выгрузка весового товара в весы с печатью этикеток (Offline-оборудование) жестко завязана на регистр сведений КодыТоваровSKU. Если переписать логику только в обработке сканирования и обойти этот регистр, штатная выгрузка номенклатуры в весы перестанет функционировать.

Решение 1. Штатный метод без доработки кода (рекомендуемый)

Рассмотрим штатный подход, который сохраняет полную работоспособность типовых механизмов и обновляемость конфигурации. Конфигурация 1С:Розница изначально рассчитана на работу с весовыми кодами через регистр сведений КодыТоваровSKU.

Посмотрим, как устроен типовой алгоритм: система ожидает в штрихкоде префикс весового товара и внутренний код SKU. Если код артикула является числовым (например, пятизначное число, начинающееся с двойки), нет необходимости менять код функции сканирования — достаточно сделать так, чтобы артикул выступал в роли номера SKU.

Разберем по шагам, как настроить этот процесс:

  1. Настройка диапазона SKU: перейдем в настройки параметров учета и зададим границы диапазона SKU весового товара в соответствии с длиной используемых артикулов (например, от 1 до 99999).
  2. Заполнение регистра КодыТоваровSKU: запишем в регистр сведений соответствие между товаром и числовым представлением его артикула в качестве ресурса SKU. Это можно сделать групповой обработкой справочника либо регламентным заданием.
  3. Автоматизация синхронизации: чтобы при создании новой номенклатуры код в регистре формировался автоматически, создадим подписку на событие ПередЗаписью или ПриЗаписи для справочника Номенклатура:

// В общем модуле расширения или доработки
Процедура СинхронизацияАртикулаИSKUПередЗаписью(Источник, Отказ) Экспорт
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Проверяем, что артикул заполнен и состоит из цифр
    Если ЗначениеЗаполнено(Источник.Артикул) Тогда
        Попытка
            ЧисловойКод = Число(СокрЛП(Источник.Артикул));
            
            МенеджерЗаписи = РегистрыСведений.КодыТоваровSKU.СоздатьМенеджерЗаписи();
            МенеджерЗаписи.Номенклатура = Источник.Ссылка;
            МенеджерЗаписи.Прочитать();
            
            Если МенеджерЗаписи.SKU <> ЧисловойКод Тогда
                МенеджерЗаписи.Номенклатура = Источник.Ссылка;
                МенеджерЗаписи.SKU = ЧисловойКод;
                МенеджерЗаписи.Записать(Истина);
            КонецЕсли;
        Исключение
            // Обработка нечисловых символов в артикуле
        КонецПопытки;
    КонецЕсли;
КонецПроцедуры

Такой подход избавляет от изменения сложных общих модулей обработки штрихкодов кассового узла и сохраняет штатную выгрузку в фасовочные весы.

Решение 2. Модификация функции ПолученШтрихкодИзСШК

Если специфика проекта или весового оборудования жестко требует разбора нестандартной структуры (5 символов артикула + 7 символов веса без префикса фасовки), разберем доработку функции ПолученШтрихкодИзСШК. Чтобы не снимать конфигурацию с поддержки, перенесем логику в расширение конфигурации с использованием аннотации &Вместо или &ИзменениеИКонтроль.

Выясним причину ошибок в исходном коде: в типовом модуле длина кода и смещение позиции веса рассчитываются из констант префиксов. Если префикс отсутствует, а артикул начинается с первого символа, смещения должны быть пересчитаны жестко:

  1. Артикул считывается методом Лев(Штрихкод, 5) или Сред(Штрихкод, 1, 5).
  2. Весовая составляющая считывается методом Сред(Штрихкод, 6, 7) — строго 7 символов до 12-го знака включительно, отсекая 13-й контрольный символ.
  3. Запрос переписывается на соединение со справочником Номенклатура по полю Артикул вместо регистра КодыТоваровSKU.

Посмотрим на исправленный фрагмент кода для перехвата штрихкода весового товара:


// Фрагмент доработанной процедуры разбора штрихкода
Если ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13 И СтрДлина(Штрихкод) = 13 Тогда
    
    // Проверяем условие задачи: штрихкод начинается с цифры 2
    Если Лев(Штрихкод, 1) = "2" Тогда
        
        АртикулТовара = СокрЛП(Сред(Штрихкод, 1, 5));
        СтрокаВеса = Сред(Штрихкод, 6, 7); // 4 знака целых, 3 знака дробных
        
        Попытка
            ВесТовара = Число(СтрокаВеса) / 1000;
        Исключение
            ВесТовара = 0;
        КонецПопытки;
        
        Если ВесТовара > 0 Тогда
            Запрос = Новый Запрос;
            Запрос.Текст = 
                "ВЫБРАТЬ ПЕРВЫЕ 1
                |	Номенклатура.Ссылка КАК Номенклатура,
                |	ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК Характеристика,
                |	ЗНАЧЕНИЕ(Справочник.УпаковкиНоменклатуры.ПустаяСсылка) КАК Упаковка,
                |	&Количество КАК Количество
                |ИЗ
                |	Справочник.Номенклатура КАК Номенклатура
                |ГДЕ
                |	Номенклатура.Артикул = &Артикул
                |	И НЕ Номенклатура.ЭтоГруппа";
            
            Запрос.УстановитьПараметр("Артикул", АртикулТовара);
            Запрос.УстановитьПараметр("Количество", ВесТовара);
            
            РезультатЗапроса = Запрос.Выполнить();
            
            Если НЕ РезультатЗапроса.Пустой() Тогда
                Выборка = РезультатЗапроса.Выбрать();
                Выборка.Следующий();
                
                НеизвестныеДанныеПО = Ложь;
                СтруктураПараметров = Новый Структура;
                СтруктураПараметров.Вставить("НеизвестныеДанныеПО", НеизвестныеДанныеПО);
                СтруктураПараметров.Вставить("ЗначенияПоиска", Новый Массив);
                СтруктураПараметров.Вставить("Действие", "ПроверкаВесовыхТоваров");
                СтруктураПараметров.Вставить("ДанныеПО", Штрихкод);
                
                СтруктураШтрихкода = Новый Структура;
                ОбщегоНазначенияРТ.ПеренестиСтрокуВыборкиВСтруктуру(РезультатЗапроса, Выборка, СтруктураШтрихкода);
                
                Если СтруктураДействий.Свойство("ИспользоватьКоличество") Тогда
                    СтруктураШтрихкода.Количество = СтруктураШтрихкода.Количество * СтруктураДействий.ИспользоватьКоличество;
                КонецЕсли;
                
                СтруктураПараметров.ЗначенияПоиска.Добавить(СтруктураШтрихкода);
                СтруктураПараметровКлиента = Форма.ОбработатьДанныеПОВФормеСервер(СтруктураПараметров, СтруктураПараметровКлиента);
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

Сравнение подходов и рекомендации

Проанализируем плюсы и минусы обоих решений:

  1. Использование регистра КодыТоваровSKU: сохраняет совместимость с драйверами торгового оборудования БПО, гарантирует быструю работу за счет индексации регистра и исключает ошибки при последующих обновлениях конфигурации.
  2. Прямой поиск по реквизиту Артикул: решает узкую задачу конкретного ТЗ, однако требует обязательного контроля уникальности артикулов со стороны пользователей и доработки правил выгрузки для весов с печатью этикеток.

Для надежной промышленной эксплуатации в 1С:Розница 2.2 оптимально использовать синхронизацию поля Артикул со штатным регистром КодыТоваровSKU, избегая вмешательства в алгоритмы обработки торгового оборудования.

← На главную