Как исправить ошибку «Сумма товарных позиций больше суммы оплат» в 1С:Розница при работе с кассами АТОЛ

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

При работе в режиме рабочего места кассира (РМК) в программе 1С:Розница 2.3 пользователи часто сталкиваются с неприятной ошибкой: «Сумма товарных позиций больше суммы оплат». Особенность проблемы заключается в её хаотичности — один и тот же чек может не пробиться с первого раза, но пройти без ошибок со второго. Ситуация осложняется при использовании эквайринговых терминалов и специфических настроек округления.

В этой статье мы подробно разберем природу этой ошибки, проанализируем влияние драйверов АТОЛ (DTO 10.x) и предложим пошаговый алгоритм решения, основываясь на опыте практикующих специалистов и технических особенностях платформы 1С.

Разберем природу ошибки: почему возникает расхождение?

Давайте выясним причину: почему кассовый аппарат «отказывается» принимать чек, который в 1С выглядит корректно? Корень проблемы кроется в жестком контроле математических операций внутри фискального накопителя и прошивки ККТ. Согласно требованиям ФФД, сумма всех переданных товарных позиций должна строго соответствовать сумме всех типов оплат (наличные, безналичные, бонусы и т.д.).

Проанализируем ситуацию, когда в 1С включено округление до рубля в настройках магазина. В 1С:Розница округление технически реализуется как автоматическая скидка. Если товар стоит 100 рублей, а итоговая сумма чека после применения всех правил должна быть округлена, программа распределяет эту «копеечную» разницу по позициям. В результате цена одной единицы товара может стать дробной (например, 99.9983 рубля). При передаче данных в драйвер ККТ происходит повторное округление, и если алгоритмы 1С и прошивки АТОЛ разойдутся хотя бы на одну копейку в итоговой сумме, касса выдаст ошибку.

Шаг 1: Настройка формато-логического контроля (ФЛК)

Первым делом нам необходимо проверить настройки взаимодействия 1С с подключаемым оборудованием. Рассмотрим, как это сделать в интерфейсе программы:

  1. Перейдем в раздел Администрирование — Подключаемое оборудование.
  2. Откроем карточку настройки нашего фискального регистратора.
  3. Найдем параметры Способ формато-логического контроля и Допустимое расхождение.

Для минимизации ошибок рекомендуется установить следующие значения:

Шаг 2: Проверка настроек ценообразования и НДС

Часто проблема возникает даже в тех случаях, когда товар продается «Без НДС». Посмотрим на важный нюанс в настройках магазина. Если в карточке магазина или в виде цен не установлена галочка «Цена включает НДС», алгоритм расчета суммы в 1С может работать некорректно при передаче в ККТ. Программа будет пытаться «накрутить» налоги или высчитать их из суммы, что приведет к появлению лишних знаков после запятой.

Убедитесь, что в настройках магазина (раздел НСИ — Магазины) на вкладке Цены и скидки установлен флаг Цена включает НДС. Это гарантирует, что сумма оплаты будет в точности соответствовать сумме, указанной в чеке, без дополнительных пересчетов на стороне драйвера.

Шаг 3: Анализ работы с двумя эквайринговыми терминалами

В рассматриваемой ситуации автор темы использует расширение для работы с двумя банковскими терминалами. Это критический момент. Если в коде расширения при закрытии чека или сверке итогов некорректно заполняется коллекция ТаблицаОплат, драйвер получит неверные данные о сумме безналичного расчета.

Рассмотрим пример функции, которая собирает данные о терминалах:


&НаСервере
Функция РА_РТ22_ЭквайринговыеТерминалыПоКассеККМ()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗРЕШЕННЫЕ
        |   ЭквайринговыеТерминалы.Ссылка КАК ЭквайринговыйТерминал,
        |   ЭквайринговыеТерминалы.ПодключаемоеОборудование КАК ПодключаемоеОборудование
        |ИЗ
        |   Справочник.ЭквайринговыеТерминалы КАК ЭквайринговыеТерминалы
        |ГДЕ
        |   ЭквайринговыеТерминалы.Касса = &Касса
        |   И НЕ ЭквайринговыеТерминалы.ПометкаУдаления";
    
    Запрос.УстановитьПараметр("Касса", Объект.КассаККМ);
    Результат = Запрос.Выполнить();
    // ... логика формирования массива терминалов
КонецФункции

Важно проанализировать, как эти данные передаются в процедуру фискализации. Если вы используете доработки, проверьте, чтобы сумма, возвращаемая эквайрингом, передавалась в объект ЧекККМ без искажений. Ошибка часто возникает, когда терминал уже списал деньги, а 1С не смогла передать эту сумму в ККТ из-за программного сбоя в расширении. В таких аварийных ситуациях можно использовать расширение для проведения чека ККМ без фискализации.

Шаг 4: Работа с драйвером АТОЛ и логами

Если программные настройки 1С не помогают, необходимо обратиться к первоисточнику данных — логам драйвера. В драйвере АТОЛ 10-й версии логи обычно располагаются по пути: %AppData%\Atol\drivers10\logs\.

Проанализируем типичную ошибку в логе:

ERROR [FiscalPrinter] Код ошибки ККТ - 009Ah
ERROR [FiscalPrinter] Объекту присвоен код ошибки 81 [Чек закрыт - операция невозможна]

Ошибка 009Ah часто сопровождает попытки драйвера выполнить JSON-задание при некорректном состоянии чека. Чтобы исправить это, попробуйте изменить параметры ККТ через утилиту «Тест драйвера»:

  1. Зайдите в Свойства — Параметры ККТ.
  2. Найдите раздел Контроль сумм.
  3. Попробуйте переключить контроль с «ККТ» на «Драйвер». В этом случае драйвер будет брать на себя ответственность за выравнивание копеек перед отправкой команды в фискальный накопитель.

Шаг 5: Программная корректировка цены перед фискализацией

Если вы опытный разработчик и проблема сохраняется, можно применить «силовой» метод выравнивания данных. Суть метода заключается в том, чтобы перед отправкой чека на печать принудительно рассчитать цену каждой позиции как Сумма / Количество, исключая любые другие методы расчета.

Посмотрим на логику, которую можно внедрить в процедуру формирования XML-пакета для ККТ:


Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
    // Если количество больше единицы и есть дробная часть,
    // проверяем математическую точность
    Если СтрокаТовара.Количество <> 0 Тогда
        РассчитаннаяЦена = СтрокаТовара.Сумма / СтрокаТовара.Количество;
        // Если Цена * Количество не равно Сумме, 
        // фиксируем цену с учетом требований ККТ
        СтрокаТовара.Цена = Окр(РассчитаннаяЦена, 2);
    КонецЕсли;
КонецЦикла;

Важный момент: согласно требованиям ФФД 1.05 и выше, в кассу должна передаваться цена за единицу товара с учетом всех скидок. Передача отдельной скидки в строке чека во многих конфигурациях уже не используется, поэтому манипуляции с ценой являются наиболее надежным способом избежать расхождений.

Резюме и рекомендации

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

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

← На главную