При формировании печатных форм, ценников или товарных накладных часто возникает задача отображения стоимости товара в удобном для покупателя виде. Например, вместо громоздкой конструкции вида «179 руб 65 к.» требуется вывести компактное значение «179,65 руб.», а если копейки отсутствуют (цена целочисленная), не отображать нулевую дробную часть вовсе (например, «180 руб.» вместо «180,00 руб.»).
Разберем типичные ошибки при решении этой задачи через строковые функции и рассмотрим правильные методы форматирования чисел в платформе 1С:Предприятие.
Посмотрим на пример попытки ручной сборки строки через функции работы с подстроками:
Обл.Параметры.ЦенаСтрокой = "" + Цел(Стр.ЦенаРозн) + "," + ?(СтрДлина(СтрЗаменить(Остаток, "0,", "")) = 1, СтрЗаменить(Остаток, "0,", "") + "0", СтрЗаменить(Остаток, "0,", "")) + " руб";
Проанализируем, почему такой подход считается неоптимальным и опасным:
"0," перестанет работать, если на сервере или клиенте разделителем установлена точка.0.05, поиск и замена могут превратить значение в 5, что приведет к неверному результату «50» копеек вместо «05».0.9999999999 вместо 1.0).Рассмотрим универсальный и надежный вариант с использованием платформенной функции Формат(). Выясним, как динамически менять форматную строку в зависимости от наличия дробной части:
// Округляем цену до 2 знаков для исключения вычислительной погрешности
Цена = Окр(Стр.ЦенаРозн, 2);
// Если цена целая — выводим без знаков после запятой, иначе — с 2 знаками
ФорматнаяСтрока = ?(Цена = Цел(Цена), "ЧДЦ=0; ЧГ=0; ЧРД=,", "ЧДЦ=2; ЧГ=0; ЧРД=,");
Обл.Параметры.ЦенаСтрокой = Формат(Цена, ФорматнаяСтрока) + " руб.";
Разберем параметры форматной строки:
ЧДЦ (Число дробной цифровой части) — определяет количество знаков после запятой. Значение ЧДЦ=0 полностью отсекает вывод копеек, а ЧДЦ=2 фиксирует два знака.ЧГ=0 (Группировка) — отключает пробелы между тысячами, если в них нет необходимости.ЧРД=, (Символ-разделитель дробной части) — принудительно задает запятую вне зависимости от региональных настроек операционной системы.Посмотрим на более лаконичный вариант записи с применением функции СтрШаблон(), доступной начиная с платформы 8.3.6. Данный подход позволяет избежать множественной конкатенации строк и делает код читаемым:
Цена = Окр(Стр.ЦенаРозн, 2);
ФорматЧисла = ?(Цена % 1 = 0, "ЧДЦ=0; ЧГ=0; ЧРД=,", "ЧДЦ=2; ЧГ=0; ЧРД=,");
Обл.Параметры.ЦенаСтрокой = СтрШаблон("%1 руб.", Формат(Цена, ФорматЧисла));
В этом примере условие Цена % 1 = 0 выполняет проверку остатка от деления на единицу, что позволяет точно определить наличие копеек.
Если ячейка в макете табличного документа объявлена как параметр числового типа, строковое объединение можно перенести на уровень свойств области макета. Разберем по шагам, как это реализовать:
Цена).
// Передаем числовое значение
Обл.Параметры.Цена = Стр.ЦенаРозн;
// Управляем отображением ячейки в области макета
ЯчейкаЦены = Обл.Область("Цена");
ЯчейкаЦены.Формат = ?(Стр.ЦенаРозн = Цел(Стр.ЦенаРозн), "ЧДЦ=0; ЧГ=0; ЧРД=,", "ЧДЦ=2; ЧГ=0; ЧРД=,");
Важно: для корректного отображения суффикса «руб.» в самом макете ячейку можно настроить как Шаблон со значением [Цена] руб., передавая в код только числовое значение.