Как отобразить флажок в таблице управляемой формы для составного типа данных?

Программист IT и автоматизация бизнеса
← На главную

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

Особенно остро этот вопрос встает при работе с Планами видов характеристик (ПВХ). Представим ситуацию: у нас есть таблица со списком свойств. В одной строке может быть «Цвет» (тип Строка), во второй — «Вес» (тип Число), а в третьей — «Активен» (тип Булево). Мы хотим, чтобы для типа Булево пользователь видел привычный флажок, а не текст «Да» или «Нет».

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

Метод 1. Использование двух колонок и Условного оформления (Рекомендуемый)

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

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

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

    Откройте свойства формы, перейдите на закладку Условное оформление и добавьте два правила:

    Правило №1 (для флажка):
    • Оформление: Видимость = Истина (или Доступность).
    • Условие: ТипЗначения(Объект.Свойства.Значение) Равно Тип("Булево").
    • Оформляемые поля: ЗначениеБулево.
    Правило №2 (для остальных типов):
    • Оформление: Видимость = Ложь.
    • Условие: ТипЗначения(Объект.Свойства.Значение) Равно Тип("Булево").
    • Оформляемые поля: ЗначениеСтрока.

Важный нюанс: на управляемой форме свойство Видимость в Условном оформлении для колонок таблицы работает специфическим образом. Оно не скрывает колонку целиком, а «гасит» содержимое ячейки. Это именно то, что нам нужно для имитации изменения типа элемента в строке.

Метод 2. Программная настройка Условного оформления

Если ваша таблица строится динамически, или вы предпочитаете держать логику в коде, можно настроить те же правила программно. Проанализируем пример кода, который можно разместить в процедуре ПриСозданииНаСервере:


// Создаем элемент условного оформления
ЭлементОформления = УсловноеОформление.Элементы.Добавить();

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

// Устанавливаем условие: тип значения должен быть Булево
ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.ТаблицаСвойств.Значение");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ЭлементУсловия.ПравоеЗначение = Тип("Булево");

// Если условие выполняется (тип НЕ Булево), скрываем видимость флажка
ЭлементОформления.Оформить.УстановитьЗначениеПараметра("Видимость", Ложь);

Этот подход позволяет гибко управлять отображением, особенно если типов данных в ПВХ много и логика их вывода сложнее, чем просто проверка на Булево.

Метод 3. Использование картинок для отображения состояния

Иногда использование двух колонок кажется избыточным. В таких случаях можно применить метод «эмуляции» флажка через картинки. Выясним причину популярности этого метода: он позволяет сохранить единую колонку для всех типов данных, что выглядит более эстетично в конфигураторе.

Для реализации этого метода выполним следующие действия:

  1. Добавим в конфигурацию общую картинку, содержащую два состояния: «флажок установлен» и «флажок снят».
  2. В таблице формы создадим колонку с видом Поле картинки.
  3. В Условном оформлении пропишем правило: если тип значения Булево и значение равно Истина, то установить КартинкаЗначений = ИндексКартинкиВключено. Если Ложь — ИндексКартинкиВыключено.

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


&НаКлиенте
Процедура ТаблицаСвойствВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    ТекущиеДанные = Элементы.ТаблицаСвойств.ТекущиеДанные;
    
    Если Поле.Имя = "КолонкаКартинки" И ТипЗнч(ТекущиеДанные.Значение) = Тип("Булево") Тогда
        СтандартнаяОбработка = Ложь;
        ТекущиеДанные.Значение = Не ТекущиеДанные.Значение;
    КонецЕсли;
    
КонецПроцедуры

Метод 4. Режим редактирования «Непосредственно»

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

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

Сравнение подходов: что выбрать?

Проанализируем ситуации, в которых лучше применять тот или иной метод:

Рассмотрим подробнее, почему вариант с ПриВыводеСтроки больше недоступен. Платформа 8.3 стремится минимизировать количество вызовов сервера. Если бы 1С позволяла динамически менять тип элемента управления для каждой строки «на лету», это бы катастрофически замедлило отрисовку таблиц с тысячами строк. Условное оформление работает на уровне декларативного описания, которое клиентский движок может эффективно оптимизировать.

Резюмируем: Для корректного отображения флажка в ПВХ на управляемой форме используйте две колонки (для Булево и для прочих типов) и управляйте их видимостью через Условное оформление. Не забудьте установить режим редактирования Непосредственно, чтобы интерфейс был отзывчивым и понятным для пользователя.

← На главную