Работа с торговым оборудованием в среде 1С часто преподносит неприятные сюрпризы, особенно когда речь идет о внешних компонентах (Add-In). Типичная ситуация: вы доработали конфигурацию, интегрировали драйвер ККТ через общие макеты, и первое время все работает идеально. Однако спустя несколько часов или сутки система начинает выдавать ошибки «Тип не определен» или «Установка внешней компоненты не выполнена». В этой статье мы подробно разберем причины такого поведения платформы и системные факторы, влияющие на стабильность драйверов.
Прежде чем переходить к лечению, давайте разберем по шагам, что происходит «под капотом» платформы при вызове стандартных методов. Рассмотрим типовой алгоритм, который обычно реализуется в модулях работы с оборудованием:
УстановитьВнешнююКомпоненту, передавая путь к макету.ПодключитьВнешнююКомпоненту, который загружает библиотеку в адресное пространство процесса 1cv8.exe.Новый("AddIn.ИмяКомпоненты.Класс").Проблема «отложенного отказа» часто связана с тем, что на одном из этих этапов возникает блокировка или конфликт ресурсов. Выясним основные причины сбоев.
Платформа 1С хранит распакованные компоненты в локальных папках пользователя. Обычно это пути вида %AppData%\Local\1C\1Cv8\AddInCache или %AppData%\Roaming\1C\1Cv8\ExtCompT. Рассмотрим ситуацию: при каждом обращении к кассе код пытается проверить актуальность компоненты. Если файл в кэше по какой-то причине заблокирован (например, антивирусом или другим сеансом 1С в терминальном режиме), попытка перезаписи или даже простого обращения может вызвать ошибку установки.
Как решить: необходимо периодически очищать локальный кэш внешних компонент. Если ошибка повторяется, попробуйте изменить логику в коде так, чтобы установка выполнялась только в случае реального отсутствия компоненты, а не при каждом открытии смены или печати чека.
Ошибка «Тип не определен» часто свидетельствует о том, что библиотека загружена, но 1С не может создать объект. В управляемых формах (особенно на платформе 8.2 и 8.3) крайне важно использовать компоненты, разработанные по технологии Native API. Если драйвер использует старую технологию COM, он требует регистрации в реестре Windows через regsvr32. Любое обновление безопасности ОС или «чистка» реестра админом может привести к тому, что ветки реестра исчезнут, и 1С «потеряет» тип объекта.
Проанализируем пример правильного подключения компоненты Native API из макета:
&НаКлиенте
Процедура ПодключитьДрайвер()
ИмяМакета = "ОбщийМакет.ДрайверАтол9";
Если ПодключитьВнешнююКомпоненту(ИмяМакета, "AtolDrive", ТипВнешнейКомпоненты.Native) Тогда
Драйвер = Новый("AddIn.AtolDrive.AtolDrive10");
Сообщить("Драйвер успешно подключен!");
Иначе
УстановитьВнешнююКомпоненту(ИмяМакета);
// Повторная попытка после установки
КонецЕсли;
КонецПроцедуры
В сообщениях форума прозвучала важная мысль: «подключалка ломается из-за переполнения счетчика». Это не миф. Многие драйверы ККТ (особенно старых версий) имеют внутренние утечки памяти или открытых дескрипторов (handles). Если в коде объект драйвера создается при каждом чеке и не уничтожается явно, то через 500-1000 операций процесс 1С достигает лимита операционной системы на количество открытых объектов. После этого любая попытка инициализировать новый AddIn возвращает «Тип не определен», так как ОС отказывает в выделении ресурсов.
Рекомендация: создавайте объект драйвера один раз при запуске программы или начале смены и храните его в переменной модуля или в параметрах клиента. Если же логика требует пересоздания, обязательно деструктурируйте старый объект:
Драйвер = Неопределено; // Освобождаем память
ЗавершитьРаботуСистемы(); // В крайнем случае помогает перезапуск сеанса
Посмотрим на ситуацию со стороны информационной безопасности. Процесс 1cv8.exe внезапно выгружает DLL-файл во временную директорию пользователя и пытается его исполнить. Для многих антивирусов (включая встроенный Windows Defender) это поведение характерно для троянов-дропперов. Антивирус может не заблокировать файл мгновенно, но поместить его в «песочницу» для анализа. Через несколько часов, завершив анализ, он может заблокировать доступ к файлу или переместить его в карантин.
Что нужно сделать:
%AppData%\Local\1C\) в исключения антивируса.1cv8.exe или 1cv8c.exe в список доверенных программ.Если пользователи работают в терминальном режиме (RDP), возникает проблема конкуренции. Когда первый пользователь вызывает УстановитьВнешнююКомпоненту, файл записывается в его профиль. Но если макет в базе был обновлен или перезаписан (даже тем же самым файлом), система может попытаться обновить компоненту у всех активных пользователей одновременно. Это вызывает состояние «гонки» (race condition), блокировку DLL и последующий крах инициализации объекта.
Разберем, как минимизировать риски в коде. Проанализируем проверку перед установкой:
Попытка
// Сначала пробуем просто создать объект, вдруг компонента уже в памяти
Драйвер = Новый("AddIn.МойДрайвер.Класс");
Исключение
// Если не вышло, пробуем подключить уже установленную
Если Не ПодключитьВнешнююКомпоненту("МойДрайвер") Тогда
// И только в самом крайнем случае ставим из макета
УстановитьВнешнююКомпоненту("ОбщийМакет.Компонента");
ПодключитьВнешнююКомпоненту("ОбщийМакет.Компонента", "МойДрайвер");
КонецЕсли;
Драйвер = Новый("AddIn.МойДрайвер.Класс");
КонецПопытки;
Если вы столкнулись с тем, что компонента «отваливается» через сутки, выполните следующие шаги:
AddInCache на рабочих станциях. Это сбросит возможные ошибки блокировки файлов.УстановитьВнешнююКомпоненту без необходимости.Соблюдение этих правил позволит стабилизировать работу с торговым оборудованием и избавит пользователей от необходимости постоянно перезагружать систему или звать программиста для «перезаливки» макетов.