При работе с торговым оборудованием в 1С:Управление торговлей 10.3 часто возникает задача кастомизации фискального чека. Одной из самых популярных подзадач является вывод информации о бонусном балансе клиента, рекламных акций или произвольных текстовых сообщений в подвале чека. Рассмотрим подробно, как это реализовать для ККТ АТОЛ (например, АТОЛ 30Ф), используя механизмы типовой конфигурации и возможности драйвера.
Проанализируем наиболее правильный метод с точки зрения архитектуры БПО (Библиотеки подключаемого оборудования), которая интегрирована в современные релизы УТ 10.3. Основная задача — внедрить текстовую строку в массив позиций чека перед тем, как данные будут отправлены на драйвер ККТ. Выясним, где именно происходит формирование этих данных.
Нам необходимо найти процедуру ПодготовитьДанныеДляФискализацииЧека. Обычно она располагается в модуле документа (например, ЧекККМ) или в общем модуле МенеджерОборудованияКлиентСервер. Разберем по шагам процесс модификации:
ЧекККМ или найдем место вызова фискализации в обработке ТОПечатьЧека.ОбщиеПараметры.ПозицииЧека.Рассмотрим пример кода, который позволяет добавить информационную строку:
// В процедуре ПодготовитьДанныеДляФискализацииЧека
// После цикла добавления товаров (ТабличнаяЧастьТовары)
ТекстБонусов = "Бонусов начислено: " + Строка(Объект.БонусыЗаПокупку) + " руб.";
ОстатокБонусов = "Ваш баланс: " + Строка(Объект.ТекущийБонус) + " руб.";
// Формируем структуру текстовой строки через типовой метод
СтрокаЧека = МенеджерОборудованияКлиентСервер.ПараметрыТекстовойСтрокиЧека(ТекстБонусов);
ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаЧека);
СтрокаЧекаОстаток = МенеджерОборудованияКлиентСервер.ParaметрыТекстовойСтрокиЧека(ОстатокБонусов);
ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаЧекаОстаток);
Важный нюанс: метод ПараметрыТекстовойСтрокиЧека создает структуру, которую драйвер распознает именно как текстовое сообщение, а не как товарную позицию. Это критично для соблюдения требований ФФД 1.05 и выше, так как передача текста под видом товара с нулевой ценой может привести к ошибке ККТ или некорректному отчету в ОФД.
Если ваша версия БПО и драйвера АТОЛ достаточно свежие (v.10), мы можем воспользоваться механизмом дополнительных реквизитов чека. Это позволяет вывести информацию в самом конце документа, после всех фискальных признаков. Посмотрим на реализацию этого метода:
В структуре ОбщиеПараметры найдем или инициализируем коллекцию ДополнительныеРеквизитыЧека. Добавим туда наше сообщение:
НовыйРеквизит = Новый Структура();
НовыйРеквизит.Вставить("Наименование", "Бонусы");
НовыйРеквизит.Вставить("Значение", "Доступно к списанию: 500");
// В некоторых версиях используется поле "Text"
ОбщиеПараметры.ДополнительныеРеквизитыЧека.Добавить(НовыйРеквизит);
Преимущество этого метода в том, что текст печатается в специальной области подвала, которая отделена от фискальных данных, что визуально воспринимается покупателем лучше.
Бывают ситуации, когда типовые механизмы 1С "обрезают" длинные строки или не позволяют форматировать текст (например, использовать жирный шрифт). В этом случае проанализируем ситуацию с прямым обращением к драйверу ККТ. Этот метод подходит, если касса не имеет автоматического отрезчика или вы можете программно управлять отрезкой.
После того как стандартный метод НапечататьФискальныйЧек отработал успешно, мы не закрываем соединение с устройством, а посылаем команду на печать нефискального текста. Разберем примерный алгоритм:
// 1. Стандартная печать чека
Результат = МенеджерОборудованияКлиент.ВыполнитьКоманду(..., "НапечататьФискальныйЧек", ПараметрыЧека);
Если Результат.Результат Тогда
// 2. Получаем объект драйвера
// В УТ 10.3 это часто делается через обработку обслуживания
ОбъектДрайвера = ПодключенноеУстройство.ОбъектДрайвера;
// 3. Используем методы АТОЛ v.10 для печати текста
ОбъектДрайвера.setParam(ОбъектДрайвера.LIBFPTR_PARAM_TEXT, "--- СПАСИБО ЗА ПОКУПКУ! ---");
ОбъектДрайвера.setParam(ОбъектДрайвера.LIBFPTR_PARAM_ALIGNMENT, ОбъектДрайвера.LIBFPTR_ALIGN_CENTER);
ОбъектДрайвера.printText();
ОбъектДрайвера.setParam(ОбъектДрайвера.LIBFPTR_PARAM_TEXT, "Ваши бонусы: 150 руб.");
ОбъектДрайвера.printText();
// 4. Если нужна отрезка
ОбъектДрайвера.cut();
КонецЕсли;
Использование прямой печати позволяет выводить даже сложные элементы, такие как QR-коды со ссылками на личный кабинет лояльности, используя метод printBarcode.
Если вам нужно выводить статичный текст (например, "Ждем вас снова!"), который не меняется от чека к чеку, выясним причину, по которой это лучше делать не в 1С. В драйверах АТОЛ есть встроенные таблицы "Клише" и "Подвал".
Этот текст будет печататься ККТ самостоятельно при закрытии любого чека, что снижает нагрузку на программный код 1С и гарантирует вывод информации даже при сбоях в базе данных.
При добавлении произвольного текста важно помнить о требованиях законодательства:
Таким образом, мы рассмотрели несколько вариантов решения задачи. Для динамических данных о бонусах оптимально использовать модификацию процедуры ПодготовитьДанныеДляФискализацииЧека с добавлением текстовых позиций в массив, а для сложных маркетинговых задач — прямое управление объектом драйвера.