В современных реалиях розничной и оптовой торговли часто возникает задача совместить на одной этикетке два типа кодов: DataMatrix (для системы «Честный ЗНАК») и классический линейный штрихкод EAN-13 (для внутренней логистики или требований маркетплейсов). В типовой конфигурации 1С:Управление торговлей 11.5 пользователи часто сталкиваются с тем, что при попытке вывести оба кода система выдает ошибку Invalid Code, либо некорректно дублирует один и тот же код в обоих полях — решить эту проблему поможет готовая печатная форма GTIN и DataMatrix для Честного ЗНАКа.
В этой статье мы разберем причины возникновения таких конфликтов и рассмотрим несколько способов решения задачи: от использования специальных шрифтов до печати кодов маркировки с криптохвостом и программной доработки механизмов печати. Для прямой генерации и маркировки есть модуль генерации и печати кодов DataMatrix из 1С.
Прежде чем переходить к решениям, проанализируем ситуацию. Основная сложность заключается в том, как 1С работает с компонентой печати штрихкодов. Рассмотрим ключевые факторы:
1С:Печать штрихкодов может инициализироваться с параметрами последнего объекта. Если первый код был DataMatrix, а второй — EAN-13, компонента может попытаться отрисовать оба как DataMatrix, что приведет к визуальной ошибке или сообщению о неверном формате данных.Invalid Code.Один из самых надежных «дедовских» способов обойти ограничения графической компоненты — это использование текстовых шрифтов, имитирующих штрихкод. В этом случае линейный штрихкод выводится как обычная строка текста, а DataMatrix — как картинка или графический объект. Рассмотрим, как это реализовать.
Для начала нам понадобится шрифт, например, EanBwrP36Tt или аналогичный. Его необходимо установить в операционную систему на сервере и на рабочих местах пользователей. Далее создадим функцию для преобразования цифрового кода в строку, понятную шрифту. Проанализируем пример кода для кодирования EAN-13:
Функция КодируемШтрихКод(Парам)
Если СтрДлина(Парам) <> 13 Тогда
Возврат "1234567890123"; // Возврат значения по умолчанию при ошибке
КонецЕсли;
ПечШтрих = "";
Код = Парам;
Ф = Новый Массив(11);
Ф[1]="000000"; Ф[2]="001011"; Ф[3]="001101"; Ф[4]="001110"; Ф[5]="010011";
Ф[6]="011001"; Ф[7]="011100"; Ф[8]="010101"; Ф[9]="010110"; Ф[10]="011010";
Маска = "" + Лев(СокрЛП(Код),1) + Ф[Число(Лев(СокрЛП(Код),1)) + 1] + "222222";
Дл = СтрДлина(Код);
Для ИИ = 1 По Дл Цикл
Если ИИ = 1 Тогда
Стр1 = "" + Лев(СокрЛП(Код), 1);
Иначе
СимволМаски = Сред(Маска, ИИ, 1);
Если СимволМаски = "0" Тогда
Стр1 = Символ(65 + Сред(Код, ИИ, 1));
ИначеЕсли СимволМаски = "1" Тогда
Стр1 = Символ(75 + Сред(Код, ИИ, 1));
ИначеЕсли СимволМаски = "2" Тогда
Стр1 = Символ(97 + Сред(Код, ИИ, 1));
КонецЕсли;
КонецЕсли;
ПечШтрих = ПечШтрих + Стр1;
Если ИИ = 7 Тогда
ПечШтрих = ПечШтрих + "*";
ИначеЕсли ИИ = 13 Тогда
ПечШтрих = ПечШтрих + "+";
КонецЕсли;
КонецЦикла;
Возврат ПечШтрих;
КонецФункции
Полученную строку мы выводим в ячейку табличного документа, для которой установлен шрифт EAN-13. Таким образом, графический движок 1С отрисовывает только DataMatrix, а линейный штрихкод выводится как текст, что исключает любые конфликты компонент.
Если мы хотим использовать стандартные возможности редактора этикеток или применить конструктор печатных форм (для этого есть универсальный конструктор печатных форм с QR-кодами), нам придется вмешаться в процесс подготовки данных. В УТ 11.5 за это отвечает модуль менеджера обработки ПечатьЭтикетокИЦенников.
Выясним алгоритм действий:
ПодготовитьСтруктуруДанных (или аналогичную, в зависимости от версии БСП).ШтрихкодДляМаркировки.ШтрихкодыНоменклатуры для текущей позиции. Также можно использовать готовые внешние печатные формы для УТ 11.5 для ускорения разработки — для автоматизации этого процесса подойдёт готовое решение маркировки и печати этикеток.Пример добавления поля в структуру данных (схематично):
&После("ЗаполнитьДанныеДляПечати")
Процедура Расш_ЗаполнитьДанныеДляПечати(ДанныеОбъекта, СтруктураДанных)
// Получаем штрихкод номенклатуры, если мы в режиме печати маркировки
Если ДанныеОбъекта.Свойство("Номенклатура") Тогда
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ТОП 1 Штрихкод ИЗ Справочник.ШтрихкодыНоменклатуры ГДЕ Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Номенклатура", ДанныеОбъекта.Номенклатура);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СтруктураДанных.Вставить("ОбычныйШтрихкод", Выборка.Штрихкод);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
После такой доработки в редакторе шаблона этикеток для маркировки появится доступ к полю ОбычныйШтрихкод, который можно будет разместить рядом с КодомМаркировки.
Рассмотрим несколько практических советов по настройке самого макета этикетки, чтобы избежать графических артефактов:
Вывести() последовательно. Иногда это помогает компоненте корректно переинициализироваться.Картинка. Это полностью снимает проблему «Invalid Code» на стороне клиента.Проанализируем ситуацию с точки зрения бизнес-логики. Часто программисты пытаются убедить клиента, что DataMatrix достаточно, так как он содержит в себе GTIN. Однако наличие отдельного EAN-13 оправдано следующими факторами:
Резюме: Для реализации задачи в УТ 11.5 лучше всего использовать комбинированный подход: программное добавление недостающих полей через расширение и вывод линейного штрихкода с помощью шрифтов для максимальной стабильности печати.