При работе в современных конфигурациях на базе 1С:Предприятие 8.3, таких как 1С:Управление торговлей 11.4, ERP 2.4 или Комплексная автоматизация 2, пользователи часто сталкиваются с неприятным эффектом: в печатных формах документов (ТОРГ-12, УПД, Счет на оплату) цена за единицу товара отображается с «некрасивыми» дробями или не сходится с ожиданиями на копейку. Это вызывает массу вопросов у бухгалтерии и контрагентов, особенно при экспортных операциях. В этой статье мы подробно разберем, почему это происходит и как с этим бороться.
Для начала проанализируем базовую логику, заложенную разработчиками в архитектуру УТ 11. В отличие от старых версий (например, УТ 10.3), где расчет зачастую шел по цепочке Цена * Количество = Сумма, современные системы используют принцип приоритета суммы. Рассмотрим ситуацию подробнее.
Когда вы назначаете скидку (процентную или суммовую) на весь документ или на конкретную строку, система в первую очередь фиксирует итоговую Сумму со скидкой. Итоговая цена в печатной форме (ПФ) при этом часто не извлекается напрямую из табличной части документа, а вычисляется «на лету» по формуле:
Цена в ПФ = Всего по строке / Количество
Если сумма со скидкой не делится нацело на количество, возникают бесконечные десятичные дроби. Алгоритм печати пытается их округлить, но визуально это выглядит как появление «скрытых» тысячных долей. Например, если 100 единиц товара со скидкой стоят 9 262,73 рубля, то расчетная цена за штуку составит 92,6273. В печатную форму попадет либо округленное значение 92,63, либо 92,627 — в зависимости от настроек макета, что сразу создает визуальное расхождение.
Выясним причину, почему проблема чаще всего обостряется при отгрузках в страны ЕАЭС (например, в Беларусь или Казахстан). Рассмотрим два фактора:
Проанализируем ситуацию, когда скидка применяется не к конкретной позиции, а к документу в целом. В этом случае 1С распределяет общую сумму скидки между строками пропорционально их стоимости. В ходе этого математического процесса во временных таблицах системы возникают числа с высокой точностью (до 10 знаков после запятой).
При записи данных в документ система принудительно округляет их до 2 знаков (стандарт денежного типа данных). Однако при этом накапливается так называемая «ошибка округления». Чтобы общая сумма документа сошлась с точностью до копейки, система может добавить или отнять эту «лишнюю» копейку в последней строке документа. Когда такая строка попадает в печатную форму, пересчет цены от итоговой суммы выдает некорректный результат.
Посмотрим на технический аспект: почему проблема может появиться внезапно после обновления. Начиная с версий платформы 8.3.15 и выше, были изменены внутренние механизмы работы с типом Число в запросах и при выводе в табличные документы. Изменение в библиотеке стандартных подсистем (БСП) может привести к тому, что метод округления сменится с арифметического на «бухгалтерское» (округление к ближайшему четному). Это приводит к тому, что копейка, которая раньше округлялась вниз, теперь округляется вверх, разрушая привычный визуальный баланс в печатных формах.
Рассмотрим по шагам, что можно предпринять для исправления ситуации в 1С:УТ 11.4.
Самый простой путь — проверить настройки печатных форм. В штатных ПФ 1С реализован механизм «обратного счета». Если в настройках системы не установлен флаг, отвечающий за вывод скидок отдельной колонкой, программа пытается показать в колонке «Цена» уже «чистую» цену за вычетом скидки.
Разберем, как это изменить: Нужно перейти в настройки оформления документов и попробовать включить отображение скидок. В этом случае в колонке «Цена» будет указана базовая цена (без скидки), которая обычно является «красивым» числом, а скидка будет выведена отдельно. Это снимает вопросы о дробных копейках в цене.
Если бизнес-процесс требует вывода именно итоговой цены, но без «мусора» в знаках после запятой, потребуется небольшая доработка. Мы можем создать расширение, которое изменит логику заполнения параметров печати.
Рассмотрим пример логики, которую следует внедрить в процедуру печати:
// Вместо вычисления цены как Сумма / Количество
// Будем брать цену напрямую из данных строки, если это возможно
ПараметрыПечати.Цена = СтрокаДокумента.Цена * (1 - СтрокаДокумента.ПроцентСкидкиНаценки / 100);
// Или принудительно округлять результат деления до 2 знаков
ПараметрыПечати.Цена = Окр(СтрокаДокумента.Сумма / СтрокаДокумента.Количество, 2);
Важно понимать, что принудительное округление цены до 2 знаков в ПФ может привести к тому, что Цена * Количество не будет равно итоговой сумме в строке. В этом случае бухгалтерски верным решением считается приоритет суммы, а цена в ПФ признается справочной величиной.
Проанализируем возможность предотвращения появления дробных копеек еще на этапе формирования документа. В 1С:УТ 11 существует функционал «Округление цен» и «Округление суммы документа».
Если настроить систему так, чтобы итоговая сумма строки со скидкой всегда была кратна количеству (что математически сложно, но достижимо для фиксированных объемов), проблема исчезнет сама собой.
Мы выяснили, что «непонятный» вывод цен — это не ошибка программы как таковая, а следствие математических расчетов при распределении скидок. Для минимизации таких ситуаций рекомендуется:
Помните, что согласно законодательству РФ и правилам бухгалтерского учета, первичным документом является именно сумма операции, а цена единицы товара в случае применения сложных систем скидок может быть расчетной величиной с точностью более двух знаков после запятой.