Почему не работает компонента 1CBarCode в 64-битной 1С и как настроить печать штрихкодов?

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

При переходе на 64-разрядную платформу 1С:Предприятие 8.3 разработчики и администраторы часто сталкиваются с неприятным поведением: в макетах табличных документов перестает работать элемент управления 1CBarCode. В режиме конфигуратора элемент отображается некорректно либо не открывает окно свойств, а в режиме предприятия печатная форма аварийно завершает формирование или выдает ошибку инициализации объекта. Разберем по шагам, почему возникает эта ошибка и какие существуют проверенные способы ее устранения.

Выясним причину: почему 64-битная платформа конфликтует с 1CBarCode

Проанализируем техническую сторону проблемы. Классическая библиотека печати штрихкодов 1CBarCode (файл 1CBarCod.dll) представляет собой 32-разрядный элемент управления ActiveX (OCX/OLE-компонент). Она была разработана еще для операционных систем эпохи Windows x86.

Когда мы устанавливаем 64-разрядный клиент 1С (1cv8c.exe или толстый клиент 1cv8.exe) либо запускаем 64-разрядный сервер 1С:Предприятия (rphost.exe), процесс выполняется в 64-битном адресном пространстве. Операционная система Windows на аппаратном и системном уровне запрещает прямую загрузку 32-разрядных динамических библиотек (DLL) внутрь 64-разрядного адресного пространства одного и того же процесса.

Рассмотрим сопутствующие симптомы и ограничения:

  1. Регистрация в реестре: при регистрации 32-битной библиотеки с помощью regsvr32 на 64-битной Windows записи создаются в ветке WOW6432Node. 64-битный конфигуратор видит ProgID в списке зарегистрированных элементов OLE, но при попытке внедрить объект в ячейку табличного документа не может получить к нему доступ.
  2. Ограничение DllSurrogate: стандартный механизм суррогатных процессов Windows (запуск через dllhost.exe или настройка служб компонентов COM+) подходит только для COM-серверов, работающих без графического интерфейса. Внедрить такой объект внутрь контейнера ячейки табличного документа нельзя, так как макет требует внутрипроцессной (in-process) отрисовки элемента.
  3. Серверная печать: если документ формируется на стороне сервера (в фоновом задании или при вызове серверной процедуры печати), 64-разрядный процесс сервера 1С физически не может взаимодействовать с 32-битным ActiveX-контролом.

Решение 1. Быстрый обходной путь: возврат к 32-разрядному клиенту 1С

Если печать штрихкодов используется во множестве доработанных документов, а времени на переработку архитектуры макетов нет, применим самый оперативный шаг — установку 32-битного клиента платформы на рабочие места пользователей и разработчиков.

32-разрядный исполняемый файл 1С без проблем взаимодействует с 32-битной библиотекой 1CBarCod.dll через подсистему совместимости Windows WOW64. Однако важно учитывать, что этот вариант временный: если формирование печатных форм происходит на 64-битном сервере 1С, данный способ не решит серверные ошибки.

Решение 2. Переход на кроссплатформенную Native API компоненту

Рассмотрим наиболее надежное и современное решение, которое используется в типовых конфигурациях (например, в УТ 11, ERP, КА и актуальных версиях БСП). Вместо устаревшего ActiveX-контрола перейдем на использование кроссплатформенной внешней компоненты печати штрихкодов, разработанной по технологии Native API.

Преимущества данного подхода очевидны: библиотека поставляется сразу в сборках для Windows x86, Windows x64, Linux x86 и Linux x64. Она не требует установки инсталлятором в операционную систему, не прописывается в системном реестре и способна генерировать штрихкод прямо в оперативную память, возвращая результат в виде двоичных данных или объекта Картинка.

Разберем алгоритм перевода печатной формы на нативную компоненту:

  1. В макете документа удалим старый элемент ActiveX и вместо него вставим обычный объект табличного документа типа Рисунок. Зададим рисунку осмысленное имя, например, Штрихкод.
  2. Поместим нативную компоненту в общий макет конфигурации с типом Двоичные данные (обычно ZIP-архив с манифестом и библиотеками под разные платформы).
  3. Напишем код подключения компоненты и генерации изображения.

Посмотрим на практический пример программного кода для генерации штрихкода:


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

