Как исправить ошибку пробития чека с неверной суммой НДС в 1С:УПП релиз 202.1?

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

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

Симптомы выглядят следующим образом: в 1С появляется сообщение об ошибке, указывающее на неправильную сумму НДС. При этом на самом кассовом аппарате пробивается только первая позиция из списка, но в качестве её стоимости выводится итоговая сумма всего заказа. После этого печать прерывается, и касса выдает сообщение ЧЕК АННУЛИРОВАН. Разберем по шагам причину такого поведения и выясним, как восстановить нормальную работу кассы.

Проанализируем физику возникновения ошибки

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

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

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

Выясним причину в программном коде

Проблема кроется глубоко в типовых механизмах конфигурации, а именно — в общем модуле МенеджерОборудованияВызовСервера. Разработчики допустили неточность в процедуре ЗаполнитьТоварнуюСтрокуЧека. Посмотрим на пример кода, который вызывает эту ошибку в релизе 202.1:


// частичная оплата
Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(СтрокаПозиции, "СуммаПлатежа") Тогда
    Если ЗначениеЗаполнено(СтрокаПозиции.СуммаПлатежа) Тогда
        Коэффициент =?(СтрокаЧека.Сумма > 0, СтрокаПозиции.СуммаПлатежа / СтрокаЧека.Сумма, 1);
        Если Коэффициент <> 1 Тогда
            СтрокаЧека.Сумма = Окр(СтрокаЧека.Сумма * Коэффициент, 2, 1);
            СтрокаЧека.Цена = Окр(СтрокаЧека.Цена * Коэффициент, 2, 1);
            СтрокаЧека.ЦенаСоСкидками = Окр(СтрокаЧека.ЦенаСоСкидками * Коэффициент, 2, 1);
            СтрокаЧека.СуммаНДС = Окр(СтрокаЧека.СуммаНДС * Коэффициент, 2, 1);
        КонецЕсли;
    КонецЕсли;
КонецЕсли;

Проанализируем этот участок кода подробнее. При частичной оплате или постоплате система вычисляет переменную Коэффициент делением суммы платежа на сумму строки чека. Если коэффициент не равен единице, программа начинает последовательно пересчитывать сумму, цену и сумму НДС для строки чека, применяя функцию Окр (Округление).

Главная уязвимость здесь — накопление погрешности округления. При умножении уже рассчитанной (и возможно, содержащей копейки) суммы НДС на коэффициент и последующем ее округлении до двух знаков, итоговая сумма налога по всем строкам начинает "разъезжаться" с итогом всего чека на несколько копеек. Фискальный накопитель, получая команду через драйвер, пересчитывает суммы самостоятельно. Заметив расхождение между СтрокаЧека.СуммаНДС и базой для начисления налога, он возвращает аппаратную ошибку.

Способы решения проблемы

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

  1. Установка официального патча или обновление релиза

    Поскольку проблема носит массовый характер и связана с ошибкой вендора (в этом же релизе были выявлены серьезные проблемы с заполнением отчета РСВ), наиболее правильным решением будет обновление конфигурации на следующий, исправленный релиз 1С:УПП. Если переход на новый релиз в данный момент невозможен из-за доработок в вашей базе, проверьте наличие официальных исправлений (патчей) от фирмы «1С» для версии 1.3.202.1. Установка расширения-патча позволит исправить ошибку расчета без снятия конфигурации с поддержки.

  2. Внесение ручных правок в программный код

    Если ждать патчей нет времени, а торговля остановлена, можно исправить ошибку силами программиста. Для этого необходимо доработать модуль МенеджерОборудованияВызовСервера. Что конкретно мы можем сделать:

    Во-первых, в процедуре ЗаполнитьТоварнуюСтрокуЧека следует изменить механизм распределения оплат. Вместо простого умножения НДС на коэффициент, необходимо внедрить алгоритм распределения "копеек" на последнюю товарную строку, либо пересчитывать НДС заново от уже округленной суммы с учетом нужной ставки налога. Это гарантирует, что сумма налога, рассчитанная от итоговой цены, будет корректной.

    Во-вторых, обратите внимание на соседние процедуры, в частности на ЗаполнитьПоНовому(). Типовой механизм часто не учитывает суммы предыдущих оплат должным образом. Для того чтобы в расчетной части чека корректно выводились фискальные типы оплат (например, «Постоплата кредит» и «Зачет аванса»), распределение должно происходить с жестким контролем суммы, чтобы общая стоимость чека (Сумма по чеку) строго равнялась сумме всех строк.

Итоги

Мы подробно разобрали ошибку пробития чека в УПП версии 1.3.202.1 и выяснили, что причиной является баг в типовом коде распределения частичных оплат. Использование математических пропорций без должного контроля погрешности округления приводит к конфликту с ФФД ККТ. Для стабильной работы кассовых аппаратов настоятельно рекомендуем использовать механизмы пересчета НДС от итоговой стоимости строки после округления, либо оперативно обновить систему до актуальной версии без данной программной недоработки.

← На главную