При работе с кассовым оборудованием Атол (например, модель 30Ф) программисты часто сталкиваются с неприятной ситуацией: во время закрытия смены (печати Z-отчета) в кассовом аппарате заканчивается лента. В этот момент 1С уже успевает зафиксировать закрытие смены в своей базе данных, но ККТ остается в промежуточном состоянии — «отчет с гашением прерван». При попытке открыть новую смену или повторно закрыть старую через стандартные механизмы 1С возникает ошибка, так как типовые методы конфигурации не умеют обрабатывать состояние прерванной печати.
В этой статье мы разберем, как программно реализовать функционал кнопки «Допечатать», доступной в тест-драйвере Атол, используя возможности 10-й версии драйвера (DTO 10) непосредственно из кода 1С.
Разберем причину, по которой обычное подключение через Новый("AddIn.ATOL_KKT_1C83_V10") не дает результата. Фирма «1С» предъявляет жесткие требования к сертифицированным драйверам. В рамках этих требований компонента должна иметь унифицированный интерфейс, одинаковый для всех производителей касс. В этом интерфейсе просто отсутствуют специфические команды производителя, такие как continuePrint() или прямой запрос версии драйвера через version().
Для решения нашей задачи нам потребуется подключить не «обертку» для 1С, а полную Native-библиотеку разработчика Атол. Проанализируем, как это сделать правильно.
Для начала нам необходимо найти файл библиотеки 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 в зависимости от способа регистрации библиотеки в системе).
В отличие от старых версий драйверов (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());
Возврат;
КонецЕсли;
Теперь, когда связь установлена, мы можем вызвать заветный метод continuePrint(). Эта команда сообщает кассовому аппарату, что ошибка (например, отсутствие бумаги) устранена и необходимо завершить формирование последнего документа.
Рассмотрим алгоритм действий:
// Проверяем состояние ККТ
Драйвер.getDeviceStatus();
Если Драйвер.errorInt() <> 0 Тогда
// Если ККТ в состоянии ошибки печати, пробуем допечатать
Драйвер.continuePrint();
// Проверяем результат выполнения
Если Драйвер.errorInt() = 0 Тогда
Сообщить("Документ успешно допечатан");
Иначе
Сообщить("Ошибка при попытке допечати: " + Драйвер.errorDescription());
КонецЕсли;
КонецЕсли;
// Обязательно закрываем соединение
Драйвер.close();
Проанализируем еще один современный способ взаимодействия с драйвером Атол 10 — метод processJson. Этот метод присутствует даже во многих версиях "1С-ных" компонент и позволяет выполнять низкоуровневые команды без глубокой инициализации объекта. Это универсальный путь, который не требует настройки веб-сервера, о котором упоминалось в обсуждении, так как библиотека умеет парсить JSON локально.
Пример формирования задания для допечати:
ЗаданиеJSON = "{""type"": ""continuePrint""}";
РезультатJSON = "";
Драйвер.processJson(ЗаданиеJSON, РезультатJSON);
// В переменной РезультатJSON будет ответ от кассы в формате JSON
Использование JSON-заданий считается более надежным и современным подходом, так как оно минимизирует количество вызовов между 1С и внешней библиотекой, что снижает вероятность возникновения ошибок памяти или блокировок потока.
Если в вашей организации более 100 торговых точек, как у автора вопроса, ручная регистрация fptr10.dll на каждом компьютере — это трудоемкий процесс. Разберем, как автоматизировать этот процесс средствами 1С:
fptr10.dll и все необходимые сопутствующие библиотеки (например, libcrypto-1_1.dll и libssl-1_1.dll, если они требуются вашей версии драйвера).УстановитьВнешнююКомпоненту("ОбщийМакет.ДрайверАтол10"). 1С сама распакует библиотеку в локальный кэш пользователя и подготовит её к работе.Важный нюанс: при автоматической установке из макета используйте метод ПодключитьВнешнююКомпоненту с указанием имени, которое вы задали при установке, а не прямого пути к файлу. Это позволит избежать проблем с правами доступа к папке Program Files.
Мы выяснили, что для решения специфических задач, таких как допечатка прерванного Z-отчета, стандартных возможностей интеграции 1С и Атол бывает недостаточно. Однако использование прямой Native-компоненты fptr10.dll открывает полный доступ ко всем сервисным функциям ККТ. Разделение логики на подключение библиотеки, настройку параметров через setSingleSetting и выполнение команды continuePrint (или через JSON) позволяет гибко управлять кассовым оборудованием и минимизировать простои на торговых точках при возникновении мелких технических неисправностей.