Почему метод fptr.open() драйвера АТОЛ 10 возвращает -1 при подключении из 1С?

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

При интеграции онлайн-касс АТОЛ через десятую версию драйвера (ДТО 10) разработчики нередко сталкиваются с ситуацией: COM-объект создается без ошибок, тестовая утилита драйвера видит фискальный регистратор и печатает чеки, однако программный вызов fptr.open() упорно возвращает -1 (соединение не установлено). Разберем причины такого поведения, выясним, почему блокируется порт, и рассмотрим правильные варианты подключения оборудования в 1С.

Причина ошибки: монопольная блокировка порта

В большинстве случаев отрицательный результат при открытии соединения связан с тем, что физический или виртуальный порт ККТ уже захвачен другим процессом. Драйвер АТОЛ работает с портами в монопольном режиме: два приложения не могут одновременно удерживать активную сессию с одним и тем же фискальным накопителем.

Рассмотрим типичные ситуации, вызывающие ошибку -1:

  1. Запущенная утилита «Тест драйвера ККТ» (fptr10_t.exe): если в тестовой программе нажата кнопка включения соединения или окно утилиты просто удерживает порт активным, 1С не сможет открыть сессию. Перед обращением к кассе из кода необходимо разорвать связь в утилите или полностью закрыть ее.
  2. Зависший процесс 1С в системе: если во время отладки произошел аварийный останов кода и метод fptr.close() не был выполнен, процесс 1cv8.exe (или 1cv8c.exe) продолжает блокировать порт в операционной системе. В этом случае требуется принудительно завершить фоновые процессы 1С через диспетчер задач Windows.
  3. Конфликт со службой передачи данных в ОФД (EoU): при подключении по USB касса может эмулировать два COM-порта (один для управляющих команд, второй для службы EthOverUsb). Если в настройках 1С указать номер порта, занятый службой EoU, драйвер вернет ошибку.
  4. Служба веб-сервера АТОЛ: если на компьютере развернут и запущен системный сервис веб-сервера драйвера, он может автоматически захватывать порт кассы при старте операционной системы.

Диагностика точной причины ошибки

Вместо перебора номеров портов наугад проанализируем внутреннее состояние драйвера. Метод 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() выдаст информативное сообщение («Порт занят другим приложением» или «Порт недоступен»), что существенно сэкономит время при поиске неполадки.

Рабочие примеры подключения через COM-объект

Посмотрим на пример инициализации подключения через прямой 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();
КонецЕсли;

Правила безопасной работы с ККТ в коде

Для предотвращения зависания порта при возникновении программных ошибок разберем ключевые рекомендации по организации кода:

  1. Обязательное закрытие сессии: операции печати чеков и опроса статуса ККТ следует оборачивать в блок обработки исключений, чтобы порт освобождался при любом исходе операции.
  2. Проверка открытого состояния: перед вызовом закрытия или повторного открытия порта проверяем метод fptr.isOpened().
  3. Энергосбережение USB в Windows: в диспетчере устройств для виртуального COM-порта и корневых USB-концентраторов рекомендуется снять флаг «Разрешить отключение этого устройства для экономии энергии», чтобы операционная система не разрывала связь при простое.

Посмотрим на безопасный шаблон взаимодействия с драйвером:


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();
КонецЕсли;

Альтернатива: переход на технологию Native API

Создание 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-регистрацией и обеспечивает кроссплатформенность решения при работе на клиенте и сервере.

← На главную