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