Как напечатать произвольный текст на фискальном регистраторе без вывода фискального подвала в 1С

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

При автоматизации розничной торговли часто возникает необходимость распечатать на фискальном регистраторе (ФР) нефискальный документ. Это может быть рекламный текст, купон на скидку, предзаказ для кухни или гостевой счет. Однако при использовании стандартных механизмов Библиотеки подключаемого оборудования (БПО) 1С, таких как метод НачатьПечатьТекста() или ПечатьТекста(), в конце документа касса неизбежно печатает «подвал» (клише) с фискальными данными: ИНН, заводским номером ККТ, регистрационным номером (РНМ), номером ФН и прочими реквизитами организации.

В этой статье мы подробно разберем, почему так происходит, и рассмотрим практические способы обойти это ограничение, чтобы напечатать абсолютно чистую текстовую строку на устройствах АТОЛ и Штрих-М.

Выясняем причину: почему стандартные методы 1С всегда выводят подвал?

Когда мы вызываем стандартные функции БПО для печати обычного текста, интеграционная компонента 1С отправляет на ККТ команду начала печати так называемого нефискального документа. На уровне драйвера этот процесс оборачивается в логические блоки «Начало документа» (beginNonfiscalDocument) и «Конец документа» (endNonfiscalDocument).

В современных прошивках кассовых аппаратов (особенно на платформе АТОЛ 5.0 и актуальных версиях Штрих-М) на уровне микропрограммы (firmware) жестко зашито правило: при закрытии любого логического документа ККТ обязана напечатать финальное клише. Это сделано производителями ККТ для предотвращения печати фальшивых чеков. Обойти данное поведение стандартными методами БПО невозможно, так как интеграционная компонента скрывает низкоуровневые методы управления печатающей головкой.

Более того, в современных реалиях платформы АТОЛ 5.0 печать независимых нефискальных документов теперь требует наличия платной лицензии от производителя. Без нее ККТ просто откажется печатать нефискальный документ.

Разберем детально, как решить эту задачу с помощью прямого обращения к драйверам оборудования в обход БПО 1С.


Решение №1: Прямая печать «в воздух» через нативный драйвер АТОЛ (ДТО 10)

Для того чтобы касса не печатала подвал, нам нужно отправить текст на печать построчно, вообще не открывая и не закрывая логический документ. Кассовый аппарат просто протянет ленту и напечатает текст, а так как документ не закрывался, триггер печати клише не сработает.

Попытка вызвать низкоуровневые методы через объект драйвера, полученный из БПО (как это показано в сообщении №14 форума), приведет к ошибке, так как интеграционная компонента 1С имеет урезанный набор методов. Нам необходимо подключить оригинальную внешнюю компоненту АТОЛ напрямую.

Рассмотрим по шагам пример реализации прямой печати на встроенном языке 1С для АТОЛ 10-й версии:


// 1. Подключаем нативную компоненту АТОЛ напрямую
РезультатПодключения = ПодключитьВнешнююКомпоненту("ОбщийМакет.ДрайверАтолККТ10", "Atol10");
Если Не РезультатПодключения Тогда
    ВызватьИсключение "Не удалось подключить внешнюю компоненту АТОЛ 10!";
КонецЕсли;

// 2. Создаем объект драйвера
ФР = Новый("AddIn.Atol10.Fptr10");

// 3. Задаем параметры связи с ККТ (можно получить из настроек БПО)
ФР.setSingleSetting(ФР.LIBFPTR_SETTINGS_PORT, "3"); // COM-порт, к которому подключена ККТ
ФР.setSingleSetting(ФР.LIBFPTR_SETTINGS_BAUDRATE, "115200"); // Скорость порта
ФР.applySingleSettings();

// 4. Соединяемся с устройством
ФР.open();

Если ФР.isOpened() Тогда
    // 5. Печатаем чистый текст без открытия нефискального документа!
    // Используем параметры драйвера напрямую
    ФР.setParam(ФР.LIBFPTR_PARAM_TEXT, "ля-ля-ля три рубля" + Символы.ПС);
    ФР.setParam(ФР.LIBFPTR_PARAM_ALIGNMENT, ФР.LIBFPTR_ALIGNMENT_LEFT); // Выравнивание по левому краю
    ФР.printText(); // Данная команда мгновенно выводит строку на термоголовку
    
    // Делаем небольшую прокрутку ленты, чтобы текст было удобно оторвать
    ФР.setParam(ФР.LIBFPTR_PARAM_LINES_COUNT, 3);
    ФР.scrollPaper();

    // 6. Закрываем соединение с ККТ
    ФР.close();
