В процессе автоматизации розничной и оптовой торговли пользователи часто сталкиваются с проблемой дублирования наименований товаров. Когда в базе скопилось множество позиций с одинаковыми названиями, а удалять их нельзя из-за истории продаж, единственным надежным способом идентификации становится штрихкодирование. Идеальный вариант в данном случае — использовать уникальный код товара или его артикул в качестве штрихкода. Это решает проблему путаницы на кассе и при проведении инвентаризации.
В этой статье мы подробно разберем, как решить эту задачу в современных конфигурациях 1С на управляемых формах (таких как «1С:Управление торговлей 11» и «1С:Розница 2.2»). Мы рассмотрим как стандартные интерактивные методы без программирования, так и более сложные технические решения: написание обработки для заполнения базы, использование гибких типов кодирования (Code 128/Code 39) и специализированных шрифтов.
Вопреки распространенному мнению, для массового присвоения штрихкодов не обязательно писать внешние обработки. В современных конфигурациях 1С встроен удобный механизм группового создания штрихкодов прямо из рабочего места печати ценников. Рассмотрим этот процесс по шагам:
Система автоматически сгенерирует корректные штрихкоды формата EAN-13 для всех выбранных позиций, учитывая правила внутреннего префикса компании, и запишет их в базу данных. Этот способ полностью безопасен и не требует от вас технических навыков программирования.
Если вам не требуется физически хранить штрихкоды в регистре сведений 1С, а нужно лишь выводить их на ценники для сканирования на кассе, мы можем воспользоваться встроенным редактором шаблонов этикеток. В качестве типа штрихкода мы выберем не жесткий стандарт EAN-13, а более гибкий Code 128 или Code 39. Эти форматы легко поддерживают любую длину строки, буквы, цифры и сохраняют лидирующие нули (например, код «00041278» будет считан сканером именно в таком виде).
Проанализируем алгоритм настройки шаблона:
Встроенная в платформу 1С компонента печати штрихкодов самостоятельно преобразует текстовое значение кода товара в графическое изображение штрихкода при выводе ценника на печать. База данных при этом остается чистой, а сканеры будут без проблем считывать код товара.
Если перед нами стоит задача заполнить базу данных реальными штрихкодами, созданными строго по кодам товаров, нам потребуется написать небольшую процедуру. При написании программного кода важно учитывать структуру современных конфигураций.
Важное предупреждение: в старых версиях 1С штрихкоды хранились в регистре РегистрыСведений.Штрихкоды. В современных конфигурациях на базе БСП (Библиотека стандартных подсистем) этот регистр называется РегистрыСведений.ШтрихкодыНоменклатуры. Запись напрямую в этот регистр (как предлагалось в некоторых сообщениях на форуме) без учета измерений характеристик и упаковок может нарушить целостность данных.
Также важно помнить о международном стандарте EAN-13. Внутренние штрихкоды предприятия должны начинаться с префиксов диапазона от 20 до 29 (или от 200 до 299 в зависимости от разрядности). Если закодировать код товара без префикса, сканеры могут сопоставить его с товарами глобальной базы данных GS1.
Рассмотрим пример готового кода обработки, которая обходит справочник номенклатуры, дополняет коды товаров нулями до нужного формата, вычисляет контрольное число EAN-13 по стандартному математическому алгоритму и корректно записывает данные в современный регистр:
// Создаем запрос для получения списка номенклатуры без штрихкодов
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Код КАК Код
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ЭтоГруппа
| И НЕ Номенклатура.Ссылка В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| Штрихкоды.Номенклатура
| ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды)";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Получаем чистый текстовый код товара
КодТовара = СокрЛП(Выборка.Код);
// Используем внутренний префикс штучного товара "20"
Префикс = "20";
// Вычисляем длину дополнения, чтобы получить 12 символов до контрольной цифры
ДлинаКода = СтрДлина(КодТовара);
Если ДлинаКода > 10 Тогда
// Если код товара слишком длинный для EAN-13, пропускаем или обрезаем
Продолжить;
КонецЕсли;
Нули = "";
Для Сч = 1 По (10 - ДлинаКода) Цикл
Нули = Нули + "0";
КонецЦикла;
// Собираем 12 знаков основы штрихкода
ОсноваШтрихкода = Префикс + Нули + КодТовара;
// Алгоритм расчета контрольного разряда EAN-13
СуммаЧетных = 0;
СуммаНечетных = 0;
Для Сч = 1 По 12 Цикл
Цифра = Число(Сред(ОсноваШтрихкода, Сч, 1));
Если Сч % 2 = 0 Тогда
СуммаЧетных = СуммаЧетных + Цифра;
Иначе
СуммаНечетных = СуммаНечетных + Цифра;
КонецЕсли;
КонецЦикла;
ОбщаяСумма = СуммаНечетных + (СуммаЧетных * 3);
Остаток = ОбщаяСумма % 10;
КонтрольныйРазряд = ?(Остаток = 0, 0, 10 - Остаток);
ИтоговыйШтрихкод = ОсноваШтрихкода + Строка(КонтрольныйРазряд);
// Записываем штрихкод в современный регистр сведений БСП
НаборЗаписей = РегистрыСведений.ШтрихкодыНоменклатуры.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Штрихкод.Установить(ИтоговыйШтрихкод);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Штрихкод = ИтоговыйШтрихкод;
НоваяЗапись.Номенклатура = Выборка.Ссылка;
НоваяЗапись.ТипШтрихкода = ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13;
Попытка
НаборЗаписей.Записать();
Исключение
Сообщить("Не удалось записать штрихкод для: " + Выборка.Ссылка + " Ошибка: " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Этот скрипт можно оформить в виде внешней обработки и запустить один раз в базе данных для того, чтобы автоматически проставить внутренние штрихкоды EAN-13 для всех товаров, у которых их еще нет.
Иногда стандартная компонента генерации изображений штрихкодов 1С дает сбои. Это выражается в виде пустых мест на ценниках или перечеркнутого красного квадрата при выводе на печать. Это происходит из-за отсутствия зарегистрированных библиотек ActiveX или проблем с правами доступа к временным файлам на сервере.
В такой ситуации отличной и очень легкой альтернативой становится использование специализированных шрифтов (например, C39HrP24DhTt или Barcode Font).
Разберем, как реализовать этот подход:
.ttf и нажать кнопку «Установить».Например, если код товара равен 00041278, то в ячейку макета должно передаваться строковое значение *00041278*. На печати этот текст отобразится в виде полноценного штрихкода, который мгновенно и без ошибок считается любым лазерным или фото-сканером.