Как использовать Native-компоненту драйвера Атол 10 в 1С для допечати прерванного отчета

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

При работе с кассовым оборудованием Атол (например, модель 30Ф) программисты часто сталкиваются с неприятной ситуацией: во время закрытия смены (печати Z-отчета) в кассовом аппарате заканчивается лента. В этот момент 1С уже успевает зафиксировать закрытие смены в своей базе данных, но ККТ остается в промежуточном состоянии — «отчет с гашением прерван». При попытке открыть новую смену или повторно закрыть старую через стандартные механизмы 1С возникает ошибка, так как типовые методы конфигурации не умеют обрабатывать состояние прерванной печати.

В этой статье мы разберем, как программно реализовать функционал кнопки «Допечатать», доступной в тест-драйвере Атол, используя возможности 10-й версии драйвера (DTO 10) непосредственно из кода 1С.

Почему стандартная компонента 1С не подходит

Разберем причину, по которой обычное подключение через Новый("AddIn.ATOL_KKT_1C83_V10") не дает результата. Фирма «1С» предъявляет жесткие требования к сертифицированным драйверам. В рамках этих требований компонента должна иметь унифицированный интерфейс, одинаковый для всех производителей касс. В этом интерфейсе просто отсутствуют специфические команды производителя, такие как continuePrint() или прямой запрос версии драйвера через version().

Для решения нашей задачи нам потребуется подключить не «обертку» для 1С, а полную Native-библиотеку разработчика Атол. Проанализируем, как это сделать правильно.

Шаг 1. Подключение Native-компоненты fptr10.dll

Для начала нам необходимо найти файл библиотеки fptr10.dll. Обычно он располагается в папке установки драйвера Атол в подкаталоге bin. Важно помнить о разрядности: если ваш клиент 1С 32-битный, используйте библиотеку из папки x86, если 64-битный — из x64. Несоответствие разрядности приведет к ошибке «Тип не определен».

Рассмотрим код для динамического подключения компоненты:


&НаКлиенте
Процедура ПодключитьДрайверНативно()
    ПутьКБиблиотеке = "C:\Program Files\ATOL\Drivers10\KKT\bin\fptr10.dll";
    Результат = ПодключитьВнешнююКомпоненту(ПутьКБиблиотеке, "AtolFptr10", ТипВнешнейКомпоненты.Native);
    
    Если Результат Тогда
        Драйвер = Новый("AddIn.AtolFptr10.Fptr10");
        Сообщить("Драйвер успешно подключен. Версия: " + Драйвер.version());
    Иначе
        Сообщить("Не удалось подключить Native-компоненту Атол");
    КонецЕсли;
КонецПроцедуры

Обратите внимание, что ProgID для полной компоненты отличается от стандартного 1С-овского. Мы используем AddIn.AtolFptr10.Fptr10 (или просто AddIn.Fptr10 в зависимости от способа регистрации библиотеки в системе).

Шаг 2. Инициализация и настройка связи с ККТ

В отличие от старых версий драйверов (DTO 8/9), где мы просто создавали COM-объект и устанавливали свойства, в 10-й версии работа с параметрами реализована через методы setSingleSetting. Выясним, как правильно инициализировать связь перед вызовом команды допечати.


// Настройка параметров подключения
Драйвер.setSingleSetting(Драйвер.LIBFPTR_SETTING_MODEL, Строка(Драйвер.LIBFPTR_MODEL_ATOL_AUTO));
Драйвер.setSingleSetting(Драйвер.LIBFPTR_SETTING_PORT, Строка(Драйвер.LIBFPTR_PORT_COM));
Драйвер.setSingleSetting(Драйвер.LIBFPTR_SETTING_COM_FILE, "COM3"); // Укажите ваш номер порта
Драйвер.setSingleSetting(Драйвер.LIBFPTR_SETTING_BAUDRATE, Строка(Дriver.LIBFPTR_PORT_BR_115200));

// Применяем настройки
Драйвер.applySingleSettings();

// Открываем соединение
Драйвер.open();

Если Не Драйвер.isOpened() Тогда
    Сообщить("Ошибка открытия связи: " + Драйвер.errorDescription());
    Возврат;
КонецЕсли;

Шаг 3. Выполнение команды допечати (continuePrint)

Теперь, когда связь установлена, мы можем вызвать заветный метод continuePrint(). Эта команда сообщает кассовому аппарату, что ошибка (например, отсутствие бумаги) устранена и необходимо завершить формирование последнего документа.

Рассмотрим алгоритм действий:


// Проверяем состояние ККТ
Драйвер.getDeviceStatus();
Если Драйвер.errorInt() <> 0 Тогда
    // Если ККТ в состоянии ошибки печати, пробуем допечатать
    Драйвер.continuePrint();
    
    // Проверяем результат выполнения
    Если Драйвер.errorInt() = 0 Тогда
        Сообщить("Документ успешно допечатан");
    Иначе
        Сообщить("Ошибка при попытке допечати: " + Драйвер.errorDescription());
    КонецЕсли;
КонецЕсли;

// Обязательно закрываем соединение
Драйвер.close();

Альтернативное решение: Использование JSON-заданий

Проанализируем еще один современный способ взаимодействия с драйвером Атол 10 — метод processJson. Этот метод присутствует даже во многих версиях "1С-ных" компонент и позволяет выполнять низкоуровневые команды без глубокой инициализации объекта. Это универсальный путь, который не требует настройки веб-сервера, о котором упоминалось в обсуждении, так как библиотека умеет парсить JSON локально.

Пример формирования задания для допечати:


ЗаданиеJSON = "{""type"": ""continuePrint""}";
РезультатJSON = "";
Драйвер.processJson(ЗаданиеJSON, РезультатJSON);
// В переменной РезультатJSON будет ответ от кассы в формате JSON

Использование JSON-заданий считается более надежным и современным подходом, так как оно минимизирует количество вызовов между 1С и внешней библиотекой, что снижает вероятность возникновения ошибок памяти или блокировок потока.

Распространение компоненты на большое количество рабочих мест

Если в вашей организации более 100 торговых точек, как у автора вопроса, ручная регистрация fptr10.dll на каждом компьютере — это трудоемкий процесс. Разберем, как автоматизировать этот процесс средствами 1С:

  1. Создайте в конфигурации новый Общий макет с типом Внешняя компонента.
  2. Загрузите в этот макет архив, содержащий fptr10.dll и все необходимые сопутствующие библиотеки (например, libcrypto-1_1.dll и libssl-1_1.dll, если они требуются вашей версии драйвера).
  3. В коде используйте метод УстановитьВнешнююКомпоненту("ОбщийМакет.ДрайверАтол10"). 1С сама распакует библиотеку в локальный кэш пользователя и подготовит её к работе.

Важный нюанс: при автоматической установке из макета используйте метод ПодключитьВнешнююКомпоненту с указанием имени, которое вы задали при установке, а не прямого пути к файлу. Это позволит избежать проблем с правами доступа к папке Program Files.

Заключение

Мы выяснили, что для решения специфических задач, таких как допечатка прерванного Z-отчета, стандартных возможностей интеграции 1С и Атол бывает недостаточно. Однако использование прямой Native-компоненты fptr10.dll открывает полный доступ ко всем сервисным функциям ККТ. Разделение логики на подключение библиотеки, настройку параметров через setSingleSetting и выполнение команды continuePrint (или через JSON) позволяет гибко управлять кассовым оборудованием и минимизировать простои на торговых точках при возникновении мелких технических неисправностей.

← На главную