Иначе
    Сообщить("Не удалось установить связь с кассовым аппаратом!");
КонецЕсли;

При таком подходе строка напечатается моментально, касса не добавит никаких данных о ФН, ИНН и заводе-изготовителе, а также не потребуются платные лицензии на печать сторонних документов.


Решение №2: Прямая печать через COM-объект Штрих-М

Аналогичный подход применим и для фискальных регистраторов семейства Штрих-М. Здесь мы напрямую обращаемся к системной COM-библиотеке драйвера. Для этого на компьютере должен быть установлен «Тест драйвера ФР» от компании Штрих-М.

Проанализируем пример кода для работы со Штрих-М через COM-соединение:


Попытка
    // Создаем экземпляр COM-объекта драйвера Штрих-М
    Драйвер = Новый COMОбъект("AddIn.DRVFR");
Исключение
    Сообщить("Драйвер Штрих-М не зарегистрирован в системе! " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Настраиваем параметры подключения (укажите свои значения)
Драйвер.ComNumber = 1; // Номер COM-порта (1 для COM1)
Драйвер.BaudRate = 6;  // Скорость обмена (условный индекс драйвера, обычно 115200)
Драйвер.Timeout = 100;

// Устанавливаем связь с ККТ
РезультатСвязи = Драйвер.Connect();
Если РезультатСвязи <> 0 Тогда
    Сообщить("Ошибка связи с ККТ Штрих-М: " + Драйвер.ResultCodeDescription);
    Возврат;
КонецЕсли;

// Печатаем строку текста напрямую без открытия чека/документа
Драйвер.StringForPrinting = "Ваш рекламный текст или предзаказ";
Драйвер.UseFont = Истина;
Драйвер.FontType = 1; // Выбор шрифта ККТ
Драйвер.PrintString(); // Метод печатает строку на ленте без вывода клише

// Прокрутка бумаги на несколько строк для удобства отрыва
Драйвер.StringForPrinting = " ";
Драйвер.PrintString();
Драйвер.PrintString();

// Разрываем соединение
Драйвер.Disconnect();

Метод PrintString() у Штрих-М осуществляет низкоуровневую печать строки символов на чековой ленте. Если выполнять его вне открытого чека, принтер просто выведет текст на бумагу без добавления служебных данных.


Альтернативный вариант: Настройка параметров таблиц ККТ

Если по каким-то причинам вы не хотите переписывать код на низкоуровневое взаимодействие с драйвером, можно попробовать минимизировать объем выводимой информации программно-аппаратными настройками самого аппарата:

  1. Для Штрих-М: Запустите утилиту «Тест драйвера ФР». Перейдите в раздел «Настройки свойств» -> «Таблицы». Найдите Таблицу №4 «Текст в чеке» (название может незначительно отличаться в зависимости от модели ККТ). В этой таблице содержатся строки рекламного текста и подвала. Вы можете полностью очистить эти поля или заменить их на пробелы. Также в параметрах ККТ можно отключить автоматическую печать лишних реквизитов, если это позволяет текущая версия прошивки ККТ.
  2. Для АТОЛ: В утилите «Тест драйвера ККТ» перейдите в «Свойства» -> «Параметры ККТ» -> раздел «Печать». Найдите параметр PrintFinalCliche (Печать финального клише) и попробуйте отключить его (установить в значение Ложь / снято). Помните, что на новых версиях ФФД (1.2) ККТ может игнорировать эту настройку для соблюдения фискального законодательства при закрытии полноценных документов.

Архитектурный совет: использование специализированного принтера чеков

В завершение разберем важный архитектурный аспект автоматизации розницы. Печать нефискальной информации (предзаказов, чеков на кухню, купонов) на фискальном регистраторе ускоряет износ его термоголовки и дорогостоящего автоотрезчика. Кроме того, это расходует ресурс ФН на фиксацию нефискальных операций в памяти устройства при определенных режимах работы.

Если перед вами стоит задача регулярной печати нефискальных документов, рассмотрите возможность приобретения нефискального принтера чеков (ESC/POS). Преимущества такого подхода:

← На главную