При формировании печатных форм с выводом штрихкодов (например, ТОРГ-12, товарно-транспортных накладных или ценников) специалисты часто сталкиваются со следующей ошибкой выполнения модуля:
{ВнешняяОбработка.ТОРГ12.МодульОбъекта(432)}: Поле объекта не обнаружено (ТипКода)
ОбластьМакета.Рисунки.Штрихкод1.Объект.ТипКода = ПолучитьЗначениеТипаШтрихкодаДляЭУ(ПланыВидовХарактеристик.ТипыШтрихкодов.EAN13);
Проанализируем ситуацию, выясним техническую причину появления этой проблемы и рассмотрим все доступные способы её решения.
Данная ошибка возникает из-за конфликта разрядности платформы 1С и внешней компоненты печати штрихкодов:
1CBarCod.dll) представляет собой 32-разрядный элемент ActiveX (OLE/COM).Объект у элемента рисунка Штрихкод1 остается равным Неопределено, и при обращении к его свойствам (ТипКода, ТекстКода, Сообщение) платформа выдает исключение «Поле объекта не обнаружено».Также следует учитывать, что ActiveX-компоненты принципиально не поддерживаются на стороне сервера 1С (в фоновых заданиях или при вызове серверных процедур), независимо от разрядности сервера.
Самый быстрый и эффективный способ вернуть работоспособность печатным формам, использующим ActiveX-компоненту — запустить 32-разрядную версию тонкого или толстого клиента «1С:Предприятие 8.3».
Разберем по шагам, как это настроить:
Для долгосрочного решения задачи и обеспечения независимости от разрядности клиента и сервера рекомендуется перевести вывод штрихкодов на механизм Native API.
Преимущества данного подхода:
Внешние компоненты Native API поставляются сразу в двух сборках (32-бит и 64-бит) и корректно исполняются как на клиенте, так и на сервере 1С.
Рассмотрим алгоритм переработки обработки:
Штрихкод).Картинка:
ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "BarCode", ТипВнешнейКомпоненты.Native);
Компонента = Новый("AddIn.BarCode.BarcodeExtension");
// Настройка параметров штрихкода
Компонента.АвтоТип = Ложь;
Компонента.ТипКода = 4; // EAN13
Компонента.Текст = "2000000000015";
Компонента.Ширина = 300;
Компонента.Высота = 150;
// Получаем картинку в виде двоичных данных
КартинкаДвоичныеДанные = Компонента.ПолучитьШтрихкод();
ОбластьМакета.Рисунки.Штрихкод.Картинка = Новый Картинка(КартинкаДвоичныеДанные);
Ещё один универсальный способ, не зависящий от разрядности платформы — выводить штрихкод с помощью шрифтов (BarCode Fonts, например, EAN-13, Code 128, GS1-128).
Рассмотрим особенность этого метода:
EAN13.ttf).Если нет возможности изменять макет или подключать компоненты Native API, штрихкод можно генерировать внешними утилитами или графическими библиотеками во временный файл формата PNG/BMP.
Рассмотрим пример загрузки готового файла в макет:
ИмяФайлаКартинки = ПолучитьИмяВременногоФайла("png");
// ... Вызов внешнего генератора, который сохраняет картинку по пути ИмяФайлаКартинки ...
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайлаКартинки);
ОбластьМакета.Рисунки.Штрихкод.Картинка = Новый Картинка(ДвоичныеДанные);
УдалитьФайлы(ИмяФайлаКартинки);
При переходе на платформу 1С 8.3 и серверные 64-битные системы старые ActiveX-компоненты печати штрихкодов (1CBarCod.dll) перестают работать. Для оперативного исправления ошибки вызовов ТипКода достаточно переключить запуск базы на 32-разрядный клиент (x86). Для стратегического решения проблемы следует перевести макеты печатных форм на компоненты Native API или шрифты штрихкодов.