Как отобразить флажок в колонке составного типа в управляемой форме 1С 8.3?

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

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

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

Разберем детально проверенные практические способы решения этой проблемы.

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

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

Рассмотрим порядок настройки шаг за шагом:

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

&НаКлиенте
Процедура ТаблицаНастроекЗначениеБулевоПриИзменении(Элемент)
    ТекущиеДанные = Элементы.ТаблицаНастроек.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        ТекущиеДанные.Значение = ТекущиеДанные.ЗначениеБулево;
    КонецЕсли;
КонецПроцедуры

Также при загрузке данных или при выборе типа характеристики необходимо инициализировать поле ЗначениеБулево соответствующим булевым значением из поля Значение.

Способ 2. Имитация флажка через условное оформление картинок и перехват клика

Рассмотрим альтернативный вариант, который позволяет обойтись одной колонкой составного типа Значение (вид — ПолеВвода), не добавляя вспомогательные колонки в таблицу.

Алгоритм реализации следующий:

  1. Настройка условного оформления: В УсловноеОформление формы добавляем правила для отображения картинок включенного и выключенного флажка:
    • Если Значение равно Истина: задаем свойство Текст = "" (пустая строка) и свойство Картинка — стандартный значок установленного флажка из библиотеки стандартных картинок.
    • Если Значение равно Ложь: задаем свойство Текст = "" и свойство Картинка — значок снятого флажка.
  2. Перехват события интерактивного нажатия: Чтобы при щелчке по ячейке значение инвертировалось без вызова стандартного диалога редактирования или выбора типа, перехватываем событие таблицы Выбор или ПередНачаломИзменения:

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

Сравнение методов

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

← На главную