Как динамически изменить количество знаков после запятой в поле табличной части управляемой формы

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

При разработке прикладных решений в 1С часто возникает задача управления отображением и вводом числовых данных в зависимости от настроек системы — например, от значения константы или параметров учетной политики. В табличных частях документов разрядность чисел (в частности, количество знаков дробной части для реквизитов Курс, Количество или Цена) по умолчанию задается в метаданных конфигуратора. Однако при необходимости динамически скрывать или добавлять знаки после запятой на управляемой форме разработчики сталкиваются со сложностями отрисовки ячеек.

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

Способ 1. Установка свойств Формат и ОграничениеТипа для элемента формы

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

  1. Формат (или ФорматРедактирования) — управляет строковым представлением числа при отображении и редактировании (параметры ЧЦ — общая длина числа, ЧДЦ — количество дробных знаков).
  2. ОграничениеТипа — устанавливает квалификаторы допустимого ввода данных, предотвращая ввод лишних знаков пользователем.

Посмотрим на пример реализации кода в серверном обработчике формы (например, в процедуре ПриСозданииНаСервере):


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Получаем значение константы или параметра настройки
    ИспользоватьУвеличеннуюТочность = Константы.ИспользоватьУвеличеннуюТочность.Получить();
    
    Если ИспользоватьУвеличеннуюТочность Тогда
        Разрядность = 15;
        РазрядностьДробнойЧасти = 4;
    Иначе
        Разрядность = 10;
        РазрядностьДробнойЧасти = 2;
    КонецЕсли;
    
    // Формируем описание типов с новыми квалификаторами числа
    Квалификатор = Новый КвалификаторыЧисла(Разрядность, РазрядностьДробнойЧасти);
    НовоеОграничение = Новый ОписаниеТипов("Число",,, Квалификатор);
    
    // Применяем настройки к элементу формы (колонке табличной части)
    ЭлементКолонки = Элементы.ТоварыКурс;
    ЭлементКолонки.ОграничениеТипа = НовоеОграничение;
    ЭлементКолонки.Формат = "ЧЦ=" + Разрядность + "; ЧДЦ=" + РазрядностьДробнойЧасти;
    ЭлементКолонки.ФорматРедактирования = "ЧЦ=" + Разрядность + "; ЧДЦ=" + РазрядностьДробнойЧасти;
    
КонецПроцедуры

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


&НаКлиенте
Процедура ПереключитьРазрядность(Разрядность, РазрядностьДробнойЧасти)
    
    Элементы.ТоварыКурс.Формат = "ЧЦ=" + Разрядность + "; ЧДЦ=" + РазрядностьДробнойЧасти;
    Элементы.ТоварыКурс.ОграничениеТипа = Новый ОписаниеТипов("Число",,, Новый КвалификаторыЧисла(Разрядность, РазрядностьДробнойЧасти));
    
    // Принудительно обновляем отображение таблицы формы
    Элементы.Товары.Обновить();
    
КонецПроцедуры

Способ 2. Использование динамического Условного оформления

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

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

Разберем по шагам создание условного оформления в процедуре ПриСозданииНаСервере:


&НаСервере
Процедура НастроитьФорматКолонкиУсловнымОформлением(ИмяТаблицы, ИмяКолонки, ДробнаяЧасть)
    
    // Создаем новый элемент условного оформления
    ЭлементОформления = УсловноеОформление.Элементы.Добавить();
    
    // Устанавливаем оформляемое поле
    ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяТаблицы + ИмяКолонки);
    
    // Задаем параметр оформления "Формат"
    ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Формат", "ЧДЦ=" + ДробнаяЧасть);
    
    // При необходимости можно задать отбор (если оформление зависит от строки),
    // либо оставить отбор пустым для применения ко всей колонке
    
КонецПроцедуры

Возможные причины проблем и нюансы платформы

Если после добавления кода формат все равно не применяется к документу, проанализируем следующие факторы:

  1. Сохраненные пользовательские настройки формы. Если пользователь хотя бы один раз открывал окно «Изменить форму» и настраивал ширину или параметры колонок вручную, платформа сохраняет эти индивидуальные настройки. Они имеют приоритет над программными изменениями свойств элементов. Чтобы исправить поведение, пользователю необходимо сбросить форму через меню «Еще» — «Установить стандартные настройки».
  2. Влияние процедур типовых библиотек (БСП). В конфигурациях на базе БСП при чтении или пересчете документа могут вызываться обработчики переопределения формата сумм и валют (например, в общих модулях работы с валютами). Проверьте модули формы на наличие повторного переопределения свойств элементов в обработчиках ПослеЗагрузкиДанныхИзНастроек или ПриЧтенииСозданииНаСервере.
  3. Ограничение метаданных. Важно помнить: установка свойств Формат и ОграничениеТипа на форме влияет только на интерфейс и пользовательский ввод. Реальная разрядность данных в базе определяется квалификаторами реквизита в метаданных конфигурации. Число в реквизите не может содержать больше знаков, чем указано в структуре метаданных.
← На главную