Как правильно отформатировать и вывести цену с копейками или без них в 1С

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

При формировании печатных форм, ценников или товарных накладных часто возникает задача отображения стоимости товара в удобном для покупателя виде. Например, вместо громоздкой конструкции вида «179 руб 65 к.» требуется вывести компактное значение «179,65 руб.», а если копейки отсутствуют (цена целочисленная), не отображать нулевую дробную часть вовсе (например, «180 руб.» вместо «180,00 руб.»).

Разберем типичные ошибки при решении этой задачи через строковые функции и рассмотрим правильные методы форматирования чисел в платформе 1С:Предприятие.

Почему строковые манипуляции приводят к ошибкам

Посмотрим на пример попытки ручной сборки строки через функции работы с подстроками:


Обл.Параметры.ЦенаСтрокой = "" + Цел(Стр.ЦенаРозн) + "," + ?(СтрДлина(СтрЗаменить(Остаток, "0,", "")) = 1, СтрЗаменить(Остаток, "0,", "") + "0", СтрЗаменить(Остаток, "0,", "")) + " руб";

Проанализируем, почему такой подход считается неоптимальным и опасным:

  1. Зависимость от региональных настроек: строковое представление числа может использовать как точку, так и запятую в качестве разделителя дробной части. Замена "0," перестанет работать, если на сервере или клиенте разделителем установлена точка.
  2. Ошибки с ведущими нулями: если копейки равны 0.05, поиск и замена могут превратить значение в 5, что приведет к неверному результату «50» копеек вместо «05».
  3. Погрешность вычислений с плавающей точкой: при вычитании целой части из дробной может возникнуть машинная погрешность (например, 0.9999999999 вместо 1.0).

Способ 1. Использование встроенной функции Формат с проверкой кратности

Рассмотрим универсальный и надежный вариант с использованием платформенной функции Формат(). Выясним, как динамически менять форматную строку в зависимости от наличия дробной части:


// Округляем цену до 2 знаков для исключения вычислительной погрешности
Цена = Окр(Стр.ЦенаРозн, 2);

// Если цена целая — выводим без знаков после запятой, иначе — с 2 знаками
ФорматнаяСтрока = ?(Цена = Цел(Цена), "ЧДЦ=0; ЧГ=0; ЧРД=,", "ЧДЦ=2; ЧГ=0; ЧРД=,");

Обл.Параметры.ЦенаСтрокой = Формат(Цена, ФорматнаяСтрока) + " руб.";

Разберем параметры форматной строки:

  1. ЧДЦ (Число дробной цифровой части) — определяет количество знаков после запятой. Значение ЧДЦ=0 полностью отсекает вывод копеек, а ЧДЦ=2 фиксирует два знака.
  2. ЧГ=0 (Группировка) — отключает пробелы между тысячами, если в них нет необходимости.
  3. ЧРД=, (Символ-разделитель дробной части) — принудительно задает запятую вне зависимости от региональных настроек операционной системы.

Способ 2. Форматирование через СтрШаблон

Посмотрим на более лаконичный вариант записи с применением функции СтрШаблон(), доступной начиная с платформы 8.3.6. Данный подход позволяет избежать множественной конкатенации строк и делает код читаемым:


Цена = Окр(Стр.ЦенаРозн, 2);
ФорматЧисла = ?(Цена % 1 = 0, "ЧДЦ=0; ЧГ=0; ЧРД=,", "ЧДЦ=2; ЧГ=0; ЧРД=,");

Обл.Параметры.ЦенаСтрокой = СтрШаблон("%1 руб.", Формат(Цена, ФорматЧисла));

В этом примере условие Цена % 1 = 0 выполняет проверку остатка от деления на единицу, что позволяет точно определить наличие копеек.

Способ 3. Динамическая настройка формата ячейки макета

Если ячейка в макете табличного документа объявлена как параметр числового типа, строковое объединение можно перенести на уровень свойств области макета. Разберем по шагам, как это реализовать:

  1. В макете ячейке присваиваем имя параметра (например, Цена).
  2. В программном коде перед выводом строки или области задаем формат конкретной ячейки:

// Передаем числовое значение
Обл.Параметры.Цена = Стр.ЦенаРозн;

// Управляем отображением ячейки в области макета
ЯчейкаЦены = Обл.Область("Цена");
ЯчейкаЦены.Формат = ?(Стр.ЦенаРозн = Цел(Стр.ЦенаРозн), "ЧДЦ=0; ЧГ=0; ЧРД=,", "ЧДЦ=2; ЧГ=0; ЧРД=,");

Важно: для корректного отображения суффикса «руб.» в самом макете ячейку можно настроить как Шаблон со значением [Цена] руб., передавая в код только числовое значение.

← На главную