Как выбрать и напечатать один основной штрихкод для товара в 1С при наличии нескольких кодов?

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

В практической деятельности торговых предприятий часто возникает классическая проблема: для одной номенклатурной позиции в базе данных зарегистрировано несколько штрихкодов. Это происходит по разным причинам. Например, у товара меняется поставщик, сам производитель проводит ребрендинг и меняет кодировку, либо под одной карточкой номенклатуры продаются аналогичные товары от разных заводов. Наличие нескольких штрихкодов в базе «1С» полезно для инвентаризации, оперативного поиска и работы кассира на кассе (ККМ), так как система без труда распознает любой из них.

Однако при печати ценников, этикеток, оформлении заказов покупателей или выгрузке данных во внешние системы (например, ТСД или весы с печатью этикеток) возникает путаница. Программа должна выбрать какой-то один, «основной» штрихкод. Давайте подробно проанализируем эту ситуацию и разберем наиболее эффективные технические и методологические способы решения этой проблемы в типовых конфигурациях «1С:Управление торговлей 11» (УТ) и «1С:Розница 2/3».

Почему в типовых конфигурациях возникает эта проблема?

В современных конфигурациях «1С» на платформе 8.3 штрихкоды хранятся в подчиненном регистре сведений РегистрСведений.ШтрихкодыНоменклатуры (или аналогичном, в зависимости от версии). Связь в базе данных реализована по принципу «один ко многим»: одной карточке номенклатуры может соответствовать неограниченное количество записей в регистре штрихкодов.

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

Решение 1. Доработка конфигурации через Расширение (Добавление признака «Основной»)

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

Разберем этот процесс по шагам:

  1. Создадим новое Расширение конфигурации в конфигураторе.
  2. Перенесем в расширение регистр сведений ШтрихкодыНоменклатуры.
  3. Добавим в расширении к этому регистру новый реквизит Основной с типом данных Булево.
  4. Вынесем этот реквизит на форму записи и форму списка регистра, чтобы пользователи могли вручную устанавливать флаг для актуального штрихкода.
  5. Напишем обработчик, который при установке флага «Основной» для одной записи автоматически будет снимать этот флаг у других штрихкодов этой же номенклатуры.

Рассмотрим пример кода на языке «1С», который можно разместить в модуле набора записей регистра штрихкодов в расширении для контроля уникальности флага:


Процедура ПередЗаписью(Отказ, Замещение)
    
    // Проверим, устанавливается ли флаг "Основной" для текущей записи
    Для Каждого Запись Из ЭтотОбъект Цикл
        Если Запись.Основной Тогда
            // Блокируем и снимаем признак основного у других штрихкодов этой номенклатуры
            Запрос = Новый Запрос;
            Запрос.Текст = 
                "ВЫБРАТЬ
                |	Штрихкоды.Номенклатура КАК Номенклатура,
                |	Штрихкоды.Характеристика КАК Характеристика,
                |	Штрихкоды.Штрихкод КАК Штрихкод
                |ИЗ
                |	РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды
                |ГДЕ
                |	Штрихкоды.Номенклатура = &Номенклатура
                |	И Штрихкоды.Характеристика = &Характеристика
                |	И Штрихкоды.Штрихкод <> &ТекущийШтрихкод
                |	И Штрихкоды.Основной = ИСТИНА";
            
            Запрос.УстановитьПараметр("Номенклатура", Запись.Номенклатура);
            Запрос.УстановитьПараметр("Характеристика", Запись.Характеристика);
            Запрос.УстановитьПараметр("ТекущийШтрихкод", Запись.Штрихкод);
            
            РезультатЗапроса = Запрос.Выполнить();
            Если Не РезультатЗапроса.Пустой() Выборка = РезультатЗапроса.Выбрать();
                Пока Выборка.Следующий() Цикл
                    // Создаем менеджер записи для сброса флага у старого основного штрихкода
                    МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
                    МенеджерЗаписи.Номенклатура = Выборка.Номенклатура;
                    МенеджерЗаписи.Характеристика = Выборка.Характеристика;
                    МенеджерЗаписи.Штрихкод = Выборка.Штрихкод;
                    МенеджерЗаписи.Прочитать();
                    Если МенеджерЗаписи.Выбран() Тогда
                        МенеджерЗаписи.Основной = Ложь;
                        МенеджерЗаписи.Записать(Истина);
                    КонецЕсли;
                КонецЦикла;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры

После реализации этой логики нам останется только скорректировать запрос в функции получения штрихкода для печати этикеток (в модуле менеджера или в обработке печати), добавив условие приоритетного выбора записи, где Основной = ИСТИНА.

Решение 2. Использование механизма «Упаковок» (Типовой функционал)

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

Проанализируем этот метод подробнее:

Решение 3. Фильтрация по типу или диапазону штрихкодов

Еще один оригинальный бескодовый метод — это разделение штрихкодов по типам или символьным маскам. В системе «1С» поддерживаются различные типы кодирования: EAN-13, EAN-8, Code 128, Code 39 и другие.

Рассмотрим, как это применить на практике:

Если предприятие печатает на ценниках собственные внутренние штрихкоды (например, начинающиеся на префикс «20» или «29»), а штрихкоды поставщиков использует только для приемки и инвентаризации, то в шаблоне ценника можно настроить фильтрацию.

При использовании внешней обработки печати этикеток мы можем задать жесткое правило:


// Пример фильтрации штрихкодов в запросе обработки печати
ВЫБРАТЬ
    Штрихкоды.Номенклатура КАК Номенклатура,
    Штрихкоды.Штрихкод КАК Штрихкод
ИЗ
    РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды
ГДЕ
    Штрихкоды.Номенклатура В (&МассивНоменклатуры)
    И Штрихкоды.Штрихкод ПОДОБНО "2%" // Выбираем только наши внутренние коды штучного товара

Или, как вариант, можно записывать «основной» штрихкод в формате, отличном от стандартного EAN-13 (например, Code 128), и выводить на ценник именно его через программную обработку выбора типов кодирования.

Решение 4. Организационный подход: Перемаркировка и очистка базы

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

Рассмотрим логику этого процесса:

  1. При поступлении товара, если у него отсутствует единый внутренний штрихкод компании, система автоматически генерирует уникальный внутренний код (EAN-13 на основе кода номенклатуры).
  2. Этот код распечатывается на принтере этикеток и наклеивается поверх заводской упаковки.
  3. Все старые штрихкоды поставщиков удаляются из базы данных, либо переносятся в архивный регистр сведений, не участвующий в оперативной печати ценников.

Преимущества метода: Абсолютное исключение пересортицы на складе и кассе, высокая скорость работы персонала, отсутствие необходимости дорабатывать программный код «1С».

Недостатки: Дополнительные расходы на расходные материалы (термотрансферная лента, этикетки) и временные затраты сотрудников склада на физическую переклейку кодов при приемке.

Резюме и рекомендации

Выбор конкретного решения зависит от масштаба вашего бизнеса и готовности к изменениям в программе:

← На главную