Почему при печати этикеток в 1С выводится штрихкод 1234567890128 и как это исправить?

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

При формировании печатных форм этикеток, ценников или бейджей сотрудников разработчики нередко сталкиваются с ситуацией, когда вместо переданного из информационной базы штрихкода на печать или предварительный просмотр выводится стандартная комбинация цифр и полос: 1234567890128. При этом под отладчиком значения штрихкода рассчитываются абсолютно корректно, а проверка контрольного символа EAN-13 успешно проходит. Разберем детально, почему возникает подобный сбой и как восстановить правильную печать штрихкодов.

Причины сброса штрихкода на значение по умолчанию

Значение 1234567890128 является жестко прошитым тестовым шаблоном по умолчанию в элементе управления ActiveX внешней компоненты 1С:Печать штрихкодов (1CBarCode.dll). Подмена реального значения на стандартное происходит в следующих случаях:

  1. Особенности клонирования объектов ActiveX при выводе области: когда в коде заполняются свойства объекта в макете до вызова метода ТабДок.Вывести(Область) или ТабДок.Присоединить(Область), платформа 1С выполняет копирование и пересоздание ActiveX-элемента. В ряде версий платформы и компоненты параметры инициализации нового экземпляра теряются, и элемент управления отображает значение по умолчанию.
  2. Несоответствие версии компоненты: обновленные версии внешней компоненты (в частности, 8.0.16.4 и выше) имеют более жесткие требования к геометрическим пропорциям области и отступам. При нехватке места код не генерируется, а выводится дефолтный шаблон.
  3. Несоответствие физического размера области рисунка в макете: если рамка объекта штрихкода слишком узкая для типа кода (например, с учетом контрольного символа и текста подписи), компонента не может отрисовать полосы в заданных границах и сбрасывает значение.
  4. Масштабирование экрана (DPI) в терминальной сессии: после переустановки операционной системы или при подключении через RDP системный масштаб (125% или 150%) может искажать расчетные пиксельные размеры контейнера ActiveX в табличном документе.

Способ 1. Заполнение свойств объекта после вывода области в табличный документ

Проанализируем типовой фрагмент формирования этикетки. Часто разработчики передают значение штрихкода непосредственно в полученную область макета:


Если РаботаСТорговымОборудованием.ПроверитьШтрихКод(СтрокаИзСписка.Штрихкод, СтрокаИзСписка.ТипШтрихкода) Тогда
    ЭтикеткаОбласть.Рисунки.Штрихкод.Объект.ТипКода = ТипКода;
    ЭтикеткаОбласть.Рисунки.Штрихкод.Объект.Сообщение = СтрокаИзСписка.Штрихкод;
    ЭтикеткаОбласть.Рисунки.Штрихкод.Объект.ТекстКода = СтрокаИзСписка.Штрихкод;
    
    ТабДокумент.Вывести(ЭтикеткаОбласть);
КонецЕсли;

Чтобы избежать сброса параметров при сериализации объекта ActiveX, изменим порядок работы. Выведем область в итоговый табличный документ, после чего обратимся к последнему добавленному рисунку результирующего документа и установим его свойства:


Если РаботаСТорговымОборудованием.ПроверитьШтрихКод(СтрокаИзСписка.Штрихкод, СтрокаИзСписка.ТипШтрихкода) Тогда
    // Сначала выводим область в результирующий документ
    ТабДокумент.Вывести(ЭтикеткаОбласть);
    
    // Получаем добавленный рисунок в итоговом документе
    ИндексРисунка = ТабДокумент.Рисунки.Количество() - 1;
    ОбъектШК = ТабДокумент.Рисунки[ИндексРисунка].Объект;
    
    // Заполняем свойства конкретного экземпляра ActiveX
    ОбъектШК.ТипКода   = ТипКода;
    ОбъектШК.Сообщение = СтрокаИзСписка.Штрихкод;
    ОбъектШК.ТекстКода = СтрокаИзСписка.Штрихкод;
КонецЕсли;

Способ 2. Откат или корректная регистрация версии компоненты печати штрихкодов

Рассмотрим вариант, когда на чистую операционную систему была установлена новая версия компоненты (например, 8.0.16.4), переставшая корректно отрабатывать старые алгоритмы конфигураций на обычных формах (УТ 2.3, УПП 1.3, КА 1.1). Пошагово выполним следующие действия:

  1. Удалим текущую версию компоненты через Панель управления → Программы и компоненты.
  2. Установим стабильную предыдущую версию компоненты (например, релиз 8.0.14.2 или 8.0.15.1), которая входит в состав большинства дистрибутивов конфигураций прошлых лет.
  3. Зарегистрируем 32-разрядную библиотеку вручную от имени администратора. Для этого запустим командную строку cmd.exe от имени Администратора и выполним команду:
    
    C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1C\1CBCode\1CBarCode.dll"
    
  4. Убедимся, что на сервере установлены необходимые пакеты распространяемых компонентов Microsoft Visual C++ Redistributable (x86), нужные для математических расчетов графической подсистемы компоненты.

Способ 3. Корректировка геометрии рисунка в макете

Выясним, не связана ли проблема с геометрическими ограничениями макета печатной формы:

  1. Откроем макет печатной формы в конфигураторе или режиме предприятия.
  2. Выделим объект штрихкода и увеличим его ширину и высоту на несколько миллиметров.
  3. В свойствах объекта ActiveX штрихкода проверим параметры отступов (полей) и размера шрифта. Если размер шрифта подписи слишком велик, компонента резервирует место под текст и не может вместить штрихи кода в оставшуюся высоту, что приводит к возврату значения по умолчанию.

Способ 4. Переход на генерацию штрихкодов через Native-компоненту или шрифты

Элементы управления ActiveX являются устаревшей технологией, зависящей от 32-разрядного окружения и контекста графической сессии Windows. Для долгосрочного решения задачи печати рассмотрим альтернативные варианты:

  1. Использование Native-компоненты БПО: компонента генерации штрихкодов из Библиотеки подключаемого оборудования формирует готовое растровое изображение (PNG/BMP) в памяти. Полученная картинка помещается в обычный рисунок табличного документа с типом ТипРисункаТабличногоДокумента.Картинка. Это устраняет любые сбои ActiveX и обеспечивает независимость от разрядности клиента.
  2. Использование TrueType-шрифтов: для простых штрихкодов (Code 128, Code 39) можно использовать специализированные шрифты штрихкодирования непосредственно в ячейках табличного документа без внешних библиотек.
← На главную