При работе в режиме рабочего места кассира (РМК) в программе 1С:Розница 2.3 пользователи часто сталкиваются с неприятной ошибкой: «Сумма товарных позиций больше суммы оплат». Особенность проблемы заключается в её хаотичности — один и тот же чек может не пробиться с первого раза, но пройти без ошибок со второго. Ситуация осложняется при использовании эквайринговых терминалов и специфических настроек округления.
В этой статье мы подробно разберем природу этой ошибки, проанализируем влияние драйверов АТОЛ (DTO 10.x) и предложим пошаговый алгоритм решения, основываясь на опыте практикующих специалистов и технических особенностях платформы 1С.
Давайте выясним причину: почему кассовый аппарат «отказывается» принимать чек, который в 1С выглядит корректно? Корень проблемы кроется в жестком контроле математических операций внутри фискального накопителя и прошивки ККТ. Согласно требованиям ФФД, сумма всех переданных товарных позиций должна строго соответствовать сумме всех типов оплат (наличные, безналичные, бонусы и т.д.).
Проанализируем ситуацию, когда в 1С включено округление до рубля в настройках магазина. В 1С:Розница округление технически реализуется как автоматическая скидка. Если товар стоит 100 рублей, а итоговая сумма чека после применения всех правил должна быть округлена, программа распределяет эту «копеечную» разницу по позициям. В результате цена одной единицы товара может стать дробной (например, 99.9983 рубля). При передаче данных в драйвер ККТ происходит повторное округление, и если алгоритмы 1С и прошивки АТОЛ разойдутся хотя бы на одну копейку в итоговой сумме, касса выдаст ошибку.
Первым делом нам необходимо проверить настройки взаимодействия 1С с подключаемым оборудованием. Рассмотрим, как это сделать в интерфейсе программы:
Для минимизации ошибок рекомендуется установить следующие значения:
Разбивать строку или Очищать. Режим «Разбивать строку» позволяет системе автоматически разделить одну товарную позицию на две (например, 1 штука по цене 100 руб. превратится в 0.99 шт. по одной цене и 0.01 шт. по другой), чтобы математически подогнать сумму под итог оплаты.0.01. Это даст драйверу право на микро-корректировку при передаче данных.Часто проблема возникает даже в тех случаях, когда товар продается «Без НДС». Посмотрим на важный нюанс в настройках магазина. Если в карточке магазина или в виде цен не установлена галочка «Цена включает НДС», алгоритм расчета суммы в 1С может работать некорректно при передаче в ККТ. Программа будет пытаться «накрутить» налоги или высчитать их из суммы, что приведет к появлению лишних знаков после запятой.
Убедитесь, что в настройках магазина (раздел НСИ — Магазины) на вкладке Цены и скидки установлен флаг Цена включает НДС. Это гарантирует, что сумма оплаты будет в точности соответствовать сумме, указанной в чеке, без дополнительных пересчетов на стороне драйвера.
В рассматриваемой ситуации автор темы использует расширение для работы с двумя банковскими терминалами. Это критический момент. Если в коде расширения при закрытии чека или сверке итогов некорректно заполняется коллекция ТаблицаОплат, драйвер получит неверные данные о сумме безналичного расчета.
Рассмотрим пример функции, которая собирает данные о терминалах:
&НаСервере
Функция РА_РТ22_ЭквайринговыеТерминалыПоКассеККМ()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ЭквайринговыеТерминалы.Ссылка КАК ЭквайринговыйТерминал,
| ЭквайринговыеТерминалы.ПодключаемоеОборудование КАК ПодключаемоеОборудование
|ИЗ
| Справочник.ЭквайринговыеТерминалы КАК ЭквайринговыеТерминалы
|ГДЕ
| ЭквайринговыеТерминалы.Касса = &Касса
| И НЕ ЭквайринговыеТерминалы.ПометкаУдаления";
Запрос.УстановитьПараметр("Касса", Объект.КассаККМ);
Результат = Запрос.Выполнить();
// ... логика формирования массива терминалов
КонецФункции
Важно проанализировать, как эти данные передаются в процедуру фискализации. Если вы используете доработки, проверьте, чтобы сумма, возвращаемая эквайрингом, передавалась в объект ЧекККМ без искажений. Ошибка часто возникает, когда терминал уже списал деньги, а 1С не смогла передать эту сумму в ККТ из-за программного сбоя в расширении. В таких аварийных ситуациях можно использовать расширение для проведения чека ККМ без фискализации.
Если программные настройки 1С не помогают, необходимо обратиться к первоисточнику данных — логам драйвера. В драйвере АТОЛ 10-й версии логи обычно располагаются по пути: %AppData%\Atol\drivers10\logs\.
Проанализируем типичную ошибку в логе:
ERROR [FiscalPrinter] Код ошибки ККТ - 009Ah
ERROR [FiscalPrinter] Объекту присвоен код ошибки 81 [Чек закрыт - операция невозможна]
Ошибка 009Ah часто сопровождает попытки драйвера выполнить JSON-задание при некорректном состоянии чека. Чтобы исправить это, попробуйте изменить параметры ККТ через утилиту «Тест драйвера»:
Если вы опытный разработчик и проблема сохраняется, можно применить «силовой» метод выравнивания данных. Суть метода заключается в том, чтобы перед отправкой чека на печать принудительно рассчитать цену каждой позиции как Сумма / Количество, исключая любые другие методы расчета.
Посмотрим на логику, которую можно внедрить в процедуру формирования XML-пакета для ККТ:
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
// Если количество больше единицы и есть дробная часть,
// проверяем математическую точность
Если СтрокаТовара.Количество <> 0 Тогда
РассчитаннаяЦена = СтрокаТовара.Сумма / СтрокаТовара.Количество;
// Если Цена * Количество не равно Сумме,
// фиксируем цену с учетом требований ККТ
СтрокаТовара.Цена = Окр(РассчитаннаяЦена, 2);
КонецЕсли;
КонецЦикла;
Важный момент: согласно требованиям ФФД 1.05 и выше, в кассу должна передаваться цена за единицу товара с учетом всех скидок. Передача отдельной скидки в строке чека во многих конфигурациях уже не используется, поэтому манипуляции с ценой являются наиболее надежным способом избежать расхождений.
Подводя итог, можно сказать, что ошибка «Сумма товарных позиций больше суммы оплат» — это конфликт между округлениями 1С и жесткой логикой ККТ. Чтобы решить её, выполните следующие действия:
Соблюдение этих шагов позволит свести количество ошибок к минимуму и обеспечит стабильную работу кассовой зоны без необходимости повторного пробития чеков.