Как запустить компоненту Ocvita в 1С 8.2 и решить проблему с кириллицей в штрихкодах?

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

При работе с устаревшими конфигурациями, такими как УПП 1.3 на платформе 1С 8.2, разработчики часто сталкиваются с необходимостью генерации сложных штрихкодов (QR-коды, DataMatrix), которые не поддерживаются встроенными средствами старых релизов. Одним из решений является использование компоненты Ocvita, построенной на базе библиотеки Zint. Однако при её внедрении возникают две основные сложности: корректная работа на стороне сервера и поддержка кириллических символов. В этой статье мы подробно разберем, как преодолеть эти препятствия.

Анализ архитектуры компоненты и проблемы регистрации на сервере

Проанализируем ситуацию: компонента Ocvita Barcode ActiveX является COM-объектом. В среде 1С «клиент-сервер» попытка создать этот объект напрямую в серверном модуле через Новый COMОбъект часто приводит к ошибке «Класс не зарегистрирован». Это происходит из-за различия разрядности: сервер 1С обычно 64-битный, а компонента — 32-битная.

Чтобы решить эту проблему, выполним следующие шаги:

  1. Зарегистрируем библиотеку в операционной системе с помощью команды regsvr32 ocvita.dll.
  2. Настроим «Службы компонентов» (COM+). Создадим новое пустое приложение в папке Component Services -> Computers -> My Computer -> COM+ Applications.
  3. Добавим компоненту в созданное приложение. Это позволит 64-битному процессу сервера 1С обращаться к 32-битной компоненте через промежуточный процесс dllhost.exe.

Решение проблемы с кириллицей в Zint/Ocvita

Выясним причину, по которой штрихкод с русскими буквами не считывается или отображается некорректно. Библиотека Zint (и, соответственно, Ocvita) ожидает на вход поток байтов. Платформа 1С работает со строками в формате UTF-16. Когда мы передаем строку напрямую, компонента воспринимает её как набор байтов в другой кодировке, что приводит к искажению данных.

Для исправления ситуации необходимо принудительно преобразовать строку в UTF-8 перед передачей в свойство Data. Рассмотрим, как это реализовать в коде 1С 8.2 через использование объекта ЗаписьТекста или ADODB.Stream, так как штатные средства работы с двоичными данными в 8.2 ограничены по сравнению с 8.3.

Разберем пример функции для преобразования строки:


Функция ПреобразоватьВUTF8(Текст)
    ИмяФайла = ПолучитьИмяВременногоФайла("txt");
    ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8, , Ложь);
    ЗаписьТекста.Записать(Текст);
    ЗаписьТекста.Закрыть();
    
    // Считываем обратно как строку, которую компонента поймет правильно
    // или передаем содержимое файла, если компонента поддерживает загрузку из файла
    ТекстUTF8 = ""; 
    // ... логика получения байтов ...
    Возврат ТекстUTF8;
КонецФункции

Программная реализация генерации штрихкода на сервере

Рассмотрим подробнее серверную процедуру, которая будет генерировать изображение штрихкода и передавать его на клиент. Основная идея заключается в том, чтобы создать объект на сервере, установить параметры, сохранить картинку во временный файл и вернуть этот файл клиенту.

Проанализируем пример кода для работы с Ocvita:


&НаСервере
Функция СформироватьШтрихкодНаСервере(ЗначениеШтрихкода)
    Попытка
        ШКОбъект = Новый COMОбъект("OcvitaBarcode.Barcode");
    Исключение
        ЗаписьЖурналаРегистрации("Ошибка Ocvita", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;

    // Устанавливаем тип штрихкода (например, 58 для QR-кода)
    ШКОбъект.Symbology = 58; 
    
    // Преобразуем кириллицу (важный шаг!)
    ДанныеДляКодирования = ПодготовитьСтрокуДляКомпоненты(ЗначениеШтрихкода);
    ШКОбъект.Data = ДанныеДляКодирования;
    
    // Настройки внешнего вида
    ШКОбъект.Scale = 5;
    ШКОбъект.BorderWidth = 0;
    
    // Выполняем генерацию
    ШКОбъект.Encode();
    
    // Сохраняем во временный файл на сервере
    ПутьКФайлу = ПолучитьИмяВременногоФайла("png");
    ШКОбъект.SaveToFile(ПутьКФайлу);
    
    // Помещаем файл во временное хранилище, чтобы передать на клиент
    ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
    АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
    
    УдалитьФайлы(ПутьКФайлу);
    
    Возврат АдресКартинки;
КонецФункции

Альтернативный вариант: Использование 1С:БПО

Посмотрим на ситуацию шире. Если использование ActiveX вызывает трудности с администрированием сервера (COM+, права доступа, разрядность), стоит рассмотреть вариант, предложенный участниками сообщества: использование штатной компоненты из 1С:Библиотеки подключаемого оборудования (БПО).

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

Для реализации этого метода нам понадобится макет с компонентой ОбщийМакет.КомпонентаПечатиШтрихкодов. Посмотрим на логику вызова:


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

// Установка параметров
Компонента.ТипКода = 16; // QR-код
Компонента.Текст = "Кириллический текст";
Компонента.Ширина = 300;
Компонента.Высота = 300;

// Получение двоичных данных картинки
КартинкаДД = Компонента.ПолучитьШтрихкод();

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

Мы проанализировали два пути решения задачи генерации штрихкодов в 1С 8.2. Если вы жестко ограничены использованием Ocvita, обязательно уделите внимание конвертации строки в UTF-8 и регистрации объекта через COM+. Если же есть возможность модификации конфигурации, настоятельно рекомендуем перейти на компоненту из БПО, так как она избавляет от проблем с разрядностью и кодировками, обеспечивая более высокую производительность на стороне сервера.

Помните, что при работе на сервере важно всегда очищать временные файлы после их считывания в ДвоичныеДанные, чтобы не забивать дисковое пространство временными объектами.

← На главную