При работе в среде «1С:Предприятие 8» разработчики часто сталкиваются с эстетической проблемой отображения числовых данных. Если для реквизита в метаданных определена фиксированная точность (например, тип Число(15, 3)), то платформа по умолчанию будет выводить все три знака после запятой. В результате число 2.5 превращается в 2,500, а целое число 2 отображается как 2,000.
Такой вывод перегружает интерфейс, усложняет чтение динамических списков, документов и отчетов. В этой статье мы подробно разберем, почему возникает эта проблема, почему стандартные форматные строки не всегда помогают, и рассмотрим три надежных способа скрыть лишние нули в дробной части в зависимости от контекста задачи.
В платформе 1С свойства отображения полей ввода, ячеек таблиц и колонок списков тесно связаны с типами данных самих реквизитов. Если в метаданных жестко прописана точность 3, поле формы автоматически наследует это свойство. Попытка просто очистить форматную строку или установить ее в значение по умолчанию не принесет желаемого результата — платформа продолжит дополнять дробную часть нулями до указанной в метаданных точности.
Также важно предостеречься от неверных советов, которые встречаются на форумах. Например, использование форматной строки вида ЧГ=3,0 не имеет никакого отношения к дробной части. Параметр ЧГ (группировка гупп) отвечает исключительно за разделение разрядов в целой части числа (например, разделение пробелом тысяч и миллионов). На незначащие нули после запятой этот параметр никак не влияет.
Давайте разберем по шагам три проверенных метода, которые гарантированно решают проблему «лишних» нулей.
Если вам необходимо убрать незначащие нули в управляемой форме — например, в динамическом списке справочника, документа или в обычной табличной части — наиболее правильным и стандартным подходом является использование механизма Условного оформления.
Этот метод хорош тем, что он декларативный, не требует написания сложного кода в модулях и работает на уровне платформы. Суть метода заключается в создании нескольких правил оформления, которые динамически меняют формат вывода числа в зависимости от его значения.
Разберем детально настройку правил условного оформления для числа с точностью до 3 знаков:
Нам нужно определить, является ли число целым. Математически это означает, что остаток от деления числа на 1 равен нулю.
Условие: [ИмяРеквизита] % 1 = 0
Оформление: Формат = ЧДЦ=0 (выводить 0 знаков после запятой). Число 2.000 отобразится как 2.
Здесь нам нужно отловить числа вида 2.500. Если мы умножим такое число на 10, оно станет целым (25), но само по себе оно целым не является.
Условие: ([ИмяРеквизита] * 10) % 1 = 0 И [ИмяРеквизита] % 1 <> 0
Оформление: Формат = ЧДЦ=1 (выводить один знак после запятой). Число 2.500 отобразится как 2,5.
Аналогично определяем числа вида 2.560.
Условие: ([ИмяРеквизита] * 100) % 1 = 0 И ([ИмяРеквизита] * 10) % 1 <> 0
Оформление: Формат = ЧДЦ=2. Число 2.560 превратится в аккуратное 2,56.
Если число не подошло ни под одно из условий (например, 2.567), то условное оформление не применяется, и платформа выведет число со стандартным форматом ЧДЦ=3.
Этот способ можно настроить как интерактивно в конфигураторе (в свойствах формы на вкладке «Условное оформление»), так и программно при создании формы на сервере. Для автоматического формирования программного кода по интерактивным настройкам подойдёт обработка для декомпиляции условного оформления формы.
Если вы разрабатываете отчет на схеме компоновки данных (СКД) или настраиваете сложный динамический список с произвольным запросом, то условное оформление можно заменить более изящным решением — настройкой Выражения представления для конкретного поля компоновки.
В схеме компоновки данных у каждого поля на вкладке «Наборы данных» есть колонка «Выражение представления». Мы можем написать туда логическое условие на языке выражений СКД, которое будет на лету форматировать число.
Давайте посмотрим на пример такого выражения:
Выбор
Когда ИмяПоля % 1 = 0 Тогда Формат(ИмяПоля, "ЧДЦ=0")
Когда (ИмяПоля * 10) % 1 = 0 Тогда Формат(ИмяПоля, "ЧДЦ=1")
Когда (ИмяПоля * 100) % 1 = 0 Тогда Формат(ИмяПоля, "ЧДЦ=2")
Иначе Формат(ИмяПоля, "ЧДЦ=3")
Конец
Платформа автоматически применит данную логику при выводе отчета пользователю. При этом само значение поля в группировках и математических расчетах останется числовым, а изменится исключительно его визуальное текстовое представление в ячейках отчета.
Бывают ситуации, когда число необходимо преобразовать в строку без лишних нулей программно — например, для отправки в текстовый файл, выгрузки в формате XML/JSON или для вывода в макет печатной формы (в тех случаях, когда стандартный формат ячейки макета переопределяется программно).
Разработчики-новички часто пытаются решить эту задачу «в лоб», используя простую замену символов через функцию СтрЗаменить(СтрокаЧисла, "0", ""). Внимание: это крайне опасный подход! Такая замена удалит абсолютно все нули в числе, превратив 10,05 в совершенно искаженное 1,5, а круглое число 100 преобразует в единицу.
Чтобы безопасно удалить нули исключительно с правого конца дробной части числа, необходимо использовать алгоритм посимвольной обработки строки справа налево. Давайте проанализируем пример функции, которую можно разместить в любом общем модуле:
Функция ФорматироватьБезНезначащихНулей(Значение) Экспорт
// Сначала преобразуем число к строке с максимальной точностью без разделения групп
Стр = Формат(Значение, "ЧДЦ=3; ЧГ=0");
// Проверяем, содержит ли строка разделитель дробной части (запятую)
Если СтрНайти(Стр, ",") > 0 Тогда
// В цикле отсекаем нули с правого края строки
Пока Прав(Стр, 1) = "0" Цикл
Стр = Лев(Стр, СтрДлина(Стр) - 1);
КонецЦикла;
// Если после удаления всех нулей на конце осталась запятая — удаляем и её
Если Прав(Стр, 1) = "," Тогда
Стр = Лев(Стр, СтрДлина(Стр) - 1);
КонецЕсли;
КонецЕсли;
Возврат Стр;
КонецФункции
Давайте разберем работу этой функции на конкретных примерах:
Если на вход подано число 2.500:
Формат() возвращает строку "2,500".СтрНайти(Стр, ",") возвращает истину, так как запятая присутствует в строке.Пока. Функция Прав("2,500", 1) возвращает "0". Строка сокращается до "2,50"."0". Строка сокращается до "2,5"."5". Цикл завершается."5", строка возвращается в неизменном виде: "2,5".Если на вход подано целое число 2.000:
"2,000"."2,"."," на конце и отсечет его. Функция вернет чистую строку "2".Используя предложенные методы, вы сможете добиться идеального и лаконичного отображения числовых показателей в любых прикладных решениях на базе платформы «1С:Предприятие 8».