При работе с торговым оборудованием на устаревших, но все еще актуальных платформах, таких как 1С:Предприятие 7.7, программисты часто сталкиваются с аппаратными ограничениями кассовых аппаратов (ККТ). Типичная задача — печать маркетингового QR-кода (ссылка на сайт, бонусную программу или опрос) в самом низу чека. Часто возникает проблема: код «вклинивается» перед итоговыми суммами или вовсе улетает на следующий чек. В этой статье мы подробно разберем, как управлять процессом печати и добиться корректного расположения элементов.
Прежде всего, проанализируем ситуацию и выясним причину такого поведения оборудования. Большинство современных онлайн-касс формируют блок ИТОГО, НАЛИЧНЫМИ и СДАЧА автоматически в момент выполнения команды фискализации чека. Если мы вызываем методы печати штрихкода до закрытия чека, драйвер ККТ воспринимает это как добавление еще одной позиции или нефискальной строки в тело документа. Поэтому код закономерно оказывается над итоговыми суммами.
Рассмотрим стандартный, но проблемный код, который часто используют разработчики:
Объект.Barcode = "https://mysite.ru";
Объект.BarcodeType = 3; // Тип QR
Объект.LineNumber = 256;
Объект.FirstLineNumber = 1;
Объект.BarcodeAlignment = 0;
Объект.PrintBarcodeGraph();
// ... далее идет закрытие чека
Объект.CloseCheck();
В данном случае PrintBarcodeGraph() выполняется внутри открытого чека, и ККТ печатает его как часть списка товаров. Чтобы переместить код вниз, нам нужно изменить саму логику взаимодействия с драйвером.
Это самый надежный программный метод. Основная идея заключается в том, чтобы закрыть фискальный чек, но запретить ККТ сразу отрезать бумагу. Пока бумага не отрезана, мы можем допечатать любую произвольную информацию (текст или графику), и только после этого дать команду на отрезку.
Разберем по шагам, как это реализовать в коде 1С 7.7:
AutoCut. Если установить его в значение 0 (ложно), ККТ не будет резать ленту после выполнения команды CloseCheck().CloseCheck(). В этот момент касса печатает итоги, фискальные признаки и стандартный QR-код (если он предусмотрен прошивкой).FullCut() или PartialCut().Посмотрим на пример реализации такой логики:
// 1. Предварительная настройка: отключаем автоотрезку
Объект.AutoCut = 0;
// 2. Закрываем чек
Если Объект.CloseCheck() <> 0 Тогда
Предупреждение("Ошибка при закрытии чека!");
Возврат;
КонецЕсли;
// 3. Выводим наш QR-код (он пойдет сразу под ИТОГО)
Объект.Barcode = "23423423";
Объект.BarcodeType = 3;
Объект.BarcodeAlignment = 0; // По центру
Объект.PrintBarcodeGraph();
// 4. Теперь отрезаем чек вручную
Объект.FullCut();
Если QR-код является статичным (например, ссылка на одну и ту же страницу соцсетей магазина), рассмотрим альтернативный вариант — запись изображения в память ККТ. Почти все модели АТОЛ и Штрих-М позволяют загрузить логотип или настроить «Нижний колонтитул» через тест драйвера.
В этом случае программисту вообще не нужно писать код для вывода графики в 1С. Достаточно один раз настроить ККТ так, чтобы после каждого закрытого чека печатался определенный блок данных из памяти устройства. Это экономит время печати и снижает нагрузку на канал связи между компьютером и кассой.
Проанализируем ситуацию, когда даже правильный код работает нестабильно. Рассмотрим подробнее несколько критических моментов:
Паузы между командами (Тайминги). ККТ — это механическое устройство. После команды CloseCheck() касса занята фискализацией данных и отправкой их в ОФД. Если мгновенно отправить команду PrintBarcodeGraph(), драйвер может вернуть ошибку «Устройство занято». Рекомендуется добавить небольшую задержку:
Объект.CloseCheck();
// Простая задержка для завершения печати итогов
Для и=1 По 10000 Цикл
// Пустой цикл или команда ожидания
КонецЦикла;
Объект.PrintBarcodeGraph();
Настройки «Клише». Выясним причину появления лишней бумаги или пустых строк. В настройках драйвера часто стоит опция «Печать клише после чека». Если она включена, то сразу после закрытия документа касса напечатает заголовок следующего чека. В итоге ваш QR-код может оказаться на чеке следующего покупателя. Всегда проверяйте, чтобы печать заголовка (клише) выполнялась перед чеком, а не после него.
Версия драйвера. В платформе 1С 7.7 чаще всего используется АТОЛ ДТО 8. Если вы планируете переход на ДТО 10, помните, что там используется объектная модель. Команды не записываются в свойства объекта, а передаются как параметры методов. Однако общая логика «Закрыть без отрезки -> Печать -> Отрезка» остается неизменной.
Фискальный vs Произвольный QR. Не путайте QR-код, который требует налоговая (с данными чека для проверки в ФНС), и ваш рекламный код. Фискальный QR-код печатается самой кассой автоматически. Если ваша задача — изменить положение именно фискального кода, то сделать это программно из 1С невозможно, так как его позиция жестко задана в прошивке ККТ (обычно в самом низу фискального блока).
Мы рассмотрели, как эффективно управлять печатной формой чека в 1С 7.7. Главный инструмент разработчика в данной задаче — ручное управление отрезкой ленты. Используя AutoCut = 0 и принудительный вызов PrintBarcodeGraph() после CloseCheck(), вы сможете гибко настраивать внешний вид чека, добавляя в него любую маркетинговую информацию без нарушения структуры фискального документа.