При разработке на управляемых формах 1С часто возникает задача отображения данных в виде иерархического списка. Многие разработчики сталкиваются с трудностями при попытке добавить строки в дерево, так как работа с ДаннымиФормыДерево на клиенте и с объектом ДеревоЗначений на сервере принципиально отличается. Давайте подробно разберем, как правильно реализовать эту задачу.
Первое, что важно усвоить: иерархия в 1С строится через вложенные коллекции. Когда мы работаем с объектом ДеревоЗначений на сервере, мы используем коллекцию Строки. Однако, когда мы работаем с реквизитом формы типа ДанныеФормыДерево, у нас нет прямого доступа к свойству Строки. Для манипуляции элементами в данном случае используется метод ПолучитьЭлементы().
Также важно помнить, что свойство Родитель у строки дерева является свойством только для чтения. Вы не можете создать строку и «присвоить» ей родителя. Строка становится дочерней только тогда, когда она была добавлена непосредственно в коллекцию дочерних элементов родительской строки.
Если ваши данные уже находятся в базе данных, самым эффективным и быстрым способом будет использование запроса с группировками. Метод Выгрузить() объекта РезультатЗапроса позволяет получить готовую структуру дерева «оптом».
Рассмотрим пример реализации:
// Выполняем запрос с иерархией
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Партнер, НомерТелефона ИЗ ... ИТОГИ ПО Партнер";
Результат = Запрос.Выполнить();
// Выгружаем в ДеревоЗначений
ПромДерево = Результат.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
// Загружаем в реквизит формы
ЗначениеВДанныеФормы(ПромДерево, ДеревоЗначенийКлиенты);
Этот метод предпочтителен, так как он минимизирует количество операций с объектами и серверные вызовы.
Бывают ситуации, когда данные поступают из разных источников или требуют сложной логики обработки «на лету». В этом случае удобно заполнять ДанныеФормыДерево напрямую. Главное — помнить о методе ПолучитьЭлементы().
Разберем процесс по шагам:
Пример кода для ручного добавления:
// Получаем коллекцию верхнего уровня
КоллекцияКлиентов = ДеревоЗначенийКлиенты.ПолучитьЭлементы();
// Добавляем строку-родителя
НоваяСтрокаКлиент = КоллекцияКлиентов.Добавить();
НоваяСтрокаКлиент.Партнер = "Клиент А";
// Добавляем дочернюю строку
НоваяСтрокаНомер = НоваяСтрокаКлиент.ПолучитьЭлементы().Добавить();
НоваяСтрокаНомер.НомерТелефона = "8-800-000-00-00";
Часто новички пытаются сделать так: сначала ДанныеФормыВЗначение, потом добавляют строки через Строки.Добавить(), а потом ЗначениеВДанныеФормы. Это работает, но создает избыточную нагрузку на систему.
Работая напрямую с ПолучитьЭлементы(), вы:
ДеревоЗначений на клиенте.Чтобы избежать ошибок при разработке, запомните следующие правила:
Правило 1: Если вам нужно отобразить иерархию, всегда проверяйте тип данных вашего реквизита. Если это ДанныеФормыДерево — используйте ПолучитьЭлементы().
Правило 2: Не пытайтесь записывать данные в колонку родителя у дочерней строки. Структура дерева определяется вложенностью коллекций, а не ссылкой на объект-родитель внутри строки.
Правило 3: Всегда сортируйте исходные данные, если планируете заполнять дерево циклом. Это позволит эффективно определять, когда нужно создавать новую «ветку» клиента, а когда — продолжать добавлять номера в текущую ветку.
Надеемся, что теперь работа с деревом значений на управляемых формах станет для вас простой и понятной задачей. Успехов в программировании!