Табличная часть
Табличная часть элемента проекта — это вложенная таблица, предназначенная для хранения вместе с каждым элементом данных однородной по своей структуре информации. Количество строк такой информации заранее неизвестно и может быть разным для разных элементов данных.
Например, справочник ИнформационныеСистемы может хранить дополнительный список сведений об объектах информационного обмена. Чтобы хранить такую информацию, в «1С:Шине» может быть использована табличная часть.
Табличные части в элементах проекта
Табличные части поддерживаются в ссылочных сущностях: в элементах проекта Справочник, ПланОбмена, КонтрактСущности.
Табличные части по сути являются единым целым с объектом, к которому относятся: они считываются и записываются вместе с ним, а также используют его права доступа (в том числе нельзя настроить ограничения доступа к строкам табличных частей).
Табличные части описываются в элементе ТабличныеЧасти объекта-владельца. Для каждой табличной части порождается структурный тип ИмяЭлементаСТабличнойЧастью.ИмяТабличнойЧасти и соответствующая таблица. Тип доступен на клиенте и сервере. Значения этого типа используются в качестве строк табличной части. Тип может иметь модуль.
Табличные части имеют следующие свойства:
Ид—Ууид, идентификатор табличной части;Имя—Строка, имя табличной части;Реквизиты— обычные хранимые реквизиты; табличные части без явно заданных реквизитов не поддерживаются;Индексы— поля, соответствующие явно задаваемым реквизитам, а также стандартные поляКонтейнериИндекс.
В таблицах табличной части порождаются поля для всех явно заданных реквизитов табличной части, а также стандартные поля: Контейнер, Индекс, НомерСтроки.
Табличные части в механизме отражения
Табличные части доступны в механизме отражения (свойство ТабличныеЧасти: ЧитаемыйМассив<ОтражениеТабличнойЧастиСущности> типа ОтражениеОбъектнойСущности).
Табличную часть сущности описывает тип ОтражениеТабличнойЧастиСущности. Тип имеет следующие свойства:
Владелец—ОтражениеСущности, сущность, которой принадлежит табличная часть;Ид—Ууид, идентификатор табличной части;Имя—ДвуязычнаяСтрока, имя на двух языках;Реквизиты—ЧитаемыйМассив<ОтражениеХранимогоСвойства>, реквизиты сущности.
Методы типа ОтражениеТабличнойЧастиСущности:
ПолучитьТаблицу(): ОтражениеТаблицы— позволяет получить таблицу, хранящую данные табличной части.
Пример добавления табличной части в справочник
-
Для справочника ИнформационныеСистемы нажмите на значок плюса напротив пункта Табличные части и добавьте табличную часть ИнформацияОбОбъекте.
-
Нажмите на значок плюса напротив табличной части ИнформацияОбОбъекте и добавьте реквизиты Номер, Страна, Город, Объект и Доступность.
-
В панели Свойства табличной части добавьте индекс с именем Номер по полю Номер.
Описание табличной частиТабличныеЧасти:-Ид: 8c6118ff-7019-49a5-8fea-b625baeaad11Имя: ИнформацияОбОбъектеИндексы:-Имя: НомерПоля:- НомерРеквизиты:-Ид: f837c40b-174b-47d0-86a1-4e1bafb20200Имя: НомерТип: Число-Ид: 8840069f-24cb-4b41-95cb-b02e1ca26e34Имя: СтранаТип: Строка-Ид: f3f3f68c-92e0-4e00-8ba2-52493debc712Имя: ГородТип: Строка-Ид: 6c81a69b-39a6-4b98-a9eb-a052aedbdbaaИмя: ОбъектТип: Строка-Ид: 667cdf92-867c-4d7d-944d-beeb6cd4922fИмя: ДоступностьТип: Булево
Примеры работы с табличной частью
Создайте план обмена ОбменСКурьерскойСлужбой и добавьте реквизит Справочник типа ИнформационныеСистемы.Ссылка? и табличную часть ИнформацияОбОбъекте со структурой, аналогичной табличной части справочника из примера выше.
Реквизиты:
# ...
-
Ид: 4f085742-fc12-4eb6-ba84-f0a95103faeb
Имя: Справочник
Тип: ИнформационныеСистемы.Ссылка?
ТабличныеЧасти:
-
Ид: c2b384f5-7379-45ae-83ae-80ea3ad06a4b
Имя: ИнформацияОбОбъекте
Реквизиты:
-
Ид: f837c40b-174b-47d0-86a1-4e1bafb20200
Имя: Номер
Тип: Число
-
Ид: 8840069f-24cb-4b41-95cb-b02e1ca26e34
Имя: Страна
Тип: Строка
-
Ид: f3f3f68c-92e0-4e00-8ba2-52493debc712
Имя: Город
Тип: Строка
-
Ид: 6c81a69b-39a6-4b98-a9eb-a052aedbdbaa
Имя: Объект
Тип: Строка
-
Ид: 667cdf92-867c-4d7d-944d-beeb6cd4922f
Имя: Доступность
Тип: Булево
-
Заполнение табличной части с помощью метода
ДобавитьНовый()на основе данных другой табличной части:метод ЗаполнитьТабличнуюЧастьСПомощьюМетода()пер ТекущаяИнформация = Справочник.ЗагрузитьОбъект()для СтрокаИнформации из ТекущаяИнформация.ИнформацияОбОбъектепер НоваяСтрока = ИнформацияОбОбъекте.ДобавитьНовый()НоваяСтрока.Город = СтрокаИнформации.ГородНоваяСтрока.Страна = СтрокаИнформации.СтранаНоваяСтрока.Объект = СтрокаИнформации.Объект;; -
Изменение данных во всех строках:
метод ИзменитьДанные()пер ТекущаяИнформация = Справочник.ЗагрузитьОбъект()для СтрокаИнформации из ТекущаяИнформация.ИнформацияОбОбъектеСтрокаИнформации.Доступность = Ложь;;
Пример обращения к табличной части с помощью языка запросов
Для табличной части порождается таблица языка запросов ИмяЭлементаПроекта.ИмяТабличнойЧасти. Таблица содержит следующие поля:
- Владелец —
ИмяЭлементаПроекта.Ссылка, ссылка на запись, владеющую строками табличной части; - Индекс —
Число, индекс строки табличной части в рамках одного владельца; - НомерСтроки —
Число, номер строки табличной части в рамках одного владельца (индекс + 1); - ИмяРеквизитаТабличнойЧасти —
ТипРеквизитаТабличнойЧасти, поле с данными реквизита табличной части.
Пример использования:
ВЫБРАТЬ
ТабличнаяЧасть.Город КАК Город,
ТабличнаяЧасть.Владелец КАК Владелец,
ТабличнаяЧасть.Объект КАК Объект,
ТабличнаяЧасть.Номер КАК Номер
ИЗ
ИнформационныеСистемы.ИнформацияОбОбъекте КАК ТабличнаяЧасть
Табличные части в контрактах сущностей
В контрактах сущностей поддерживается использование табличных частей. Для каждой табличной части в контракте сущности порождается контракт типа с именем ИмяКонтрактаСущности.ИмяТабличнойЧасти. Контракт доступен на клиенте и сервере. В таком контракте типа есть свойства для всех реквизитов табличной части, доступные на чтение и запись (если иное не указано в описании соответствующего реквизита табличной части контракта).
В объектах контрактов сущностей табличные части представлены одноименными свойствами с типом ИзменяемыйМассив<ИмяКонтрактаСущности.ИмяТабличнойЧасти>. Свойства доступны только для чтения. Если в контракте сущности есть табличная часть, во всех реализациях должна быть табличная часть с таким же именем и всеми реквизитами контракта.
Пример YAML-файла контракта сущности УчастникиОповещений с табличной частью:
ВидЭлемента: КонтрактСущности
Ид: cb011e96-79cf-4f7a-b2fa-6ba010d2b4a7
Имя: УчастникиОповещений
ОбластьВидимости: ВПроекте
ТаблицыКонтракта: Доступны
Свойства:
-
Ид: 21e49337-0bf0-4270-8685-14133d807dfb
Имя: ИдентификаторОбъекта
Тип: Строка
ТолькоЧтение: Истина
ТабличныеЧасти:
-
Ид: c2b384f5-7379-45ae-83ae-80ea3ad06a4b
Имя: ИнформацияОбОбъекте
Реквизиты:
-
Ид: 8840069f-24cb-4b41-95cb-b02e1ca26e34
Имя: Страна
Тип: Строка
-
Ид: f3f3f68c-92e0-4e00-8ba2-52493debc712
Имя: Город
Тип: Строка
-
Ид: 6c81a69b-39a6-4b98-a9eb-a052aedbdbaa
Имя: Объект
Тип: Строка
-
Ид: f837c40b-174b-47d0-86a1-4e1bafb20200
Имя: Номер
Тип: Число
-
Ид: 667cdf92-867c-4d7d-944d-beeb6cd4922f
Имя: Доступность
Тип: Булево
Пример YAML-файла справочника ИнформационныеСистемы, реализующего этот контракт:
ВидЭлемента: Справочник
Ид: 6eb669ed-40af-4f39-b4de-598d06c78545
Имя: ИнформационныеСистемы
ОбластьВидимости: ВПодсистеме
НастройкиТипов:
Справочник.Объект:
Контракты:
- СправочникИнформационныхСистем.Объект
- УчастникиОповещений.Объект
Реквизиты:
-
Имя: Наименование
Длина: 255
-
Ид: 9fa89b2b-eb70-41c1-b63b-ef8e3f55a676
Имя: ИдентификаторОбъекта
Тип: Строка
# Другие реквизиты...
ТабличныеЧасти:
-
Ид: c2b384f5-7379-45ae-83ae-80ea3ad06a4b
Имя: ИнформацияОбОбъекте
Реквизиты:
-
Ид: 8840069f-24cb-4b41-95cb-b02e1ca26e34
Имя: Страна
Тип: Строка
-
Ид: f3f3f68c-92e0-4e00-8ba2-52493debc712
Имя: Город
Тип: Строка
-
Ид: 6c81a69b-39a6-4b98-a9eb-a052aedbdbaa
Имя: Объект
Тип: Строка
-
Ид: f837c40b-174b-47d0-86a1-4e1bafb20200
Имя: Номер
Тип: Число
-
Ид: 667cdf92-867c-4d7d-944d-beeb6cd4922f
Имя: Доступность
Тип: Булево
Выбор между табличной частью и реквизитом-коллекцией
Вместо табличной части вы можете использовать реквизит-коллекцию и хранимую структуру. Это может быть удобно в следующих случаях:
- нужно хранить множество неизменяемых значений (например, чисел или ссылок), при этом добавление дополнительной информации к значениям не планируется;
- если в проекте есть готовая хранимая структура, к которой не планируется добавление дополнительной информации, и нужно хранить множество таких структур.
Однако, если вам понадобится добавить дополнительную информацию в реквизит-коллекцию, то придется переносить данные и переходить к использованию табличной части. Например, если реквизит-коллекция имеет тип Массив<МоеПеречисление>, а вы хотите изменить его на Массив<МояСтруктура>, где МояСтруктура — это некая структура с двумя полями типа Строка и МоеПеречисление, то в этом случае «1С:Шина» не сможет выполнить реструктуризацию таблиц базы данных и вам придется переносить данные самостоятельно.
Также рекомендуется использовать табличную часть в контракте сущности, если в реализациях планируется расширение состава полей. При использовании реквизита-коллекции сделать это не получится.