Перейти к основному содержимому

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

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

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

Пример справочника «Проекты»

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

Табличная часть справочника «Проекты»

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

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

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

Табличные части имеют следующие свойства:

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

В таблицах табличной части порождаются поля для всех явно заданных реквизитов табличной части, а также стандартные поля: Контейнер, Индекс, НомерСтроки.

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

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

Табличную часть сущности описывает тип ОтражениеТабличнойЧастиСущности. Тип имеет следующие свойства:

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

Методы типа ОтражениеТабличнойЧастиСущности:

  • ПолучитьТаблицу(): ОтражениеТаблицы — позволяет получить таблицу, хранящую данные табличной части.

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

  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
Имя: Срочность
Тип: Булево

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

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

  • нужно хранить множество неизменяемых значений (например, чисел или ссылок), при этом добавление дополнительной информации к значениям не планируется;
  • если в проекте есть готовая хранимая структура, к которой не планируется добавление дополнительной информации, и нужно хранить множество таких структур.

Однако, если вам понадобится добавить дополнительную информацию в реквизит-коллекцию, то придется переносить данные и переходить к использованию табличной части. Например, если реквизит-коллекция имеет тип Массив<МоеПеречисление>, а вы хотите изменить его на Массив<МояСтруктура>, где МояСтруктура — это некая структура с двумя полями типа Строка и МоеПеречисление, то в этом случае «1С:Шина» не сможет выполнить реструктуризацию таблиц базы данных и вам придется переносить данные самостоятельно.

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