Как заставить компоненту 1С:Печать штрихкодов работать в 64-битном клиенте 1С

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

При переходе на 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, но его внутренние свойства и методы становятся недоступны.

Вариант 1. Использование COM+ (промежуточное решение без переписывания кода)

Если вам необходимо заставить старый код работать «здесь и сейчас» без глобальной переработки макетов этикеток, единственным способом является использование службы компонентов Windows COM+. Этот механизм позволяет запустить 32-битную компоненту в отдельном системном процессе dllhost.exe, который будет выступать посредником между 64-битным клиентом 1С и 32-битной библиотекой.

Проанализируем шаги по настройке этого моста:

  1. Откройте Панель управления — Администрирование — Службы компонентов (или выполните команду dcomcnfg).
  2. В дереве консоли перейдите в Компьютеры — Мой компьютер — Приложения COM+.
  3. Нажмите правой кнопкой мыши на «Приложения COM+» и выберите Создать — Приложение.
  4. В мастере установки выберите Создать новое приложение. Введите имя, например, 1CBarcode32.
  5. На шаге «Способ активации» обязательно выберите Серверное приложение. Это критически важно, так как именно этот режим заставляет компоненту работать в отдельном процессе.
  6. В созданном приложении раскройте ветку и найдите папку Компоненты.
  7. Нажмите правой кнопкой мыши, выберите Создать — Компонент.
  8. Выберите Установка новых компонентов и укажите путь к файлу Barcode.ocx (обычно он находится в папке установки компоненты 1С).

После этой настройки при вызове кода:


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

Windows не будет пытаться загрузить библиотеку внутрь 1С, а обратится к созданному серверу COM+, который вернет ссылку на объект. Это позволит 64-битному клиенту успешно управлять свойствами ТипКода, Сообщение и другими.

Вариант 2. Переход на Native API (рекомендуемый современный способ)

Рассмотрим более правильный, с точки зрения развития платформы, подход. Фирма «1С» выпустила обновленную версию компоненты печати штрихкодов (начиная с версии 9.0 и выше), которая построена на технологии Native API. Она лишена проблем с разрядностью и работает как в 32-битных, так и в 64-битных клиентах (включая Linux-клиенты).

При использовании Native API мы отказываемся от вставки ActiveX-объекта непосредственно в таблицу макета. Вместо этого мы используем программное формирование картинки. Проанализируем пример кода для работы с новой компонентой:


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

// Настройка параметров
ОбъектШК.ТипКода = 1; // Например, Code128
ОбъектШК.Сообщение = "1234567890";
ОбъектШК.Ширина = 200;
ОбъектШК.Высота = 100;

// Получение картинки штрихкода
ДанныеКартинки = ОбъектШК.ПолучитьШтрихкод();
КартинкаШК = Новый Картинка(ДанныеКартинки);

// Вывод в макет
Область = Макет.ПолучитьОбласть("ОбластьШтрихкода");
Рисунок = Область.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
Рисунок.Картинка = КартинкаШК;

Преимущества этого метода:

Проблемы с регистрацией и кэшем

Выясним причину, по которой даже после переустановки компоненты в 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.

← На главную