При работе в современных конфигурациях на платформе 1С:Предприятие 8.3, таких как 1С:Управление торговлей 11, 1С:Комплексная автоматизация 2 или 1С:ERP, пользователи часто сталкиваются с неприятной особенностью. При расчете автоматических скидок, а конкретно — скидки типа «Округление суммы документа», итоговая сумма в Заказе клиента перестает быть круглой, если в табличной части присутствуют строки со статусом «Отменена». Рассмотрим подробно, почему это происходит, как логика системы влияет на учет и какими способами можно исправить эту ситуацию.
Разберем внутренний механизм работы скидок. Когда мы нажимаем кнопку «Рассчитать скидки (наценки)», система запускает сложный алгоритм, сосредоточенный в программных модулях СкидкиНаценкиСервер и СкидкиНаценкиПоискРасчет. Проблема заключается в том, как движок расчета формирует «базу» для округления.
Выясним причину некорректного поведения: система анализирует общую сумму документа. В некоторых версиях кода запрос, собирающий данные для расчета округления, видит все строки табличной части Товары. Даже если у строки установлен флаг Отменено, она физически остается в документе. В результате возникают следующие этапы ошибки:
Проанализируем ответ технической поддержки, который часто получают пользователи. С точки зрения проектирования системы, поведение считается корректным в контексте жизненного цикла заказа. Рассмотрим ситуацию: по заказу уже была произведена частичная отгрузка (создана Реализация товаров и услуг). Если после этого менеджер отменяет недопоставленные остатки, пересчет скидок (и округления в частности) мог бы изменить цены в уже отгруженных позициях. Это привело бы к расхождениям между заказом и финансовыми документами отгрузки.
Поэтому 1С предлагает два организационных решения:
Товары. В этом случае база для расчета округления всегда будет актуальной.Посмотрим на практический способ обхода проблемы без внесения изменений в код конфигурации. Если бизнес-процесс требует именно отмены строк (например, для контроля работы отдела закупок), можно воспользоваться следующим алгоритмом:
Цена в значение 0.Отменено и укажите причину отмены.Поскольку цена в отмененной строке равна нулю, она не вносит искажений в общую сумму документа при сборе данных для округления. Движок скидок увидит только корректную сумму активных позиций и рассчитает округление правильно.
Если пользователей много и ручной контроль цен в отмененных строках невозможен, проанализируем программный способ решения задачи. Нам потребуется создать расширение, которое будет корректировать запрос в модуле расчета скидок. Наша цель — исключить строки с признаком Отменено = Истина из выборки для расчета скидки «Округление».
Рассмотрим пример логики, которую необходимо внедрить в процедуру расчета (условно):
// В расширении для модуля СкидкиНаценкиСервер
// Перехватываем формирование таблицы товаров для расчета
&Перед("ПодготовитьТаблицуТоваров")
Процедура Расш_ПодготовитьТаблицуТоваров(ПараметрыРасчета, ТаблицаТоваров)
// Удаляем отмененные строки из временной таблицы,
// которая передается в движок расчета скидок
Индекс = ТаблицаТоваров.Количество() - 1;
Пока Индекс >= 0 Цикл
СтрокаТЧ = ТаблицаТоваров[Индекс];
Если СтрокаТЧ.Отменено Тогда
ТаблицаТоваров.Удалить(Индекс);
КонецЕсли;
Индекс = Индекс - 1;
КонецЦикла;
КонецПроцедуры
Использование &Перед или &Вместо в расширении позволяет гарантировать, что механизм округления будет видеть только те товары, за которые клиент действительно должен заплатить. Это обеспечит корректное распределение копеек по активным позициям.
Если заказов с «кривым» округлением накопилось много, разберем способ их массового исправления. Для этого можно использовать стандартную обработку «Групповое изменение реквизитов».
Действуем по шагам:
Заказ клиента (табличная часть Товары).Ссылка.Дата (нужный период), Отменено = Да и Цена <> 0.Цена устанавливаем 0.Проанализируем ситуацию с точки зрения законодательства. Некорректное округление в Заказе клиента — это не просто эстетическая проблема. Когда на основании такого заказа принимается оплата (через Приходный кассовый ордер или Эквайринговую операцию), данные передаются на контрольно-кассовую технику (ККТ).
Согласно требованиям ФФД 1.2, сумма всех позиций чека должна до копейки совпадать с итоговой суммой оплаты. Если из-за отмененной строки округление «поплыло», в чеке могут возникнуть лишние копейки, которые невозможно принять наличными или которые вызовут ошибку «Сумма всех типов оплаты меньше суммы чека». Поэтому правильная настройка округления критически важна для розничных и мелкооптовых продаж, работающих с наличными расчетами.
Подведем итог: Проблема с округлением при отмененных строках в УТ 11 и КА 2 является следствием заложенной логики «сохранения истории». Для корректной работы системы в операционном режиме рекомендуется либо удалять ошибочно введенные строки (если по ним не было движений), либо использовать программные доработки, исключающие отмененные товары из базы расчета скидок.