При работе с устаревшими конфигурациями, такими как УПП 1.3 на платформе 1С 8.2, разработчики часто сталкиваются с необходимостью генерации сложных штрихкодов (QR-коды, DataMatrix), которые не поддерживаются встроенными средствами старых релизов. Одним из решений является использование компоненты Ocvita, построенной на базе библиотеки Zint. Однако при её внедрении возникают две основные сложности: корректная работа на стороне сервера и поддержка кириллических символов. В этой статье мы подробно разберем, как преодолеть эти препятствия.
Проанализируем ситуацию: компонента Ocvita Barcode ActiveX является COM-объектом. В среде 1С «клиент-сервер» попытка создать этот объект напрямую в серверном модуле через Новый COMОбъект часто приводит к ошибке «Класс не зарегистрирован». Это происходит из-за различия разрядности: сервер 1С обычно 64-битный, а компонента — 32-битная.
Чтобы решить эту проблему, выполним следующие шаги:
regsvr32 ocvita.dll.dllhost.exe.Выясним причину, по которой штрихкод с русскими буквами не считывается или отображается некорректно. Библиотека 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(ПутьКФайлу);
// Помещаем файл во временное хранилище, чтобы передать на клиент
ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
АдресКартинки = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
УдалитьФайлы(ПутьКФайлу);
Возврат АдресКартинки;
КонецФункции
Посмотрим на ситуацию шире. Если использование ActiveX вызывает трудности с администрированием сервера (COM+, права доступа, разрядность), стоит рассмотреть вариант, предложенный участниками сообщества: использование штатной компоненты из 1С:Библиотеки подключаемого оборудования (БПО).
Преимущества этого подхода:
Для реализации этого метода нам понадобится макет с компонентой ОбщийМакет.КомпонентаПечатиШтрихкодов. Посмотрим на логику вызова:
// Подключение внешней компоненты из макета
УстановитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов");
Компонента = Новый("AddIn.КартинкаШтрихкода.Barcode");
// Установка параметров
Компонента.ТипКода = 16; // QR-код
Компонента.Текст = "Кириллический текст";
Компонента.Ширина = 300;
Компонента.Высота = 300;
// Получение двоичных данных картинки
КартинкаДД = Компонента.ПолучитьШтрихкод();
Мы проанализировали два пути решения задачи генерации штрихкодов в 1С 8.2. Если вы жестко ограничены использованием Ocvita, обязательно уделите внимание конвертации строки в UTF-8 и регистрации объекта через COM+. Если же есть возможность модификации конфигурации, настоятельно рекомендуем перейти на компоненту из БПО, так как она избавляет от проблем с разрядностью и кодировками, обеспечивая более высокую производительность на стороне сервера.
Помните, что при работе на сервере важно всегда очищать временные файлы после их считывания в ДвоичныеДанные, чтобы не забивать дисковое пространство временными объектами.