ТаблицаФормы.Отображение

Свойства · Representation

Тип: ОтображениеТаблицы. Отображение данных в таблице.

Полное описание, параметры и ограничения

ТаблицаФормы.Отображение (FormTable.Representation)

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

Отображение (Representation)

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

Использование:
Чтение и запись.
Описание:
Тип: ОтображениеТаблицы.
Отображение данных в таблице.
Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Изменение свойства на клиенте может потребовать обращения к серверу.

Использование в версии:

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

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

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

Вставить, переместить и удалить товары только в учебном дереве формы

На собственной категории демонстрируем все восемь методов коллекции детей. Итоговые Книга и Ручка сохраняются; временные узлы удаляются.

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

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

Подготовка

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

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

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

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

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

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

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

&НаКлиенте
Процедура УчебноеДействие(Команда)
    Корни = Категории.ПолучитьЭлементы();
    Группа = Корни.Получить(0);
    Дети = Группа.ПолучитьЭлементы();
    Карандаш = Дети.Вставить(1);
    Карандаш.Название = "Карандаш";
    Карандаш.Количество = 2;
    Сообщить(Дети.Количество() = 3);
    Сообщить(Дети.Индекс(Карандаш) = 1);
    Дети.Сдвинуть(1, 1);
    Сообщить(Дети.Индекс(Карандаш) = 2);
    Сообщить(Дети.Получить(2).Название = "Карандаш");
    Дети.Удалить(2);
    Временный = Дети.Добавить();
    Временный.Название = "Временная строка";
    Временный.Количество = 99;
    Дети.Удалить(Временный);
    Резерв = Корни.Получить(1);
    РезервныеДети = Резерв.ПолучитьЭлементы();
    Черновик = РезервныеДети.Добавить();
    Черновик.Название = "Черновик только этой формы";
    РезервныеДети.Очистить();
    Сообщить(РезервныеДети.Количество() = 0);
    Сообщить(Дети.Количество() = 2);
    Сообщить(Дети.Получить(0).Название = "Книга");
    Сообщить(Дети.Получить(1).Название = "Ручка");
    Сообщить(Корни.Количество() = 2);
КонецПроцедуры

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

  1. Вставить(1) помещает Карандаш между Книгой и Ручкой. Индексы начинаются с нуля и относятся только к одной коллекции детей.

  2. Сдвинуть(1, 1) перемещает строку на одну позицию к концу; объект строки сохраняется, его индекс меняется.

  3. Получить читает строку по позиции. Удалить поддерживает позицию и сам элемент: в уроке использованы оба варианта.

  4. Добавить помещает временную строку в конец; удаление не записывает изменения в справочник.

  5. Очистить вызывается только для собственных детей Резерва. Канцелярия и сами корневые группы не очищаются.

  6. После удаления не обращаемся к Карандашу и Временному: эти элементы больше не принадлежат коллекции.

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

  1. Карандаш сначала имеет индекс 1, после сдвига 2.

  2. После кнопки в Канцелярии снова только Книга 3 и Ручка 1; Резерв пустой.

  3. Повторное нажатие даёт тот же итог: временные узлы не накапливаются.

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

Все восемь операций коллекции детей проверены на собственной структуре без удаления рабочих данных.

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

  1. Очистить удаляет всех детей выбранной коллекции, поэтому нельзя переносить вызов на рабочий объект без проверки области действия.

  2. Позиция 1 в корнях и позиция 1 у Канцелярии относятся к разным строкам.

  3. Перемещение по позиции внутри коллекции не переносит строку к другому родителю.

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

Показать категории с товарами и найти строку дерева по идентификатору

Полная форма создаётся с нуля. Видим две категории и два товара внутри Канцелярии; проверяем связи родитель/дети и отличие идентификатора от позиции.

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

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

Подготовка

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

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

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

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

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

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

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

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

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

  1. При создании формы добавляются дерево и две колонки реквизита. Значение ДеревоЗначений преобразуется в ДанныеФормыДерево.

  2. ТаблицаФормы — визуальное представление, Категории — данные. Отображение Дерево задаёт интерфейс с раскрываемыми узлами.

  3. ПолучитьЭлементы у дерева даёт корневые категории, а у строки — только её непосредственных детей.

  4. ПолучитьРодителя у корневой группы возвращает Неопределено; у Книги возвращает Канцелярию.

  5. НайтиПоИдентификатору находит строку во всём дереве. Число идентификатора не нужно подставлять в Получить как индекс.

  6. Свойство проверяет наличие колонки и может вернуть её значение во второй параметр.

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

  1. Раскройте Канцелярию: Книга 3, Ручка 1; Резерв без детей.

  2. После кнопки все булевы проверки Истина, выводится идентификатор Книги.

  3. У корней две строки, у Канцелярии два ребёнка, у Книги детей нет.

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

Новичок видит иерархию формы и умеет получать родителя, детей и строку по её идентификатору.

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

  1. ДанныеФормыДерево нельзя создавать через Новый: оно появляется из реквизита формы с типом ДеревоЗначений.

  2. Идентификатор действителен для текущих данных формы, не является UUID товара или ключом базы.

  3. Название и Количество — собственные колонки этого урока, не свойства любого дерева.

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

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

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

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

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