При выводе иерархических структур данных, таких как номенклатура или справочник подразделений, часто требуется предоставить пользователю возможность отмечать строки флажками (галками). Если просто выгрузить результат запроса в дерево значений и вызвать метод СоздатьКолонки(), логическое поле будет отображаться как обычный текст «Да» или «Нет».
Разберем подробно, как правильно подготовить запрос, выгрузить дерево значений и настроить отображение интерактивных флажков на форме.
Проанализируем структуру запроса. Для того чтобы в дереве значений появилась колонка под флажок, необходимо добавить в текст запроса поле булева типа (например, со значением Ложь по умолчанию). Кроме того, для корректного построения дерева методом Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией) в запросе обязательно должна присутствовать секция ИТОГИ ПО ... ИЕРАРХИЯ.
Посмотрим на пример правильного формирования дерева значений:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| ЛОЖЬ КАК Пометка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ПометкаУдаления = ЛОЖЬ
| И Номенклатура.ЭтоГруппа = ИСТИНА
|ИТОГИ ПО
| Ссылка ИЕРАРХИЯ";
Результат = Запрос.Выполнить();
ДеревоНоменклатуры = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
В обычных формах табличное поле при автогенерации колонок создает текстовые поля ввода. Метод СоздатьКолонки() полностью сбрасывает ручные настройки колонок. Поэтому настройку элементов управления и привязок необходимо выполнять строго после вызова этого метода или создавать колонки программно с нуля.
Чтобы колонка отображалась именно в виде флажка и переключалась одним кликом мыши, выполним следующие действия:
Данные у колонки, чтобы платформа не пыталась выводить строковое представление «Да/Нет».ДанныеФлажка.РежимРедактирования.Рассмотрим программную настройку колонки табличного поля:
// Создаем колонки на основании выгруженного дерева
ЭлементыФормы.фДеревоНоменклатуры.Значение = ДеревоНоменклатуры;
ЭлементыФормы.фДеревоНоменклатуры.СоздатьКолонки();
// Настраиваем колонку флажка
КолонкаПометки = ЭлементыФормы.фДеревоНоменклатуры.Колонки.Пометка;
КолонкаПометки.Данные = ""; // Очищаем текстовые данные
КолонкаПометки.ДанныеФлажка = "Пометка"; // Привязываем к полю данных
КолонкаПометки.РежимРедактирования = РежимРедактированияКолонки.Непосредственно;
КолонкаПометки.ТолькоПросмотр = Ложь;
Флажок также можно отобразить визуально через обработчик событий табличного поля ПриВыводеСтроки. Посмотрим, как выглядит программный код оформления:
Процедура фДеревоНоменклатурыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
ОформлениеСтроки.Ячейки.Пометка.ОтображатьТекст = Ложь;
ОформлениеСтроки.Ячейки.Пометка.ОтображатьФлажок = Истина;
ОформлениеСтроки.Ячейки.Пометка.Флажок = ДанныеСтроки.Пометка;
КонецПроцедуры
Обратите внимание: При таком подходе простого клика по флажку недостаточно для обновления значения в данных, так как событие отвечает только за визуальное оформление. Чтобы изменения записывались в строку дерева, необходимо дополнительно обработать событие табличного поля ПриИзмененииФлажка:
Процедура фДеревоНоменклатурыПриИзмененииФлажка(Элемент, Колонка)
Если Колонка.Имя = "Пометка" Тогда
ТекущаяСтрока = Элемент.ТекущаяСтрока;
Если ТекущаяСтрока <> Неопределено Тогда
ТекущаяСтрока.Пометка = Не ТекущаяСтрока.Пометка;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Если задача решается на управляемых формах, привязка флажка выполняется значительно проще:
ДеревоЗначений с колонками Ссылка и Пометка (тип Булево).Пометка, устанавливаем свойство Вид = ВидПоляФормы.ПолеФлажка.ПутьКДанным указано ДеревоНоменклатуры.Пометка.Платформа 1С не синхронизирует флажки в иерархических структурах автоматически. Если требуется, чтобы при установке галки на группе помечались все подчиненные элементы, организуем рекурсивный обход строк дерева:
Процедура УстановитьПометкуДочерним(СтрокаДерева, ЗначениеПометки)
Для Каждого ДочерняяСтрока Из СтрокаДерева.Строки Цикл
ДочерняяСтрока.Пометка = ЗначениеПометки;
// Рекурсивный вызов для всех вложенных уровней
УстановитьПометкуДочерним(ДочерняяСтрока, ЗначениеПометки);
КонецЦикла;
КонецПроцедуры