Почему не работает округление при расчете цен в 1С:Управлении торговлей 11 и как это исправить?

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

При работе в программе 1С:Управление торговлей 11 (особенно в релизах ветки 11.4.5 и первых сборках 11.4.6, таких как 11.4.6.174 или 11.4.6.188) пользователи и администраторы часто сталкиваются с крайне неприятной проблемой: перестает работать автоматическое округление цен. Вы задаете правила округления в карточке вида цен (например, округлять до целого рубля), но при расчете в документе «Установка цен номенклатуры» система упорно выводит копейки. Зависимые цены рассчитываются с дробной частью, а ручные манипуляции не приносят желаемого результата.

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

Выясняем причину ошибки (Почему ломается округление?)

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

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

Решение 1. Обход проблемы через произвольные формулы расчета

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

Рассмотрим по шагам, как это сделать:

  1. Перейдем в раздел CRM и маркетинг — Настройки и справочники — Виды цен.
  2. Откроем карточку проблемного (зависимого) вида цены.
  3. В поле «Способ задания цены» установим переключатель в положение «Произвольная формула от других видов цен».
  4. Нажмем на ссылку для редактирования формулы. Перед нами откроется конструктор формул.
  5. Вместо простого указания базовой цены и процента наценки (например, ЦенаБазовая * 1.15), мы принудительно заставим систему округлить результат математическим путем с помощью встроенных функций.

Давайте разберем пример формулы. Если нам нужно округлить цену до целого рубля, мы можем использовать математические операторы и функции округления, поддерживаемые языком формул 1С. Пример такой конструкции:


// Округляем базовую цену с наценкой 15% до целого числа
Окр(ЦенаБазовая * 1.15, 0, РежимОкругления.Окр15как20)

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

Решение 2. Обходной путь через групповое изменение цен

Если у вас уже создан документ «Установка цен номенклатуры» и цены в нем рассчитались с копейками, существует быстрый способ заставить систему применить правила округления принудительно.

Проанализируем этот алгоритм:

  1. Откроем документ Установка цен номенклатуры, в котором цены рассчитались некорректно.
  2. На панели инструментов табличной части нажмем кнопку Изменить цены и выберем пункт Изменение на процент.
  3. В открывшемся окне установим значение процента равным 0.
  4. Нажмем кнопку Выполнить (или Рассчитать).

Почему этот способ работает? При вызове команды изменения цен на процент (даже если этот процент равен нулю) система запускает альтернативную ветку кода в обработчике табличной части. Этот обработчик принудительно обращается к правилам округления, заданным для каждого вида цен, и перезаписывает значения в табличной части уже в округленном виде. Это отличный временный «костыль», который позволяет быстро провести документ с правильными ценами без изменения кода конфигурации.

Решение 3. Использование расширения конфигурации

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

Суть данного метода заключается в перехвате процедуры расчета цен. Нам потребуется доработать общий модуль, отвечающий за расчет цен по формулам. Рассмотрим пример кода, который можно внедрить через расширение в процедуру расчета цен перед их записью в документ:


&После("РассчитатьЦеныПоФормулам")
Процедура Расш_РассчитатьЦеныПоФормулам(ТаблицаЦен, ПравилаРасчета)
    Для Каждого СтрокаЦены Из ТаблицаЦен Цикл
        // Проверяем наличие правил округления для текущего вида цены
        ПравилоОкругления = ПолучитьПравилоОкругления(СтрокаЦены.ВидЦены);
        Если ПравилоОкругления <> Неопределено Тогда
            // Принудительно применяем округление
            СтрокаЦены.Цена = ЦенообразованиеКлиентСервер.ОкруглитьЦену(СтрокаЦены.Цена, ПравилоОкругления);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

Решение 4. Кардинальное исправление — обновление конфигурации

Важно понимать, что описанная проблема является официально зарегистрированным багом конфигурации «1С:Управление торговлей 11». Фирма «1С» признала ошибку автоматического округления цен при расчете зависимых тарифов и исправила ее в последующих накопительных пакетах обновлений.

Если вы хотите избавиться от проблемы навсегда без использования сторонних расширений и изменения формул, рекомендуем выполнить следующие действия:

  1. Проверьте текущий релиз вашей конфигурации. Ошибка наиболее активно проявляется на сборках 11.4.6.174 и 11.4.6.188.
  2. Запланируйте обновление конфигурации до более стабильного релиза. Баг был полностью устранен в релизах ветки 11.4.6, начиная с версии 11.4.6.207 и выше.
  3. Если у вас есть возможность, обновитесь до более актуальной ветки конфигурации, например 11.4.7 или современной 11.5, где механизмы ценообразования работают стабильно и оптимизированы для высоких нагрузок.

Дополнительная проверка соответствия валют

Иногда округление не срабатывает из-за банальной ошибки в настройках, которую часто путают с программным багом. Давайте разберем этот момент подробнее.

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

Что нужно проверить:

Подводя итог, можно сказать, что проблема неработающего округления в УТ 11 решается несколькими путями в зависимости от ваших возможностей. Если нужно решить проблему «здесь и сейчас» без программирования — используйте групповое изменение на 0% или перейдите на произвольные формулы. Если есть ресурсы на администрирование — установите специализированное расширение или обновите систему до стабильного релиза 11.4.6.207+.

← На главную