Как в 1С убрать лишние нули после запятой в поле ввода на управляемой форме?

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

В практике разработки на платформе 1С часто возникает задача сделать интерфейс более «чистым» и читаемым. Одна из таких задач — скрытие незначащих нулей в числовых полях. По умолчанию, если у реквизита установлена точность (например, 3 знака после запятой), платформа всегда отображает их: число 1 превращается в 1,000, а 1,02 в 1,020. Это может перегружать форму, особенно если речь идет о количественных показателях. В этой статье мы подробно разберем, как сделать так, чтобы число 1,000 отображалось как 1, а 1,020 — как 1,02, сохраняя при этом возможность полноценного редактирования.

Причина возникновения проблемы

Прежде чем переходить к решениям, проанализируем ситуацию. В 1С свойства отображения числа жестко привязаны к метаданным реквизита или настройкам Формат и ФорматРедактирования в свойствах элемента формы. Если вы явно указываете точность ЧДЦ=3, платформа резервирует эти места для вывода. Основная сложность заключается в том, что поле ввода должно одновременно обеспечивать и красивое отображение, и удобный ввод данных. Если просто программно ограничить точность до 0 знаков, пользователь не сможет ввести дробную часть.

Решение 1. Динамическое управление форматом через события фокуса

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

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

Создадим обработчики событий для поля ввода Количество:


&НаКлиенте
Процедура КоличествоПриВходе(Элемент)
    // При входе в поле разрешаем ввод до 3-х знаков после запятой
    Элемент.ФорматРедактирования = "ЧДЦ=3";
КонецПроцедуры

&НаКлиенте
Процедура КоличествоПриВыходе(Элемент)
    // При выходе определяем, есть ли дробная часть, и настраиваем формат отображения
    ЗначениеЧисла = Объект.Количество;
    
    // Вычисляем количество значащих знаков после запятой
    // Один из способов: вычесть из числа его целую часть и проверить остаток
    ДробнаяЧасть = ЗначениеЧисла - Цел(ЗначениеЧисла);
    
    Если ДробнаяЧасть = 0 Тогда
        Элемент.Формат = "ЧДЦ=0";
    Иначе
        // Проверяем точность до 2-х знаков (например, для 1.02)
        Если (ЗначениеЧисла * 100) - Цел(ЗначениеЧисла * 100) = 0 Тогда
            Элемент.Формат = "ЧДЦ=2";
        Иначе
            Элемент.Формат = "ЧДЦ=3";
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

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

Решение 2. Использование свойства «Выводить незначащие нули»

Рассмотрим более простой способ, который не требует написания сложного кода, но зависит от версии платформы и настроек метаданных. В палитре свойств каждого числового поля ввода на форме есть группа свойств «Оформление».

  1. Найдите свойство «Выводить незначащие нули».
  2. Установите его в значение Ложь (снимите галочку).
  3. В свойстве «Формат» убедитесь, что параметр ЧДЦ (Число десятичных знаков) не задан жестко или соответствует максимальной точности.

Проанализируем ситуацию: если в метаданных реквизита точность установлена в 3, а в формате на форме пусто, платформа при выключенном выводе незначащих нулей будет автоматически «подрезать» хвосты. Однако этот метод иногда ведет себя нестабильно в старых релизах платформы 8.3, поэтому программный метод из Решения 1 считается более надежным.

Решение 3. Подмена реквизита (Строковый дублер)

Если требования заказчика специфичны и стандартное поведение поля ввода 1С не устраивает, можно прибегнуть к методу «прокси-реквизита». Выясним причину популярности этого метода: он дает 100% контроль над визуализацией.

Разберем реализацию по шагам:

  1. Выполняем добавление реквизитов и элементов формы (нам понадобится КоличествоСтрокой с типом Строка).
  2. Размещаем его на форме, а основной числовой реквизит Количество скрываем.
  3. В событии ПриИзменении строкового реквизита пишем код преобразования строки в число и записи в основной реквизит.
  4. В процедуре ПриЧтенииНаСервере или ПриОткрытии выполняем обратное преобразование.

Пример кода для форматирования числа в строку без нулей:


&НаКлиенте
Функция СформироватьКрасивоеЧисло(ЗначениеЧисла)
    // Используем системную функцию Формат с параметром ЧН (представление нуля)
    // и логику удаления лишних символов
    Результат = Формат(ЗначениеЧисла, "ЧЦ=12; ЧДЦ=3; ЧГ=0");
    
    // Удаляем лишние нули в конце строки после запятой
    Пока Прав(Результат, 1) = "0" Цикл
        Результат = Лев(Результат, СтрДлина(Результат) - 1);
    КонецЦикла;
    
    // Если после удаления нулей остался разделитель дробной части, удаляем и его
    Разделитель = Константы.РазделительДробнойЧастиДляТекущегоСеанса(); // Или просто ","
    Если Прав(Результат, 1) = Разделитель Тогда
        Результат = Лев(Результат, СтрДлина(Результат) - 1);
    КонецЕсли;
    
    Возврат Результат;
КонецФункции

Решение 4. Тип «Произвольный» и динамическая типизация

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

Рекомендации по выбору метода

Подведем итог нашему анализу:

Помните, что избыточное усложнение кода ради косметических правок не всегда оправдано. Всегда стоит обсудить с пользователями, действительно ли им мешают эти нули, так как стандартное поведение 1С привычно для большинства бухгалтеров и операторов склада, работающих с количественным учетом.

← На главную