Как программно выполнить отрезку нефискального документа на АТОЛ Платформа 5

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

При работе с фискальными регистраторами АТОЛ на Платформе 5.0 (драйвер версии 10) разработчики часто сталкиваются с ситуацией, когда стандартные методы завершения документа не приводят к автоматической отрезке чековой ленты. Особенно это актуально для нефискальных документов (слип-чеки, квитанции, отчеты), где логика работы обрезчика может отличаться от печати обычного кассового чека. В этой статье мы подробно разберем, как заставить обрезчик выполнять свою функцию, проанализируем различные подходы — от использования специфических символов 1С до низкоуровневых команд драйвера и JSON-заданий.

Разбор проблемы: Почему обрезчик молчит?

Проанализируем ситуацию: на Платформе 5 управление периферийными устройствами (ножом в том числе) жестко завязано на состояние документа в буфере ККТ. Рассмотрим основные причины, по которым fptr.endNonfiscalDocument() не вызывает отрезку:

  1. Параметр печати футера: В методе закрытия документа часто передается флаг отключения печати подвала. Если передать false, драйвер может подавить выполнение команды отрезки, которая логически следует за клише.
  2. Специфика Библиотеки подключаемого оборудования (БПО) 1С: Многие привыкли, что вставленный в текст символ (char)22 или тег [cut] автоматически режет бумагу. Однако важно понимать, что это функционал именно интеграционной компоненты 1С, а не самого «голого» драйвера АТОЛ. При работе напрямую из C# или других языков эти символы будут проигнорированы принтером.
  3. Физическое смещение: Иногда отрезка происходит, но из-за отсутствия прокрутки ленты (Line Feed) нож попадает на текст или режет документ слишком рано.

Решение №1: Прямое управление методом cut()

Если мы работаем с драйвером напрямую (например, из внешнего приложения на C# или Delphi), наиболее очевидным кажется использование метода cut(). Рассмотрим правильную последовательность вызовов. Выясним причину, почему простой вызов метода часто не помогает: дело в том, что команда должна быть подана строго после того, как документ официально закрыт в памяти аппарата.

Разберем пример кода:


// Завершаем нефискальный документ, не печатая футер (клише)
fptr.setParam(AtolConstants.LIBFPTR_PARAM_PRINT_FOOTER, false);
fptr.endNonfiscalDocument();

// Теперь явно даем команду на отрезку
// Устанавливаем тип отрезки: полная (LIBFPTR_CT_FULL) или частичная (LIBFPTR_CT_PART)
fptr.setParam(AtolConstants.LIBFPTR_PARAM_CUT_TYPE, AtolConstants.LIBFPTR_CT_FULL);
fptr.cut();

Важный момент: Перед вызовом cut() рекомендуется добавить несколько пустых строк с помощью printText(), чтобы текст документа успел выйти за пределы линии отреза. Обычно достаточно 3–4 пустых строк.

Решение №2: Использование JSON-заданий (Рекомендуемый способ)

Для Платформы 5 компания АТОЛ позиционирует работу через JSON как наиболее надежный и универсальный метод. Метод processJson позволяет описать весь документ и действия с ним в одной структуре. Проанализируем, как это выглядит для нефискальной печати:


{
    "type": "nonFiscal",
    "items": [
        { "type": "text", "text": "ПЕЧАТЬ ТЕСТОВОГО ДОКУМЕНТА", "alignment": "center" },
        { "type": "text", "text": "--------------------------" },
        { "type": "text", "text": "Данный документ отрезан автоматически" }
    ],
    "postItems": [
        { "type": "cut" }
    ]
}

В данном случае блок postItems гарантирует, что после печати всех элементов items будет выполнена команда cut. Это избавляет разработчика от необходимости отслеживать состояние документа и вручную управлять параметрами драйвера.

Решение №3: Особенности работы через БПО 1С

Если ваша задача реализуется внутри экосистемы 1С, рассмотрим, как работает механизм «магического символа». В 1С символ с кодом 22 (Символ(22)) служит маркером для компоненты. Когда компонента встречает этот символ в текстовом потоке, она сама инициирует команду отрезки через драйвер.

Посмотрим на пример кода в 1С:


ТекстДляПечати = "Заголовок документа" + Символы.ПС;
ТекстДляПечати = ТекстДляПечати + "Содержимое документа" + Символы.ПС;
// Добавляем символ отрезки в конец текста
ТекстДляПечати = ТекстДляПечати + Символ(22);

// При передаче этого текста в стандартные методы БПО (ПечатьТекста) 
// произойдет физическая отрезка ленты.

Однако, как мы выяснили в ходе обсуждения, этот метод не сработает, если вы вызываете функции драйвера printText напрямую из внешней среды, минуя обертку 1С.

Дополнительные настройки ККТ

Иногда программные методы бессильны, если в настройках самого аппарата отключена аппаратная отрезка. Проверим параметры через «Тест драйвера»:

  1. Зайдем в раздел «Параметры ККТ».
  2. Найдем пункт «Основные» или «Оборудование».
  3. Убедимся, что флаг «Отрезка чека» (или аналогичный) установлен.
  4. Также обратим внимание на параметр «Печать клише и рекламы». В некоторых прошивках Платформы 5 отрезка неразрывно связана с печатью клише в конце документа.

Подведение итогов

Рассмотрев все варианты, сделаем выводы. Для максимально стабильной работы на Платформе 5 при прямой интеграции (C#, Python, Java) следует использовать JSON-задания. Если же вы ограничены использованием классических методов API драйвера v.10, не забывайте о явном вызове fptr.cut() после закрытия документа методом fptr.endNonfiscalDocument(), предварительно обеспечив прокрутку бумаги для предотвращения «зарезания» текста.

← На главную