При переходе на новые форматы фискальных данных (ФФД 1.05 и выше) многие разработчики и пользователи «1С» сталкиваются с неприятной проблемой: при пробитии чека на частичную оплату (или доплату) ККТ АТОЛ автоматически печатает на чеке строку «Скидка». Например, если товар стоит 1000 рублей, а покупатель вносит только 300 рублей, в чеке неожиданно появляется скидка в размере 700 рублей. Покупатель недоумевает, а бухгалтерия бьет тревогу, ведь фактически никакая скидка клиенту не предоставлялась.
В этой статье мы подробно разберем, почему драйвер ККТ АТОЛ ведет себя подобным образом, как правильно с точки зрения налогового законодательства и ФФД оформлять такие операции, и что именно нужно изменить в коде «1С», чтобы навсегда избавиться от нежелательной скидки в чеке.
Для начала проанализируем ситуацию с технической стороны. В современных драйверах ККТ АТОЛ (как в устаревшей 9-й версии, так и в актуальной 10-й линейке) жестко зашит алгоритм контроля ФФД. Драйвер ККТ следит за тем, чтобы математика чека сходилась. Для каждой товарной позиции выполняется простая проверка:
Цена × Количество = Стоимость (Сумма строки)
Если в коде «1С» при заполнении параметров чека вы передаете:
Драйвер видит математическое расхождение: 1000 * 1 не равно 300. Разница составляет 700 рублей. В соответствии с внутренней логикой, ККТ АТОЛ трактует эту разницу как предоставленную покупателю скидку. Информация об этой «скидке» тут же выводится на печать в бумажном чеке и отправляется в ОФД. Однако при частичной оплате или кредите это методологически неверно: товар не стал дешевле, просто клиент оплачивает его не полностью.
Налоговая инспекция совершенно справедливо требует, чтобы при частичной оплате в чеке фигурировала полная стоимость товара (1000 рублей), а не заниженная до фактически вносимой суммы. Как же быть?
Чтобы избежать появления ложной скидки, сумма товарных позиций в чеке должна строго соответствовать сумме всех типов оплат в подвале чека. В ФФД 1.05 для этого реализован механизм разделения платежей по признакам способа расчета и типам оплаты. Рассмотрим два основных сценария, которые зависят от того, передается ли товар покупателю в момент совершения данного платежа.
Если клиент забирает товар стоимостью 1000 рублей прямо сейчас, но платит в кассу только 300 рублей (остальные 700 рублей обязуется доплатить позже), операция оформляется следующим образом:
5 — «ЧАСТИЧНЫЙ РАСЧЕТ И КРЕДИТ».При такой схеме драйвер ККТ сравнивает общую стоимость товарной строки (1000 рублей) с суммой всех видов оплат (300 рублей наличными + 700 рублей кредитом = 1000 рублей). Математика сходится, и никакая скидка в чеке не печатается!
Когда клиент приходит доплачивать оставшиеся 700 рублей, выбивается второй чек:
9 — «ОПЛАТА КРЕДИТА».Если покупатель вносит 300 рублей в качестве аванса, а сам товар заберет только после полной оплаты:
2) или «АВАНС» (значение 3). Сумма позиции в этом чеке указывается равной фактически внесенному платежу — 300 рублей.4). Сумма товарной позиции указывается полная — 1000 рублей. В блоке оплат указывается: «Зачет аванса» (тег 1215) — 300 рублей и «Наличные/Безналичные» — 700 рублей.Многие программисты и бухгалтеры опасаются использовать тип оплаты «Постоплата» (Кредит), думая, что эти виртуальные суммы попадут в Z-отчет (отчет о закрытии смены) как реальная выручка и приведут к завышению налогооблагаемой базы.
Проанализируем эту ситуацию. Налоговая служба (ФНС) на уровне своих фискальных систем четко разделяет денежные и неденежные потоки:
В Z-отчете и в личном кабинете ОФД эти суммы будут разнесены по разным строкам. Никакого «двоения» выручки при правильном заполнении признаков способа расчета не происходит.
Рассмотрим, как правильно передавать структуру чека в драйвер ККТ АТОЛ из «1С». Если вы работаете напрямую с драйвером (через COM-объект или внешнюю компоненту), вам необходимо правильно формировать XML-пакет для фискализации чека или корректно заполнять свойства объектов драйвера.
Ниже приведен пример формирования XML-пакета для частичной оплаты по Сценарию 1 (товар передается сразу, часть оплачивается на месте, часть уходит в кредит). Этот формат используется в современных БСП-совместимых конфигурациях:
// Формируем XML-пакет для передачи на ККТ через БСП
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку("UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Receipt"); // Начало чека
ЗаписьXML.ЗаписатьНачалоЭлемента("Positions"); // Список товаров
ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
ЗаписьXML.ЗаписатьАтрибут("Name", "Пылесос беспроводной");
ЗаписьXML.ЗаписатьАтрибут("Quantity", "1");
ЗаписьXML.ЗаписатьАтрибут("PriceWithDiscount", "1000.00"); // Полная цена товара
ЗаписьXML.ЗаписатьАтрибут("SumWithDiscount", "1000.00"); // Полная стоимость строки
ЗаписьXML.ЗаписатьАтрибут("VATRate", "20"); // Ставка НДС
ЗаписьXML.ЗаписатьАтрибут("PaymentMethod", "5"); // Тег 1214: "Частичный расчет и кредит"
ЗаписьXML.ЗаписатьКонецЭлемента(); // FiscalString
ЗаписьXML.ЗаписатьКонецЭлемента(); // Positions
ЗаписьXML.ЗаписатьНачалоЭлемента("Payments"); // Раздел оплат
// 1. Оплата наличными или безналичными (то, что клиент платит сейчас)
ЗаписьXML.ЗаписатьНачалоЭлемента("Payment");
ЗаписьXML.ЗаписатьАтрибут("Type", "1"); // 1 - Наличные (или 2 - Безналичные)
ЗаписьXML.ЗаписатьАтрибут("Sum", "300.00");
ЗаписьXML.ЗаписатьКонецЭлемента(); // Payment
// 2. Постоплата (виртуальный платеж в кредит на оставшуюся сумму)
ЗаписьXML.ЗаписатьНачалоЭлемента("Payment");
ЗаписьXML.ЗаписатьАтрибут("Type", "5"); // 5 - Постоплата (Кредит) в терминах драйвера АТОЛ
ЗаписьXML.ЗаписатьАтрибут("Sum", "700.00");
ЗаписьXML.ЗаписатьКонецЭлемента(); // Payment
ЗаписьXML.ЗаписатьКонецЭлемента(); // Payments
ЗаписьXML.ЗаписатьКонецЭлемента(); // Receipt
XMLПакет = ЗаписьXML.Закрыть();
Если вы пишете интеграцию напрямую через низкоуровневые методы драйвера ККТ АТОЛ 9.х или 10.х, обратите внимание на обязательное заполнение свойств платежей. Посмотрим на логику работы с объектом драйвера:
// Пример для прямого обращения к свойствам драйвера (DTO 10)
// 1. Регистрация позиции с полной ценой
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_COMMODITY_NAME, "Пылесос беспроводной");
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_PRICE, 1000.00);
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_QUANTITY, 1);
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_TAX_TYPE, Драйвер.LIBFPTR_TAX_VAT20);
// Устанавливаем признак способа расчета - ЧАСТИЧНЫЙ РАСЧЕТ И КРЕДИТ
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_PAYMENT_METHOD, Драйвер.LIBFPTR_PM_PARTIAL_PAYMENT);
Драйвер.registration();
// 2. Регистрация оплаты живыми деньгами (300 рублей безналичными)
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_PAYMENT_TYPE, Драйвер.LIBFPTR_PT_ELECTRONIC);
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_PAYMENT_SUM, 300.00);
Драйver.payment();
// 3. Регистрация оплаты кредитом (700 рублей постоплаты)
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_PAYMENT_TYPE, Драйвер.LIBFPTR_PT_CREDIT);
Драйвер.setParam(Драйвер.LIBFPTR_PARAM_PAYMENT_SUM, 700.00);
Драйвер.payment();
// Закрытие чека
Драйвер.closeReceipt();
В оригинальном обсуждении на форуме упоминается использование крайне старого драйвера АТОЛ версии 9.12. Мы настоятельно рекомендуем обновить драйвер ККТ до актуальной 10-й версии (ДТО 10). Начиная с версии 10, взаимодействие интеграционных библиотек «1С» и кассовых аппаратов АТОЛ по форматам ФФД 1.05 и ФФД 1.2 работает значительно стабильнее. Новые версии БСП автоматически формируют правильные XML-пакеты со всеми необходимыми тегами предоплат и кредитов, избавляя вас от необходимости писать сложные обработчики распределения сумм вручную.