Как одновременно напечатать QR-код DataMatrix и обычный штрихкод на одной этикетке в 1С:УТ 11.5?

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

В современных реалиях розничной и оптовой торговли часто возникает задача совместить на одной этикетке два типа кодов: DataMatrix (для системы «Честный ЗНАК») и классический линейный штрихкод EAN-13 (для внутренней логистики или требований маркетплейсов). В типовой конфигурации 1С:Управление торговлей 11.5 пользователи часто сталкиваются с тем, что при попытке вывести оба кода система выдает ошибку Invalid Code, либо некорректно дублирует один и тот же код в обоих полях — решить эту проблему поможет готовая печатная форма GTIN и DataMatrix для Честного ЗНАКа.

В этой статье мы разберем причины возникновения таких конфликтов и рассмотрим несколько способов решения задачи: от использования специальных шрифтов до печати кодов маркировки с криптохвостом и программной доработки механизмов печати. Для прямой генерации и маркировки есть модуль генерации и печати кодов DataMatrix из 1С.

Разберем причины возникновения проблемы

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

  1. Конфликт внешней компоненты: Когда на одну область макета выводятся два объекта типа «Штрихкод», внешняя компонента 1С:Печать штрихкодов может инициализироваться с параметрами последнего объекта. Если первый код был DataMatrix, а второй — EAN-13, компонента может попытаться отрисовать оба как DataMatrix, что приведет к визуальной ошибке или сообщению о неверном формате данных.
  2. Ограничения типов шаблонов: В УТ 11.5 шаблоны этикеток строго разделены по назначению. Шаблон «Этикетка для маркировки» оперирует данными из регистров ИС МП и «не видит» обычные штрихкоды номенклатуры. В то же время шаблон «Этикетка для товаров» не имеет прямого доступа к кодам маркировки.
  3. Несоответствие данных (GTIN vs EAN): В коде маркировки зашит GTIN, который обычно имеет длину 14 символов (с ведущим нулем). Стандартный EAN-13 требует строго 13 символов. Попытка передать 14 знаков в объект, настроенный на EAN-13, моментально вызывает ошибку Invalid Code.

Способ 1: Использование шрифтов (наиболее стабильный вариант)

Один из самых надежных «дедовских» способов обойти ограничения графической компоненты — это использование текстовых шрифтов, имитирующих штрихкод. В этом случае линейный штрихкод выводится как обычная строка текста, а 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, а линейный штрихкод выводится как текст, что исключает любые конфликты компонент.

Способ 2: Программная доработка через расширение

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

Выясним алгоритм действий:

  1. Создадим Расширение для конфигурации.
  2. В расширении перехватим процедуру ПодготовитьСтруктуруДанных (или аналогичную, в зависимости от версии БСП).
  3. Добавим в структуру данных новое поле, например, ШтрихкодДляМаркировки.
  4. Пропишем логику получения обычного штрихкода из справочника ШтрихкодыНоменклатуры для текущей позиции. Также можно использовать готовые внешние печатные формы для УТ 11.5 для ускорения разработки — для автоматизации этого процесса подойдёт готовое решение маркировки и печати этикеток.

Пример добавления поля в структуру данных (схематично):


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

После такой доработки в редакторе шаблона этикеток для маркировки появится доступ к полю ОбычныйШтрихкод, который можно будет разместить рядом с КодомМаркировки.

Важные нюансы настройки макета

Рассмотрим несколько практических советов по настройке самого макета этикетки, чтобы избежать графических артефактов:

Зачем клиенту два кода на одной этикетке?

Проанализируем ситуацию с точки зрения бизнес-логики. Часто программисты пытаются убедить клиента, что DataMatrix достаточно, так как он содержит в себе GTIN. Однако наличие отдельного EAN-13 оправдано следующими факторами:

  1. Скорость работы: Линейные сканеры на складах и кассах часто считывают 1D-коды быстрее и стабильнее, особенно если этикетка слегка замята.
  2. Универсальность: Не всё оборудование на складе (например, старые ТСД или весы) поддерживает чтение 2D-кодов.
  3. Требования сетей: Крупные ритейлеры часто требуют стандартный штрихкод в строго определенном месте этикетки для автоматизированных сортировочных линий.

Резюме: Для реализации задачи в УТ 11.5 лучше всего использовать комбинированный подход: программное добавление недостающих полей через расширение и вывод линейного штрихкода с помощью шрифтов для максимальной стабильности печати.

← На главную