Табличная часть

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

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

Чтобы смоделировать это в , используется табличная часть.

Табличные части в элементах проекта

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

Табличные части описываются в свойстве ТабличныеЧасти объекта-владельца. Для каждой табличной части порождается структурный тип ИмяЭлементаСТабличнойЧастью.ИмяТабличнойЧасти. В примере выше это Проекты.Задачи. Тип доступен на клиенте и сервере. Значения этого типа используются в качестве строк табличной части. Тип может иметь модуль.

Табличные части имеют следующие свойства:
  • Ид — Ууид, идентификатор табличной части;
  • Имя — Строка, имя табличной части;
  • Реквизиты — обычные хранимые реквизиты; табличные части без явно заданных реквизитов не поддерживаются;
  • Индексы — поля, соответствующие явно задаваемым реквизитам, а также стандартные поля Контейнер и Индекс.
В таблицах табличной части порождаются поля для всех явно заданных реквизитов табличной части, а также стандартные поля: Контейнер, Индекс, НомерСтроки.

Табличные части в механизме отражения

Табличные части доступны в механизме отражения (свойство ТабличныеЧасти: ЧитаемыйМассив<ОтражениеТабличнойЧастиСущности> типа ОтражениеОбъектнойСущности).

Табличную часть сущности описывает тип ОтражениеТабличнойЧастиСущности. Тип имеет следующие свойства:
  • Владелец — ОтражениеСущности, сущность, которой принадлежит табличная часть;
  • Ид — Ууид, идентификатор табличной части;
  • Имя — ДвуязычнаяСтрока, имя на двух языках;
  • Реквизиты — ЧитаемыйМассив<ОтражениеХранимогоСвойства>, реквизиты сущности.
Методы типа ОтражениеТабличнойЧастиСущности:
  • ПолучитьТаблицу(): ОтражениеТаблицы — позволяет получить таблицу, хранящую данные табличной части.

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

  1. В демонстрационном приложении в подсистеме Основное создайте справочник Проекты со стандартными реквизитами Наименование и Код. Тогда YAML-файл справочника будет выглядеть так:
    ВидЭлемента: Справочник
    Ид: ee3618d6-a21c-443b-8ed6-c2087b661536
    Имя: Проекты
    ОбластьВидимости: ВПодсистеме
    Реквизиты:
        -
            Имя: Наименование
        -
            Имя: Код
            Тип: Строка
            Автонумерация:
                Использовать: Ложь
  2. Добавьте табличную часть Задачи.В
  3. Добавьте реквизиты Номер, Описание и Срочность.

    В YAML-файле добавится описание свойства ТабличныеЧасти с реквизитами:

    ТабличныеЧасти:
        -
            Ид: 64a781a9-e9fb-4f87-a63a-3445ceea58a7
            Имя: Задачи
            Реквизиты:
                -
                    Ид: 2a280a5b-31d8-4e67-84d7-dd0416c17d44
                    Имя: Номер
                    Тип: Число
                -
                    Ид: be4269cc-f7d0-4d2a-a704-a07c6f88a0ac
                    Имя: Описание
                    Тип: Строка
                -
                    Ид: e6d73627-d246-4ac1-9849-a4a75811c66e
                    Имя: Срочность
                    Тип: Булево
  4. В панели Свойства табличной части Задачи добавьте индекс по полю Номер.

    Полный YAML-файл справочника Проекты будет выглядеть следующим образом:
    ВидЭлемента: Справочник
    Ид: ee3618d6-a21c-443b-8ed6-c2087b661536
    Имя: Проекты
    ОбластьВидимости: ВПодсистеме
    Реквизиты:
        -
            Имя: Наименование
        -
            Имя: Код
            Тип: Строка
            Автонумерация:
                Использовать: Ложь
    ТабличныеЧасти:
        -
            Ид: d72d66c6-2f9e-49ef-8815-7dfd719cfbed
            Имя: Задачи
            Реквизиты:
                -
                    Ид: 674cd65b-2650-4f0b-90c7-73a21f2f0807
                    Имя: Номер
                    Тип: Число
                -
                    Ид: d1962b99-9de5-46aa-8610-8c670e8923ef
                    Имя: Описание
                    Тип: Строка
                -
                    Ид: 1d5e0f82-c21c-452d-8f4c-60a7715b2cf2
                    Имя: Срочность
                    Тип: Булево
            Индексы:
                -
                    Имя: Номер
                    Поля:
                        - Номер

Примеры работы с табличной частью

В демонстрационном приложении в справочник Сотрудники добавьте реквизит Проект и табличную часть Задачи со структурой, аналогичной табличной части Проекты.Задачи. Описание добавленных реквизитов в YAML-файле справочника Сотрудники:
Реквизиты:
    ...
    -
        Ид: c8c87d62-c920-43ce-8f33-9aff0305fe30
        Имя: Проект
        Тип: Проекты.Ссылка?
