Как сформировать и распечатать штрихкод в 1С 8.3 на управляемых формах?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке печатных форм ценников, этикеток или документов со штрихкодами разработчики часто сталкиваются с ошибкой «Значение "ТипКода" не является значением объектного типа» при попытке инициализировать элемент V8.Barcod. Выясним причину этой ошибки и разберем современный, надежный способ вывода штрихкодов на платформе 1С:Предприятие 8.3.

Почему возникает ошибка при использовании 1CBarCode через COM

Проанализируем классическую реализацию, которая работала на обычных формах в 32-разрядных версиях платформы:


Попытка
    КомпонентШК = Новый COMОбъект("V8.Barcod");
Исключение
    КомпонентШК = Неопределено;
КонецПопытки;

Если этот код выполняется на сервере 1С или в 64-разрядном клиенте, блок перехвата исключения присваивает переменной значение Неопределено. В результате последующее обращение к свойствам объекта (например, КомпонентШК.ТипКода или Ценник.Рисунки.Штрихкод.Объект.ТипКода) приводит к аварийной остановке с ошибкой обращения к объекту, которого не существует.

Рассмотрим ключевые причины сбоя старого подхода:

  1. Несовместимость разрядности: библиотека 1CBarCode.ocx является 32-разрядным элементом ActiveX. 64-разрядный рабочий процесс rphost или 64-битный клиент не могут напрямую загрузить 32-битный COM-сервер.
  2. Работа на стороне сервера: внедренные в табличный документ элементы управления ActiveX не поддерживаются на сервере 1С (как под Windows, так и под Linux), а также в веб- и тонком клиентах.
  3. Необходимость регистрации в ОС: использование COM-объекта требует обязательной регистрации через regsvr32 с правами администратора на каждом рабочем месте и сервере.

Современное решение: использование Native-компоненты печати штрихкодов

В современных типовых конфигурациях (1С:Управление торговлей, 1С:ERP, 1С:Бухгалтерия 3.0, Библиотека подключаемого оборудования) используется нативная кроссплатформенная компонента (Native API). Она хранится непосредственно в метаданных конфигурации в виде двоичных данных общего макета.

Преимущество этого подхода заключается в том, что штрихкод генерируется на сервере в виде графического изображения (картинки) и помещается в ячейку или рисунок табличного документа. Клиентское приложение получает уже готовый табличный документ с картинкой, что полностью исключает зависимость от клиентских библиотек и операционной системы.

Пошаговое подключение и генерация штрихкода

Разберем по шагам, как реализовать вывод штрихкода в нетиповой или дорабатываемой конфигурации.

Шаг 1. Подготовка макета конфигурации

Перенесем из любой современной конфигурации (или БПО) общий макет с двоичными данными компоненты (обычно называется КомпонентаПечатиШтрихкодов). В макете печатной формы вставим обычный графический элемент (рисунок типа «Картинка») с именем Штрихкод.

Шаг 2. Инициализация компоненты в программном коде

Рассмотрим пример подключения внешней компоненты из макета на сервере:


&НаСервере
Функция ПолучитьОбъектГенерацииШтрихкода()
    
    ИмяМакета = "ОбщийМакет.КомпонентаПечатиШтрихкодов";
    ИмяПодключения = "КартинкаШтрихкода";
    
    ПодключениеВыполнено = ПодключитьВнешнююКомпоненту(ИмяМакета, ИмяПодключения, ТипВнешнейКомпоненты.Native);
    
    Если ПодключениеВыполнено Тогда
        Попытка
            Возврат Новый("AddIn." + ИмяПодключения + ".Barcode");
        Исключение
            Возврат Неопределено;
        КонецПопытки;
    КонецЕсли;
    
    Возврат Неопределено;
    
КонецФункции

Шаг 3. Формирование изображения и вывод в печатную форму

Посмотрим на пример заполнения области табличного документа с подстановкой сгенерированного изображения:


&НаСервере
Процедура ВывестиШтрихкодВТабличныйДокумент(ТабДок, ДанныеШК)
    
    Макет = Документы.Ценники.ПолучитьМакет("Печать");
    ОбластьЦенник = Макет.ПолучитьОбласть("Ценник");
    
    ОбластьЦенник.Параметры.Номер = ДанныеШК.Номер;
    ОбластьЦенник.Параметры.Описание = ДанныеШК.Описание;
    
    КомпонентШК = ПолучитьОбъектГенерацииШтрихкода();
    
    Если КомпонентШК <> Неопределено Тогда
        // Задаем параметры штрихкода
        КомпонентШК.АвтоТип = Ложь;
        КомпонентШК.ТипКода = ДанныеШК.ТипКода; // Например, 0 - EAN13, 1 - Code39, 4 - Code128
        КомпонентШК.ЗначениеКода = ДанныеШК.ШтрихКод;
        КомпонентШК.ОтображатьТекст = Истина;
        
        // Получаем двоичные данные картинки
        КартинкаДвоичныеДанные = КомпонентШК.ПолучитьШтрихкод();
        
        Если КартинкаДвоичныеДанные <> Неопределено Тогда
            ОбластьЦенник.Рисунки.Штрихкод.Картинка = Новый Картинка(КартинкаДвоичныеДанные);
        КонецЕсли;
    КонецЕсли;
    
    ТабДок.Вывести(ОбластьЦенник);
    
КонецПроцедуры

Практические рекомендации по качеству печати и сканированию

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

  1. Пропорции и растягивание: для графического объекта в макете задавайте свойство РазмерКартинки = РазмерКартинки.РеальныйРазмер или РазмерКартинки.Пропорционально. Принудительное растягивание штрихкода по неверной сетке приводит к интерполяции пикселей («размыливанию»), из-за чего сканеры и терминалы сбора данных перестают распознавать код.
  2. Печать через RDP и EasyPrint: при перенаправлении печати через терминальные службы драйверы виртуальной печати могут снижать разрешение графики. Формирование штрихкода с четкими границами в реальном размере предотвращает появление лишних артефактов при сжатии потока печати.
  3. Окружение Linux: если сервер 1С функционирует под управлением ОС Linux, для корректной работы нативной графической компоненты на сервере должны быть установлены системные библиотеки работы с изображениями (в частности, пакеты libpng, libjpeg и актуальная версия libstdc++).
← На главную