Почему не подключается внешняя компонента ККТ АТОЛ в 1С и как исправить ошибку регистрации?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Торговля и дистрибуция
← На главную

При настройке торгового оборудования и подключении контрольно-кассовой техники (ККТ) к «1С:Предприятию» специалисты нередко сталкиваются с ситуацией, когда метод ПодключитьВнешнююКомпоненту завершается неудачей и возвращает Ложь. Попытки зарегистрировать библиотеку вручную через системную утилиту Windows regsvr32 обычно приводят к сообщению: «Возможно, модуль не совместим с версией Windows, работающей на этом компьютере. Проверьте, совместим ли этот модуль с x86 (32-разрядной) или 64-разрядной версией regsvr32.exe».

Проанализируем технические причины этой проблемы, разберем архитектуру внешних компонент 1С и выясним, как правильно запустить печать чеков на рабочих местах.

Рассмотрим типовой фрагмент встроенного языка 1С, на котором возникает сбой подключения:


Макет = ПолучитьМакет("ИнтеграционнаяКомпонента");
Адрес = ПоместитьВоВременноеХранилище(Макет);

// Метод возвращает Ложь
Если Не ПодключитьВнешнююКомпоненту(Адрес, "ИнтеграционнаяКомпонента", ТипВнешнейКомпоненты.Native) Тогда
    ВызватьИсключение "Ошибка подключения внешней компоненты!";
КонецЕсли;

Драйвер = Новый("AddIn.ИнтеграционнаяКомпонента.ATOL_KKM_1C82_54FZ");

Причина 1. Ошибочная попытка регистрации Native API через regsvr32

Разберем природу ошибки утилиты regsvr32. Утилита regsvr32.exe создана исключительно для регистрации библиотек, поддерживающих технологию COM/OLE. Такие библиотеки экспортируют специальную системную функцию DllRegisterServer.

Современные драйверы оборудования для 1С поставляются как компоненты, созданные по технологии Native API (нативные библиотеки). Они не являются COM-серверами, в них отсутствует точка входа DllRegisterServer. По этой причине попытка выполнить команду regsvr32 имя_файла.dll гарантированно вызовет ошибку несовместимости, независимо от того, запускается ли команда из каталога System32 или SysWOW64.

Запомним важное правило: нативные библиотеки регистрировать через операционную систему не требуется. Их загрузка, инициализация и интеграция в адресное пространство выполняются самой платформой 1С в момент вызова функции ПодключитьВнешнююКомпоненту.

Причина 2. Конфликт разрядности клиента 1С и динамической библиотеки

Выясним главную причину возврата значения Ложь в коде 1С. Любой исполняемый процесс может загружать в свою память только библиотеки аналогичной битности:

  1. 64-разрядный клиент 1С (x64) способен работать исключительно с 64-битными библиотеками (dll).
  2. 32-разрядный клиент 1С (x86) способен загружать только 32-битные библиотеки (dll).

В устаревших линейках драйверов (например, АТОЛ ДТО 8.х, включая 8.14) внешняя компонента под требования 1С поставлялась только в 32-разрядном варианте (x86). При попытке вызвать ПодключитьВнешнююКомпоненту из-под 64-битного клиента 1С платформа физически не может загрузить 32-битную dll в 64-битное адресное пространство процесса 1cv8.exe и возвращает Ложь.

Причина 3. Отсутствие системных библиотек Microsoft Visual C++

Даже при совпадении разрядностей библиотека может не стартовать из-за отсутствия необходимых зависимостей в операционной системе. Драйверы АТОЛ компилируются в среде Microsoft Visual Studio, и для их корректной работы требуются соответствующие пакеты Microsoft Visual C++ Redistributable. Разрядность установленного пакета Visual C++ должна соответствовать разрядности клиента 1С (для x86-клиента обязательно должен быть установлен x86-пакет распространяемых библиотек C++).

Способ 1. Использование 32-разрядного клиента «1С:Предприятие»

