При разработке отчетов и печатных форм в среде «1С:Предприятие» программисты регулярно сталкиваются с необходимостью приведения числовых данных к единому стандарту. Крайне важно, чтобы все числа в колонках имели одинаковую разрядность дробной части. Например, если в финансовом отчете принято выводить два знака после запятой (копейки или центы), то числа должны выглядеть как 15,20, 100,50 или 0,00.
Однако стандартная функция форматирования при значении 0 часто преподносит неприятный сюрприз: вместо ожидаемого красивого нуля с дробной частью выводится либо пустая строка, либо просто одиночный ноль без дробной части. В этой статье мы подробно разберем, почему так происходит, рассмотрим неэффективные методы решения и изучим один простой, элегантный и методологически правильный способ форматирования нуля в 1С.
Давайте проанализируем стандартное поведение платформы. Если мы хотим вывести число с двумя знаками после запятой, первая мысль любого разработчика — использовать конструктор форматной строки и ограничить дробную часть параметром ЧДЦ=2 (Число Десятичных Знаков равное двум). Посмотрим на пример кода:
ЗначениеЧисла = 0;
РезультатВывода = Формат(ЗначениеЧисла, "ЧДЦ=2");
// В результате переменная РезультатВывода будет содержать пустую строку ""
Почему так произошло? Дело в том, что по умолчанию платформа 1С считает нулевые значения малоинформативными для печатных форм и отчетов, поэтому заменяет их пустой строкой. Чтобы исправить это поведение, разработчики начинают искать обходные пути.
Рассмотрим несколько популярных, но не совсем удачных решений, которые часто встречаются на практике и обсуждаются на форумах.
Вариант 1. Жесткое кодирование строки представления нуля ("ЧН=0.00")
Первое, что приходит на ум — использовать параметр форматной строки ЧН (Представление нуля), который принудительно заменяет нулевое значение указанным текстом:
РезультатВывода = Формат(0, "ЧДЦ=2; ЧН=0.00");
// Вернет строковое значение "0.00"
Кажется, что задача решена. Но давайте проанализируем ситуацию глубже. Данный подход обладает двумя критическими недостатками:
0,00), а в англоязычной — точка (0.00). Если вы жестко пропишете ЧН=0.00, то у русскоязычного пользователя обычные числа будут выводиться с запятой (например, 15,50), а нулевые значения — с точкой (0.00). Это нарушит единообразие печатной формы.ЧДЦ=3), вам придется не забыть вручную переписать параметр ЧН=0.000. Если мест использования формата в коде много, это неизбежно приведет к ошибкам и «хардкоду».Вариант 2. Написание собственных функций-обработчиков (процедур)
Некоторые разработчики предлагают написать вспомогательную функцию, которая будет принимать количество знаков и динамически собирать строку формата в цикле. Пример такой сложной конструкции:
Функция ПолучитьФорматЧисла(КоличествоЗнаков)
СтрокаНулей = "";
Для Ит = 1 По КоличествоЗнаков Цикл
СтрокаНулей = СтрокаНулей + "0";
КонецЦикла;
Возврат "ЧДЦ=" + КоличествоЗнаков + "; ЧН=0." + СтрокаНулей;
КонецФункции
Такой подход избыточен. Писать собственный код там, где можно обойтись штатными возможностями платформы — плохой тон в программировании 1С. Это усложняет чтение кода и увеличивает затраты на его поддержку.
Платформа «1С:Предприятие» имеет встроенный элегантный механизм для решения этой проблемы. Чтобы заставить систему обрабатывать ноль по общим правилам форматирования (с учетом заданной точности и региональных стандартов), достаточно просто объявить параметр ЧН= в форматной строке, оставив его значение пустым.
Давайте выясним, как это работает на практике. Посмотрим на следующий пример:
// Корректное универсальное форматирование нуля
Результат1 = Формат(0, "ЧДЦ=2; ЧН="); // Вернет "0,00" (для русской локали)
Результат2 = Формат(0, "ЧДЦ=3; ЧН="); // Вернет "0,000" (для русской локали)
Указывая ЧН= без какого-либо текста после знака равенства, мы даем платформе специальную инструкцию: «Не заменяй ноль пустой строкой, а обрабатывай его как обычное число». При этом к нулю автоматически применяются все остальные параметры форматирования:
ЧДЦ);ЧРГ);Рассмотрим практический сценарий формирования печатной формы, где данные выводятся в табличный документ. Мы хотим гарантировать, что все числовые показатели, включая нулевые остатки или обороты, будут выведены строго с двумя знаками после запятой:
ТабДок = Новый ТабличныйДокумент;
Макет = ПолучитьМакет("МакетПечати");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
Для Каждого СтрокаДанных Из РезультатЗапроса Цикл
// Заполняем параметры области макета
ОбластьСтрока.Параметры.Номенклатура = СтрокаДанных.Номенклатура;
// Применяем универсальный формат для вывода количества и суммы
ОбластьСтрока.Параметры.Количество = Формат(СтрокаДанных.Количество, "ЧЦ=15; ЧДЦ=3; ЧН=");
ОбластьСтрока.Параметры.Сумма = Формат(СтрокаДанных.Сумма, "ЧЦ=15; ЧДЦ=2; ЧН=");
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
В данном примере, даже если СтрокаДанных.Сумма будет равна нулю, в печатной форме пользователь увидит красивое и аккуратное значение 0,00, которое не будет выбиваться из общего числового столбца.
Важно помнить об одной технической особенности платформы. Описанный выше параметр ЧН (Представление нуля) отлично работает в функции Формат(), при выводе данных в табличные документы, отчеты СКД или текстовые макеты. Однако, если вы попытаетесь применить форматную строку с ЧН= к обычному Полю ввода числового типа на управляемой форме, результат может вас разочаровать.
На управляемых формах отображение нулевых значений в полях ввода регулируется другими механизмами:
Поэтому разделяйте форматирование данных для вывода (в печатных формах и отчетах) и форматирование данных для интерактивного редактирования пользователем на форме.
Используйте простое и надежное сочетание параметров ЧДЦ=...; ЧН= в своей повседневной разработке, чтобы ваш код оставался чистым, легко поддерживаемым и независимым от региональных настроек конечных пользователей.