При переходе на 64-разрядную платформу 1С:Предприятие 8.3 разработчики и администраторы часто сталкиваются с неприятным поведением: в макетах табличных документов перестает работать элемент управления 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-разрядного адресного пространства одного и того же процесса.
Рассмотрим сопутствующие симптомы и ограничения:
regsvr32 на 64-битной Windows записи создаются в ветке WOW6432Node. 64-битный конфигуратор видит ProgID в списке зарегистрированных элементов OLE, но при попытке внедрить объект в ячейку табличного документа не может получить к нему доступ.dllhost.exe или настройка служб компонентов COM+) подходит только для COM-серверов, работающих без графического интерфейса. Внедрить такой объект внутрь контейнера ячейки табличного документа нельзя, так как макет требует внутрипроцессной (in-process) отрисовки элемента.Если печать штрихкодов используется во множестве доработанных документов, а времени на переработку архитектуры макетов нет, применим самый оперативный шаг — установку 32-битного клиента платформы на рабочие места пользователей и разработчиков.
32-разрядный исполняемый файл 1С без проблем взаимодействует с 32-битной библиотекой 1CBarCod.dll через подсистему совместимости Windows WOW64. Однако важно учитывать, что этот вариант временный: если формирование печатных форм происходит на 64-битном сервере 1С, данный способ не решит серверные ошибки.
Рассмотрим наиболее надежное и современное решение, которое используется в типовых конфигурациях (например, в УТ 11, ERP, КА и актуальных версиях БСП). Вместо устаревшего ActiveX-контрола перейдем на использование кроссплатформенной внешней компоненты печати штрихкодов, разработанной по технологии Native API.
Преимущества данного подхода очевидны: библиотека поставляется сразу в сборках для Windows x86, Windows x64, Linux x86 и Linux x64. Она не требует установки инсталлятором в операционную систему, не прописывается в системном реестре и способна генерировать штрихкод прямо в оперативную память, возвращая результат в виде двоичных данных или объекта Картинка.
Разберем алгоритм перевода печатной формы на нативную компоненту:
Штрихкод.Посмотрим на практический пример программного кода для генерации штрихкода:
// Подключаем внешнюю компоненту из общего макета
УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов");
КомпонентаПодключена = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "Barcode", ТипВнешнейКомпоненты.Native);
Если КомпонентаПодключена Тогда
ОбъектШтрихкода = Новый("AddIn.Barcode.BarcodeExtension");
// Настраиваем базовые параметры штрихкода
ОбъектШтрихкода.ТипШтрихкода = 1; // Например, EAN-13 или Code 128
ОбъектШтрихкода.Значение = "4601234567890";
ОбъектШтрихкода.ОтображатьТекст = Истина;
ОбъектШтрихкода.Ширина = 200;
ОбъектШтрихкода.Высота = 100;
// Получаем двоичные данные изображения
ДвоичныеДанныеКартинки = ОбъектШтрихкода.ПолучитьШтрихкод();
КартинкаШтрихкода = Новый Картинка(ДвоичныеДанныеКартинки);
// Помещаем сформированное изображение в рисунок табличного документа
ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
РисунокШтрихкод = ОбластьМакета.Рисунки.Найти("Штрихкод");
Если РисунокШтрихкод <> Неопределено Тогда
РисунокШтрихкод.Картинка = КартинкаШтрихкода;
КонецЕсли;
КонецЕсли;
Такой механизм работает одинаково стабильно как на 32-битном, так и на 64-битном клиенте, а также на сервере 1С под управлением Windows или Linux.
Проанализируем вариант, который полностью исключает зависимость от сторонних библиотек и 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% независимость от операционной системы, разрядности платформы и внешних зависимостей. Код выполняется с одинаковой скоростью и на сервере, и на клиенте.
Еще один распространенный способ — вывод штрихкода с помощью специальных шрифтов (например, Code 128 или EAN-13). В макете используется обычная текстовая ячейка, для которой задан соответствующий шрифт.
Однако здесь важно учесть критические нюансы:
В распределенных корпоративных системах генерацию штрихкодов нередко выносят за пределы 1С. Рассмотрим два распространенных подхода:
ЗапуститьПриложение(). Сформированный графический файл считывается с диска через конструктор Новый Картинка(ИмяФайла) и удаляется.HTTPСоединение и HTTPЗапрос. В теле ответа 1С получает готовый бинарный поток PNG или SVG, который напрямую загружается в макет.Если перед вами стоит задача срочно запустить печать в существующей рабочей базе, проще всего временно использовать 32-разрядный клиент. Однако в перспективе единственным верным архитектурным решением является отказ от OLE-контрола 1CBarCode в пользу Native API компоненты из БСП либо переход на алгоритмическую генерацию SVG-картинок средствами встроенного языка 1С.