Рассмотрим самое простое и проверенное решение для конфигураций на обычных формах (например, «Управление торговлей 10.3») при использовании драйверов линейки ДТО 8:

  1. Установим на рабочую станцию пользователя 32-битный дистрибутив платформы 1С:Предприятие. На 64-разрядных версиях Windows (Windows 7, 10, 11, Server 2012 R2 и новее) 32-битные приложения функционируют штатно через подсистему WOW64.
  2. В окне запуска информационных баз перейдем в параметры нужной базы и в поле Разрядность явно укажем 32 (x86).
  3. Запустим сеанс 1С и выполним стандартную процедуру проверки связи с кассой через меню подключения торгового оборудования.

После переключения на платформу разрядности x86 вызов ПодключитьВнешнююКомпоненту корректно обработает 32-битную библиотеку и вернет Истина.

Способ 2. Переход на единый драйвер ДТО 10 с кроссплатформенным макетом

Если специфика инфраструктуры или требования системных администраторов исключают использование 32-битного клиента 1С, перейдем на современную архитектуру драйверов АТОЛ версии 10.х (ДТО 10):

  1. Скачаем и установим актуальный релиз драйвера АТОЛ 10.х.
  2. В современных драйверах интеграционная компонента поставляется в виде zip-архива, внутри которого находится файл описания MANIFEST.XML, а также наборы скомпилированных библиотек под различные платформы и разрядности: Windows x86, Windows x64, Linux x86, Linux x64.
  3. Загрузим данный zip-архив в макет двоичных данных конфигурации или обработки обслуживания.

Посмотрим, как платформа работает с таким архивом:


// В макете должен лежать полноценный zip-архив с манифестом
МакетДрайвера = ПолучитьМакет("ИнтеграционнаяКомпонентаАтол10");
АдресХранилища = ПоместитьВоВременноеХранилище(МакетДрайвера);

// Платформа сама прочитает MANIFEST.XML и выберет нужную dll под текущую ОС и битность клиента
Если ПодключитьВнешнююКомпоненту(АдресХранилища, "ИнтеграцияККТ", ТипВнешнейКомпоненты.Native) Тогда
    ОбъектДрайвера = Новый("AddIn.ИнтеграцияККТ.ATOL_KKT_10");
    // Инициализация объекта драйвера завершена успешно
Иначе
    ВызватьИсключение "Не удалось инициализировать компоненту драйвера ДТО 10!";
КонецЕсли;

Организация сетевой печати и совместного доступа к ККТ

Разберем типичное заблуждение относительно сетевой работы кассовых аппаратов. Нередко считается, что служба Ethernet over USB (EoU) позволяет отправлять чеки на ККТ с других рабочих мест по локальной сети. Это не так.

Служба EoU предназначена только для одной задачи: трансляции фискальных данных от кассового аппарата на серверы ОФД через USB-интерфейс компьютера, имеющего доступ в интернет. Она не предоставляет сетевой сокет для печати чеков с других ПК.

Для организации сетевой печати на аппаратах типа АТОЛ 22 ПТК применим один из следующих подходов:

  1. Прямое подключение ККТ по Ethernet: Аппарат АТОЛ 22 ПТК оснащен физическим интерфейсом Ethernet. В таблицах настроек ККТ переключим основной канал управления на Ethernet. Зададим кассе статический IP-адрес и порт (по умолчанию 5559). Каждое рабочее место сможет адресовать команды печати напрямую по сетевому адресу кассы. При этом важно помнить, что порт ККТ является монопольным: пока одно рабочее место печатает чек, для остальных порт будет занят.
  2. Использование Web-сервера АТОЛ (KKT Server): В составе ДТО 10 присутствует локальный Web-сервер. Он принимает команды фискализации по протоколу HTTP(S) от любых клиентов в сети и автоматически выстраивает входящие чеки в последовательную очередь печати, исключая конфликты блокировки портов.
  3. Централизованная печать через сервер 1С: Организуем серверную очередь внутри самой базы данных: пользователи создают документы, а печать фискальных чеков выполняет сервер «1С:Предприятие» в рамках регламентного задания или выделенного сервиса, взаимодействующего с IP-адресом кассы.
← На главную