Каждый специалист, занимающийся автоматизацией розничной торговли и интеграцией ККТ с программными продуктами 1С, регулярно сталкивается с капризами внешних компонент. Одной из наиболее распространенных проблем является сбой на этапе инициализации драйвера оборудования, который сопровождается ошибкой «Ошибка: тип не определен AddIn.ИнтеграционнаяКомпонента.ATOL_KKT_1C83_V9» (или аналогичной для других версий, например, ATOL_KKT_1C83_V10).
Эта ошибка делает невозможной дальнейшую работу с фискальным регистратором, блокирует пробитие чеков и парализует работу кассовой зоны. В рамках данной статьи мы подробно проанализируем причины этой неисправности, разберем базовые механизмы взаимодействия платформы 1С с внешними библиотеками и рассмотрим пошаговые сценарии решения проблемы.
Давайте сначала посмотрим на классический фрагмент кода, при выполнении которого возникает сбой. Обычно разработчики пытаются подключить компоненту динамически из макета конфигурации или макета драйвера, поставляемого в составе Библиотеки подключаемого оборудования (БПО):
Адрес = МенеджерОборудованияВызовСервера.ПолучитьМакетССервера("ДрайверАТОЛККТ54ФЗ105");
ПодключитьВнешнююКомпоненту(Адрес, "ИнтеграционнаяКомпонента", ТипВнешнейКомпоненты.Native);
Драйвер = Новый("AddIn.ИнтеграционнаяКомпонента.ATOL_KKT_1C83_V9");
Выясним причину, почему этот код падает на строке создания нового объекта Новый(). Дело в том, что функция ПодключитьВнешнююКомпоненту при невозможности загрузить библиотеку возвращает значение Ложь. Если в коде отсутствует должная проверка возвращаемого значения, платформа пытается инициализировать объект недогруженного драйвера, что незамедлительно приводит к фатальной ошибке «Тип не определен».
Проанализируем пять основных технических причин, из-за которых операционная система и платформа 1С отказываются загружать внешнюю компоненту АТОЛ, и разберем методы их устранения.
Это ключевая причина сбоя, с которой столкнулся автор темы на форуме. Архитектура операционной системы Windows, разрядность установленной платформы 1С и разрядность самого драйвера ККТ жестко взаимосвязаны:
Драйверы_торгового_оборудования_9_12_3_x64), полагая, что раз операционная система 64-битная, то и драйвер должен быть соответствующий.1cv8.exe будет стоять пометка «32 бита», либо исполняемый файл будет запускаться из папки C:\Program Files (x86)\1cv8\....Важное техническое правило: 32-битный процесс платформы 1С физически не может загрузить в свое адресное пространство 64-битные динамические библиотеки (DLL). Попытка выполнить ПодключитьВнешнююКомпоненту в этом случае всегда завершится неудачей.
Для решения этой проблемы выполним следующие шаги:
bin установленной платформы 1С.Чтобы прямо в коде понять, какая разрядность у текущего запущенного приложения 1С, мы можем использовать встроенные свойства глобального контекста. Проанализируем пример кода, который помогает определить архитектуру процесса:
Инфо = Новый СистемнаяИнформация;
АрхитектураПроцесса = Инфо.ТипПлатформы;
Если АрхитектураПроцесса = ТипПлатформы.Windows_x86 Тогда
Сообщить("Запущен 32-битный клиент 1С. Требуется 32-битная библиотека драйвера ККТ.");
ИначеЕсли АрхитектураПроцесса = ТипПлатформы.Windows_x86_64 Тогда
Сообщить("Запущен 64-битный клиент 1С. Требуется 64-битная библиотека драйвера ККТ.");
КонецЕсли;
Внешние компоненты АТОЛ (Native-библиотеки) разрабатываются на языке C++. Для их корректного запуска в среде Windows требуются динамические библиотеки времени выполнения (Runtime), поставляемые корпорацией Microsoft.
Если на целевом компьютере отсутствуют нужные библиотеки, операционная система заблокирует загрузку DLL драйвера АТОЛ на этапе системного вызова. Платформа 1С получит отказ от ОС и выдаст уже знакомую нам ошибку о неопределенном типе.
Выясним, какие пакеты необходимо установить для восстановления работоспособности:
vc_redist.x86.exe (для 32-битных приложений), и vc_redist.x64.exe (для 64-битных систем). Это исключит любые проблемы совместимости среды выполнения.При использовании метода ПодключитьВнешнююКомпоненту из макета, платформа 1С временно распаковывает бинарные файлы драйвера (DLL-файлы) на локальный диск пользователя. Обычно это происходит во временную папку:
C:\Users\ИмяПользователя\AppData\Local\Temp\1Cv8...
В корпоративных сетях часто действуют жесткие групповые политики безопасности (например, AppLocker), которые запрещают запуск любых исполняемых файлов (EXE, DLL) из каталогов профиля пользователя и временных папок. В этом случае Windows заблокирует загрузку библиотеки АТОЛ из папки Temp.
Для устранения этой преграды выполните следующие действия:
1C в Local и Roaming) в список исключений сканирования в реальном времени.Иногда при обновлении драйверов кассы или самой платформы 1С возникает ситуация, когда в локальном кэше пользователя «зависает» старая версия внешней компоненты. Платформа видит, что файл с таким именем уже существует в кэше, и отказывается копировать туда новую версию библиотеки, пытаясь подключить устаревшую или поврежденную DLL.
Рассмотрим, как правильно произвести глубокую очистку кэша:
%USERPROFILE%\AppData\Local\1C\1Cv8\. Удалите все папки с длинными буквенно-цифровыми именами (например, 8e24fa6b-7341...).%USERPROFILE%\AppData\Roaming\1C\1Cv8\ и аналогично очистите папки кэша.Если вы до сих пор используете драйвер АТОЛ версии 9 (как в примере автора: ATOL_KKT_1C83_V9), настоятельно рекомендуем рассмотреть переход на актуальную 10-ю версию (ДТО 10). Девятая версия драйверов давно снята производителем с поддержки, не развивается и плохо совместима с современными требованиями маркировки («Честный Знак») и форматами фискальных документов (ФФД 1.2).
Переход на АТОЛ 10 не только решит проблемы совместимости, но и предоставит альтернативные, более надежные способы интеграции:
Драйвер = Новый("AddIn.ATOL_KKT_1C83_V10");
Чтобы избежать внезапных аварийных остановок системы у кассиров, разработчик должен писать отказоустойчивый код инициализации оборудования. Разберем по шагам, как правильно реализовать процедуру подключения драйвера ККТ с обработкой возможных исключительных ситуаций:
&НаКлиенте
Процедура ПодключитьКассовыйДрайвер()
ИмяКомпоненты = "ИнтеграционнаяКомпонента";
Идентификатор = "AddIn.ИнтеграционнаяКомпонента.ATOL_KKT_1C83_V10";
// Шаг 1. Пытаемся подключить компоненту из системного реестра или кэша
Попытка
РезультатПодключения = ПодключитьВнешнююКомпоненту(Идентификатор);
Исключение
РезультатПодключения = Ложь;
ЗаписьЖурналаРегистрации("ККТ_АТОЛ", УровеньЖурналаРегистрации.Предупреждение, , ,
"Не удалось загрузить компоненту по ProgID: " + ОписаниеОшибки());
КонецПопытки;
// Шаг 2. Если по ProgID не подключилась, пробуем загрузить из макета БПО
Если Не РезультатПодключения Тогда
Попытка
АдресМакет = ПолучитьМакетДрайвераНаСервере();
РезультатПодключения = ПодключитьВнешнююКомпоненту(АдресМакет, ИмяКомпоненты, ТипВнешнейКомпоненты.Native);
Исключение
РезультатПодключения = Ложь;
ЗаписьЖурналаРегистрации("ККТ_АТОЛ", УровеньЖурналаРегистрации.Ошибка, , ,
"Ошибка загрузки компоненты из макета: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
// Шаг 3. Инициализируем объект драйвера при успешном подключении библиотеки
Если РезультатПодключения Тогда
Попытка
ОбъектДрайвера = Новый(Идентификатор);
СообщитьПользователю("Драйвер АТОЛ успешно подключен и готов к работе!");
Исключение
ВызватьИсключение "Библиотека зарегистрирована, но объект драйвера создать не удалось. Проверьте разрядность приложения!";
КонецПопытки;
Иначе
ПоказатьПредупреждение(, "Не удалось запустить интеграционную компоненту ККТ АТОЛ. Обратитесь к системному администратору.");
КонецЕсли;
КонецПроцедуры
Использование подобных конструкций позволяет системе мягко реагировать на технические проблемы. Кассир получит информативное сообщение, а в Журнале регистрации 1С появится подробная техническая информация с указанием конкретной системной ошибки, что существенно ускорит диагностику для программиста.