Почему в Заказе клиента УТ 11 и КА 2 не работает округление при наличии отмененных строк?

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

При работе в современных конфигурациях на платформе 1С:Предприятие 8.3, таких как 1С:Управление торговлей 11, 1С:Комплексная автоматизация 2 или 1С:ERP, пользователи часто сталкиваются с неприятной особенностью. При расчете автоматических скидок, а конкретно — скидки типа «Округление суммы документа», итоговая сумма в Заказе клиента перестает быть круглой, если в табличной части присутствуют строки со статусом «Отменена». Рассмотрим подробно, почему это происходит, как логика системы влияет на учет и какими способами можно исправить эту ситуацию.

Анализ технической причины проблемы

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

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

  1. Алгоритм суммирует стоимость всех товаров, включая те, которые клиент отказался покупать (отмененные строки).
  2. На основании этой «раздутой» суммы вычисляется величина скидки-округления (например, чтобы сумма стала кратной 1 или 10 рублям).
  3. Затем система пытается распределить полученную сумму скидки по строкам документа. Однако, согласно логике 1С, скидки не могут быть назначены на отмененные строки.
  4. В итоге скидка распределяется только по «активным» строкам, но так как база расчета была неверной, итоговая сумма документа после применения скидки все равно содержит копейки.

Официальная позиция разработчиков 1С

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

Поэтому 1С предлагает два организационных решения:

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

Вариант решения №1: Обнуление цен в отмененных строках

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

  1. Перед расчетом скидок в строке, которую необходимо отменить, установите Цена в значение 0.
  2. Установите флаг Отменено и укажите причину отмены.
  3. Произведите расчет скидок через меню «Цены и скидки».

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

Вариант решения №2: Программная корректировка через расширение

Если пользователей много и ручной контроль цен в отмененных строках невозможен, проанализируем программный способ решения задачи. Нам потребуется создать расширение, которое будет корректировать запрос в модуле расчета скидок. Наша цель — исключить строки с признаком Отменено = Истина из выборки для расчета скидки «Округление».

Рассмотрим пример логики, которую необходимо внедрить в процедуру расчета (условно):


// В расширении для модуля СкидкиНаценкиСервер
// Перехватываем формирование таблицы товаров для расчета
&Перед("ПодготовитьТаблицуТоваров")
Процедура Расш_ПодготовитьТаблицуТоваров(ПараметрыРасчета, ТаблицаТоваров)
    
    // Удаляем отмененные строки из временной таблицы, 
    // которая передается в движок расчета скидок
    Индекс = ТаблицаТоваров.Количество() - 1;
    Пока Индекс >= 0 Цикл
        СтрокаТЧ = ТаблицаТоваров[Индекс];
        Если СтрокаТЧ.Отменено Тогда
            ТаблицаТоваров.Удалить(Индекс);
        КонецЕсли;
        Индекс = Индекс - 1;
    КонецЦикла;

КонецПроцедуры

Использование &Перед или &Вместо в расширении позволяет гарантировать, что механизм округления будет видеть только те товары, за которые клиент действительно должен заплатить. Это обеспечит корректное распределение копеек по активным позициям.

Вариант решения №3: Использование групповой обработки

Если заказов с «кривым» округлением накопилось много, разберем способ их массового исправления. Для этого можно использовать стандартную обработку «Групповое изменение реквизитов».

Действуем по шагам:

  1. Выбираем объект Заказ клиента (табличная часть Товары).
  2. Добавляем фильтр: Ссылка.Дата (нужный период), Отменено = Да и Цена <> 0.
  3. В колонке «Новое значение» для реквизита Цена устанавливаем 0.
  4. После выполнения обработки необходимо перепровести заказы с пересчетом скидок.

Важность округления для работы с кассой (ФФД 1.2)

Проанализируем ситуацию с точки зрения законодательства. Некорректное округление в Заказе клиента — это не просто эстетическая проблема. Когда на основании такого заказа принимается оплата (через Приходный кассовый ордер или Эквайринговую операцию), данные передаются на контрольно-кассовую технику (ККТ).

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

Подведем итог: Проблема с округлением при отмененных строках в УТ 11 и КА 2 является следствием заложенной логики «сохранения истории». Для корректной работы системы в операционном режиме рекомендуется либо удалять ошибочно введенные строки (если по ним не было движений), либо использовать программные доработки, исключающие отмененные товары из базы расчета скидок.

← На главную