Почему возникают сбои при загрузке внешней компоненты печати штрихкодов и как их устранить

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

При организации печати этикеток и документов со штрихкодами в управляемом и веб-клиенте разработчики 1С часто сталкиваются с плавающей ошибкой: «Не найден файл внешней компоненты» при попытке инициализации объекта Новый("AddIn.КартинкаШтрихкода.Barcode"). Ошибка может появляться периодически, с интервалом от нескольких минут до нескольких часов, а временно устраняется перезапуском агента сервера 1С или повторной загрузкой библиотеки в общий макет.

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

Основные причины периодического падения внешней компоненты

Проанализируем ситуации, из-за которых платформа теряет доступ к динамической библиотеке DLL или SO:

  1. Автоматическая очистка временных каталогов (Temp): При вызове подключения компоненты из общего макета платформа 1С распаковывает архивированные файлы во временный каталог системного пользователя (например, AppData\Local\Temp службы usr1cv8). Если на сервере работают фоновые утилиты очистки диска, антивирусное ПО или скрипты обслуживания, временные DLL-файлы удаляются с диска. При этом кэш платформы продолжает считать компоненту подключенной, что и приводит к ошибке.
  2. Несоответствие разрядности процесса сервера и библиотеки: Если рабочий процесс сервера 1С (rphost) работает в 64-разрядном режиме, а в макет загружена только 32-битная компонента (или наоборот), платформа не может загрузить библиотеку в адресное пространство процесса.
  3. Ошибки в архиве и манифесте библиотеки: Для корректной работы Native API компонента должна быть правильно упакована в ZIP-архив. Файл манифеста должен иметь имя строго MANIFEST.XML в верхнем регистре. Если имя указано в нижнем регистре (manifest.xml), платформа не сможет сопоставить библиотеку с операционной системой.
  4. Сбои изолированного процесса выполнения: По умолчанию подключение внешних компонент на сервере происходит в изолированном режиме (ТипПодключенияВнешнейКомпоненты.Изолированно). При нехватке оперативной памяти на сервере или ограничениях прав дочерний процесс компоненты завершается аварийно.

Способ 1. Переход на механизмы Библиотеки подключаемого оборудования (БПО)

Разберем по шагам наиболее надежный способ интеграции компоненты печати штрихкодов, принятый в типовых конфигурациях. Вместо прямого вызова Новый("AddIn...") целесообразно использовать стандартные серверные функции БПО, которые самостоятельно контролируют наличие, версию и подключение компоненты.

Посмотрим на пример кода формирования картинки штрихкода с помощью БПО:


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

МакетПечати.Рисунки.ШтрихКод.Картинка = МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода(ПараметрыШтрихкода);

Метод МенеджерОборудованияВызовСервера.ПолучитьКартинкуШтрихкода() берет на себя все низкоуровневые операции: проверяет статус компоненты, при необходимости переподключает её из макета информационной базы и возвращает готовое изображение формата Картинка.

Способ 2. Обработка исключений и явное переподключение компоненты

Если в вашей конфигурации не используется БПО, разработаем алгоритм с безопасным подключением компоненты перед каждым её созданием. Не следует рассчитывать на то, что компонента останется в памяти сервера навсегда.

Перед инициализацией вызовем метод ПодключитьВнешнююКомпоненту() с последующей обработкой исключений:


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

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

ВнешняяКомпонента = Новый("AddIn.КартинкаШтрихкода.Barcode");

Также важно убедиться, что каталог временных файлов учетной записи, под которой запущен агент сервера 1С (например, usr1cv8), добавлен в исключения антивируса и задач очистки диска.

Способ 3. Вывод штрихкодов через шрифты (EAN / Code128)

Рассмотрим альтернативный метод, полностью исключающий использование внешних DLL и серверных компонент. Для одномерных штрихкодов (EAN-13, EAN-8, Code128) можно применить специализированные шрифты.

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

  1. Установим необходимый шрифт штрихкода (например, EAN13 или Code128) в систему на рабочих местах пользователей и на сервере печати.
  2. Напишем функцию алгоритма формирования контрольного символа и кодирования исходного значения в последовательность символов шрифта.
  3. В табличном документе создадим ячейку с выбранным шрифтом и передадим в нее подготовленную строку текста.

Данный подход гарантирует стабильную печать, так как не зависит от серверных процессов 1С и разрядности платформы, однако требует предварительной установки шрифта на устройства пользователей.

Способ 4. Генерация штрихкодов средствами BSL и SVG без внешних библиотек

Выясним, как формировать штрихкоды и QR-коды на чистом языке 1С без установленных шрифтов и сторонних библиотек:

  1. Отрисовка ячейками табличного документа: Кодом на BSL рассчитывается последовательность полос штрихкода, после чего ширина колонок табличного документа устанавливается минимальной, а нужные ячейки закрашиваются черным цветом.
  2. Генерация векторного изображения SVG: Программным путем формируется XML-строка в формате SVG, описывающая прямоугольники полос или QR-кода. После этого векторное изображение переводится в байтовый массив и помещается в объект Картинка.

Эти методы абсолютно кроссплатформенны, корректно работают на серверах под управлением Linux, а также в тонком и веб-клиентах без риска возникновения ошибок отсутствия файлов.

← На главную