При разработке печатных форм ценников, этикеток или документов со штрихкодами разработчики часто сталкиваются с ошибкой «Значение "ТипКода" не является значением объектного типа» при попытке инициализировать элемент V8.Barcod. Выясним причину этой ошибки и разберем современный, надежный способ вывода штрихкодов на платформе 1С:Предприятие 8.3.
Проанализируем классическую реализацию, которая работала на обычных формах в 32-разрядных версиях платформы:
Попытка
КомпонентШК = Новый COMОбъект("V8.Barcod");
Исключение
КомпонентШК = Неопределено;
КонецПопытки;
Если этот код выполняется на сервере 1С или в 64-разрядном клиенте, блок перехвата исключения присваивает переменной значение Неопределено. В результате последующее обращение к свойствам объекта (например, КомпонентШК.ТипКода или Ценник.Рисунки.Штрихкод.Объект.ТипКода) приводит к аварийной остановке с ошибкой обращения к объекту, которого не существует.
Рассмотрим ключевые причины сбоя старого подхода:
1CBarCode.ocx является 32-разрядным элементом ActiveX. 64-разрядный рабочий процесс rphost или 64-битный клиент не могут напрямую загрузить 32-битный COM-сервер.regsvr32 с правами администратора на каждом рабочем месте и сервере.В современных типовых конфигурациях (1С:Управление торговлей, 1С:ERP, 1С:Бухгалтерия 3.0, Библиотека подключаемого оборудования) используется нативная кроссплатформенная компонента (Native API). Она хранится непосредственно в метаданных конфигурации в виде двоичных данных общего макета.
Преимущество этого подхода заключается в том, что штрихкод генерируется на сервере в виде графического изображения (картинки) и помещается в ячейку или рисунок табличного документа. Клиентское приложение получает уже готовый табличный документ с картинкой, что полностью исключает зависимость от клиентских библиотек и операционной системы.
Разберем по шагам, как реализовать вывод штрихкода в нетиповой или дорабатываемой конфигурации.
Шаг 1. Подготовка макета конфигурации
Перенесем из любой современной конфигурации (или БПО) общий макет с двоичными данными компоненты (обычно называется КомпонентаПечатиШтрихкодов). В макете печатной формы вставим обычный графический элемент (рисунок типа «Картинка») с именем Штрихкод.
Шаг 2. Инициализация компоненты в программном коде
Рассмотрим пример подключения внешней компоненты из макета на сервере:
&НаСервере
Функция ПолучитьОбъектГенерацииШтрихкода()
ИмяМакета = "ОбщийМакет.КомпонентаПечатиШтрихкодов";
ИмяПодключения = "КартинкаШтрихкода";
ПодключениеВыполнено = ПодключитьВнешнююКомпоненту(ИмяМакета, ИмяПодключения, ТипВнешнейКомпоненты.Native);
Если ПодключениеВыполнено Тогда
Попытка
Возврат Новый("AddIn." + ИмяПодключения + ".Barcode");
Исключение
Возврат Неопределено;
КонецПопытки;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Шаг 3. Формирование изображения и вывод в печатную форму
Посмотрим на пример заполнения области табличного документа с подстановкой сгенерированного изображения:
&НаСервере
Процедура ВывестиШтрихкодВТабличныйДокумент(ТабДок, ДанныеШК)
Макет = Документы.Ценники.ПолучитьМакет("Печать");
ОбластьЦенник = Макет.ПолучитьОбласть("Ценник");
ОбластьЦенник.Параметры.Номер = ДанныеШК.Номер;
ОбластьЦенник.Параметры.Описание = ДанныеШК.Описание;
КомпонентШК = ПолучитьОбъектГенерацииШтрихкода();
Если КомпонентШК <> Неопределено Тогда
// Задаем параметры штрихкода
КомпонентШК.АвтоТип = Ложь;
КомпонентШК.ТипКода = ДанныеШК.ТипКода; // Например, 0 - EAN13, 1 - Code39, 4 - Code128
КомпонентШК.ЗначениеКода = ДанныеШК.ШтрихКод;
КомпонентШК.ОтображатьТекст = Истина;
// Получаем двоичные данные картинки
КартинкаДвоичныеДанные = КомпонентШК.ПолучитьШтрихкод();
Если КартинкаДвоичныеДанные <> Неопределено Тогда
ОбластьЦенник.Рисунки.Штрихкод.Картинка = Новый Картинка(КартинкаДвоичныеДанные);
КонецЕсли;
КонецЕсли;
ТабДок.Вывести(ОбластьЦенник);
КонецПроцедуры
Проанализируем нюансы, которые гарантируют безошибочное считывание штрихкода сканерами:
РазмерКартинки = РазмерКартинки.РеальныйРазмер или РазмерКартинки.Пропорционально. Принудительное растягивание штрихкода по неверной сетке приводит к интерполяции пикселей («размыливанию»), из-за чего сканеры и терминалы сбора данных перестают распознавать код.libpng, libjpeg и актуальная версия libstdc++).