При работе с фискальными регистраторами АТОЛ на Платформе 5.0 (драйвер версии 10) разработчики часто сталкиваются с ситуацией, когда стандартные методы завершения документа не приводят к автоматической отрезке чековой ленты. Особенно это актуально для нефискальных документов (слип-чеки, квитанции, отчеты), где логика работы обрезчика может отличаться от печати обычного кассового чека. В этой статье мы подробно разберем, как заставить обрезчик выполнять свою функцию, проанализируем различные подходы — от использования специфических символов 1С до низкоуровневых команд драйвера и JSON-заданий.
Проанализируем ситуацию: на Платформе 5 управление периферийными устройствами (ножом в том числе) жестко завязано на состояние документа в буфере ККТ. Рассмотрим основные причины, по которым fptr.endNonfiscalDocument() не вызывает отрезку:
false, драйвер может подавить выполнение команды отрезки, которая логически следует за клише.(char)22 или тег [cut] автоматически режет бумагу. Однако важно понимать, что это функционал именно интеграционной компоненты 1С, а не самого «голого» драйвера АТОЛ. При работе напрямую из C# или других языков эти символы будут проигнорированы принтером.Если мы работаем с драйвером напрямую (например, из внешнего приложения на 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 пустых строк.
Для Платформы 5 компания АТОЛ позиционирует работу через JSON как наиболее надежный и универсальный метод. Метод processJson позволяет описать весь документ и действия с ним в одной структуре. Проанализируем, как это выглядит для нефискальной печати:
{
"type": "nonFiscal",
"items": [
{ "type": "text", "text": "ПЕЧАТЬ ТЕСТОВОГО ДОКУМЕНТА", "alignment": "center" },
{ "type": "text", "text": "--------------------------" },
{ "type": "text", "text": "Данный документ отрезан автоматически" }
],
"postItems": [
{ "type": "cut" }
]
}
В данном случае блок postItems гарантирует, что после печати всех элементов items будет выполнена команда cut. Это избавляет разработчика от необходимости отслеживать состояние документа и вручную управлять параметрами драйвера.
Если ваша задача реализуется внутри экосистемы 1С, рассмотрим, как работает механизм «магического символа». В 1С символ с кодом 22 (Символ(22)) служит маркером для компоненты. Когда компонента встречает этот символ в текстовом потоке, она сама инициирует команду отрезки через драйвер.
Посмотрим на пример кода в 1С:
ТекстДляПечати = "Заголовок документа" + Символы.ПС;
ТекстДляПечати = ТекстДляПечати + "Содержимое документа" + Символы.ПС;
// Добавляем символ отрезки в конец текста
ТекстДляПечати = ТекстДляПечати + Символ(22);
// При передаче этого текста в стандартные методы БПО (ПечатьТекста)
// произойдет физическая отрезка ленты.
Однако, как мы выяснили в ходе обсуждения, этот метод не сработает, если вы вызываете функции драйвера printText напрямую из внешней среды, минуя обертку 1С.
Иногда программные методы бессильны, если в настройках самого аппарата отключена аппаратная отрезка. Проверим параметры через «Тест драйвера»:
Рассмотрев все варианты, сделаем выводы. Для максимально стабильной работы на Платформе 5 при прямой интеграции (C#, Python, Java) следует использовать JSON-задания. Если же вы ограничены использованием классических методов API драйвера v.10, не забывайте о явном вызове fptr.cut() после закрытия документа методом fptr.endNonfiscalDocument(), предварительно обеспечив прокрутку бумаги для предотвращения «зарезания» текста.