Если КомпонентаПодключена Тогда
    ОбъектШтрихкода = Новый("AddIn.Barcode.BarcodeExtension");
    
    // Настраиваем базовые параметры штрихкода
    ОбъектШтрихкода.ТипШтрихкода = 1; // Например, EAN-13 или Code 128
    ОбъектШтрихкода.Значение = "4601234567890";
    ОбъектШтрихкода.ОтображатьТекст = Истина;
    ОбъектШтрихкода.Ширина = 200;
    ОбъектШтрихкода.Высота = 100;
    
    // Получаем двоичные данные изображения
    ДвоичныеДанныеКартинки = ОбъектШтрихкода.ПолучитьШтрихкод();
    КартинкаШтрихкода = Новый Картинка(ДвоичныеДанныеКартинки);
    
    // Помещаем сформированное изображение в рисунок табличного документа
    ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
    РисунокШтрихкод = ОбластьМакета.Рисунки.Найти("Штрихкод");
    Если РисунокШтрихкод <> Неопределено Тогда
        РисунокШтрихкод.Картинка = КартинкаШтрихкода;
    КонецЕсли;
КонецЕсли;

Такой механизм работает одинаково стабильно как на 32-битном, так и на 64-битном клиенте, а также на сервере 1С под управлением Windows или Linux.

Решение 3. Генерация штрихкода на встроенном языке (SVG / BMP)

Проанализируем вариант, который полностью исключает зависимость от сторонних библиотек и DLL. Начиная с версии 8.3, платформа 1С:Предприятие поддерживает векторный формат SVG во встроенном объекте Картинка.

Для линейных штрихкодов (Code 128, Code 39, EAN-13) и двумерных кодов (QR-код) математический алгоритм расчета полос и контрольных сумм легко реализуется на чистом встроенном языке 1С. Алгоритм формирует текстовую строку разметки SVG, состоящую из тегов <rect> нужной ширины и координат.

Разберем пример создания картинки из сгенерированной SVG-строки:


// Формируем текстовую строку SVG с разметкой полос штрихкода
ТекстSVG = "<svg xmlns=""http://www.w3.org/2000/svg"" width=""150"" height=""60"">"
         + "<rect x=""10"" y=""10"" width=""2"" height=""40"" fill=""black""/>"
         + "<rect x=""14"" y=""10"" width=""4"" height=""40"" fill=""black""/>"
         + "</svg>";

ДвоичныеДанныеSVG = ПолучитьДвоичныеДанныеИзСтроки(ТекстSVG);
КартинкаШК = Новый Картинка(ДвоичныеДанныеSVG);

// Помещаем сформированную картинку в область табличного документа
Область = Макет.ПолучитьОбласть("СтрокаШК");
Область.Рисунки.Штрихкод.Картинка = КартинкаШК;

Такой подход обеспечивает 100% независимость от операционной системы, разрядности платформы и внешних зависимостей. Код выполняется с одинаковой скоростью и на сервере, и на клиенте.

Решение 4. Использование специализированных штрихкодовых шрифтов

Еще один распространенный способ — вывод штрихкода с помощью специальных шрифтов (например, Code 128 или EAN-13). В макете используется обычная текстовая ячейка, для которой задан соответствующий шрифт.

Однако здесь важно учесть критические нюансы:

  1. Кодирование строки: нельзя просто передать строку цифр в ячейку со шрифтом. Для сканирования сканером требуется рассчитать контрольный символ, а также добавить служебные стартовые и стоповые символы в соответствии со спецификацией конкретного формата.
  2. Установка шрифта: файл шрифта должен быть установлен во все операционные системы, где открывается табличный документ. Если печатная форма сохраняется в PDF на сервере, шрифт обязательно должен быть инсталлирован в операционной системе сервера.

Решение 5. Внешние консольные утилиты и сетевые микросервисы

В распределенных корпоративных системах генерацию штрихкодов нередко выносят за пределы 1С. Рассмотрим два распространенных подхода:

  1. Консольные утилиты: вызов локального генератора через метод ЗапуститьПриложение(). Сформированный графический файл считывается с диска через конструктор Новый Картинка(ИмяФайла) и удаляется.
  2. Микросервисы по HTTP: обращение к внутреннему сервису генерации через HTTPСоединение и HTTPЗапрос. В теле ответа 1С получает готовый бинарный поток PNG или SVG, который напрямую загружается в макет.

Итоги и рекомендации

Если перед вами стоит задача срочно запустить печать в существующей рабочей базе, проще всего временно использовать 32-разрядный клиент. Однако в перспективе единственным верным архитектурным решением является отказ от OLE-контрола 1CBarCode в пользу Native API компоненты из БСП либо переход на алгоритмическую генерацию SVG-картинок средствами встроенного языка 1С.

← На главную