При переходе на драйвер ККТ АТОЛ 10-й версии (ДТО 10) разработчики часто сталкиваются с тем, что привычные методы прямого управления механизмами кассы перестают работать. В частности, прямые команды прокрутки ленты lineFeed() и обрезки чека Cut() (или FullCut()) игнорируются устройством, хотя сам текстовый блок печатается без ошибок. Выясним причину такого поведения и разберем по шагам, как правильно реализовать печать произвольного текста с автоматическим отрезом без вывода лишней информации.
В современных версиях ДТО 10 архитектура взаимодействия с кассовым аппаратом построена на строгом контроле состояний устройства. Касса ожидает последовательного выполнения этапов оформления документа. Прямой вызов низкоуровневых команд обрезки и прокрутки вне открытого документа часто блокируется внутренними механизмами драйвера или прошивки ККТ. Особенно критично это проявляется на Платформе 5.0, где кассовый аппарат самостоятельно управляет физическими процессами печати на основе логических блоков данных.
Чтобы кассовый аппарат корректно отработал протяжку ленты и выполнил отрез после печати произвольного текста, необходимо оборачивать вывод информации в рамки специального нефискального документа. Для этого используются методы драйвера beginNonfiscalDocument() и endNonfiscalDocument().
Проанализируем ситуацию на примере кода для 1С. Рассмотрим подробнее, как должен выглядеть правильный алгоритм печати:
// Инициализируем начало нефискального документа
FR.beginNonfiscalDocument();
// Устанавливаем параметры текста и выводим строки
FR.setParam(FR.LIBFPTR_PARAM_TEXT, "--- НЕФИСКАЛЬНЫЙ ДОКУМЕНТ ---");
FR.printText();
FR.setParam(FR.LIBFPTR_PARAM_TEXT, "Тестовая строка 1");
FR.printText();
FR.setParam(FR.LIBFPTR_PARAM_TEXT, "Тестовая строка 2");
FR.printText();
FR.setParam(FR.LIBFPTR_PARAM_TEXT, "-----------------------------");
FR.printText();
// Завершаем нефискальный документ
// При закрытии документа ККТ автоматически выполнит необходимую прокрутку и отрезку ленты
FR.endNonfiscalDocument();
При использовании стандартного метода закрытия нефискального документа endNonfiscalDocument() касса может автоматически напечатать системный подвал (дата, время, ИНН и надпись «НЕФИСКАЛЬНЫЙ ДОКУМЕНТ»). Чтобы избежать печати этой лишней информации и сэкономить чековую ленту, перед закрытием документа необходимо явно передать драйверу параметр отключения подвала.
Посмотрим на пример реализации отключения подвала:
FR.beginNonfiscalDocument();
FR.setParam(FR.LIBFPTR_PARAM_TEXT, "Печать текста без подвала");
FR.printText();
// Передаем параметр, отключающий печать подвала
FR.setParam(FR.LIBFPTR_PARAM_PRINT_FOOTER, 0); // Использование числового 0 или Ложь в зависимости от обертки драйвера
// Завершаем документ - теперь подвал печататься не будет, но автоотрез сработает штатно
FR.endNonfiscalDocument();
Даже после программного отключения подвала при открытии нефискального документа на ленте может продолжать печататься рекламный или стандартный логотип АТОЛ. Этот логотип находится в энергонезависимой памяти самой кассы и выводится автоматически как часть клише (шапки документа) при вызове метода beginNonfiscalDocument().
Чтобы полностью убрать этот логотип, выполним настройку параметров ККТ через сервисную утилиту:
↓36↓¶0,center¶ или аналогичный код).После этого касса при получении команды начала документа больше не будет тратить ленту на печать графического логотипа.
Если интеграция происходит в современных конфигурациях 1С 8.3 через Библиотеку подключаемого оборудования (БПО), можно использовать механизм отправки специальных тегов разметки. Компонента БПО самостоятельно преобразует эти теги в корректные команды драйвера АТОЛ 10.
Для принудительного отреза чека в конце текстового массива достаточно вставить управляющий символ или текстовый тег отрезки:
Символ(22). Встретив данный символ в потоке текста, компонента ККТ произведет отрезку.[отрезка] или [cut]. При обработке макета печатной формы БПО автоматически заменит данный тег на команду физического отреза ленты.Для обеспечения необходимой высоты прокрутки (чтобы текст полностью вышел из прорези крышки ККТ перед отрезом) рекомендуется добавлять несколько пустых строк Символы.ПС (перевод строки) непосредственно перед вызовом команды отрезки.