Как в 1С вывести дерево из СКД с интерактивной колонкой-флажком?

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

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

Однако при стандартном выводе СКД в ДеревоЗначений разработчики часто сталкиваются с тем, что колонки типа Булево отображаются как текст ("Да"/"Нет"), а не как интерактивные элементы. В этой статье мы подробно разберем, как правильно настроить типизацию, визуальное отображение и логику работы с флажками в дереве значений.

Проблема автоматической типизации в СКД

Разберем ситуацию: вы создали вычисляемое поле в схеме компоновки данных с выражением ЛОЖЬ. При выводе в табличный документ система может отобразить его как флажок, если настроено соответствующее оформление. Но когда мы выводим результат программно в объект ДеревоЗначений, платформа создает структуру колонок динамически. Если не предпринять специальных мер, тип колонки может определиться как произвольный или строковый, что приведет к текстовому отображению значения в интерфейсе.

Шаг 1. Программный вывод СКД в Дерево Значений

Рассмотрим стандартный программный код вывода компоновки в дерево. Чтобы колонка изначально имела нужный нам тип, проанализируем процесс инициализации ДереваЗначений. Мы можем либо позволить системе создать дерево автоматически, либо подготовить его структуру заранее.

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


// Подготовка компоновщика и процессора
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКД, ДанныеРасшифровки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

ДеревоЗначений = Новый ДеревоЗначений;
// Если мы хотим жесткую типизацию, колонку можно создать заранее:
// ДеревоЗначений.Колонки.Добавить("Выбран", Новый ОписаниеТипов("Булево"));

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ДеревоЗначений);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Важно помнить, что если колонка с именем, совпадающим с именем поля в СКД, уже существует в ДеревоЗначений, процессор вывода будет использовать её, сохраняя установленный тип данных.

Шаг 2. Отображение флажка на управляемой форме

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

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

  1. Свойство Вид: установим значение ВидПоляФормы.ПолеФлажка.
  2. Свойство ПутьКДанным: должно указывать на булевый реквизит в строке дерева.
  3. Свойство РежимРедактирования: для удобства пользователя рекомендуется установить значение Непосредственно. Это позволит изменять состояние флажка одним кликом, без перехода в режим редактирования ячейки.

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


НовыйЭлемент = Элементы.Добавить("ДеревоВыбран", Тип("ПолеФормы"), Элементы.Дерево);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
НовыйЭлемент.ПутьКДанным = "Объект.ДеревоДанных.Выбран";
НовыйЭлемент.Заголовок = "Выбрать";

Шаг 3. Реализация логики "Родитель — Потомок"

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

Выясним, как это реализовать через событие ПриИзменении поля флажка:


&НаКлиенте
Процедура ДеревоВыбранПриИзменении(Элемент)
    ТекущаяСтрока = Элементы.Дерево.ТекущиеДанные;
    Если ТекущаяСтрока = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Устанавливаем флаги всем подчиненным элементам
    УстановитьФлагиРекурсивно(ТекущаяСтрока, ТекущаяСтрока.Выбран);
КонецПроцедуры

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

Шаг 4. Обработка данных на сервере

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

Рассмотрим способ сбора отмеченных строк:


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

Дополнительные советы по оптимизации

При работе с большими объемами данных в дереве СКД следует учитывать несколько нюансов:

  1. Производительность рекурсии: Если дерево содержит тысячи строк, рекурсивный обход на клиенте может вызвать кратковременное "зависание" интерфейса. В таких случаях можно ограничивать глубину обхода или выполнять часть логики на сервере.
  2. Третье состояние флажка: Иногда требуется показать, что в ветке выбраны не все элементы (флажок "закрашен"). В 1С это реализуется сложнее — обычно через использование колонки с картинками и обработку события Выбор, так как стандартное Поле флажка поддерживает только состояния Истина/Ложь.
  3. Оформление в СКД: Чтобы в самой схеме компоновки поле выглядело корректно, на вкладке "Наборы данных" можно явно указать тип значения для вычисляемого поля как Булево. Это поможет системе правильно сопоставить типы при автоматической генерации колонок.

Подведем итог: для реализации интерактивного дерева с флажками на базе СКД необходимо обеспечить три составляющие: правильную типизацию колонки в объекте ДеревоЗначений, установку вида Поле флажка для элемента формы и написание кода для обработки иерархических изменений. Такой подход делает отчеты не только информативными, но и функциональными инструментами для работы пользователей.

← На главную