При переходе на онлайн-кассы (ККТ с передачей данных) многие пользователи программы 1С:Розница 2.2 столкнулись с неприятной ситуацией: при попытке оплатить покупку бонусными баллами система выдает ошибку, сообщая, что «сумма в строке не заполнена». В этой статье мы подробно разберем, почему это происходит, как работают механизмы распределения скидок и какие шаги нужно предпринять для решения проблемы.
Давайте проанализируем ситуацию. До внедрения онлайн-касс и формата фискальных данных (ФФД) версии 1.05 кассовые аппараты были менее требовательны к передаваемым данным. Однако современные требования ФЛК (форматно-логического контроля) жестко ограничивают структуру чека. Основная причина ошибки заключается в том, что оплата бонусами в типовой архитектуре 1С часто воспринимается как скидка.
Рассмотрим пример: покупатель приобретает товар стоимостью 1249 рублей и хочет оплатить 1248 рублей бонусами. К оплате наличными остается всего 1 рубль. Программа должна распределить эту скидку (1248 руб.) по всем позициям чека. Если позиций несколько или количество товара дробное, возникает погрешность округления. Алгоритм 1С пытается компенсировать эту погрешность и иногда разделяет одну товарную позицию на две строки (так называемое «разбиение строк»), чтобы итоговая сумма чека сошлась до копейки. В результате таких математических преобразований в одну из строк может попасть нулевая сумма остатка к оплате.
Согласно требованиям ФФД 1.05, для каждого предмета расчета (тег 1059) обязательно должны быть заполнены Цена (тег 1079) и Сумма (тег 1043). Если после применения всех скидок сумма строки становится равной нулю, драйвер кассы блокирует пробитие чека, так как передача товара с нулевой ценой (если это не подарок с соответствующим признаком) недопустима.
Посмотрим на фрагмент кода, который отвечает за проверку реквизитов позиций чека. Проанализируем функцию ПроверяемыеРеквизитыПозицийЧека, которая определяет, какие поля являются обязательными для передачи в ККТ:
Функция ПроверяемыеРеквизитыПозицийЧека(МассивФФД, СоответствиеРеквизитов)
МассивРеквизитов = Новый Массив;
Для каждого ФорматФД Из МассивФФД Цикл
Если ФорматФД = "1.0" Тогда
МассивРеквизитов.Добавить("Цена"); // тег 1079
СоответствиеРеквизитов.Вставить("Цена", НСтр("ru = 'Цена'"));
МассивРеквизитов.Добавить("Количество"); // тег 1023
СоответствиеРеквизитов.Вставить("Количество", НСтр("ru = 'Количество'"));
МассивРеквизитов.Добавить("СтавкаНДС"); // тег 1199
СоответствиеРеквизитов.Вставить("СтавкаНДС", НСтр("ru = 'Ставка НДС'"));
МассивРеквизитов.Добавить("Сумма"); // тег 1191
СоответствиеРеквизитов.Вставить("Сумма", НСтр("ru = 'Сумма'"));
ИначеЕсли ФорматФД = "1.05" Тогда
// Для 1.05 действуют те же правила, что и для 1.0 в части обязательности Суммы
ИначеЕсли ФорматФД = "1.1" Тогда
МассивРеквизитов.Добавить("ПризнакПредметаРасчета"); // тег 1212
СоответствиеРеквизитов.Вставить("ПризнакПредметаРасчета", НСтр("ru = 'Признак предмета расчета'"));
МассивРеквизитов.Добавить("ПризнакСпособаРасчета"); // тег 1214
СоответствиеРеквизитов.Вставить("ПризнакСпособаРасчета", НСтр("ru = 'Признак способа расчета'"));
КонецЕсли;
КонецЦикла;
Возврат МассивРеквизитов;
КонецФункции
Как мы видим, реквизит Сумма является обязательным. В случае с бонусами программа не находит значения для этого поля после распределения скидки, что и приводит к ошибке.
Самый простой и эффективный способ «победить» ошибку без вмешательства в программный код — это исключить возможность появления нулевых остатков. Выясним, как это сделать в настройках программы:
Почему это помогает? Установив ограничение в 99%, мы гарантируем, что покупатель всегда заплатит хотя бы 1 копейку или 1 рубль наличными или картой. Этого «остатка» достаточно, чтобы распределить его по строкам чека и избежать появления нулевых сумм в позициях. С точки зрения лояльности разница для клиента невелика, а техническая стабильность системы возрастает в разы.
Разберем ситуацию с округлениями. В настройках 1С:Розница существует механизм, позволяющий сглаживать копейки при распределении скидок. Рассмотрим следующие шаги:
Это позволит системе более корректно схлопывать мелкие суммы, возникающие при распределении бонусов, и снизит вероятность появления паразитных строк с нулевой ценой.
Проанализируем более глубокий подход. В современных релизах 1С (начиная с Розницы 2.3 и последних патчей 2.2) реализована возможность пробивать бонусы не как скидку, а как иной вид оплаты (тег 1217 «Иная форма оплаты» или «Встречное предоставление»).
В этом случае цена товара в чеке остается полной, а бонусы проходят как один из видов платежа (наряду с наличными и безналичными). Это полностью решает проблему с НДС и нулевыми строками. Однако для реализации этого метода в старых версиях Розницы 2.2 может потребоваться:
МенеджерОборудованияВызовСервера.Важно помнить, что если вы используете бонусы как скидку, то налоговая база по НДС уменьшается. Если же вы решите просто списывать товар без пробития чека (что иногда практикуют на форумах), это может привести к нарушению кассовой дисциплины (54-ФЗ). Согласно законодательству, любое движение товара должно сопровождаться фискальным документом. Поэтому вариант с оставлением 1 рубля к оплате является наиболее безопасным и с точки зрения закона, и с точки зрения работы алгоритмов 1С.
Мы выяснили, что ошибка «Сумма в строке не заполнена» — это следствие конфликта между алгоритмом распределения скидок в 1С и строгим контролем полей в современных онлайн-кассах. Чтобы решить проблему, мы рекомендуем:
Следуя этим инструкциям, вы сможете восстановить работоспособность бонусной системы и избежать сбоев при печати чеков.