В практике автоматизации розничной торговли часто возникает задача вывода на чековую ленту информации, не относящейся напрямую к фискальному чеку. Это могут быть маркетинговые ссылки, коды для подтверждения оплаты в сторонних приложениях или QR-коды Системы быстрых платежей (СБП). Распространенное заблуждение гласит, что QR-код может быть напечатан только в составе фискального документа, так как он генерируется фискальным накопителем. Однако современные фискальные регистраторы (ФР) позволяют выводить графическую информацию в режиме нефискальной печати. Рассмотрим подробно, как реализовать эту задачу в 1С.
Для начала разберем, как 1С взаимодействует с печатающим устройством. Фискальный регистратор — это не просто принтер, а сложное устройство с собственной логикой. Когда мы работаем через Библиотеку подключаемого оборудования (БПО), мы используем стандартизированные методы. Важно понимать, что печать QR-кода возможна двумя способами: как части фискального чека (автоматически формируется ФН) и как произвольного штрихкода (формируется процессором принтера или драйвером).
Для решения нашей задачи мы проанализируем ситуацию, когда необходимо напечатать "чистый" QR-код без открытия смены или пробития чека продажи. Это реализуется через механизм печати текстовых или нефискальных документов.
Если ваша конфигурация (например, 1С:Розница 2.2 или 2.3) использует БПО, наиболее правильным путем будет использование штатных интерфейсов. Разберем по шагам, как это работает. Для печати штрихкода нам не нужно пробивать чек, но нам нужно правильно инициализировать устройство.
В большинстве драйверов, соответствующих стандарту 1С, существует метод НапечататьШтрихкод. Рассмотрим пример логики вызова этого метода:
// Подготавливаем параметры штрихкода
ПараметрыШтрихкода = Новый Структура;
ПараметрыШтрихкода.Вставить("ТипКода", 43); // 43 обычно соответствует QR-коду в стандартах 1С
ПараметрыШтрихкода.Вставить("Данные", "https://mysite.ru/promo");
ПараметрыШтрихкода.Вставить("Ширина", 200);
ПараметрыШтрихкода.Вставить("Высота", 200);
// Вызываем печать через объект драйвера
Результат = ОбъектДрайвера.НапечататьШтрихкод(ИДУстройства, ПараметрыШтрихкода);
Важный момент: чтобы принтер не выдал ошибку, рекомендуется обрамлять печать командами открытия и закрытия нефискального документа. Это сообщает ФР, что сейчас идет поток данных, который не нужно фискализировать и записывать в память ФН.
Проанализируем более гибкий метод, который упоминался в обсуждении на форуме. Современные драйверы поддерживают метод НапечататьТекстовыйДокумент, который принимает на вход строку в формате 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" обычно отвечает за центрирование кода на ленте.
Иногда возможности БПО могут быть ограничены версией конфигурации. В этом случае мы можем рассмотреть ситуацию прямого взаимодействия с 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 конкретного производителя оборудования.
Одной из главных проблем, озвученных автором темы, было отсутствие физического регистратора для тестов. Выясним, как выйти из этой ситуации. Существует два проверенных пути:
printBarcode или НапечататьШтрихкод прошла успешно.При реализации печати следует учитывать следующие моменты:
Width и Height, чтобы код был читаемым, но не обрезался по краям.Подводя итог, можно сказать, что задача печати произвольного QR-кода на ФР полностью решаема программными средствами 1С без фискализации операций. Оптимальным выбором будет использование метода НапечататьТекстовыйДокумент с XML-структурой, так как это наиболее универсальный способ в рамках актуальных стандартов разработки на платформе 1С:Предприятие 8.3.