При разработке торговых решений на платформе «1С:Предприятие» программисты часто сталкиваются с ситуацией, когда код подключения торгового оборудования (например, касс АТОЛ или Штрих-М) отлично работает в режиме толстого клиента, но выдает критическую ошибку в тонком клиенте. При попытке инициализации объекта драйвера система сообщает: «тип не определен AddIn.MyName.ATOL_KKT_1C83_V9». Разобраться, почему так происходит, и как правильно настроить подключение внешней компоненты (ВК), нам поможет детальный разбор механизмов платформы.
Разница в поведении систем кроется во внутренних механизмах безопасности и архитектурных ограничениях различных режимов запуска 1С:
ПодключитьВнешнююКомпоненту() платформа способна «на лету» прочитать двоичные данные из общего макета конфигурации и загрузить библиотеку непосредственно в память текущего процесса, не требуя ее предварительного сохранения на жесткий диск.Если в тонком клиенте сразу вызвать метод ПодключитьВнешнююКомпоненту() без предварительной подготовки, платформа вернет ошибку, так как файл библиотеки отсутствует на компьютере пользователя.
Для того чтобы решить проблему в тонком клиенте, мы должны применить простое правило: сначала установить компоненту на локальный диск, а затем подключить её. Рассмотрим подробнее, как выглядит надежная схема инициализации компоненты с использованием конструкции попытки и исключения.
Проанализируем пример кода, который решает эту задачу в синхронном режиме:
Попытка
// Сначала пробуем просто подключить уже установленную компоненту
ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверАТОЛККТ54ФЗ105", "MyName", ТипВнешнейКомпоненты.Native);
ОбъектДрайвера = Новый("AddIn.MyName.ATOL_KKT_1C83_V9");
Исключение
Попытка
// Если подключить не удалось, значит компонента еще не установлена на этот ПК.
// Выполняем установку библиотеки на диск пользователя.
УстановитьВнешнююКомпоненту("ОбщийМакет.ДрайверАТОЛККТ54ФЗ105");
// После установки повторяем попытку подключения
ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверАТОЛККТ54ФЗ105", "MyName", ТипВнешнейКомпоненты.Native);
ОбъектДрайвера = Новый("AddIn.MyName.ATOL_KKT_1C83_V9");
Исключение
Сообщить("Не удалось установить или инициализировать драйвер ККТ: " + ОписаниеОшибки());
КонецПопытки;
КонецПопытки;
Разберем по шагам, что происходит «под капотом» во время выполнения этого кода:
УстановитьВнешнююКомпоненту() платформа 1С обращается к указанному общему макету, извлекает из него ZIP-архив и распаковывает его в специальный каталог пользователя на локальном компьютере. В операционной системе Windows это обычно папка %APPDATA%\1C\1Cv8\ExtCompT.registry.xml. В нем платформа регистрирует символическое имя компоненты, пути к файлам библиотек и поддерживаемую архитектуру процессора.ПодключитьВнешнююКомпоненту() 1С обращается к локальному файлу registry.xml, находит там запись о компоненте MyName, успешно загружает библиотеку в память процесса и позволяет создать объект Новый("AddIn.MyName.ATOL_KKT_1C83_V9").Начиная с версии платформы 8.3.6, использование синхронных методов работы с внешними компонентами в интерфейсных потоках считается устаревшим (deprecated). В современных конфигурациях (особенно построенных на БСП — Библиотеке стандартных подсистем) синхронные методы могут блокировать интерфейс или приводить к ошибкам работы в веб-клиенте.
Посмотрим на пример реализации асинхронного подключения с использованием механизма оповещений:
&НаКлиенте
Процедура ИнициализироватьДрайвер()
ПараметрыПодключения = Новый Структура;
ПараметрыПодключения.Вставить("ИмяМакета", "ОбщийМакет.ДрайверАТОЛККТ54ФЗ105");
ПараметрыПодключения.Вставить("СимволическоеИмя", "MyName");
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПодключенияКомпоненты", ЭтотОбъект, ПараметрыПодключения);
// Асинхронно пробуем подключить компоненту
НачатьПодключениеВнешнейКомпоненты(ОписаниеОповещения,
ПараметрыПодключения.ИмяМакета,
ПараметрыПодключения.СимволическоеИмя,
ТипВнешнейКомпоненты.Native);
КонецПроцедуры
&НаКлиенте
Процедура ПослеПодключенияКомпоненты(Результат, ДопПараметры) Экспорт
Если Результат Тогда
// Компонента успешно подключена, создаем объект драйвера
Попытка
ОбъектДрайвера = Новый("AddIn." + ДопПараметры.СимволическоеИмя + ".ATOL_KKT_1C83_V9");
// Далее выполняем работу с кассовым аппаратом...
Исключение
ПоказатьПредупреждение(, "Ошибка создания объекта драйвера: " + ОписаниеОшибки());
КонецПопытки;
Иначе
// Если подключить не удалось (библиотека еще не установлена), запускаем установку
ОписаниеОповещенияУстановки = Новый ОписаниеОповещения("ПослеУстановкиКомпоненты", ЭтотОбъект, ДопПараметры);
НачатьУстановкуВнешнейКомпоненты(ОписаниеОповещенияУстановки, ДопПараметры.ИмяМакета);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеУстановкиКомпоненты(Результат, ДопПараметры) Экспорт
Если Результат Тогда
// После успешной установки пробуем подключить заново
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПодключенияКомпоненты", ЭтотОбъект, ДопПараметры);
НачатьПодключениеВнешнейКомпоненты(ОписаниеОповещения,
ДопПараметры.ИмяМакета,
ДопПараметры.СимволическоеИмя,
ТипВнешнейКомпоненты.Native);
Иначе
ПоказатьПредупреждение(, "Не удалось установить внешнюю компоненту на локальный компьютер.");
КонецЕсли;
КонецПроцедуры
Такой асинхронный подход гарантирует стабильную работу во всех типах клиентов (включая запуск 1С через веб-браузер) и исключает зависание сеанса пользователя при медленной установке драйверов.
Если вы применили правильные методы установки и подключения, но ошибка «тип не определен» всё равно сохраняется в тонком клиенте, обязательно проанализируйте следующие факторы:
manifest.xml правильно их описывает.УстановитьВнешнююКомпоненту() пытается записать файлы в каталог %APPDATA%. Если у пользователя Windows ограничены права на запись в эту папку или её блокирует доменная политика безопасности (например, AppLocker), то физическая распаковка файлов не произойдет.%APPDATA%\1C в исключения антивирусного ПО.Используя правильную последовательность установки и подключения внешних компонент, а также учитывая разрядность приложений, вы сможете легко решить проблему совместимости торгового оборудования с тонким клиентом 1С.