В процессе разработки отчетов, печатных форм или интерфейсов в 1С часто возникает задача по аккуратному и читаемому отображению числовых данных. Стандартное форматирование не всегда подходит. Например, нам нужно, чтобы целые числа, такие как 15, выводились без дробной части, а не как "15,00", в то время как дробные числа, например 15,78924, должны быть округлены и представлены с двумя знаками после запятой, то есть как "15,79".
Рассмотрим два основных способа решения этой задачи: программный, с использованием встроенного языка 1С, и декларативный, через настройку условного оформления, который идеально подходит для отчетов в СКД и динамических списков.
Этот метод является наиболее гибким, так как позволяет полностью контролировать логику преобразования числа в строку в любом месте программного кода. Суть подхода заключается в проверке: является ли число целым. В зависимости от результата мы применяем ту или иную форматную строку.
Основная логика
Для проверки, имеет ли число значимую дробную часть, можно сравнить его с его же целой частью, полученной с помощью функции Цел().
15,0000 равно Цел(15,0000)), то считаем его целым и выводим без дробных знаков.15,789 не равно Цел(15,789)), значит, у него есть дробная часть, и мы форматируем его с двумя знаками после запятой.Посмотрим на пример кода:
Предположим, у нас есть переменная ИсходноеЧисло, которую нужно правильно отформатировать.
Процедура ПримерФорматирования(ИсходноеЧисло)
Перем Результат;
// Проверяем, является ли число целым
Если ИсходноеЧисло = Цел(ИсходноеЧисло) Тогда
// Если число целое, выводим его без дробной части.
// Параметр "ЧГ=0" отключает разделение групп разрядов (пробелы в тысячах).
Результат = Формат(ИсходноеЧисло, "ЧГ=0");
Иначе
// Если у числа есть дробная часть, выводим с двумя знаками.
// Функция Формат автоматически выполнит округление.
// Параметр "ЧДЦ=2" означает "Число Десятичных Знаков = 2".
Результат = Формат(ИсходноеЧисло, "ЧДЦ=2; ЧГ=0");
КонецЕсли;
Сообщить(Результат);
КонецПроцедуры
Разберем, как этот код обработает разные значения:
ИсходноеЧисло = 15.78924 условие 15.78924 = Цел(15.78924) (т.е. 15.78924 = 15) будет Ложь. Выполнится ветка Иначе, и Формат(15.78924, "ЧДЦ=2") вернет строку "15,79".ИсходноеЧисло = 15.000000 условие 15.0 = Цел(15.0) (т.е. 15 = 15) будет Истина. Выполнится первая ветка, и Формат(15, "ЧГ=0") вернет строку "15".ИсходноеЧисло = 15.7 условие 15.7 = Цел(15.7) (т.е. 15.7 = 15) будет Ложь. Функция Формат(15.7, "ЧДЦ=2") вернет строку "15,70", дополнив недостающий знак нулем.Важное замечание о точности. В некоторых случаях, из-за особенностей хранения чисел с плавающей запятой, число вроде 15.0000000001 может не считаться целым. Если по вашей бизнес-логике такие числа нужно считать целыми, можно немного усложнить проверку, предварительно округлив число до нужной точности:
// Более строгая проверка для чисел, которые могут иметь незначительные "хвосты"
Если Окр(ИсходноеЧисло, 2) = Цел(ИсходноеЧисло) Тогда
// Считаем число целым
Результат = Формат(ИсходноеЧисло, "ЧГ=0");
Иначе
// Считаем число дробным
Результат = Формат(ИсходноеЧисло, "ЧДЦ=2; ЧГ=0");
КонецЕсли;
Этот вариант сначала округляет число до 2 знаков, а потом сравнивает с целой частью. Например, для 15.001 результат Окр(15.001, 2) будет 15.00, что равно Цел(15.001), и число будет отформатировано как "15".
Если вам нужно применить такое форматирование в отчете на Системе Компоновки Данных (СКД), в динамическом списке или на форме, нет необходимости менять запросы или писать код. Для этого в платформе существует мощный механизм — условное оформление.
Рассмотрим настройку на примере отчета в СКД.
Разберем по шагам:
ЧДЦ=2.Цена).Цел(Цена).В итоге у вас получится условие вида: Цена <> Цел(Цена).
Цена).Как это работает?
При формировании отчета СКД для каждой строки будет проверять заданное условие. Если значение в поле Цена не равно своей целой части (т.е. число дробное), к ячейке применится указанный формат ЧДЦ=2. Если же число целое, условие не выполнится, и для ячейки будет использовано стандартное форматирование (которое для целых чисел не выводит нули после запятой).
Этот способ является предпочтительным для отчетов, так как он не требует программирования и легко настраивается даже в режиме пользователя.
Выбор между программным методом и условным оформлением зависит от вашей задачи:
Формат(), когда вам нужно получить строковое представление числа в коде модуля — например, для формирования текста печатной формы, для выгрузки в файл или для отображения в сообщении пользователю.Оба метода эффективно решают исходную задачу, позволяя сделать представление числовых данных в вашей системе более аккуратным и удобным для восприятия.