При работе со старыми редакциями конфигурации 1С:Управление торговлей 10.3 и современными онлайн-кассами (такими как Атол 30Ф) программисты часто сталкиваются с ситуацией, когда все пробитые чеки регистрируются ККТ с типом оплаты «Электронно». Это происходит даже в тех случаях, когда клиент расплачивается наличными. Такая ситуация является нарушением правил ведения кассовых операций и требует немедленного исправления в коде обработки обслуживания или конфигурации.
В этой статье мы подробно разберем, как устроена передача данных в драйвер Атол, почему возникает путаница с типами оплаты и как правильно модифицировать XML-пакет фискализации, чтобы касса корректно разделяла нал и безнал.
Первое и самое важное, что нам необходимо понять: в современных драйверах Атол (начиная с 8-й и 9-й версий и заканчивая актуальной 10-й) тип оплаты в чеке зачастую определяется не передачей какого-то числового идентификатора (например, 1 или 2), а заполнением конкретного атрибута суммы в XML-структуре, которую 1С передает драйверу. Проанализируем типичную ситуацию: если программа передает всю сумму чека в параметр ElectronicPayment, ККТ логично закрывает чек как электронный. Если мы хотим, чтобы оплата прошла как наличная, сумма должна попасть в атрибут Cash.
Рассмотрим структуру XML-пакета, который формируется в процедуре ПолучитьXMLПакетДляФискализацияЧека. Именно здесь кроется ключ к решению проблемы. Драйвер ожидает распределения общей суммы чека по следующим категориям:
Давайте проанализируем фрагмент кода, который отвечает за запись атрибутов оплаты в XML. Для того чтобы касса понимала, какой тип оплаты используется, нам нужно заранее рассчитать переменные СуммаНаличными, СуммаЭлектронными и другие. Посмотрим, как это должно выглядеть в теле функции:
// Формирование блока оплаты в XML-пакете
ЗаписьXML.ЗаписатьАтрибут("Cash" , XMLСтрока(СуммаНаличными));
ЗаписьXML.ЗаписатьАтрибут("ElectronicPayment", XMLСтрока(СуммаЭлектронными));
ЗаписьXML.ЗаписатьАтрибут("Credit" , XMLСтрока(СуммаПостоплатой));
ЗаписьXML.ЗаписатьАтрибут("AdvancePayment" , XMLСтрока(СуммаПредоплатой));
ЗаписьXML.ЗаписатьАтрибут("CashProvision" , XMLСтрока(СуммаПредоставлением));
Обратите внимание на важный нюанс: если вы передадите 0 в атрибут Cash и полную сумму в ElectronicPayment, чек будет электронным. Ошибка «все чеки электронные» обычно возникает потому, что в коде 1С расчет переменной СуммаЭлектронными перекрывает остальные значения или логика определения вида оплаты в документе работает некорректно.
Чтобы правильно заполнить вышеуказанные атрибуты, нам нужно обратиться к данным самого документа (например, ЧекККМ). Проанализируем, как в типовой УТ 10.3 реализовано получение сумм. Обычно используются экспортные функции модуля документа или обработки. Выясним причину ошибки, проверив, как вызываются методы ПолучитьСуммуНаличнойОплаты() и ПолучитьСуммуБезналичнойОплаты().
Рассмотрим пример правильной подготовки данных перед формированием XML:
СуммаНаличными = 0;
СуммаЭлектронными = 0;
// Если в документе выбран вид оплаты "Наличные"
Если ВидОплаты = Перечисления.ВидыОплатыЧекаККМ.Наличные Тогда
СуммаНаличными = Объект.СуммаДокумента;
// Если оплата платежной картой
ИначеЕсли ВидОплаты = Перечисления.ВидыОплатыЧекаККМ.ПлатежнаяКарта Тогда
СуммаЭлектронными = Объект.СуммаДокумента;
КонецЕсли;
Важный совет: В случае сложных (комбинированных) оплат, когда часть суммы оплачивается картой, а часть наличными, убедитесь, что ваша конфигурация поддерживает табличную часть «Оплаты» и корректно суммирует итоги по каждому виду. Если передать в ККТ сумму оплат, которая в итоге не равна сумме строк чека, драйвер выдаст ошибку «Сумма всех типов оплаты меньше суммы чека».
Иногда программный код 1С написан верно, но касса все равно печатает не те названия типов оплаты. Это может быть связано с внутренними настройками самой ККТ Атол. Посмотрим на ситуацию со стороны железа. В памяти кассы есть Таблица №2 «Типы оплаты».
Рассмотрим стандартные индексы этой таблицы:
Если вы используете специфическую обработку обслуживания, она может пытаться передать индекс типа оплаты напрямую через атрибут PaymentType. В этом случае убедитесь, что в коде 1С передается именно тот индекс, который соответствует нужной строке в таблицах ККТ. Однако для современных моделей Атол 30Ф и драйверов версии 8.14+ и выше рекомендуется использовать именно распределение по именованным атрибутам сумм (Cash, ElectronicPayment), так как это стандарт протокола ФФД 1.05.
Проанализируем влияние версии драйвера на результат. Пользователи часто спорят, стоит ли переходить с 8-го драйвера на 9-й или 10-й. Для корректной работы с типами оплаты в рамках ФФД 1.05 подходят все перечисленные версии, но есть особенности:
Если ваша организация работает с маркированным товаром (Честный ЗНАК) или использует УСН/Патент, крайне рекомендуется использовать драйвер версии 10.х и обновленные обработки обслуживания, так как старые версии драйверов могут некорректно печатать реквизиты НДС или не передавать коды маркировки (теги 1162/1163), что приведет к штрафам.
Подводя итог, для исправления проблемы «все чеки электронно» выполните следующие шаги:
1. Найдите в коде обработки или конфигурации процедуру формирования XML-пакета (обычно ПолучитьXMLПакетДляФискализацияЧека).
2. Проверьте, заполняются ли атрибуты Cash и ElectronicPayment разными значениями в зависимости от типа оплаты документа.
3. Убедитесь, что переменная ТипРасчета (тег 1214) соответствует моменту расчета (обычно это «Полный расчет»), а не подменяет собой тип оплаты.
4. Протестируйте пробитие чека на тестовой кассе или в режиме эмулятора, анализируя сформированный XML-текст перед его отправкой на устройство.
Правильное распределение сумм по атрибутам XML позволит вам не только соблюдать закон, но и получать корректные отчеты о выручке в разрезе способов оплаты как в 1С, так и в личном кабинете ОФД.