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