При организации печати этикеток, ценников или формировании печатных форм документов разработчики нередко сталкиваются с ситуацией, когда на рабочей базе или одном из серверов кластера генерация штрихкода дает сбой. При вызове конструктора нового объекта или типовых функций БСП возникает исключительная ситуация: «Тип не определен (AddIn.BarcodeSymbolicName.Barcode)». При этом на тестовом стенде или соседнем сервере со схожей конфигурацией операционной системы код отрабатывает штатно. Разберем детально, почему возникает эта ошибка, как быстро восстановить работоспособность системы и какие альтернативные подходы можно применить.
Посмотрим на пример кода, который вызывает исключение:
ПодключаемыйМодуль = Новый("AddIn.BarcodeSymbolicName.Barcode");
Либо аналогичный вызов через типовые механизмы Библиотеки стандартных подсистем (БСП):
ВнешняяКомпонента = ГенерацияШтрихКода.ПодключитьКомпонентуГенерацииИзображенияШтрихкода();
Выясним причину такого поведения платформы. Метод Новый с передачей имени типа в строковом виде пытается создать экземпляр ранее подключенного объекта. Если вызов функции подключения внешней компоненты вернул Ложь (или библиотека вообще не была загружена в память процесса), платформа не знает указанного типа данных и аварийно завершает выполнение с ошибкой «Тип не определен».
Как показывает практика, наиболее распространенная причина расхождения в поведении одинаковых серверов — повреждение или неактуальное состояние кэшированных данных платформы. При автоматическом обновлении конфигурации или повторной инициализации внешних компонент серверный процесс rphost.exe может обращаться к устаревшим или поврежденным временным файлам метаданных.
Разберем по шагам регламент правильной очистки серверного кэша:
1C:Enterprise 8.3 Server Agent) через консоль управления службами services.msc или командную строку.C:\Program Files\1cv8\srvinfo или C:\Program Files (x86)\1cv8\srvinfo).reg_1541) и внутри него папки баз данных (по уникальным GUID идентификаторам). Очистим в них подкаталоги временных данных кэша, не затрагивая конфигурационные файлы кластера (1CV8Clst.lst, 1CV8Clt.lst).%TEMP%, AppData\Local\Temp пользователя usr1cv8).Проанализируем технические особенности загрузки динамических библиотек. 64-битный рабочий процесс сервера 1С (rphost.exe) фундаментально не может загрузить 32-битные динамические библиотеки (DLL) в свое адресное пространство. Старые инсталляторы пакета «1С:Печать штрихкодов» часто содержали исключительно 32-битные COM-компоненты.
Для устранения конфликта архитектур выполним следующие действия:
.dll. Для 64-битного сервера требуется соответствующая x64 сборка библиотеки.Для корректного вызова LoadLibrary операционной системой скомпилированные библиотеки штрихкодирования требуют наличия в среде Windows системных библиотек времени выполнения. Если на новом или обновленном сервере отсутствуют необходимые пакеты, Windows блокирует запуск DLL без вывода явного предупреждения в журнал 1С.
Рассмотрим, как это исправить:
При вызове процедур инициализации компонент штрихкодирования БСП извлекает бинарные данные из общего макета и сохраняет их во временную директорию на диске сервера. Если служба сервера запущена под ограниченной системной учетной записью (например, usr1cv8), у нее могут отсутствовать права на запись или запуск исполняемых модулей.
Проверим и настроим права доступа:
C:\Windows\Temp и пользовательского каталога AppData\Local\Temp учетной записи службы.Чтобы избежать аварийного завершения сеанса и локализовать причину ошибки в программном коде, всегда используем проверку результата инициализации и перехват исключений. Посмотрим на пример безопасного подключения:
Попытка
Подключено = ПодключитьВнешнююКомпоненту("ОбщийМакет.КомпонентаПечатиШтрихкодов", "Barcode", ТипВнешнейКомпоненты.Native);
Если Подключено Тогда
ПодключаемыйМодуль = Новый("AddIn.Barcode.Barcode");
Иначе
ВызватьИсключение "Не удалось загрузить внешнюю компоненту в память процесса.";
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("ГенерацияШтрихкода", УровеньЖурналаРегистрации.Ошибка,,, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение "Ошибка инициализации подсистемы штрихкодирования: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
Такой подход позволяет зафиксировать точную причину сбоя в Журнале регистрации и не позволяет коду пытаться вызывать конструктор Новый для несуществующего типа.
Если серверное окружение жестко ограничено политиками безопасности, либо в гетерогенной среде (Windows и Linux) возникают постоянные проблемы с совместимостью бинарных библиотек, рассмотрим альтернативные методы формирования кодов:
Code 128 или EAN-13 на сервер и клиенты. В коде 1С исходная строка дополняется стартовыми, стоповыми и контрольными знаками, после чего ячейке макета назначается соответствующий шрифт.