При переходе на 64-битный клиент 1С:Предприятие многие разработчики сталкиваются с неприятной ситуацией: привычная компонента 1С:Печать штрихкодов (ActiveX-объект V8.Barcod.1) перестает работать. В коде это проявляется либо ошибкой «Поле объекта не обнаружено (ТипКода)» при обращении к свойствам рисунка в макете, либо невозможностью создать объект через Новый COMОбъект. В этой статье мы подробно разберем, почему это происходит и как решить проблему двумя способами: через настройку COM+ и переход на технологию Native API.
Разберем причину с технической стороны. Проблема заключается в разрядности процессов операционной системы Windows. Старая компонента 1С:Печать штрихкодов версии 8.0.x (файл Barcode.ocx) является 32-битным элементом управления ActiveX. Согласно архитектуре Windows, 64-битный процесс (которым является клиент 1С x64) не может напрямую загружать 32-битные динамические библиотеки (DLL или OCX) в свое адресное пространство.
Рассмотрим ситуацию, описанную в сообщениях форума. Когда вы запускаете 32-битный клиент, 1С успешно находит библиотеку и инициализирует её. Когда же запускается 64-битный клиент, он пытается найти 64-битную версию V8.Barcod.1 в соответствующей ветке реестра. Не находя её или не имея возможности загрузить 32-битный файл, система выдает ошибку. Именно поэтому при отладке мы видим, что тип значения РисунокШтрихкод.Объект определяется как ActiveX, но его внутренние свойства и методы становятся недоступны.
Если вам необходимо заставить старый код работать «здесь и сейчас» без глобальной переработки макетов этикеток, единственным способом является использование службы компонентов Windows COM+. Этот механизм позволяет запустить 32-битную компоненту в отдельном системном процессе dllhost.exe, который будет выступать посредником между 64-битным клиентом 1С и 32-битной библиотекой.
Проанализируем шаги по настройке этого моста:
dcomcnfg).1CBarcode32.Barcode.ocx (обычно он находится в папке установки компоненты 1С).После этой настройки при вызове кода:
Попытка
КомпонентШК = Новый COMОбъект("V8.Barcod.1");
Исключение
Сообщить("Ошибка инициализации штрихкода!");
КонецПопытки;
Windows не будет пытаться загрузить библиотеку внутрь 1С, а обратится к созданному серверу COM+, который вернет ссылку на объект. Это позволит 64-битному клиенту успешно управлять свойствами ТипКода, Сообщение и другими.
Рассмотрим более правильный, с точки зрения развития платформы, подход. Фирма «1С» выпустила обновленную версию компоненты печати штрихкодов (начиная с версии 9.0 и выше), которая построена на технологии Native API. Она лишена проблем с разрядностью и работает как в 32-битных, так и в 64-битных клиентах (включая Linux-клиенты).
При использовании Native API мы отказываемся от вставки ActiveX-объекта непосредственно в таблицу макета. Вместо этого мы используем программное формирование картинки. Проанализируем пример кода для работы с новой компонентой:
// Подключение компоненты Native API
Если ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "Barcode", ТипВнешнейКомпоненты.Native) Тогда
ОбъектШК = Новый("AddIn.Barcode.Barcode");
Иначе
Возврат; // Компонента не найдена
КонецЕсли;
// Настройка параметров
ОбъектШК.ТипКода = 1; // Например, Code128
ОбъектШК.Сообщение = "1234567890";
ОбъектШК.Ширина = 200;
ОбъектШК.Высота = 100;
// Получение картинки штрихкода
ДанныеКартинки = ОбъектШК.ПолучитьШтрихкод();
КартинкаШК = Новый Картинка(ДанныеКартинки);
// Вывод в макет
Область = Макет.ПолучитьОбласть("ОбластьШтрихкода");
Рисунок = Область.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = КартинкаШК;
Преимущества этого метода:
1С:Предприятие.regsvr32.Выясним причину, по которой даже после переустановки компоненты в 64-битном клиенте может сохраняться ошибка. При установке 32-битной компоненты записи в реестре Windows 64-бит попадают в специальный раздел HKEY_CLASSES_ROOT\Wow6432Node\CLSID. 64-битные приложения ищут компоненты в HKEY_CLASSES_ROOT\CLSID. Если записи там отсутствуют (а для 32-битных OCX их там и не будет без COM+), объект не создастся.
Также стоит учитывать кэширование макетов. Если в вашем макете (как в сообщении №1) уже размещен объект типа Рисунок с типом 1С.V8.Печать штрих-кодов, то при открытии этого макета в 64-битном сеансе 1С пытается инициализировать внедренный ActiveX. Проанализируем, что происходит: 1С видит описание объекта, но физически не может связать его с программным кодом. В итоге вы получаете «пустой» объект с типом ActiveX, у которого нет свойств ТипКода или Текст.
Рекомендация: Если вы решили остаться на ActiveX через COM+, убедитесь, что компонента установлена и зарегистрирована последней. Если вы переходите на Native API — удалите старый ActiveX-рисунок из макета и замените его на обычный объект типа «Картинка». Для организации вывода кодов в различных макетах и печатных формах подойдёт подсистема настройки отображения штрихкода.
Рассмотрев все варианты, можно сделать следующий вывод. Если ваша информационная база (например, УПП или старая версия УТ) сильно завязана на макеты с внедренными ActiveX-объектами и у вас нет времени на их переделку — настраивайте COM+. Это позволит сохранить работоспособность печати этикеток при использовании мощных 64-битных рабочих станций.
Однако для обеспечения стабильности и кроссплатформенности в будущем, настоятельно рекомендуем выполнить переход на компоненту Native API (версия 9.0+), доступную на ИТС. Это избавит вас от зависимости от специфических настроек операционной системы и обеспечит корректную печать штрихкодов в любых условиях эксплуатации платформы 1С. В качестве альтернативного решения для генерации кодов без штатной компоненты можно использовать программу для печати этикеток и ценников на базе библиотеки Zint.