Как устранить ошибку ККТ «45h, Сумма всех типов оплаты меньше итога чека» в 1С?

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

При пробитии фискальных чеков на кассовых аппаратах (в частности, линейки Штрих-М и РИТЕЙЛ-01Ф) в программах 1С:Управление торговлей 11, 1С:Комплексная автоматизация, 1С:ERP или 1С:Розница может возникать аппаратная ошибка: 45h, Сумма всех типов оплаты меньше итога чека. Проанализируем природу этой ошибки и разберем практические способы ее устранения.

Причины возникновения ошибки 45h

Выясним, почему фискальный регистратор блокирует печать чека. Ошибка проявляется при одновременном выполнении нескольких условий:

  1. Наличие скидок в строках документа: в типовых конфигурациях 1С скидка чаще всего рассчитывается на итоговую сумму строки или чека, а не вычитается непосредственно из цены единицы товара.
  2. Некратное деление суммы на количество: если итоговая стоимость строки со скидкой не делится без остатка на количество единиц товара, расчетная цена за единицу получает дробную копеечную часть (например, при сумме 100.05 руб. за 2 шт. расчетная цена составляет 50.025 руб.).
  3. Требования формата фискальных данных (ФФД): протоколы фискализации строго контролируют соотношение реквизитов 1079 (цена за единицу с учетом скидок) и 1043 (стоимость позиции с учетом скидок). В кассу передается требование соблюдения жесткой формулы: Количество × Цена = Стоимость.
  4. Безналичный расчет: при оплате банковской картой или безналичными средствами касса не допускает образования сдачи или переплаты. Если драйвер или касса округляет расчетную цену до двух или трех знаков, итоговая сумма строк чека может увеличиться на 1 копейку и превысить общую сумму оплат, переданную в теге Payments. В этот момент касса возвращает ошибку 45h.

Рассмотрим структуру некорректного пакета CheckPackage, приводящего к сбою:


<CheckPackage>
    <Parameters PaymentType="1" TaxVariant="2" SenderEmail="" CustomerEmail="" CustomerPhone=""/>
    <Positions>
        <FiscalString Name="Товар тестовый" Quantity="2" Price="51" Amount="100.05" Department="1" Tax="none"/>
    </Positions>
    <Payments Cashless="100.05"/>
</CheckPackage>

В приведенном примере передана сумма Amount="100.05" при Quantity="2". Фискальный регистратор пытается определить цену за штуку со скидкой: 100.05 / 2 = 50.025. При округлении цены до 50.03 руб. итоговая сумма строк кассы составит 2 × 50.03 = 100.06, что на 1 копейку больше суммы безналичного платежа 100.05.

Решение 1. Включение форматно-логического контроля (ФЛК) в 1С

Разберем наиболее правильный и штатный способ решения проблемы в конфигурациях на базе БПО (Библиотеки подключаемого оборудования).

Начиная с релизов УТ 11.3.4.19 (и аналогичных версий КА 2, ERP 2 и Розницы), в типовой функционал встроен специальный механизм форматно-логического контроля перед формированием фискального пакета. Алгоритм выполняет взаимозачет копеек между позициями или автоматически разбивает проблемную строку на несколько частей.

Пошаговая настройка в пользовательском режиме:

  1. Перейдем в раздел НСИ и администрирование → РMarket / Подключаемое оборудование.
  2. Откроем карточку используемого экземпляра ККТ с передачей данных.
  3. Найдем параметр Допустимое расхождение формато-логического контроля.
  4. Установим значение 0 (или 0.00). По умолчанию в старых версиях могло быть установлено значение 0.01. При значении 0 система принудительно выравнивает копейки до отправки команды в ККТ.
  5. Запишем и закроем настройки оборудования.

В программном коде за этот процесс отвечает процедура ПровестиФорматоЛогическийКонтроль общего модуля МенеджерОборудованияКлиентСервер. При обнаружении копеечного несовпадения система преобразует одну позицию в две самостоятельные фискальные строки.

Решение 2. Программное разбиение строк при формировании CheckPackage

Если используется нетиповая конфигурация или устаревший релиз, где ФЛК отсутствует, реализуем алгоритм разбиения позиции на уровне формирования пакета XML.

Посмотрим на пример структуры XML после программного разбиения строки с количеством 2 шт. и суммой 100.05 руб.:


<CheckPackage>
    <Parameters PaymentType="1" TaxVariant="2" SenderEmail="" CustomerEmail="" CustomerPhone=""/>
    <Positions>
        <FiscalString Name="Товар тестовый" Quantity="1" Price="50.03" Amount="50.03" Department="1" Tax="none"/>
        <FiscalString Name="Товар тестовый" Quantity="1" Price="50.02" Amount="50.02" Department="1" Tax="none"/>
    </Positions>
    <Payments Cashless="100.05"/>
</CheckPackage>

Разберем логику разделения строк на встроенном языке 1С:


// Пример алгоритма разделения строки при расхождении округления
СуммаПоСтроке = СтрокаЧека.Сумма;
Количество = СтрокаЧека.Количество;
ЦенаСоСкидкой = Окр(СуммаПоСтроке / Количество, 2, РежимОкругления.Округление15как20);

Если ЦенаСоСкидкой * Количество <> СуммаПоСтроке Тогда
    // Вычисляем копеечную разницу
    Разница = СуммаПоСтроке - (ЦенаСоСкидкой * (Количество - 1));
    
    // Добавляем основную часть (N - 1)
    Если Количество > 1 Тогда
        ДобавитьСтрокуВЧек(СтрокаЧека.Номенклатура, Количество - 1, ЦенаСоСкидкой, ЦенаСоСкидкой * (Количество - 1));
    КонецЕсли;
    
    // Добавляем отдельную строку на 1 шт. с остатком суммы
    ДобавитьСтрокуВЧек(СтрокаЧека.Номенклатура, 1, Разница, Разница);
Иначе
    ДобавитьСтрокуВЧек(СтрокаЧека.Номенклатура, Количество, ЦенаСоСкидкой, СуммаПоСтроке);
КонецЕсли;

Решение 3. Настройка параметров драйвера и рабочего места кассира

Проанализируем дополнительные параметры торговой системы и оборудования, которые помогают избежать ошибки 45h:

  1. Отключение объединения позиций в РМК: в 1С:Розница в настройках профиля РМК можно снять флаг Объединять одинаковые позиции. В этом случае каждая сканируемая единица товара попадает в чек отдельной строкой с количеством 1, что полностью исключает ошибки деления суммы.
  2. Обновление драйвера и прошивки ККТ: убедимся, что на рабочем месте используется актуальный сертифицированный драйвер стандарта ККТ с передачей данных. Устаревшие драйверы передавали в кассу скидки отдельной строкой, что противоречит требованиям новых форматов фискальных данных.
  3. Проверка региональных таблиц ККТ: в утилите «Тест драйвера ККТ» в Таблице 17 («Региональные настройки») или Таблице 1 («Тип и режим кассы») следует проверить режим начисления скидок, отключив аппаратный пересчет чека внутренними математическими алгоритмами кассы.
← На главную