ТаблицаФормы.Развернуть

Методы · Expand

Разворачивает узел в указанной строке дерева.

Синтаксис

Развернуть(<ИдентификаторСтроки>, <СПодчиненными>)
Полное описание, параметры и ограничения

ТаблицаФормы.Развернуть (FormTable.Expand)

ТаблицаФормы (FormTable)

Развернуть (Expand)

Доступен, начиная с версии 8.2.

Синтаксис:
Развернуть(<ИдентификаторСтроки>, <СПодчиненными>)
Параметры:

<ИдентификаторСтроки> (обязательный)
Тип: Произвольный.
Идентификатор строки таблицы.

<СПодчиненными> (необязательный)
Тип: Булево.
Определяет необходимость раскрытия подчиненных узлов. Истина - раскрывать подчиненные узлы, Ложь - не раскрывать подчиненные узлы.
Значение по умолчанию: Ложь.
Описание:

Разворачивает узел в указанной строке дерева.

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение (клиент).

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

Доступен, начиная с версии 8.2.

Описание изменено в версии 8.3.17.

Методическая информация

Практические примеры

Выбрать Книгу в дереве и посмотреть текущего родителя таблицы

ТекущийРодитель относится к отображению иерархической таблицы. Для родителя данных отдельно используем ПолучитьРодителя строки дерева.

Где и как запускать

Модуль новой управляемой формы учебной внешней обработки. Код содержит готовые процедуры с директивами; вставляйте на уровне модуля, не внутрь другого обработчика. Каждую задачу запускайте в отдельной копии формы.

Подготовка

  1. В учебной базе создайте новую внешнюю обработку УчебноеДерево с пустой управляемой основной формой. Каждую задачу размещайте в отдельной копии формы.

  2. Не создавайте вручную реквизит Категории и элементы ДеревоКатегорий: код создаёт их программно.

  3. В свойствах формы → События назначьте ПриСозданииНаСервере одноимённой процедуре из кода. Остальные процедуры вставьте полностью на уровне модуля.

  4. Сохраните собственную EPF и откройте в 1С через Файл → Открыть. Данные Книга/Ручка создаются только в памяти формы.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Новые = Новый Массив;
    Новые.Добавить(Новый РеквизитФормы("Категории", Новый ОписаниеТипов("ДеревоЗначений")));
    Новые.Добавить(Новый РеквизитФормы("Название", Новый ОписаниеТипов("Строка"), "Категории"));
    Новые.Добавить(Новый РеквизитФормы("Количество", Новый ОписаниеТипов("Число"), "Категории"));
    ЭтаФорма.ИзменитьРеквизиты(Новые);
    Дерево = Новый ДеревоЗначений;
    Дерево.Колонки.Добавить("Название", Новый ОписаниеТипов("Строка"));
    Дерево.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
    Группа = Дерево.Строки.Добавить();
    Группа.Название = "Канцелярия";
    Книга = Группа.Строки.Добавить();
    Книга.Название = "Книга";
    Книга.Количество = 3;
    Ручка = Группа.Строки.Добавить();
    Ручка.Название = "Ручка";
    Ручка.Количество = 1;
    Резерв = Дерево.Строки.Добавить();
    Резерв.Название = "Резерв";

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

    КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
    КомандаДействия.Действие = "УчебноеДействие";
    КомандаДействия.Заголовок = "Проверить своё дерево";
    КомандаДействия.Подсказка = "Действие только над данными учебной формы";
    КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
    Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
    Кнопка.ИмяКоманды = КомандаДействия.Имя;
    Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры

&НаКлиенте
Процедура УчебноеДействие(Команда)
    Корни = ЭтаФорма.Категории.ПолучитьЭлементы();
    Если Корни.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    Группа = Корни.Получить(0);
    Дети = Группа.ПолучитьЭлементы();
    Если Дети.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    Книга = Дети.Получить(0);
    Если Книга.Название <> "Книга" Тогда
        ВызватьИсключение "Нужна исходная учебная Книга";
    КонецЕсли;
    Таблица = Элементы.ДеревоКатегорий;
    Таблица.Развернуть(Группа.ПолучитьИдентификатор());
    Таблица.ТекущаяСтрока = Книга.ПолучитьИдентификатор();
    ЭтаФорма.ТекущийЭлемент = Таблица;
    Сообщить(Книга.ПолучитьРодителя() = Группа);
    Сообщить("Текущий родитель UI: " + Строка(Таблица.ТекущийРодитель));
    Сообщить("Идентификатор родителя данных: " + Строка(Группа.ПолучитьИдентификатор()));
КонецПроцедуры

Разбор по шагам

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

  2. Проверяем наличие корня/детей и собственную Книгу до обращения к индексам.

  3. Для выбора используем идентификатор строки, раскрываем её группу и ставим фокус в таблицу.

  4. ПолучитьРодителя проверяет связь данных; ТекущийРодитель выводится отдельно как состояние UI, без предположения, что это индекс или объект базы.

Как проверить результат

  1. Проверка родителя данных Истина; в дереве выбрана Книга под Канцелярией.

  2. Сравните диагностические идентификаторы после отображения в своём клиенте; строки и количества не изменяются.

Ожидаемый результат

Отделены навигационное состояние таблицы, родитель строки данных и сохранённая ссылка базы.

На что обратить внимание

  1. Свойство ТекущийРодитель используется только при иерархическом отображении.

  2. Идентификатор данных формы не является UUID справочника.

  3. Состояние UI может обновляться при отображении, а не синхронно с каждым присваиванием.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Развернуть и свернуть собственную группу дерева по идентификатору

Работаем с группой Канцелярия, а не индексом строки произвольного дерева. Разворачивание меняет просмотр, не удаляет детей.

Где и как запускать

