При интеграции онлайн-касс АТОЛ через десятую версию драйвера (ДТО 10) разработчики нередко сталкиваются с ситуацией: COM-объект создается без ошибок, тестовая утилита драйвера видит фискальный регистратор и печатает чеки, однако программный вызов fptr.open() упорно возвращает -1 (соединение не установлено). Разберем причины такого поведения, выясним, почему блокируется порт, и рассмотрим правильные варианты подключения оборудования в 1С.
В большинстве случаев отрицательный результат при открытии соединения связан с тем, что физический или виртуальный порт ККТ уже захвачен другим процессом. Драйвер АТОЛ работает с портами в монопольном режиме: два приложения не могут одновременно удерживать активную сессию с одним и тем же фискальным накопителем.
Рассмотрим типичные ситуации, вызывающие ошибку -1:
fptr.close() не был выполнен, процесс 1cv8.exe (или 1cv8c.exe) продолжает блокировать порт в операционной системе. В этом случае требуется принудительно завершить фоновые процессы 1С через диспетчер задач Windows.EthOverUsb). Если в настройках 1С указать номер порта, занятый службой EoU, драйвер вернет ошибку.Вместо перебора номеров портов наугад проанализируем внутреннее состояние драйвера. Метод open() при возврате значения -1 фиксирует точные сведения о сбое. Добавим получение кода и описания ошибки:
fptr = Новый COMОбъект("AddIn.Fptr10");
fptr.setSingleSetting(fptr.LIBFPTR_SETTING_PORT, Строка(fptr.LIBFPTR_PORT_USB));
fptr.applySingleSettings();
Если fptr.open() < 0 Тогда
КодОшибки = fptr.errorCode();
ТекстОшибки = fptr.errorDescription();
Сообщить("Не удалось открыть связь с ККТ: " + ТекстОшибки + " (Код: " + Строка(КодОшибки) + ")");
КонецЕсли;
Если порт занят утилитой или службой, метод fptr.errorDescription() выдаст информативное сообщение («Порт занят другим приложением» или «Порт недоступен»), что существенно сэкономит время при поиске неполадки.
Посмотрим на пример инициализации подключения через прямой USB-интерфейс:
ОбъектДрайвера = Новый COMОбъект("AddIn.Fptr10");
// Указываем тип подключения USB
ОбъектДрайвера.setSingleSetting(ОбъектДрайвера.LIBFPTR_SETTING_PORT, Строка(ОбъектДрайвера.LIBFPTR_PORT_USB));
ОбъектДрайвера.applySingleSettings();
// Открываем соединение
Если ОбъектДрайвера.open() < 0 Тогда
ВызватьИсключение ОбъектДрайвера.errorDescription();
КонецЕсли;
Теперь рассмотрим подключение через виртуальный последовательный порт (COM):
ОбъектДрайвера = Новый COMОбъект("AddIn.Fptr10");
// Настройка подключения по COM-порту
ОбъектДрайвера.setSingleSetting(ОбъектДрайвера.LIBFPTR_SETTING_MODEL, Строка(ОбъектДрайвера.LIBFPTR_MODEL_ATOL_AUTO));
ОбъектДрайвера.setSingleSetting(ОбъектДрайвера.LIBFPTR_SETTING_PORT, Строка(ОбъектДрайвера.LIBFPTR_PORT_COM));
ОбъектДрайвера.setSingleSetting(ОбъектДрайвера.LIBFPTR_SETTING_COM_FILE, "COM4"); // Для Linux: "/dev/ttyACM0"
ОбъектДрайвера.setSingleSetting(ОбъектДрайвера.LIBFPTR_SETTING_BAUDRATE, Строка(ОбъектДрайвера.LIBFPTR_PORT_BR_115200));
ОбъектДрайвера.applySingleSettings();
Если ОбъектДрайвера.open() < 0 Тогда
ВызватьИсключение ОбъектДрайвера.errorDescription();
КонецЕсли;
Для предотвращения зависания порта при возникновении программных ошибок разберем ключевые рекомендации по организации кода:
fptr.isOpened().Посмотрим на безопасный шаблон взаимодействия с драйвером:
fptr = Новый COMОбъект("AddIn.Fptr10");
fptr.setSingleSetting(fptr.LIBFPTR_SETTING_PORT, Строка(fptr.LIBFPTR_PORT_USB));
fptr.applySingleSettings();
Попытка
Если fptr.open() < 0 Тогда
ВызватьИсключение "Ошибка подключения к ККТ: " + fptr.errorDescription();
КонецЕсли;
// Выполнение фискальных операций
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
// Гарантированно освобождаем устройство
Если fptr.isOpened() Тогда
fptr.close();
КонецЕсли;
Создание COM-объекта через конструкцию Новый COMОбъект("AddIn.Fptr10") накладывает ограничения: требует регистрации библиотеки в Windows через regsvr32, зависит от совпадения разрядности клиента 1С и DLL, а также не функционирует в среде Linux. Драйвер АТОЛ 10 поддерживает Native API, что позволяет подключить внешнюю компоненту напрямую средствами 1С:
// Загрузка компоненты без регистрации в реестре Windows
ПодключитьВнешнююКомпоненту("C:\Program Files\ATOL\Drivers10\KKT\bin\fptr10.dll", "Fptr10", ТипПодключенияВнешнейКомпоненты.Native);
fptr = Новый("AddIn.Fptr10");
Использование Native API исключает системные проблемы с COM-регистрацией и обеспечивает кроссплатформенность решения при работе на клиенте и сервере.