При оформлении продаж в кредит в розничных магазинах программисты и бухгалтеры часто сталкиваются со следующей проблемой: при отправке чека на ККМ (например, Штрих-М или Атол) тип оплаты «Кредит» печатается на чеке в виде строки «Постоплатой (в кредит)», тогда как заказчик или бухгалтерия требуют, чтобы в поле «Получено» отображалась понятная клиенту фраза вроде «Оплата Кредита». Как реализовать это технически корректно, не нарушив при этом требования 54-ФЗ и форматы фискальных документов (ФФД)?
В этой статье мы подробно разберем, почему стандартные «костыли» с переименованием таблиц в кассе могут привести к штрафам, в чем разница между передачей товара в кредит и его последующей оплатой, а также покажем правильные примеры кода для интеграции ККМ в 1С.
---
Некоторые специалисты решают задачу «в лоб»: заходят через тест драйвера ККТ в таблицы параметров (например, Таблица 5 «Наименования типов оплаты» в драйвере Штрих-М) и переименовывают стандартные наименования типов оплат под свои нужды (например, меняют «Электронные» или «Кредит» на «Оплата кредита банк Х»).
Выясним причину, почему так делать не стоит:
Согласно требованиям 54-ФЗ, касса отправляет в ОФД не текстовое наименование типа платежа, а строго определенные числовые коды (теги). Всего в ФФД 1.05, 1.1 и 1.2 предусмотрено только 5 типов оплаты (сумм по чеку):
Cash.ElectronicPayment.PrePayment (или AdvancePayment в старых версиях).PostPayment (или Credit в старых версиях).Barter (или CashProvision).Если вы переименуете строку в кассе, на бумажном чеке покупатель действительно увидит нужный вам текст. Однако в электронном чеке, ушедшем в ФНС через ОФД, по-прежнему будет фигурировать стандартный тег. При несовпадении данных на бумажном носителе и в ОФД организация рискует получить крупный штраф при проверке налоговыми органами.
---
Для правильного построения архитектуры взаимодействия 1С и ККТ нам необходимо четко разделять два совершенно разных этапа сделки по методологии ФНС.
Покупатель забирает товар здесь и сейчас, но реальных денег в кассу или на расчетный счет вы еще не получили (например, ждете выплаты от банка по кредитному договору).
Рассмотрим, как должен выглядеть фискальный чек в этом случае:
ПередачаБезОплаты (или ПередачаСЧастичнойОплатой, если был первоначальный взнос).В XML-пакете 1С это выглядит следующим образом:
// Формирование блока оплат для ККТ при передаче товара в кредит
ЗаписьXML.ЗаписатьАтрибут("Cash" , XMLСтрока(СуммаНаличными)); // Первоначальный взнос налом, если есть
ЗаписьXML.ЗаписатьАтрибут("ElectronicPayment", XMLСтрока(СуммаЭлектронными)); // Первоначальный взнос картой, если есть
ЗаписьXML.ЗаписатьАтрибут("PostPayment" , XMLСтрока(СуммаВКредит)); // Сумма, уходящая в кредит (тег 1216)
Этот этап наступает, когда клиент (или банк за него) вносит реальные денежные средства в счет погашения ранее выданного кредита. Здесь оформляется совершенно другой чек:
Cash (Наличные) или ElectronicPayment (Безналичные).ПлатежВыплата (тег 1212) или Услуга, а в наименовании пишется «Погашение кредита по договору №...».ОплатаКредита.Проанализируем ситуацию: на втором этапе мы ни в коем случае не должны передавать тип оплаты как «Кредит» (PostPayment), иначе мы не зафиксируем реальный приход денег, а лишь увеличим сумму виртуального долга.
---
Если бухгалтерия требует выводить на чеке специфическую информацию (номер кредитного договора, ФИО заемщика или марку банковской карты), мы можем пойти двумя законными путями.
Практически все современные драйверы ККТ (включая Штрих-М и Атол) поддерживают печать нефискального текста внутри чека. Эти строки не отправляются в ОФД, не влияют на фискальные итоги, но физически выводятся на чековую ленту.
Разберем пример добавления текстовой строки в XML-пакет чека при использовании БСП (Библиотеки стандартных подсистем) в 1С:
// Добавляем информационную текстовую строку в состав позиций чека
ЗаписьXML.ЗаписатьСтартЭлемента("TextString");
ЗаписьXML.ЗаписатьАтрибут("Text", "Кредитный договор № КР-00125/24");
ЗаписьXML.ЗаписатьКонецЭлемента();
Такой подход полностью устраивает и налоговую (так как фискальные теги не искажены), и бухгалтерию предприятия (так как на бумаге напечатаны все необходимые реквизиты договора).
Согласно требованиям ФФД 1.05 и выше, для передачи произвольных реквизитов (таких как номера договоров или транзакций) выделен специальный фискальный тег 1084 («Дополнительный реквизит пользователя»). Этот реквизит отправляется в ОФД и отображается на чеке.
Для его передачи в XML-пакете 1С предусмотрен атрибут AdditionalAttribute в параметрах чека:
// Передача дополнительного реквизита в параметрах фискального документа
ЗаписьXML.ЗаписатьАтрибут("AdditionalAttribute", "Договор кредита № КР-00125/24");
---
Рассмотрим по шагам, как программно сформировать структуру XML-пакета для ККТ (компоненты версии 2.x/3.x) при приеме оплаты в счет погашения кредита:
// Функция формирует XML-пакет для печати чека оплаты кредита
Функция СформироватьПакетОплатыКредита(СуммаПлатежа, НомерДоговора, СпособОплаты) Экспорт
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьСтартЭлемента("CheckPackage");
// Описываем параметры самого фискального документа
ЗаписьXML.ЗаписатьСтартЭлемента("Parameters");
ЗаписьXML.ЗаписатьАтрибут("CashierName", "Иванова А.А.");
ЗаписьXML.ЗаписатьАтрибут("OperationType", "1"); // 1 - Приход
ЗаписьXML.ЗаписатьАтрибут("TaxVariant", "1"); // Система налогообложения
// Используем официальный тег 1084 для номера договора
ЗаписьXML.ЗаписатьАтрибут("AdditionalAttribute", "Оплата по договору " + НомерДоговора);
ЗаписьXML.ЗаписатьКонецЭлемента(); // Parameters
// Описываем товарные позиции чека (в нашем случае - услуга платежа)
ЗаписьXML.ЗаписатьСтартЭлемента("Positions");
ЗаписьXML.ЗаписатьСтартЭлемента("FiscalString");
ЗаписьXML.ЗаписатьАтрибут("Name", "Погашение обязательств по договору " + НомерДоговора);
ЗаписьXML.ЗаписатьАтрибут("Quantity", "1");
ЗаписьXML.ЗаписатьАтрибут("Price", XMLСтрока(СуммаПлатежа));
ЗаписьXML.ЗаписатьАтрибут("Amount", XMLСтрока(СуммаПлатежа));
ЗаписьXML.ЗаписатьАтрибут("Department", "1");
ЗаписьXML.ЗаписатьАтрибут("TaxRate", "none"); // Без НДС
// Важно: Указываем признак способа расчета - Оплата кредита (значение 7)
ЗаписьXML.ЗаписатьАтрибут("SignMethodCalculation", "7");
// Признак предмета расчета - Платеж (значение 10)
ЗаписьXML.ЗаписатьАтрибут("SignSubjectCalculation", "10");
ЗаписьXML.ЗаписатьКонецЭлемента(); // FiscalString
// Добавим нефискальную строку для визуальной красоты на чековой ленте
ЗаписьXML.ЗаписатьСтартЭлемента("TextString");
ЗаписьXML.ЗаписатьАтрибут("Text", "ПОЛУЧЕНО В СЧЕТ ПОГАШЕНИЯ КРЕДИТА");
ЗаписьXML.ЗаписатьКонецЭлемента(); // TextString
ЗаписьXML.ЗаписатьКонецЭлемента(); // Positions
// Описываем фактический платеж (нал или карта)
ЗаписьXML.ЗаписатьСтартЭлемента("Payments");
Если СпособОплаты = "Наличные" Тогда
ЗаписьXML.ЗаписатьАтрибут("Cash", XMLСтрока(СуммаПлатежа));
ИначеЕсли СпособОплаты = "Карта" Тогда
ЗаписьXML.ЗаписатьАтрибут("ElectronicPayment", XMLСтрока(СуммаПлатежа));
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента(); // Payments
ЗаписьXML.ЗаписатьКонецЭлемента(); // CheckPackage
Возврат ЗаписьXML.Закрыть();
КонецФункции
Используя приведенный шаблон, мы получаем абсолютно легальный чек, который без проблем пройдет проверки ОФД и ФНС. В ОФД уйдет корректная информация о приходе реальных денежных средств (нал или безнал) с указанием того, что эта транзакция закрывает ранее выданный кредит по конкретному договору. На бумажном же чеке покупатель увидит всю необходимую текстовую информацию, подтверждающую внесение средств по кредитному обязательству.