При работе с онлайн-кассами в старых редакциях программ, таких как 1С:Управление торговлей 10.3, программисты часто сталкиваются с проблемой некорректного отображения видов оплаты на бумажном чеке. Типичная ситуация: в программе выбран вид оплаты «Кредит», но на чеке печатается «Плат. карта» или «Безналичными». Проанализируем, почему это происходит, как устроена структура XML-пакета для фискализации и как заставить драйвер ККТ (например, Штрих-М) выводить правильные наименования.
Для начала рассмотрим, как 1С передает данные о платежах в драйвер кассы. Основную роль играет секция <Payments>. Посмотрим на пример стандартного пакета, который генерирует 1С:
<Payments Cash="0" ElectronicPayment="1" Credit="0" AdvancePayment="0" CashProvision="0"/>
В этом блоке атрибуты соответствуют типам оплаты согласно ФФД (Формату фискальных данных):
Если мы хотим, чтобы касса зафиксировала продажу именно как «Кредит» (без фактического поступления денег в момент отгрузки), нам необходимо изменить значения в этом узле. Рассмотрим правильный вариант формирования узла для кредитной сделки:
<Payments Cash="0" ElectronicPayment="0" Credit="100.00" AdvancePayment="0" CashProvision="0"/>
В данном случае сумма 100.00 передается в атрибут Credit, что сигнализирует кассе о возникновении задолженности покупателя перед организацией.
Часто возникает ситуация: даже если мы передали ElectronicPayment="1", на чеке вместо «Безналичными» печатается «Плат. карта». Это связано с тем, что в драйверах ККТ (особенно Штрих-М) существует внутренняя таблица наименований типов оплат. Выясним причину, почему настройки, сделанные вручную в «Тесте драйвера», могут сбрасываться.
Проанализируем механизм работы интеграционной компоненты 1С. При каждом открытии смены или даже при каждой печати чека 1С выполняет метод УстановитьПараметры. В современных версиях библиотек подключаемого оборудования (БПО) реализована принудительная синхронизация таблиц кассы с настройками в 1С. Если в базе 1С в параметрах оборудования жестко прописано соответствие типов оплат, программа будет каждый раз перезаписывать Таблицу №17 (Наименования типов оплат) в памяти ККТ.
Чтобы решить эту проблему, выполним следующие шаги:
Важно не путать вид оплаты (наличные/безналичные) и признак способа расчета (тег 1214). В XML-пакете 1С признак способа расчета передается внутри каждой позиции <FiscalString> в параметре SignMethodCalculation.
Разберем основные значения SignMethodCalculation:
Рассмотрим пример строки позиции для отгрузки товара в кредит:
<FiscalString Name="Товар" Quantity="1" PriceWithDiscount="100" SumWithDiscount="100" ... SignMethodCalculation="6" SignCalculationObject="1" />
Здесь SignMethodCalculation="6" говорит о том, что товар передается в кредит. При этом в блоке <Payments> сумма должна стоять в атрибуте Credit.
Ситуация усложняется, когда покупатель берет кредит в банке. С точки зрения ФЗ-54, это двухэтапная операция. Рассмотрим ее подробнее:
Этап 1: Отгрузка товара. Покупатель оформляет кредит, банк еще не перечислил деньги, но товар мы отдаем. В этот момент печатается первый чек. Признак способа расчета: ПЕРЕДАЧА В КРЕДИТ (6). Тип оплаты в чеке: ПОСЛЕДУЮЩАЯ ОПЛАТА (КРЕДИТ).
Этап 2: Поступление денег от банка. Когда банк перечисляет средства на расчетный счет организации, мы обязаны пробить второй чек на «Оплату кредита». Признак способа расчета: ОПЛАТА КРЕДИТА (7). Тип оплаты в чеке: БЕЗНАЛИЧНЫМИ (т.к. деньги пришли от юрлица/банка).
В УТ 10.3 для реализации этой схемы часто требуется доработка кода. Разберем, где именно формируется XML. Обычно это происходит в общем модуле МенеджерОборудованияВызовСервера или в обработке обслуживания драйвера. Нам нужно найти функцию ПолучитьXMLПакетДляФискализацияЧека и проанализировать, как заполняется структура ОбъектЧека.
Пример кода для программного разделения типов оплат в обработке формирования чека:
// Пример заполнения таблицы оплат для XML
ТаблицаОплат = Новый ТаблицаЗначений;
ТаблицаОплат.Колонки.Добавить("ТипОплаты"); // 0-нал, 1-безнал, 2-кредит
ТаблицаОплат.Колонки.Добавить("Сумма");
Если СпособОплатыПоДокументу = Перечисления.ВидыОплатЧека.Кредит Тогда
НоваяСтрока = ТаблицаОплат.Добавить();
НоваяСтрока.ТипОплаты = 2; // Соответствует атрибуту Credit в XML
НоваяСтрока.Сумма = СуммаДокумента;
Иначе
// Стандартная логика
КонецЕсли;
Чтобы в чеке корректно отображался вид оплаты «Кредит», необходимо соблюдение трех условий:
Credit узла Payments.Помните, что согласно ФФД 1.05 и выше, для налоговой службы критически важен именно числовой код типа оплаты и признака расчета, а текстовое описание на чеке вторично, хотя и должно быть понятным для покупателя.