В практической деятельности торговых предприятий часто возникает классическая проблема: для одной номенклатурной позиции в базе данных зарегистрировано несколько штрихкодов. Это происходит по разным причинам. Например, у товара меняется поставщик, сам производитель проводит ребрендинг и меняет кодировку, либо под одной карточкой номенклатуры продаются аналогичные товары от разных заводов. Наличие нескольких штрихкодов в базе «1С» полезно для инвентаризации, оперативного поиска и работы кассира на кассе (ККМ), так как система без труда распознает любой из них.
Однако при печати ценников, этикеток, оформлении заказов покупателей или выгрузке данных во внешние системы (например, ТСД или весы с печатью этикеток) возникает путаница. Программа должна выбрать какой-то один, «основной» штрихкод. Давайте подробно проанализируем эту ситуацию и разберем наиболее эффективные технические и методологические способы решения этой проблемы в типовых конфигурациях «1С:Управление торговлей 11» (УТ) и «1С:Розница 2/3».
В современных конфигурациях «1С» на платформе 8.3 штрихкоды хранятся в подчиненном регистре сведений РегистрСведений.ШтрихкодыНоменклатуры (или аналогичном, в зависимости от версии). Связь в базе данных реализована по принципу «один ко многим»: одной карточке номенклатуры может соответствовать неограниченное количество записей в регистре штрихкодов.
При этом стандартные механизмы печати этикеток и ценников при формировании макета выполняют простой запрос к базе данных. Если для номенклатуры найдено несколько записей, система, как правило, берет самый первый созданный штрихкод (с минимальным внутренним идентификатором) или выводит их случайным образом, что далеко не всегда совпадает с актуальным кодом на упаковке товара. Выясним, как мы можем это исправить.
Это наиболее гибкий, технологичный и правильный способ с точки зрения программирования. Он позволяет сохранить типовую конфигурацию на полной поддержке. Мы добавим в регистр сведений «Штрихкоды номенклатуры» новый реквизит и доработаем логику выбора штрихкода для печати.
Разберем этот процесс по шагам:
ШтрихкодыНоменклатуры.Основной с типом данных Булево.Рассмотрим пример кода на языке «1С», который можно разместить в модуле набора записей регистра штрихкодов в расширении для контроля уникальности флага:
Процедура ПередЗаписью(Отказ, Замещение)
// Проверим, устанавливается ли флаг "Основной" для текущей записи
Для Каждого Запись Из ЭтотОбъект Цикл
Если Запись.Основной Тогда
// Блокируем и снимаем признак основного у других штрихкодов этой номенклатуры
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Штрихкоды.Номенклатура КАК Номенклатура,
| Штрихкоды.Характеристика КАК Характеристика,
| Штрихкоды.Штрихкод КАК Штрихкод
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды
|ГДЕ
| Штрихкоды.Номенклатура = &Номенклатура
| И Штрихкоды.Характеристика = &Характеристика
| И Штрихкоды.Штрихкод <> &ТекущийШтрихкод
| И Штрихкоды.Основной = ИСТИНА";
Запрос.УстановитьПараметр("Номенклатура", Запись.Номенклатура);
Запрос.УстановитьПараметр("Характеристика", Запись.Характеристика);
Запрос.УстановитьПараметр("ТекущийШтрихкод", Запись.Штрихкод);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Создаем менеджер записи для сброса флага у старого основного штрихкода
МенеджерЗаписи = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Номенклатура = Выборка.Номенклатура;
МенеджерЗаписи.Характеристика = Выборка.Характеристика;
МенеджерЗаписи.Штрихкод = Выборка.Штрихкод;
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
МенеджерЗаписи.Основной = Ложь;
МенеджерЗаписи.Записать(Истина);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
После реализации этой логики нам останется только скорректировать запрос в функции получения штрихкода для печати этикеток (в модуле менеджера или в обработке печати), добавив условие приоритетного выбора записи, где Основной = ИСТИНА.
Если изменять конфигурацию категорически нельзя (например, база находится на жестком аудите или облачном хостинге), можно использовать встроенный аналитический механизм упаковок (единиц измерения).
Проанализируем этот метод подробнее:
Еще один оригинальный бескодовый метод — это разделение штрихкодов по типам или символьным маскам. В системе «1С» поддерживаются различные типы кодирования: EAN-13, EAN-8, Code 128, Code 39 и другие.
Рассмотрим, как это применить на практике:
Если предприятие печатает на ценниках собственные внутренние штрихкоды (например, начинающиеся на префикс «20» или «29»), а штрихкоды поставщиков использует только для приемки и инвентаризации, то в шаблоне ценника можно настроить фильтрацию.
При использовании внешней обработки печати этикеток мы можем задать жесткое правило:
// Пример фильтрации штрихкодов в запросе обработки печати
ВЫБРАТЬ
Штрихкоды.Номенклатура КАК Номенклатура,
Штрихкоды.Штрихкод КАК Штрихкод
ИЗ
РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды
ГДЕ
Штрихкоды.Номенклатура В (&МассивНоменклатуры)
И Штрихкоды.Штрихкод ПОДОБНО "2%" // Выбираем только наши внутренние коды штучного товара
Или, как вариант, можно записывать «основной» штрихкод в формате, отличном от стандартного EAN-13 (например, Code 128), и выводить на ценник именно его через программную обработку выбора типов кодирования.
Многие крупные торговые сети используют радикальный, но максимально надежный подход к учету — полный отказ от использования разнородных штрихкодов поставщиков на ценниках.
Рассмотрим логику этого процесса:
Преимущества метода: Абсолютное исключение пересортицы на складе и кассе, высокая скорость работы персонала, отсутствие необходимости дорабатывать программный код «1С».
Недостатки: Дополнительные расходы на расходные материалы (термотрансферная лента, этикетки) и временные затраты сотрудников склада на физическую переклейку кодов при приемке.
Выбор конкретного решения зависит от масштаба вашего бизнеса и готовности к изменениям в программе: