Как отобразить число в 1С: без лишних нулей для целых и с заданной точностью для дробных?

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

При работе с числами в системе 1С:Предприятие мы часто сталкиваемся с необходимостью их форматирования. Одна из распространенных задач — это отображение целых чисел без дробной части (например, "10" вместо "10,0" или "10,00"), при этом для дробных чисел требуется сохранять заданную точность (например, "10,50" или "10,57"). Эта задача может показаться простой на первый взгляд, но стандартные методы форматирования в 1С имеют свои особенности, которые мы сейчас подробно разберем и найдем оптимальные решения.

Давайте выясним, почему возникают сложности и как мы можем настроить вывод чисел так, чтобы они соответствовали нашим требованиям. Мы рассмотрим как стандартные параметры форматирования, так и более гибкие программные подходы, которые позволят нам добиться желаемого результата.

Понимание стандартных параметров форматирования в 1С

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

Рассмотрим ключевые параметры форматной строки, которые влияют на отображение чисел:

  1. ЧДЦ (Число Десятичных Цифр): Этот параметр указывает, сколько десятичных разрядов должно быть в дробной части числа. Если мы указываем ЧДЦ=2, это означает, что число всегда будет отображаться с двумя знаками после запятой, даже если оно целое. Например, Формат(10, "ЧДЦ=2") выдаст "10,00". А Формат(10.567, "ЧДЦ=2") округлит и выдаст "10,57". Здесь мы видим, что ЧДЦ всегда добавляет нули, если дробная часть отсутствует или короче указанного числа знаков. Это именно та причина, по которой у нас появляется "10,0" вместо желаемого "10".
  2. ЧЦ (Общая Ширина Числа): Этот параметр задает максимальную общую длину числа, включая целую и дробную части, а также разделитель. Если указанная ширина меньше полученного числа, она динамически расширяется, чтобы вместить все знаки. Однако, если мы указываем общую ширину, которая не соответствует реальным требованиям к числу (например, для числа "125" указываем ЧЦ=2), это может привести к некорректному отображению или округлению, например, "99" (в старых версиях или при некорректном использовании). Обычно мы редко строго ограничиваем общую ширину, позволяя ей быть динамической.
  3. ЧГ (Группировка Разрядов): Этот параметр позволяет нам задать правила группировки разрядов в целой части числа, обычно для удобства чтения больших чисел (например, "1 000 000" вместо "1000000"). Мы можем использовать ЧГ=Истина для включения группировки или ЧГ=0 для ее отключения.
  4. ЧВФ (Выводить Ведущие Нули): Этот параметр указывает, нужно ли добавлять ведущие нули для целой части числа, чтобы достичь заданной ширины. Это полезно, например, для формирования номеров документов фиксированной длины (например, "00123").

Как мы видим, параметр ЧДЦ является корнем нашей проблемы с "лишними" нулями. Он обязывает систему выводить указанное количество десятичных знаков, даже если число является целым.

Проблема с незначимыми нулями: почему '10.0' вместо '10'?

Вопрос, который мы пытаемся решить, прозвучал так: "Нужно, чтобы максимальное количество было 3, точность 2. При этом если вводить, например, 10, должно отображаться 10. А у меня выводит 10.0. Как убрать этот ноль после запятой?".

Давайте проанализируем ситуацию. Требование "точность 2" для дробных чисел означает, что для числа 9.99 мы должны увидеть "9,99", а для 10.5 — "10,50". Но для числа 10 мы хотим видеть "10", а не "10,00". Стандартный формат "ЧДЦ=2" не может этого обеспечить, поскольку он будет выводить "10,00".

В некотором смысле, требование "максимальное количество 3" и "точность 2" при одновременном желании увидеть "10" может быть слегка противоречивым, если "максимальное количество 3" подразумевает общую ширину числа. Например, если общая ширина числа 3 и точность 2, то максимальное число, которое мы можем отобразить, будет "9,99". Число "10" уже имеет два знака в целой части, что с точностью 2 займет минимум 5 позиций ("10,00"). Однако, если "максимальное количество 3" относится только к целой части, то "999,99" было бы максимумом. Мы будем исходить из того, что основное требование — это динамическое удаление дробной части для целых чисел при сохранении точности для дробных, а параметры длины при этом будут гибкими.