ТабличныеЧасти:
    -
        Ид: 705b7d99-af1a-491a-aaad-2c8cc38440bc
        Имя: Задачи
        Реквизиты:
            -
                Ид: bc3d285c-a681-47da-af6c-1a4c9f9d8736
                Имя: Номер
                Тип: Число
            -
                Ид: b5862322-3d53-4219-b495-40286928c671
                Имя: Описание
                Тип: Строка
            -
                Ид: 162ab406-a0b6-462b-819f-3a20c7db7b6d
                Имя: Срочность
                Тип: Булево
  1. Заполнение табличной части с помощью метода ДобавитьНовый() на основе данных другой табличной части:
    пер ТекущийПроект = Проект.ЗагрузитьОбъект()
    для СтрокаПроекта из ТекущийПроект.Задачи
        пер СтрокаЗадачи = Задачи.ДобавитьНовый()
        СтрокаЗадачи.Номер = СтрокаПроекта.Номер
        СтрокаЗадачи.Описание = СтрокаПроекта.Описание
        СтрокаЗадачи.Срочность = СтрокаПроекта.Срочность
    ;
  2. Заполнение табличной части с помощью конструктора на основе данных другой табличной части:
    пер ТекущийПроект = Проект.ЗагрузитьОбъект()
    для СтрокаПроекта из ТекущийПроект.Задачи
        Задачи.Добавить(новый Сотрудники.Задачи(
            Номер = СтрокаПроекта.Номер,
            Описание = СтрокаПроекта.Описание,
            Срочность = СтрокаПроекта.Срочность
        ))
    ;
  3. Изменение данных во всех строках:
    пер ТекущийПроект = Проект.ЗагрузитьОбъект()
    для СтрокаПроекта из ТекущийПроект.Задачи
        СтрокаПроекта.Срочность = Истина
    ;

Пример обращения к табличной части с помощью языка запросов

Для табличной части порождается таблица языка запросов ИмяЭлементаПроекта.ИмяТабличнойЧасти. Таблица содержит следующие поля:
  • Владелец — ИмяЭлементаПроекта.Ссылка, ссылка на запись, владеющую строками табличной части;
  • Индекс — Число, индекс строки табличной части в рамках одного владельца;
  • НомерСтроки — Число, номер строки табличной части в рамках одного владельца (индекс + 1);
  • ИмяРеквизитаТабличнойЧасти — ТипРеквизитаТабличнойЧасти, поле с данными реквизита табличной части.
Пример использования:
ВЫБРАТЬ
    Индекс,
    НомерСтроки,
    Номер,
    Описание,
    Срочность,
    Владелец
ИЗ
    Проекты.Задачи
ГДЕ
    Владелец.Представление == "Проект 1"
УПОРЯДОЧИТЬ ПО
    НомерСтроки

Табличные части в контрактах сущностей

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

В объектах контрактов сущностей табличные части представлены одноименными свойствами с типом ИзменяемыйМассив<ИмяКонтрактаСущности.ИмяТабличнойЧасти>. Свойства доступны только для чтения. Если в контракте сущности есть табличная часть, во всех реализациях должна быть табличная часть с таким же именем и всеми реквизитами контракта.

Пример YAML-файла контракта сущности КонтрактСущностиПроект с табличной частью:
ВидЭлемента: КонтрактСущности
Ид: a5105ca6-19d6-49a9-bac8-51b0752ed7a8
Имя: КонтрактСущностиПроект
ОбластьВидимости: ВПодсистеме
ТабличныеЧасти:
    -
        Ид: b177a736-c491-483d-9740-f64d75f5fefb
        Имя: Задачи
        Реквизиты:
            -
                Ид: e8efd298-4170-49a3-bbef-98e2e719faae
                Имя: Номер
                Тип: Число
                ТолькоЧтение: Истина
            -
                Ид: d310ed62-345b-4840-97c0-0cfdac54b088
                Имя: Описание
                Тип: Строка
            -
                Ид: 08df8c71-c6c0-454b-87cc-e5bcbe72809f
                Имя: Срочность
                Тип: Булево
                ТолькоЧтение: Истина
Свойства:
    -
        Ид: 62f1864c-be4b-4000-9959-90ebccff55e0
        Имя: Наименование
        Тип: Строка
        МаксимальнаяДлина: 10
        ТолькоЧтение: Истина
Пример YAML-файла справочника МойСправочникСКонтрактом, реализующего этот контракт:
ВидЭлемента: Справочник
Ид: 6eb669ed-40af-4f39-b4de-598d06c78545
Имя: МойСправочникСКонтрактом
ОбластьВидимости: ВПодсистеме
НастройкиТипов:
    Справочник.Объект:
        Контракты:
            - КонтрактСущностиПроект.Объект
Реквизиты:
    -
        Имя: Наименование
        Длина: 10
ТабличныеЧасти:
    -
        Ид: b1acc279-c3c0-47e7-a33a-13f5d8f257f7
        Имя: Задачи
        Реквизиты:
            -
                Ид: 2fe0cf63-8771-4cdb-8cbe-b55ad229994c
                Имя: Номер
                Тип: Число
            -
                Ид: cfd7cdf0-44d4-472d-867f-bb67b677e450
                Имя: Описание
                Тип: Строка
            -
                Ид: e07b8a10-24ca-411e-8099-369d57215c77
                Имя: Срочность
                Тип: Булево

Выбор между табличной частью и реквизитом-коллекцией

Чтобы смоделировать табличную часть, можно использовать реквизит-коллекцию и хранимую структуру. Это может быть удобно в следующих случаях:
  • нужно хранить множество неизменяемых значений (например, чисел или ссылок), если добавление дополнительной информации к значениям не планируется;
  • если в проекте есть готовая хранимая структура, к которой не планируется добавление дополнительной информации, и нужно хранить множество таких структур.
    Важно: Если вам понадобится добавить дополнительную информацию в реквизит-коллекцию, то придется переносить данные и переходить к использованию табличной части.