Как сделать колонку с флажками (пометками) в дереве значений на форме 1С?

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

При выводе иерархических структур данных, таких как номенклатура или справочник подразделений, часто требуется предоставить пользователю возможность отмечать строки флажками (галками). Если просто выгрузить результат запроса в дерево значений и вызвать метод СоздатьКолонки(), логическое поле будет отображаться как обычный текст «Да» или «Нет».

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

Шаг 1. Подготовка запроса и выборка данных для дерева

Проанализируем структуру запроса. Для того чтобы в дереве значений появилась колонка под флажок, необходимо добавить в текст запроса поле булева типа (например, со значением Ложь по умолчанию). Кроме того, для корректного построения дерева методом Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией) в запросе обязательно должна присутствовать секция ИТОГИ ПО ... ИЕРАРХИЯ.

Посмотрим на пример правильного формирования дерева значений:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Номенклатура.Ссылка КАК Ссылка,
    |	ЛОЖЬ КАК Пометка
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |	Номенклатура.ПометкаУдаления = ЛОЖЬ
    |	И Номенклатура.ЭтоГруппа = ИСТИНА
    |ИТОГИ ПО
    |	Ссылка ИЕРАРХИЯ";

Результат = Запрос.Выполнить();
ДеревоНоменклатуры = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

Шаг 2. Настройка колонки табличного поля (Обычные формы)

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

Чтобы колонка отображалась именно в виде флажка и переключалась одним кликом мыши, выполним следующие действия:

  1. Очистим свойство Данные у колонки, чтобы платформа не пыталась выводить строковое представление «Да/Нет».
  2. Укажем имя булевой колонки дерева в свойстве ДанныеФлажка.
  3. Установим режим прямого редактирования по клику через свойство РежимРедактирования.

Рассмотрим программную настройку колонки табличного поля:


// Создаем колонки на основании выгруженного дерева
ЭлементыФормы.фДеревоНоменклатуры.Значение = ДеревоНоменклатуры;
ЭлементыФормы.фДеревоНоменклатуры.СоздатьКолонки();

// Настраиваем колонку флажка
КолонкаПометки = ЭлементыФормы.фДеревоНоменклатуры.Колонки.Пометка;
КолонкаПометки.Данные = ""; // Очищаем текстовые данные
КолонкаПометки.ДанныеФлажка = "Пометка"; // Привязываем к полю данных
КолонкаПометки.РежимРедактирования = РежимРедактированияКолонки.Непосредственно;
КолонкаПометки.ТолькоПросмотр = Ложь;

Альтернативный вариант: Отрисовка через событие «ПриВыводеСтроки»

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


Процедура фДеревоНоменклатурыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    ОформлениеСтроки.Ячейки.Пометка.ОтображатьТекст = Ложь;
    ОформлениеСтроки.Ячейки.Пометка.ОтображатьФлажок = Истина;
    ОформлениеСтроки.Ячейки.Пометка.Флажок = ДанныеСтроки.Пометка;
КонецПроцедуры

Обратите внимание: При таком подходе простого клика по флажку недостаточно для обновления значения в данных, так как событие отвечает только за визуальное оформление. Чтобы изменения записывались в строку дерева, необходимо дополнительно обработать событие табличного поля ПриИзмененииФлажка:


Процедура фДеревоНоменклатурыПриИзмененииФлажка(Элемент, Колонка)
    Если Колонка.Имя = "Пометка" Тогда
        ТекущаяСтрока = Элемент.ТекущаяСтрока;
        Если ТекущаяСтрока <> Неопределено Тогда
            ТекущаяСтрока.Пометка = Не ТекущаяСтрока.Пометка;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Реализация в управляемых формах

Если задача решается на управляемых формах, привязка флажка выполняется значительно проще:

  1. Создаем реквизит формы типа ДеревоЗначений с колонками Ссылка и Пометка (тип Булево).
  2. Перетаскиваем реквизит в элементы формы.
  3. Для элемента таблицы формы, соответствующего колонке Пометка, устанавливаем свойство Вид = ВидПоляФормы.ПолеФлажка.
  4. Проверяем, что в свойстве ПутьКДанным указано ДеревоНоменклатуры.Пометка.

Иерархическая логика установки пометок

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


Процедура УстановитьПометкуДочерним(СтрокаДерева, ЗначениеПометки)
    Для Каждого ДочерняяСтрока Из СтрокаДерева.Строки Цикл
        ДочерняяСтрока.Пометка = ЗначениеПометки;
        // Рекурсивный вызов для всех вложенных уровней
        УстановитьПометкуДочерним(ДочерняяСтрока, ЗначениеПометки);
    КонецЦикла;
КонецПроцедуры
← На главную