Таким образом, для достижения желаемого результата нам потребуется более гибкий подход, который будет динамически определять, является ли число целым, и применять соответствующее форматирование.

Комплексные подходы к динамическому форматированию чисел

Для решения нашей задачи мы можем использовать несколько подходов, в зависимости от места, где нам требуется форматирование (в коде, в отчете СКД или в форме):

  1. Программная проверка на целостность числа (наиболее гибкий подход)

    Этот метод является самым надежным и гибким, так как позволяет нам полностью контролировать логику форматирования. Мы будем проверять, является ли число целым, и в зависимости от этого применять разные форматные строки.

    Рассмотрим по шагам, как мы можем реализовать это в коде 1С:

    1. Определяем функцию для форматирования: Мы можем создать общую функцию, которую будем использовать для всех наших чисел. Это сделает наш код более чистым и поддерживаемым.
    2. Проверяем, является ли число целым: Для этого мы можем сравнить исходное число с его целой частью. Если число равно своей целой части, значит, оно целое.
    3. Применяем условное форматирование:
      • Если число целое, форматируем его без десятичных знаков. Мы можем использовать пустую форматную строку или "ЧДЦ=0".
      • Если число дробное, форматируем его с требуемой точностью (например, 2 знака после запятой).

    Давайте посмотрим на пример такой функции на языке 1С:

    
    Функция ФорматироватьЧислоДинамически(ЗначениеЧисла, ТочностьДробнойЧасти = 2) Экспорт
        Если ТипЗнч(ЗначениеЧисла) <> Тип("Число") Тогда
            Возврат Строка(ЗначениеЧисла); // Возвращаем как есть, если это не число
        КонецЕсли;
    
        // Проверяем, является ли число целым
        Если ЗначениеЧисла = Цел(ЗначениеЧисла) Тогда
            // Если число целое, форматируем без дробной части
            // Используем "ЧГ=" для отключения группировки, если не нужна
            Возврат Формат(ЗначениеЧисла, "ЧДЦ=0; ЧГ=0"); 
        Иначе
            // Если число дробное, форматируем с заданной точностью
            Перем ФорматнаяСтрока;
            ФорматнаяСтрока = "ЧДЦ=" + ТочностьДробнойЧасти + "; ЧГ=0";
            Возврат Формат(ЗначениеЧисла, ФорматнаяСтрока);
        КонецЕсли;
    КонецФункции
    
    // Примеры использования:
    // ПеременнаяЧисло1 = 10;
    // Сообщить(ФорматироватьЧислоДинамически(ПеременнаяЧисло1)); // Выведет "10"
    
    // ПеременнаяЧисло2 = 10.0;
    // Сообщить(ФорматироватьЧислоДинамически(ПеременнаяЧисло2)); // Выведет "10"
    
    // ПеременнаяЧисло3 = 10.5;
    // Сообщить(ФорматироватьЧислоДинамически(ПеременнаяЧисло3)); // Выведет "10,50"
    
    // ПеременнаяЧисло4 = 10.567;
    // Сообщить(ФорматироватьЧислоДинамически(ПеременнаяЧисло4)); // Выведет "10,57"
    
    // ПеременнаяЧисло5 = 9.99;
    // Сообщить(ФорматироватьЧислоДинамически(ПеременнаяЧисло5)); // Выведет "9,99"
    

    Обратите внимание, что в форматной строке мы также добавили ЧГ=0, чтобы отключить группировку разрядов, если она не нужна. Это универсальное решение, которое позволит нам контролировать форматирование в любом месте кода.

  2. Условное оформление в отчетах СКД

    Если мы работаем с отчетами, построенными на Системе Компоновки Данных (СКД), мы можем использовать механизм условного оформления. Этот подход позволяет нам задать разные форматы для поля в зависимости от определенного условия. Мы можем задать условие, если число целое, то форматировать его без дробной части, а если дробное – с двумя знаками после запятой.

    Давайте разберем по шагам, как это сделать в СКД:

    1. Откройте настройки СКД: В режиме настройки отчета перейдите на вкладку "Настройки" и затем в раздел "Условное оформление".
    2. Создайте новый элемент условного оформления: Нажмите кнопку "Добавить" для создания нового правила.
    3. Задайте условие для целых чисел: В поле "Условие" мы можем использовать выражение, которое проверяет, является ли значение поля целым. Например, Цел(ПолеСЧислом) = ПолеСЧислом. Здесь ПолеСЧислом — это наше числовое поле, которое мы хотим форматировать.
    4. Укажите формат для целых чисел: В разделе "Оформление" для этого условия выберите "Формат" и установите форматную строку, например, "ЧДЦ=0" или просто удалите все параметры, связанные с дробной частью.
    5. Создайте второе правило для дробных чисел: Это правило будет применяться ко всем числам, которые не попадают под первое условие (то есть к дробным числам). В этом случае, условие не задаем, или задаем обратное условие Не(Цел(ПолеСЧислом) = ПолеСЧислом) (хотя обычно достаточно одного условия и общего формата).
    6. Укажите формат для дробных чисел: В разделе "Оформление" для второго правила (или в общих настройках поля, если первое правило переопределяет его для целых) установите форматную строку с необходимой точностью, например, "ЧДЦ=2".

    Таким образом, мы добиваемся того, что для целых чисел дробная часть не выводится, а для дробных чисел она отображается с заданной точностью. Этот подход особенно удобен, когда мы не хотим вмешиваться в код запроса или программный модуль.

  3. Использование выражений в запросах СКД (с ограничениями)

    В СКД также можно использовать выражения прямо в запросе для форматирования чисел. Например, для того чтобы вывести целое число без дробной части, а дробное с двумя знаками, можно использовать конструкцию ВЫРАЗИТЬ(<Число> КАК Число(П,2)), где П — общая длина числа. Однако, этот подход часто приводит к появлению нулей в дробной части для целых чисел, например, "100,00" вместо "100", что не решает нашу основную проблему.

    Например, выражение в запросе может выглядеть так:

    
    ВЫБОР
        КОГДА (ВашеПоле = ЦЕЛ(ВашеПоле))
            ТОГДА ВЫРАЗИТЬ(ВашеПоле КАК Число(10, 0))
        ИНАЧЕ ВЫРАЗИТЬ(ВашеПоле КАК Число(10, 2))
    КОНЕЦ КАК ВашеФорматированноеПоле
    

    Здесь Число(10, 0) означает число с общей длиной 10 и 0 знаками после запятой, а Число(10, 2) — с 2 знаками. Тем не менее, ВЫРАЗИТЬ в этом контексте может не всегда давать желаемое строковое форматирование без лишних нулей. Чаще всего, оно меняет тип данных, а для строкового представления все равно потребуется функция Формат() уже на уровне полей отчета или в программном модуле, где вы используете результат запроса.

  4. Использование конструктора форматной строки (общие настройки)

    Конструктор форматной строки, упомянутый в сообщениях форума, предоставляет удобный графический интерфейс для настройки параметров форматирования, таких как ширина, точность, разделители групп и другие. Мы можем вызвать его, например, через свойства поля формы или в конфигураторе при настройке макета отчета. Он помогает нам визуально подобрать нужную форматную строку, но, как мы выяснили, стандартные параметры, такие как ЧДЦ=2, всегда будут добавлять нули после запятой для целых чисел. Поэтому сам по себе конструктор форматной строки не сможет решить нашу проблему динамического удаления нулей без применения одного из вышеописанных программных или условных методов.

    Мы используем конструктор для формирования базовой форматной строки, например, для дробных чисел с двумя знаками после запятой, а затем эту строку применяем в условиях или в программном коде, как мы рассматривали ранее.

Таким образом, для того чтобы получить "10" для числа 10, "10,50" для числа 10.5, и "9,99" для числа 9.99, нам необходимо использовать либо программный подход с проверкой на целостность числа (если форматирование происходит в модуле), либо условное оформление в СКД (если речь идет об отчетах).

Каждый из этих методов имеет свои преимущества и недостатки, и выбор конкретного подхода будет зависеть от контекста нашей задачи. Наиболее универсальным и гибким всегда будет программный подход, так как он предоставляет полный контроль над логикой форматирования.

← На главную