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