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

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

В практике автоматизации розничной торговли часто возникает задача вывода на чековую ленту информации, не относящейся напрямую к фискальному чеку. Это могут быть маркетинговые ссылки, коды для подтверждения оплаты в сторонних приложениях или QR-коды Системы быстрых платежей (СБП). Распространенное заблуждение гласит, что QR-код может быть напечатан только в составе фискального документа, так как он генерируется фискальным накопителем. Однако современные фискальные регистраторы (ФР) позволяют выводить графическую информацию в режиме нефискальной печати. Рассмотрим подробно, как реализовать эту задачу в 1С.

Понимание механизмов печати на фискальном регистраторе

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

Для решения нашей задачи мы проанализируем ситуацию, когда необходимо напечатать "чистый" QR-код без открытия смены или пробития чека продажи. Это реализуется через механизм печати текстовых или нефискальных документов.

Способ 1: Использование метода НапечататьШтрихкод через БПО

Если ваша конфигурация (например, 1С:Розница 2.2 или 2.3) использует БПО, наиболее правильным путем будет использование штатных интерфейсов. Разберем по шагам, как это работает. Для печати штрихкода нам не нужно пробивать чек, но нам нужно правильно инициализировать устройство.

В большинстве драйверов, соответствующих стандарту 1С, существует метод НапечататьШтрихкод. Рассмотрим пример логики вызова этого метода:


// Подготавливаем параметры штрихкода
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("ТипКода", 43); // 43 обычно соответствует QR-коду в стандартах 1С
ПараметрыШтрихкода.Вставить("Данные", "https://mysite.ru/promo");
ПараметрыШтрихкода.Вставить("Ширина", 200);
ПараметрыШтрихкода.Вставить("Высота", 200);

// Вызываем печать через объект драйвера
Результат = ОбъектДрайвера.НапечататьШтрихкод(ИДУстройства, ПараметрыШтрихкода);

Важный момент: чтобы принтер не выдал ошибку, рекомендуется обрамлять печать командами открытия и закрытия нефискального документа. Это сообщает ФР, что сейчас идет поток данных, который не нужно фискализировать и записывать в память ФН.

Способ 2: Печать через XML-описание (метод НапечататьТекстовыйДокумент)

Проанализируем более гибкий метод, который упоминался в обсуждении на форуме. Современные драйверы поддерживают метод НапечататьТекстовыйДокумент, который принимает на вход строку в формате XML. Это позволяет комбинировать текст и штрихкоды в одном задании на печать.

Выясним причину, почему это удобно: вы можете напечатать заголовок "Отсканируйте код", сам QR-код и подпись под ним одной командой. Структура XML-данных для передачи в драйвер выглядит следующим образом:


ТекстПечати = 
"<Document>
    <Line>Подтвердите оплату</Line>
    <Barcode Type=""QR"" Value=""ВАШИ_ДАННЫЕ"" Width=""200"" Height=""200"" Alignment=""1"" />
    <Line>Благодарим за покупку!</Line>
</Document>";

Результат = ОбъектДрайвера.НапечататьТекстовыйДокумент(ИДУстройства, ТекстПечати);

Обратите внимание на тег Barcode. Атрибут Type="QR" указывает драйверу, что переданную строку Value нужно преобразовать в графический QR-код. Параметр Alignment="1" обычно отвечает за центрирование кода на ленте.

Способ 3: Прямое обращение к драйверу (на примере АТОЛ)

Иногда возможности БПО могут быть ограничены версией конфигурации. В этом случае мы можем рассмотреть ситуацию прямого взаимодействия с COM-объектом или Native-компонентой драйвера. Для драйверов АТОЛ 10-й версии это выглядит весьма лаконично.

Посмотрим на пример кода, который обращается напрямую к API драйвера:


// Предположим, ОбъектДрайвера уже инициализирован и связь установлена
ОбъектДрайвера.setParam(ОбъектДрайвера.LIBFPTR_PARAM_BARCODE, "https://qr.nspk.ru/...");
ОбъектДрайвера.setParam(ОбъектДрайвера.LIBFPTR_PARAM_BARCODE_TYPE, ОбъектДрайвера.LIBFPTR_BT_QR);
ОбъектДрайвера.setParam(ОбъектДрайвера.LIBFPTR_PARAM_ALIGNMENT, ОбъектДрайвера.LIBFPTR_ALIGNMENT_CENTER);
ОбъектДрайвера.setParam(ОбъектДрайвера.LIBFPTR_PARAM_BARCODE_VERSION, 0);
ОбъектДрайвера.setParam(ОбъектДрайвера.LIBFPTR_PARAM_BARCODE_CORRECTION, 0);
ОбъектДрайвера.setParam(ОбъектДрайвера.LIBFPTR_PARAM_BARCODE_PIXEL_SIZE, 5);

// Команда печати
ОбъектДрайвера.printBarcode();

Этот метод работает максимально быстро и надежно, так как не зависит от посредников в виде прослоек 1С, но требует четкого понимания API конкретного производителя оборудования.

Тестирование без реального оборудования

Одной из главных проблем, озвученных автором темы, было отсутствие физического регистратора для тестов. Выясним, как выйти из этой ситуации. Существует два проверенных пути:

  1. Использование эмулятора БПО. В последних версиях 1С:Библиотека подключаемого оборудования есть встроенный эмулятор "1С:Фискальный регистратор (нефискальный)". При отправке команды на печать он открывает графическое окно, где имитирует чековую ленту. Если ваш код написан правильно, вы увидите QR-код прямо на экране.
  2. Тестовые утилиты производителей. У компаний АТОЛ и Штрих-М есть "Тест драйвера". В настройках этих утилит можно создать виртуальное ККТ. При подаче команд из 1С драйвер будет отрабатывать их в логах, и вы сможете убедиться, что команда printBarcode или НапечататьШтрихкод прошла успешно.

Важные технические нюансы

При реализации печати следует учитывать следующие моменты:

Подводя итог, можно сказать, что задача печати произвольного QR-кода на ФР полностью решаема программными средствами 1С без фискализации операций. Оптимальным выбором будет использование метода НапечататьТекстовыйДокумент с XML-структурой, так как это наиболее универсальный способ в рамках актуальных стандартов разработки на платформе 1С:Предприятие 8.3.

← На главную