Почему в 1С:Розница 2.2 не пробивается чек при оплате бонусами и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

При переходе на онлайн-кассы (ККТ с передачей данных) многие пользователи программы 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 = 'Признак способа расчета'"));
        КонецЕсли;
    КонецЦикла;
    
    Возврат МассивРеквизитов;
    
КонецФункции

Как мы видим, реквизит Сумма является обязательным. В случае с бонусами программа не находит значения для этого поля после распределения скидки, что и приводит к ошибке.

Вариант решения №1: Ограничение процента оплаты бонусами

Самый простой и эффективный способ «победить» ошибку без вмешательства в программный код — это исключить возможность появления нулевых остатков. Выясним, как это сделать в настройках программы:

  1. Перейдем в раздел Маркетинг — Бонусные программы лояльности.
  2. Откроем используемую бонусную программу.
  3. В поле «Максимальный процент оплаты бонусами» установим значение 99% (вместо 100%).

Почему это помогает? Установив ограничение в 99%, мы гарантируем, что покупатель всегда заплатит хотя бы 1 копейку или 1 рубль наличными или картой. Этого «остатка» достаточно, чтобы распределить его по строкам чека и избежать появления нулевых сумм в позициях. С точки зрения лояльности разница для клиента невелика, а техническая стабильность системы возрастает в разы.

Вариант решения №2: Настройка округления

Разберем ситуацию с округлениями. В настройках 1С:Розница существует механизм, позволяющий сглаживать копейки при распределении скидок. Рассмотрим следующие шаги:

  1. Зайдем в Администрирование — Продажи.
  2. Найдем пункт «Округлять суммы чека в пользу покупателя».
  3. Установим точность округления (например, до 1 рубля или до 10 копеек).

Это позволит системе более корректно схлопывать мелкие суммы, возникающие при распределении бонусов, и снизит вероятность появления паразитных строк с нулевой ценой.

Вариант решения №3: Использование «Встречного предоставления» (для продвинутых пользователей)

Проанализируем более глубокий подход. В современных релизах 1С (начиная с Розницы 2.3 и последних патчей 2.2) реализована возможность пробивать бонусы не как скидку, а как иной вид оплаты (тег 1217 «Иная форма оплаты» или «Встречное предоставление»).

В этом случае цена товара в чеке остается полной, а бонусы проходят как один из видов платежа (наряду с наличными и безналичными). Это полностью решает проблему с НДС и нулевыми строками. Однако для реализации этого метода в старых версиях Розницы 2.2 может потребоваться:

Рекомендации по учету НДС

Важно помнить, что если вы используете бонусы как скидку, то налоговая база по НДС уменьшается. Если же вы решите просто списывать товар без пробития чека (что иногда практикуют на форумах), это может привести к нарушению кассовой дисциплины (54-ФЗ). Согласно законодательству, любое движение товара должно сопровождаться фискальным документом. Поэтому вариант с оставлением 1 рубля к оплате является наиболее безопасным и с точки зрения закона, и с точки зрения работы алгоритмов 1С.

Итоги

Мы выяснили, что ошибка «Сумма в строке не заполнена» — это следствие конфликта между алгоритмом распределения скидок в 1С и строгим контролем полей в современных онлайн-кассах. Чтобы решить проблему, мы рекомендуем:

  1. Ограничить оплату бонусами до 99%.
  2. Проверить и настроить правила округления в системе.
  3. Убедиться, что версия драйвера ККТ актуальна и поддерживает корректную работу с ФФД 1.05.

Следуя этим инструкциям, вы сможете восстановить работоспособность бонусной системы и избежать сбоев при печати чеков.

← На главную