При переходе со старых конфигураций 1С (например, КА 1.1 или УПП 1.3) на современные системы управления предприятием — ERP 2, Комплексная автоматизация 2 (КА 2) или Управление торговлей 11 (УТ 11) — пользователи и программисты часто сталкиваются с неожиданным поведением программы. В документах продажи (таких как «Реализация товаров и услуг») процент автоматической скидки начинает «плясать», выводя дробные значения с сотыми долями (например, 3.01% или 2.99% вместо жестко настроенных 3%).
Для менеджеров по продажам и бухгалтеров это выглядит как ошибка системы. Более того, при работе с крупными торговыми сетями (сетевиками) расхождение даже в одну копейку в печатных формах или выгрузках EDI может стать причиной возврата всей партии товара и отказа в приемке документов. В этой статье мы подробно разберем, почему возникает этот эффект, как работает математический аппарат современных конфигураций 1С и какими практическими методами можно решить эту проблему.
Давайте проанализируем ситуацию на конкретном примере, который наглядно демонстрирует логику работы платформы 1С. Предположим, у нас есть товар стоимостью 19,30 рублей, и для него настроена автоматическая скидка в размере 3%.
Проследим за шагами, которые выполняет алгоритм программы при расчете документа:
Формула обратного пересчета выглядит следующим образом:
Фактический процент = (Округленная сумма скидки / Сумма без скидки) × 100
Подставим наши значения в формулу:
(0,58 руб. / 19,30 руб.) × 100 = 3,0051813... %
Округляя этот показатель до сотых долей для вывода на экран и в форму документа, программа записывает итоговое значение: 3,01%. Именно его и видит менеджер в интерфейсе.
Если бы система оставила в документе «красивые» 3%, но при этом указала сумму скидки 0,58 руб., то возникло бы явное арифметическое противоречие: при проверке формулы на калькуляторе покупатель или налоговый инспектор получил бы расхождение (19,30 × 3% = 0,57, а в документе написано 0,58). Именно для обеспечения жесткого математического соответствия показателей внутри каждой строки документа разработчики 1С заложили этот алгоритм обратного пересчета.
Рассмотрим структуру этого расчета на примере небольшого фрагмента кода, имитирующего логику проведения расчетов в модуле ценообразования современных конфигураций:
// Алгоритм расчета скидки в строке документа
СуммаБезСкидки = СтрокаТовара.Цена * СтрокаТовара.Количество;
СуммаСкидкиПредварительная = СуммаБезСкидки * (ПроцентСкидкиПоНастройке / 100);
// Округление до копеек (2 знака после запятой)
СтрокаТовара.СуммаСкидки = Округлен(СуммаСкидкиПредварительная, 2);
// Обратный пересчет фактического процента для обеспечения сходимости данных
Если СуммаБезСкидки <> 0 Тогда
СтрокаТовара.ПроцентАвтоматическойСкидки = (СтрокаТовара.СуммаСкидки / СуммаБезСкидки) * 100;
КонецЕсли;
Согласно методологии, заложенной в современные ERP-решения фирмы 1С, первичной в финансовом учете всегда является сумма операции в денежном выражении. Процент скидки в данном случае носит исключительно справочный характер. Программа гарантирует, что сумма скидки и сумма к оплате сойдутся до копейки, а «плывущий» процент является лишь следствием этой точности.
Тем не менее, на практике такое объяснение редко устраивает конечных клиентов, особенно торговые сети. Рассмотрим основные способы решения этой проблемы.
Если специфика вашего бизнеса или требования контрагентов не позволяют отправлять документы с дробными сотыми долями процентов, мы можем применить один из следующих подходов для исправления ситуации.
Поскольку в самой базе данных расчет копеек должен оставаться математически точным для корректного ведения взаиморасчетов и формирования деклараций по НДС, внутренние алгоритмы проведения документов лучше не изменять. Вместо этого мы можем скорректировать логику вывода информации на печать (в формы УПД, ТОРГ-12 или счет на оплату).
Рассмотрим два варианта доработки печатных форм:
Пример кода в процедуре вывода строки печатной формы, где мы принудительно приводим процент к целому числу:
// Вместо вывода точного значения из базы выполняем округление для печатной формы
ПроцентДляПечати = Округлить(ОбластьМакета.Параметры.ПроцентСкидки, 0);
ОбластьМакета.Параметры.ПроцентСкидкиТекст = Формат(ПроцентДляПечати, "ЧДЦ=0") + "%";
В современных конфигурациях 1С присутствует встроенный инструмент, позволяющий сглаживать копейки при расчете скидок. Мы можем настроить специальную автоматическую скидку с типом «Округление суммы документа».
Разберем по шагам, как правильно настроить этот механизм:
Скидки (наценки).Это позволит скорректировать копейки и избежать ситуации, когда на копеечных суммах обратный расчет уводит процент далеко от его номинального значения.
Если типовые настройки округления не подходят, а печатные формы изменять нельзя из-за требований EDI-провайдеров, мы можем использовать механизм внешних обработок для переопределения логики расчета скидок без снятия конфигурации с поддержки.
В современных версиях 1С разработчик может написать внешнюю обработку, которая подключается через механизм дополнительных отчетов и обработок и переопределяет расчет скидок:
Рассмотрим еще один организационно-технический метод решения. Иногда проблему «пляшущих» сотых долей процентов проще решить не программным кодом, а оптимизацией прайс-листа.
Если базовые цены номенклатуры будут кратны определенным величинам (например, 10 или 100 рублям), то применение стандартных процентов скидок (3%, 5%, 10%) всегда будет давать на выходе ровные суммы в копейках. Это исключит саму необходимость округления на первом шаге расчета, и, как следствие, обратный пересчет процента скидки всегда будет возвращать ровное исходное значение без сотых долей.