Как программно вывести флажок в колонке табличной части вместо текста 'Да'/'Нет'?

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

При работе с расширениями конфигурации часто возникает задача программно добавить колонку в табличную часть существующего документа. Если эта колонка привязана к реквизиту с типом Булево, ожидаемое поведение — увидеть в ячейках таблицы флажки (галочки). Однако нередко вместо них платформа отображает текстовые значения "Да" или "Нет". Рассмотрим, почему так происходит и как добиться корректного отображения именно флажка.

Проанализируем ситуацию: в чем корень проблемы?

Предположим, мы добавляем поле на форму программно, например, в обработчике события ПриСозданииНаСервере. Код может выглядеть следующим образом:


// Пример проблемного кода
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Добавляем поле в группу колонок или прямо в таблицу
    Поле = Элементы.Добавить("ТоварыАВ_РучнаяЦенаЗакупки", Тип("ПолеФормы"), Элементы.Товары);
    Поле.Вид = ВидПоляФормы.ПолеФлажка;
    Поле.ВидФлажка = ВидФлажка.Флажок; // Пытаемся явно указать вид
    Поле.ПутьКДанным = "Объект.Товары.ав_РучнаяЦенаЗакупки";
    
    // Ключевая строка, вызывающая проблему
    Поле.ТолькоПросмотр = Истина;
    
    Поле.Видимость = Истина;
    Поле.ПропускатьПриВводе = Истина;
    Поле.ОтображатьВШапке = Ложь;
    
КонецПроцедуры

На первый взгляд, все верно: мы указали вид поля как ПолеФлажка. Но результат — текст "Да"/"Нет".

Основная причина такого поведения кроется в свойстве ТолькоПросмотр. Когда для колонки таблицы на управляемой форме установлено значение ТолькоПросмотр = Истина, платформа считает, что интерактивное взаимодействие с этим элементом не требуется. Поэтому вместо интерактивного элемента (флажка, который можно нажать) она выводит его статичное текстовое представление. Это стандартный механизм оптимизации отображения данных в режиме "только для чтения".

Свойство ВидФлажка (которое может принимать значения Флажок или Тумблер) в данном случае не имеет эффекта, так как оно определяет внешний вид именно интерактивного элемента, а платформа до его отображения дело не доводит.

Решение 1: Управление доступностью вместо свойства "ТолькоПросмотр"

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

Если флажок должен быть нередактируемым, установите для колонки свойство Доступность в значение Ложь. В этом случае флажок будет отображаться корректно, но будет неактивным (серого цвета), и пользователь не сможет изменить его состояние.

Посмотрим на исправленный пример кода:

  1. Убираем строку Поле.ТолькоПросмотр = Истина;.
  2. Если редактирование нужно запретить по определенному условию, добавляем проверку и устанавливаем свойство Доступность.

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

Этот подход является наиболее предпочтительным, так как он сохраняет визуальное представление флажка и семантически правильно отражает состояние "недоступно для редактирования".

Решение 2: Использование условного оформления (альтернативный метод)

Бывают ситуации, когда по логике бизнес-процесса необходимо использовать именно ТолькоПросмотр или требуется более гибкая визуализация (например, разные иконки вместо стандартного флажка). В этом случае на помощь приходит механизм условного оформления.

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

Разберем по шагам, как это настроить программно:

  1. Программно добавляем колонку в таблицу. Можно даже оставить Вид = ВидПоляФормы.ПолеВвода.
  2. Создаем новый элемент условного оформления для формы.
  3. Настраиваем отбор: указываем, что оформление должно применяться, когда значение в нашей колонке равно Истина.
  4. Настраиваем оформление: в качестве значения параметра Картинка устанавливаем подходящую картинку из библиотеки, например, БиблиотекаКартинок.Выполнено. Также можно установить параметр Текст в пустую строку, чтобы скрыть "Да"/"Нет".
  5. Указываем оформляемые поля: добавляем в список нашу новую колонку.

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


Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

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

Итоги и рекомендации

Таким образом, мы выяснили, что проблема отображения "Да"/"Нет" вместо флажка напрямую связана со свойством ТолькоПросмотр для колонки таблицы.

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

← На главную