Модуль новой управляемой формы учебной внешней обработки. Код содержит готовые процедуры с директивами; вставляйте на уровне модуля, не внутрь другого обработчика. Каждую задачу запускайте в отдельной копии формы.

Подготовка

  1. В учебной базе создайте новую внешнюю обработку УчебноеДерево с пустой управляемой основной формой. Каждую задачу размещайте в отдельной копии формы.

  2. Не создавайте вручную реквизит Категории и элементы ДеревоКатегорий: код создаёт их программно.

  3. В свойствах формы → События назначьте ПриСозданииНаСервере одноимённой процедуре из кода. Остальные процедуры вставьте полностью на уровне модуля.

  4. Сохраните собственную EPF и откройте в 1С через Файл → Открыть. Данные Книга/Ручка создаются только в памяти формы.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Новые = Новый Массив;
    Новые.Добавить(Новый РеквизитФормы("Категории", Новый ОписаниеТипов("ДеревоЗначений")));
    Новые.Добавить(Новый РеквизитФормы("Название", Новый ОписаниеТипов("Строка"), "Категории"));
    Новые.Добавить(Новый РеквизитФормы("Количество", Новый ОписаниеТипов("Число"), "Категории"));
    ЭтаФорма.ИзменитьРеквизиты(Новые);
    Дерево = Новый ДеревоЗначений;
    Дерево.Колонки.Добавить("Название", Новый ОписаниеТипов("Строка"));
    Дерево.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
    Группа = Дерево.Строки.Добавить();
    Группа.Название = "Канцелярия";
    Книга = Группа.Строки.Добавить();
    Книга.Название = "Книга";
    Книга.Количество = 3;
    Ручка = Группа.Строки.Добавить();
    Ручка.Название = "Ручка";
    Ручка.Количество = 1;
    Резерв = Дерево.Строки.Добавить();
    Резерв.Название = "Резерв";

    ЭтаФорма.ЗначениеВРеквизитФормы(Дерево, "Категории");
    Таблица = Элементы.Добавить("ДеревоКатегорий", Тип("ТаблицаФормы"));
    Таблица.ПутьКДанным = "Категории";
    Таблица.Отображение = ОтображениеТаблицы.Дерево;
    Таблица.Заголовок = "Учебные категории — данные только в памяти";
    Таблица.АвтоВводНовойСтроки = Ложь;
    Таблица.АвтоВводНезаполненного = Ложь;
    Для Каждого ИмяКолонки Из СтрРазделить("Название,Количество", ",") Цикл
        Поле = Элементы.Добавить("Категории" + ИмяКолонки, Тип("ПолеФормы"), Таблица);
        Поле.Вид = ВидПоляФормы.ПолеВвода;
        Поле.ПутьКДанным = "Категории." + ИмяКолонки;
        Поле.Заголовок = ИмяКолонки;
    КонецЦикла;
    Таблица.НачальноеОтображениеДерева = НачальноеОтображениеДерева.НеРаскрывать;

    КомандаДействия = ЭтаФорма.Команды.Добавить("УчебноеДействие");
    КомандаДействия.Действие = "УчебноеДействие";
    КомандаДействия.Заголовок = "Проверить своё дерево";
    КомандаДействия.Подсказка = "Действие только над данными учебной формы";
    КомандаДействия.ИзменяетСохраняемыеДанные = Ложь;
    Кнопка = Элементы.Добавить("КнопкаУчебноеДействие", Тип("КнопкаФормы"));
    Кнопка.ИмяКоманды = КомандаДействия.Имя;
    Кнопка.Заголовок = КомандаДействия.Заголовок;
КонецПроцедуры

&НаКлиенте
Процедура УчебноеДействие(Команда)
    Таблица = Элементы.ДеревоКатегорий;
    Корни = ЭтаФорма.Категории.ПолучитьЭлементы();
    Если Корни.Количество() <> 2 Тогда
        ВызватьИсключение "Нужны исходные две учебные группы";
    КонецЕсли;
    Группа = Корни.Получить(0);
    Если Группа.Название <> "Канцелярия" Тогда
        ВызватьИсключение "Первая группа не учебная Канцелярия";
    КонецЕсли;
    Ключ = Группа.ПолучитьИдентификатор();
    Состояние = Таблица.Развернут(Ключ);
    Если Состояние = Неопределено Тогда
        Сообщить("Узел сейчас не доступен в отображаемой таблице");
        Возврат;
    КонецЕсли;
    Таблица.Развернуть(Ключ, Истина);
    Сообщить(Таблица.Развернут(Ключ) = Истина);
    Таблица.Свернуть(Ключ);
    Сообщить(Таблица.Развернут(Ключ) = Ложь);
    Сообщить(Группа.ПолучитьЭлементы().Количество() = 2);
КонецПроцедуры

Разбор по шагам

  1. При создании задаём НеРаскрывать; пользователь видит корневые группы.

  2. По известной собственной схеме берём Канцелярию и проверяем её имя; получаем идентификатор, не подставляем индекс 0 в Развернуть.

  3. Развернут может вернуть Неопределено. До действий отдельно проверяем доступность состояния.

  4. Развернуть с Истина включает подчинённые узлы; Свернуть меняет только просмотр. Дети сохраняются в данных.

Как проверить результат

  1. Три логических сообщения Истина: раскрыт, затем свёрнут, у группы осталось два ребёнка.

  2. Раскройте вручную после команды: Книга/3 и Ручка/1 по-прежнему существуют.

Ожидаемый результат

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

На что обратить внимание

  1. Для отсутствующего узла Развернуть/Свернуть могут вызвать исключение. Не храните старый ключ после замены данных.

  2. У скрытой таблицы команды просмотра могут ничего не делать.

  3. Сворачивание дерева не является очисткой или сохранением иерархии.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.