При переходе на формат фискальных данных ФФД 1.05 и обновлении прошивок ККТ возникает задача корректного оформления продаж в кредит и рассрочку. Часто разработчики сталкиваются с ситуацией, когда сумма кредита закрывается как безналичная оплата (платежная карта) либо драйвер ККТ выдает ошибку несоответствия сумм. Разберем по шагам, как правильно подготовить структуру данных в 1С, заполнить признаки способа расчета и сформировать XML-пакет фискализации для касс производителя Штрих-М.
В отличие от формата ФФД 1.0, где все безналичные платежи отправлялись в одну категорию, в формате 1.05 выделяются пять самостоятельных типов оплаты (сумм расчета):
Cash — наличная оплата;ElectronicPayment — безналичная оплата (платежные карты, эквайринг);AdvancePayment — сумма предоплаты (зачет аванса или ранее внесенной предоплаты);Credit — постоплата (продажа в кредит или рассрочку продавца);CashProvision — встречное предоставление (товарообмен, подарочные сертификаты).Также ключевую роль играет реквизит позиции чека Признак способа расчета (тег 1214):
Проанализируем частую ошибку: если сумма кредита добавляется в таблицу оплат с типом Электронно, драйвер фискализирует весь чек как оплату банковской картой. Чтобы сумма попала в фискальный реквизит кредита (тег 1216), необходимо явно указывать тип оплаты постоплатой.
Рассмотрим пример формирования таблицы оплат для документа продажи:
// Оплата наличными
СуммаТипаОплатыНаличные = ПолучитьСуммуНаличнойОплаты(ЧекККМ);
Если СуммаТипаОплатыНаличные <> 0 Тогда
СтрокаОплаты = Новый Структура();
СтрокаОплаты.Вставить("ТипОплаты", ПредопределенноеЗначение("Перечисление.ТипыОплатыККТ.Наличные"));
СтрокаОплаты.Вставить("Наименование", "Наличная оплата");
СтрокаОплаты.Вставить("Сумма", СуммаТипаОплатыНаличные);
ОбщиеПараметры.ТаблицаОплат.Добавить(СтрокаОплаты);
КонецЕсли;
// Оплата платежной картой (эквайринг)
СуммаТипаОплатыПлатежнойКартой = ПолучитьСуммуОплатыПлатежнойКартой(ЧекККМ);
Если СуммаТипаОплатыПлатежнойКартой <> 0 Тогда
СтрокаОплаты = Новый Структура();
СтрокаОплаты.Вставить("ТипОплаты", ПредопределенноеЗначение("Перечисление.ТипыОплатыККТ.Электронно"));
СтрокаОплаты.Вставить("Наименование", "Платежная карта");
СтрокаОплаты.Вставить("Сумма", СуммаТипаОплатыПлатежнойКартой);
ОбщиеПараметры.ТаблицаОплат.Добавить(СтрокаОплаты);
КонецЕсли;
// Продажа в кредит / рассрочку
СуммаТипаОплатыКредит = ПолучитьСуммуКредита(ЧекККМ);
Если СуммаТипаОплатыКредит <> 0 Тогда
СтрокаОплаты = Новый Структура();
СтрокаОплаты.Вставить("ТипОплаты", ПредопределенноеЗначение("Перечисление.ТипыОплатыККТ.Постоплата"));
СтрокаОплаты.Вставить("Наименование", "Кредит");
СтрокаОплаты.Вставить("Сумма", СуммаТипаОплатыКредит);
ОбщиеПараметры.ТаблицаОплат.Добавить(СтрокаОплаты);
КонецЕсли;
Важно помнить главное правило ФФД: сумма товарной строки всегда должна содержать полную стоимость товара. Занижать или обнулять сумму товара на размер кредита нельзя — иначе не сойдется контрольная сумма чека (сумма всех товарных позиций обязана строго равняться сумме всех внесенных оплат).
Посмотрим на алгоритм заполнения товарных позиций:
Для Каждого СтрокаТовара Из ЧекККМ.Товары Цикл
СтрокаЧека = МенеджерОборудованияКлиентСервер.ПараметрыФискальнойСтрокиЧека();
СтрокаЧека.Количество = СтрокаТовара.Количество;
СтрокаЧека.Цена = СтрокаТовара.Цена;
СтрокаЧека.ЦенаСоСкидками = СтрокаТовара.Сумма / СтрокаТовара.Количество;
СтрокаЧека.Сумма = СтрокаТовара.Сумма; // Всегда полная сумма с учетом скидок!
СтрокаЧека.ПризнакПредметаРасчета = ПредопределенноеЗначение("Перечисление.ПризнакиПредметаРасчета.Товар");
// Определяем признак способа расчета
Если ЧекККМ.СуммаКредита = ЧекККМ.СуммаДокумента Тогда
// 100% кредит без первого взноса
СтрокаЧека.ПризнакСпособаРасчета = ПредопределенноеЗначение("Перечисление.ПризнакиСпособаРасчета.ПередачаБезОплаты");
ИначеЕсли ЧекККМ.СуммаКредита > 0 Тогда
// Частичная оплата (аванс/взнос + кредит)
СтрокаЧека.ПризнакСпособаРасчета = ПредопределенноеЗначение("Перечисление.ПризнакиСпособаРасчета.ПередачаСЧастичнойОплатой");
Иначе
// Обычная продажа со 100% оплатой
СтрокаЧека.ПризнакСпособаРасчета = ПредопределенноеЗначение("Перечисление.ПризнакиСпособаРасчета.ПередачаСПолнойОплатой");
КонецЕсли;
ОбщиеПараметры.ПозицииЧека.Добавить(СтрокаЧека);
КонецЦикла;
При передаче чека в интеграционную компоненту драйвера Штрих-М формируется XML-пакет. В функции ПолучитьXMLПакетДляФискализацияЧека распределение сумм по атрибутам зависит от версии ФФД:
Если ВерсияФФД > 0 Тогда // Формат ФФД 1.0.5
ЗаписьXML.ЗаписатьАтрибут("Cash" , XMLСтрока(СуммаНаличными));
ЗаписьXML.ЗаписатьАтрибут("ElectronicPayment", XMLСтрока(СуммаЭлектронными));
ЗаписьXML.ЗаписатьАтрибут("Credit" , XMLСтрока(СуммаПостоплатой));
ЗаписьXML.ЗаписатьАтрибут("AdvancePayment" , XMLСтрока(СуммаПредоплатой));
ЗаписьXML.ЗаписатьАтрибут("CashProvision" , XMLСтрока(СуммаПредоставлением));
Иначе // Формат ФФД 1.0
ЗаписьXML.ЗаписатьАтрибут("Cash" , XMLСтрока(СуммаНаличными));
ЗаписьXML.ЗаписатьАтрибут("ElectronicPayment", XMLСтрока(СуммаЭлектронными + СуммаПостоплатой + СуммаПредоплатой + СуммаПредоставлением));
КонецЕсли;
При корректной передаче для кредитного чека результирующий XML-пакет будет выглядеть следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<CheckPackage>
<Parameters PaymentType="1" TaxVariant="0" CashierName="Иванов И.И."/>
<Positions>
<FiscalString Name="Холодильник" Quantity="1" PriceWithDiscount="30000" SumWithDiscount="30000" Department="1" Tax="none" SignMethodCalculation="6" SignCalculationObject="1"/>
</Positions>
<Payments Cash="0" ElectronicPayment="0" Credit="30000" AdvancePayment="0" CashProvision="0"/>
</CheckPackage>
Разберем визуальные особенности напечатанного чека:
Tax = none), чтобы избежать повторного начисления налога.ElectronicPayment).