При формировании печатных форм документов, этикеток или ценников со штрихкодами в управляемом приложении разработчики часто сталкиваются с ситуацией: в файловой информационной базе штрихкоды формируются корректно, но при переходе в клиент-серверный режим клиент получает исключение «Ошибка подключения внешней компоненты печати штрихкода!».
Проанализируем программный код, при выполнении которого на стороне сервера возникает данная ошибка:
ВнешняяКомпонента = Штрихкодирование.ПодключитьВнешнююКомпонентуПечатиШтрихкода();
Если ВнешняяКомпонента = Неопределено Тогда
ВызватьИсключение НСтр("ru = 'Ошибка подключения внешней компоненты печати штрихкода!'");
КонецЕсли;
Разберем основные технические причины такого поведения платформы 1С:Предприятие и рассмотрим пошаговые варианты решения проблемы.
Выясним, почему вызов &НаСервере возвращает значение Неопределено при попытке инициализировать внешнюю компоненту:
rphost.exe x64), 64-разрядный процесс не может напрямую загрузить 32-битную COM-библиотеку в свое адресное пространство. Ручная регистрация через regsvr32 и копирование файла в системные каталоги не дают результата.USR1CV8) извлекает библиотеку во временный каталог профиля. При отсутствии прав на запись и исполнение файлов в папке Temp подключение завершается ошибкой.Рассмотрим наиболее надежный способ, решающий проблему разрядности и независимости от локальных установок на сервере. В типовых конфигурациях (например, «1С:Управление торговлей 11», «1С:ERP», «1С:Комплексная автоматизация») библиотека поставляется прямо внутри метаданных как архив с кроссплатформенными версиями Native API.
Выполним следующие шаги:
КомпонентаПечатиШтрихкодов (тип макета — Двоичные данные).ШтрихкодированиеСервер или МенеджерПечати), задействовав штатные методы платформы УстановитьВнешнююКомпоненту и ПодключитьВнешнююКомпоненту.Посмотрим на пример правильного серверного подключения компоненты из макета:
Функция ПодключитьВнешнююКомпонентуПечатиШтрихкода() Экспорт
ИмяКомпоненты = "КомпонентаПечатиШтрихкодов";
Местоположение = "ОбщийМакет.КомпонентаПечатиШтрихкодов";
// Пробуем подключить уже загруженную ранее компоненту
Если ПодключитьВнешнююКомпоненту(Местоположение, ИмяКомпоненты, ТипПодключенияВнешнейКомпоненты.Native) Тогда
Возврат Новый("AddIn." + ИмяКомпоненты + ".Barcode");
КонецЕсли;
// Если компонента не установлена на сервере, выполняем установку из макета
Если УстановитьВнешнююКомпоненту(Местоположение) Тогда
Если ПодключитьВнешнююКомпоненту(Местоположение, ИмяКомпоненты, ТипПодключенияВнешнейКомпоненты.Native) Тогда
Возврат Новый("AddIn." + ИмяКомпоненты + ".Barcode");
КонецЕсли;
КонецЕсли;
Возврат Неопределено;
КонецФункции
При таком подходе платформа 1С автоматически извлекает нужную версию бинарного файла под разрядность текущего процесса сервера (x86 или x64) и операционную систему (Windows или Linux).
Если ранее применялось динамическое обновление конфигурации, сеансы сервера могли сохранить некорректные дескрипторы модулей. Разберем порядок действий:
1C:Enterprise 8.3 Server Agent.Проанализируем еще одну частую проблему: компонента успешно подключается, но падает с внутренней ошибкой при попытке сформировать изображение из-за несоответствия типов данных. Если свойству компоненты передается строка вместо числа или наоборот, генерация штрихкода прерывается.
Посмотрим на пример установки параметров с контролем типов:
КомпонентаШтрихкода.ТипКода = Число(ПараметрыШтрихкода.ТипКода);
КомпонентаШтрихкода.Штрихкод = Строка(ПараметрыШтрихкода.ЗначениеШтрихкода);
КомпонентаШтрихкода.ОтображатьТекст = Ложь;
КомпонентаШтрихкода.РазмерШрифта = 10;
Обязательно проверяйте типы значений, передаваемых в свойства компоненты, чтобы избежать скрытых ошибок на стороне сервера.