При работе в программе 1С:Управление торговлей 11 (особенно в релизах ветки 11.4.5 и первых сборках 11.4.6, таких как 11.4.6.174 или 11.4.6.188) пользователи и администраторы часто сталкиваются с крайне неприятной проблемой: перестает работать автоматическое округление цен. Вы задаете правила округления в карточке вида цен (например, округлять до целого рубля), но при расчете в документе «Установка цен номенклатуры» система упорно выводит копейки. Зависимые цены рассчитываются с дробной частью, а ручные манипуляции не приносят желаемого результата.
В этой статье мы подробно разберем, почему возникает эта ошибка, проанализируем внутренние механизмы платформы и предложим несколько эффективных способов решения проблемы — от простых пользовательских обходных путей до кардинального исправления в кодовой базе.
Давайте проанализируем ситуацию и заглянем «под капот» системы. Проблема кроется в обновленном механизме ценообразования, который разработчики фирмы «1С» внедрили в указанных релизах. При расчете цен, которые зависят от других видов цен (рассчитываются по наценке или по базовой формуле), программа выполняет расчет на стороне сервера.
В процессе выполнения серверных процедур в общих модулях ценообразования (таких как Ценообразование, ЦенообразованиеСервер) была допущена ошибка: функция округления для рассчитанных по формулам цен либо вызывается некорректно, либо полностью игнорируется. В результате система записывает в базу данных неокругленные значения с копейками. При этом для базовых (задаваемых вручную) цен округление продолжает работать штатно, так как они обрабатываются по другим алгоритмам.
Один из самых надежных и простых способов обойти эту ошибку без программирования и изменения конфигурации — изменить способ расчета цен. Вместо стандартного варианта «Наценка на другой вид цен» мы переведем расчет в режим работы с произвольными формулами.
Рассмотрим по шагам, как это сделать:
ЦенаБазовая * 1.15), мы принудительно заставим систему округлить результат математическим путем с помощью встроенных функций.Давайте разберем пример формулы. Если нам нужно округлить цену до целого рубля, мы можем использовать математические операторы и функции округления, поддерживаемые языком формул 1С. Пример такой конструкции:
// Округляем базовую цену с наценкой 15% до целого числа
Окр(ЦенаБазовая * 1.15, 0, РежимОкругления.Окр15как20)
Использование встроенного в формулы механизма округления позволяет обойти сломавшийся общий модуль постобработки цен, так как система получит на входе уже готовое округленное число.
Если у вас уже создан документ «Установка цен номенклатуры» и цены в нем рассчитались с копейками, существует быстрый способ заставить систему применить правила округления принудительно.
Проанализируем этот алгоритм:
0.Почему этот способ работает? При вызове команды изменения цен на процент (даже если этот процент равен нулю) система запускает альтернативную ветку кода в обработчике табличной части. Этот обработчик принудительно обращается к правилам округления, заданным для каждого вида цен, и перезаписывает значения в табличной части уже в округленном виде. Это отличный временный «костыль», который позволяет быстро провести документ с правильными ценами без изменения кода конфигурации.
Для программистов и системных администраторов, которые хотят решить проблему раз и навсегда для всех пользователей без изменения основной конфигурации, лучшим выбором будет использование расширения.
Суть данного метода заключается в перехвате процедуры расчета цен. Нам потребуется доработать общий модуль, отвечающий за расчет цен по формулам. Рассмотрим пример кода, который можно внедрить через расширение в процедуру расчета цен перед их записью в документ:
&После("РассчитатьЦеныПоФормулам")
Процедура Расш_РассчитатьЦеныПоФормулам(ТаблицаЦен, ПравилаРасчета)
Для Каждого СтрокаЦены Из ТаблицаЦен Цикл
// Проверяем наличие правил округления для текущего вида цены
ПравилоОкругления = ПолучитьПравилоОкругления(СтрокаЦены.ВидЦены);
Если ПравилоОкругления <> Неопределено Тогда
// Принудительно применяем округление
СтрокаЦены.Цена = ЦенообразованиеКлиентСервер.ОкруглитьЦену(СтрокаЦены.Цена, ПравилоОкругления);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Использование директивы &После или &Вместо позволяет скорректировать поведение системы и гарантировать, что все цены, прошедшие через расчет по формулам, будут корректно обработаны функциями округления непосредственно перед выводом пользователю.
Важно понимать, что описанная проблема является официально зарегистрированным багом конфигурации «1С:Управление торговлей 11». Фирма «1С» признала ошибку автоматического округления цен при расчете зависимых тарифов и исправила ее в последующих накопительных пакетах обновлений.
Если вы хотите избавиться от проблемы навсегда без использования сторонних расширений и изменения формул, рекомендуем выполнить следующие действия:
Иногда округление не срабатывает из-за банальной ошибки в настройках, которую часто путают с программным багом. Давайте разберем этот момент подробнее.
При настройке округления по диапазонам (когда для разных интервалов цен задаются свои правила округления) система жестко привязывается к валюте. Если в правилах округления указана валюта USD (доллары), а сам вид цены рассчитывается в RUB (рубли), то правила округления по диапазонам просто не будут применены. Программа не сможет сопоставить диапазоны цен и оставит копейки без изменений.
Что нужно проверить:
Подводя итог, можно сказать, что проблема неработающего округления в УТ 11 решается несколькими путями в зависимости от ваших возможностей. Если нужно решить проблему «здесь и сейчас» без программирования — используйте групповое изменение на 0% или перейдите на произвольные формулы. Если есть ресурсы на администрирование — установите специализированное расширение или обновите систему до стабильного релиза 11.4.6.207+.