При интеграции кассового оборудования и доработке типовых конфигураций 1С часто возникает задача вывести в кассовый чек дополнительную информацию перед списком товаров или услуг. Это может быть номер договора, ФИО покупателя, комментарий к заказу или служебные реквизиты. Однако попытка отправить произвольный текст на печать прямым вызовом методов драйвера до или после пробития чека приводит к разрыву документа: касса печатает строку, отрезает чек или формирует отдельный нефискальный документ, нарушая целостность чека.
В этой статье мы подробно разберем, почему возникает эта ошибка, как устроена печать документов в Библиотеке подключаемого оборудования (БПО) 1С и как правильно встроить текстовые строки в единый пакет данных чека.
Проанализируем типичную ошибку при доработке: разработчик находит процедуру отправки команды на печать (например, в общем модуле МенеджерОборудованияКлиент) и перед формированием чека вызывает метод ПодключаемоеОборудованиеУниверсальныйДрайверКлиент.ПечатьТекста() или низкоуровневую функцию драйвера НапечататьТекстовыйДокумент().
При таком подходе происходят следующие действия:
Главное правило: любые данные, которые должны оказаться внутри фискального чека (между открытием документа и подвалом с QR-кодом), обязаны передаваться в кассу единым сформированным XML-пакетом или структурой данных через типовой механизм СформироватьЧек.
Выясним, как подсистема подключаемого оборудования 1С формирует состав чека. В типовых конфигурациях (1С:Бухгалтерия государственного учреждения, 1С:Розница, 1С:Управление торговлей, 1С:ERP и др.) перед отправкой команды на кассу вызывается процедура подготовки данных (например, ПодготовитьДанныеДляПробитияЧека или СформироватьXMLПакетДляЧекаККТ).
Внутри этой процедуры формируется массив ПозицииЧека, который передается в сериализатор пакета. Каждая товарная строка представляет собой структуру с набором свойств (наименование, количество, цена, ставка НДС, признак способа расчета и т. д.).
Чтобы добавить нефискальную текстовую строку, в этот же массив ПозицииЧека необходимо вставить специальную структуру. Рассмотрим ее особенности:
ТекстоваяСтрока выступает маркером типа строки для парсера БПО (значение может быть пустым).Текст содержит непосредственную строку, которую необходимо напечатать на чековой ленте.Такая архитектура сделана для стандартизации: парсер проверяет наличие ключа-маркера и, если обнаружена ТекстоваяСтрока, формирует соответствующий узел XML-пакета <TextString Text="..."/> вместо фискальной товарной позиции.
Разберем по шагам, как добавить текст в самое начало чека (перед позициями номенклатуры).
1. Найдем в модуле конфигурации место, где заполняется массив ПозицииЧека (или результирующая таблица/массив позиций документа).
2. Создадим структуру для текстовой строки и вставим ее в массив позиций на нулевой индекс (в начало массива):
// Создаем структуру для текстовой строки
СтрокаТекста = Новый Структура;
СтрокаТекста.Вставить("ТекстоваяСтрока", "");
СтрокаТекста.Вставить("Текст", "Покупатель: " + СокрЛП(РеквизитыДокумента.Покупатель));
// Вставляем строку в самое начало массива позиций чека
ПозицииЧека.Вставить(0, СтрокаТекста);
// При необходимости можно добавить еще одну строку
СтрокаДокумент = Новый Структура;
СтрокаДокумент.Вставить("ТекстоваяСтрока", "");
СтрокаДокумент.Вставить("Текст", "Основание: " + СокрЛП(РеквизитыДокумента.НомерДоговора));
ПозицииЧека.Вставить(1, СтрокаДокумент);
3. Если в конфигурации позиции формируются через таблицу значений, текстовые строки добавляются аналогичным образом через соответствующие колонки перед конвертацией в XML-пакет.
Обратим внимание на важный законодательный нюанс. Если задача заключается в передаче данных юридического лица или ИП (покупателя) при расчетах между организациями, простой печати нефискального текста недостаточно.
Согласно требованиям 54-ФЗ и форматам фискальных данных (ФФД 1.05, 1.1, 1.2), сведения о покупателе должны быть фискализированы и отправлены в ОФД через обязательные теги:
Посмотрим на пример заполнения фискальных данных покупателя в корневой структуре чека:
// Заполнение фискальных реквизитов покупателя в шапке чека
ПараметрыЧека.Вставить("ПокупательНаименование", РеквизитыДокумента.КонтрагентНаименование);
ПараметрыЧека.Вставить("ПокупательИНН", РеквизитыДокумента.КонтрагентИНН);
// Дополнительный реквизит чека (Тег 1192)
ДопРеквизит = Новый Структура;
ДопРеквизит.Вставить("Наименование", "НомерЗаказа");
ДопРеквизит.Вставить("Значение", РеквизитыДокумента.НомерЗаказа);
ПараметрыЧека.Вставить("ДополнительныйРеквизитЧека", ДопРеквизит);
При таком заполнении драйвер ККТ АТОЛ автоматически распечатает данные покупателя в соответствии с шаблоном прошивки кассы и передаст эти теги в электронный чек для ФНС.
Рассмотрим несколько практических рекомендаций для стабильной работы кассы АТОЛ 22ПТК / 22Ф:
&ИзменениеИКонтроль или &Вместо для процедур модуля МенеджерОборудованияВызовСервера или специализированных менеджеров документов.