При настройке торгового оборудования и подключении контрольно-кассовой техники (ККТ) к «1С:Предприятию» специалисты нередко сталкиваются с ситуацией, когда метод ПодключитьВнешнююКомпоненту завершается неудачей и возвращает Ложь. Попытки зарегистрировать библиотеку вручную через системную утилиту Windows regsvr32 обычно приводят к сообщению: «Возможно, модуль не совместим с версией Windows, работающей на этом компьютере. Проверьте, совместим ли этот модуль с x86 (32-разрядной) или 64-разрядной версией regsvr32.exe».
Проанализируем технические причины этой проблемы, разберем архитектуру внешних компонент 1С и выясним, как правильно запустить печать чеков на рабочих местах.
Рассмотрим типовой фрагмент встроенного языка 1С, на котором возникает сбой подключения:
Макет = ПолучитьМакет("ИнтеграционнаяКомпонента");
Адрес = ПоместитьВоВременноеХранилище(Макет);
// Метод возвращает Ложь
Если Не ПодключитьВнешнююКомпоненту(Адрес, "ИнтеграционнаяКомпонента", ТипВнешнейКомпоненты.Native) Тогда
ВызватьИсключение "Ошибка подключения внешней компоненты!";
КонецЕсли;
Драйвер = Новый("AddIn.ИнтеграционнаяКомпонента.ATOL_KKM_1C82_54FZ");
Разберем природу ошибки утилиты regsvr32. Утилита regsvr32.exe создана исключительно для регистрации библиотек, поддерживающих технологию COM/OLE. Такие библиотеки экспортируют специальную системную функцию DllRegisterServer.
Современные драйверы оборудования для 1С поставляются как компоненты, созданные по технологии Native API (нативные библиотеки). Они не являются COM-серверами, в них отсутствует точка входа DllRegisterServer. По этой причине попытка выполнить команду regsvr32 имя_файла.dll гарантированно вызовет ошибку несовместимости, независимо от того, запускается ли команда из каталога System32 или SysWOW64.
Запомним важное правило: нативные библиотеки регистрировать через операционную систему не требуется. Их загрузка, инициализация и интеграция в адресное пространство выполняются самой платформой 1С в момент вызова функции ПодключитьВнешнююКомпоненту.
Выясним главную причину возврата значения Ложь в коде 1С. Любой исполняемый процесс может загружать в свою память только библиотеки аналогичной битности:
В устаревших линейках драйверов (например, АТОЛ ДТО 8.х, включая 8.14) внешняя компонента под требования 1С поставлялась только в 32-разрядном варианте (x86). При попытке вызвать ПодключитьВнешнююКомпоненту из-под 64-битного клиента 1С платформа физически не может загрузить 32-битную dll в 64-битное адресное пространство процесса 1cv8.exe и возвращает Ложь.
Даже при совпадении разрядностей библиотека может не стартовать из-за отсутствия необходимых зависимостей в операционной системе. Драйверы АТОЛ компилируются в среде Microsoft Visual Studio, и для их корректной работы требуются соответствующие пакеты Microsoft Visual C++ Redistributable. Разрядность установленного пакета Visual C++ должна соответствовать разрядности клиента 1С (для x86-клиента обязательно должен быть установлен x86-пакет распространяемых библиотек C++).
Рассмотрим самое простое и проверенное решение для конфигураций на обычных формах (например, «Управление торговлей 10.3») при использовании драйверов линейки ДТО 8:
После переключения на платформу разрядности x86 вызов ПодключитьВнешнююКомпоненту корректно обработает 32-битную библиотеку и вернет Истина.
Если специфика инфраструктуры или требования системных администраторов исключают использование 32-битного клиента 1С, перейдем на современную архитектуру драйверов АТОЛ версии 10.х (ДТО 10):
MANIFEST.XML, а также наборы скомпилированных библиотек под различные платформы и разрядности: Windows x86, Windows x64, Linux x86, Linux x64.Посмотрим, как платформа работает с таким архивом:
// В макете должен лежать полноценный zip-архив с манифестом
МакетДрайвера = ПолучитьМакет("ИнтеграционнаяКомпонентаАтол10");
АдресХранилища = ПоместитьВоВременноеХранилище(МакетДрайвера);
// Платформа сама прочитает MANIFEST.XML и выберет нужную dll под текущую ОС и битность клиента
Если ПодключитьВнешнююКомпоненту(АдресХранилища, "ИнтеграцияККТ", ТипВнешнейКомпоненты.Native) Тогда
ОбъектДрайвера = Новый("AddIn.ИнтеграцияККТ.ATOL_KKT_10");
// Инициализация объекта драйвера завершена успешно
Иначе
ВызватьИсключение "Не удалось инициализировать компоненту драйвера ДТО 10!";
КонецЕсли;
Разберем типичное заблуждение относительно сетевой работы кассовых аппаратов. Нередко считается, что служба Ethernet over USB (EoU) позволяет отправлять чеки на ККТ с других рабочих мест по локальной сети. Это не так.
Служба EoU предназначена только для одной задачи: трансляции фискальных данных от кассового аппарата на серверы ОФД через USB-интерфейс компьютера, имеющего доступ в интернет. Она не предоставляет сетевой сокет для печати чеков с других ПК.
Для организации сетевой печати на аппаратах типа АТОЛ 22 ПТК применим один из следующих подходов: