К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как в 1С получить имя табличной части

Как в 1С получить имя табличной части документа или справочника: через метаданные, коллекцию ТабличныеЧасти, перебор строк. Примеры кода, ошибки, FAQ.

Имя табличной части в 1С требуется, когда код должен работать с разными документами универсально: построить запрос, скопировать строки, вывести печатную форму или заполнить данные программно. Обратиться к табличной части «в лоб» через точку (Документ.Товары) можно только тогда, когда имя известно заранее. Если же алгоритм пишется для произвольного объекта, имя приходится получать через метаданные.

Встроенный язык 1С даёт для этого два основных пути: коллекцию Метаданные.ТабличныеЧасти у объекта метаданных и коллекцию ТабличныеЧасти у конкретного объекта данных. Оба подхода возвращают имена в виде строк, которые затем используются через квадратные скобки: Объект["Товары"].

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

Через что получают имя табличной части

Табличная часть — составная часть объекта конфигурации (документа, справочника, плана счетов и т.д.), описанная в метаданных. У каждой табличной части есть имя, заданное разработчиком в конфигураторе, например «Товары», «Услуги», «Сотрудники». Именно это имя используется в запросах, обращениях к коллекциям строк и при программном заполнении.

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

Важно различать: метаданные описывают структуру (имена, реквизиты, типы), а объект данных хранит сами строки. Для получения имени достаточно метаданных; для чтения или изменения строк нужен объект данных.

Получение имени через метаданные объекта

Самый универсальный способ — перебрать коллекцию табличных частей у объекта метаданных. Подходит, когда есть ссылка на документ или справочник, но заранее неизвестно, какие табличные части у него есть.

ОбъектМетаданных = СсылкаНаДокумент.Метаданные();

Для Каждого ТабличнаяЧасть Из ОбъектМетаданных.ТабличныеЧасти Цикл

Сообщить("Имя табличной части: " + ТабличнаяЧасть.Имя);

КонецЦикла;

Здесь ТабличнаяЧасть.Имя — строка с именем, например «Товары». Кроме имени у элемента коллекции доступны Синоним (представление для пользователя) и коллекция Реквизиты, что удобно для построения универсальных выгрузок.

Если нужно проверить существование конкретной табличной части, используйте метод Найти:

Если ОбъектМетаданных.ТабличныеЧасти.Найти("Товары") <> Неопределено Тогда

// табличная часть "Товары" существует

КонецЕсли;

bsl
Для Каждого ТЧ Из Ссылка.Метаданные().ТабличныеЧасти Цикл
    Сообщить(ТЧ.Имя);
КонецЦикла;

Перебор табличных частей у объекта данных

Если работа идёт с открытым объектом (через ПолучитьОбъект() или в модуле объекта через ЭтотОбъект), можно перебрать коллекцию ТабличныеЧасти самого объекта. Эта коллекция содержит сами табличные части с данными, а имя каждой получают через её метаданные:

ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();

Для Каждого ТабличнаяЧасть Из ДокументОбъект.Метаданные().ТабличныеЧасти Цикл

ИмяТЧ = ТабличнаяЧасть.Имя;

КоллекцияСтрок = ДокументОбъект[ИмяТЧ];

Сообщить(ИмяТЧ + ": строк — " + КоллекцияСтрок.Количество());

КонецЦикла;

Ключевой приём — обращение по строковому имени через квадратные скобки: ДокументОбъект[ИмяТЧ]. Это позволяет писать код, не привязанный к конкретной конфигурации.

В модуле объекта или формы документа аналогично работает обращение к ЭтотОбъект (в модуле объекта) или к реквизиту формы типа «ДанныеФормыСтруктура» — в последнем случае коллекцию табличных частей формы перебирают через Элементы формы или через метаданные объекта, связанного с формой.

Получение имени для таблицы значений и запроса

Когда табличная часть выгружена в таблицу значений

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

Построение запроса к табличной части

В тексте запроса табличная часть указывается через точку после имени документа: Документ.РеализацияТоваровУслуг.Товары. Чтобы собрать такой запрос динамически, имя табличной части подставляют строкой:

ИмяТЧ = СсылкаНаДокумент.Метаданные().ТабличныеЧасти[0].Имя;

ИмяДокумента = СсылкаНаДокумент.Метаданные().Имя;

ТекстЗапроса = "ВЫБРАТЬ * ИЗ Документ." + ИмяДокумента + "." + ИмяТЧ

+ " ГДЕ Ссылка = &Ссылка";

Такой подход применяют в универсальных отчётах и обработках сравнения данных. Учтите: обращение ТабличныеЧасти[0] берёт первую табличную часть по порядку в конфигураторе, что не всегда совпадает с нужной логически — надёжнее искать по имени через Найти().

Особенности для разных типов объектов

Не у всех объектов метаданных есть табличные части. Коллекция ТабличныеЧасти существует у документов, справочников, планов видов характеристик, планов счетов, планов видов расчёта, бизнес-процессов, задач и некоторых других объектов. У регистров, констант, перечислений табличных частей нет — обращение к свойству вызовет ошибку.

Чтобы код не падал, проверяйте наличие свойства через метаданные или тип объекта:

ОбъектМетаданных = Ссылка.Метаданные();

Если Метаданные.Документы.Содержит(ОбъектМетаданных)

Или Метаданные.Справочники.Содержит(ОбъектМетаданных) Тогда

// у объекта может быть коллекция ТабличныеЧасти

КонецЕсли;

Дополнительный нюанс: у иерархических справочников и планов счетов табличные части принадлежат объекту целиком, а у документов — тоже объекту, но строки часто завязаны на проведение. Удаление строк табличной части у проведённого документа без перепроведения приведёт к расхождению данных движений и документа.

Тип объектаЕсть табличные частиОсобенность
ДокументДаСтроки связаны с проведением
СправочникДаОбщие для всех элементов по виду
План видов характеристикДаАналогично справочнику
Регистр сведений / накопленияНетДанные — записи регистра, не табличная часть
Перечисление, константаНетОбращение вызовет ошибку

Типичные ошибки и как их избежать

Самая частая ошибка — попытка обратиться к несуществующей табличной части по «жёстко» прописанному имени. В типовых конфигурациях имена отличаются: в одном документе «Товары», в другом «Запасы» или «Материалы». Перед обращением всегда проверяйте наличие через Найти().

Вторая ошибка — путаница между именем и синонимом. Синоним («Товары и услуги») предназначен для интерфейса и не работает в обращениях через квадратные скобки и в запросах. Использовать нужно только свойство Имя.

Третья группа ошибок — обращение к ТабличныеЧасти у объекта, у которого их нет, либо попытка получить имя у таблицы значений после выгрузки. Обе ситуации решаются проверкой типа и сохранением имени до выгрузки.

Типичные ошибки
01
Обращение Объект.Товары без проверки — падает на документах с другим именем табличной части
02
Использование синонима вместо имени — синоним не работает в коде и запросах
03
Вызов ПолучитьОбъект() только ради имени — лишняя нагрузка, имя доступно через ссылку
04
Поиск имени у таблицы значений после Выгрузить() — имя теряется, сохраняйте его заранее

Проверка результата и практические рекомендации

После получения имени проверьте, что обращение по нему работает: выполните Объект[ИмяТЧ].Количество() в отладчике или через Сообщить(). Если возвращается число строк — имя корректно. Ошибка «Поле объекта не обнаружено» означает, что имя не совпадает с метаданными.

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

Порядок действий
  1. 1
    Получите объект метаданных: Ссылка.Метаданные()
  2. 2
    Переберите коллекцию ТабличныеЧасти или найдите нужную через Найти(Имя)
  3. 3
    Сохраните имя в строковую переменную
  4. 4
    Обратитесь к данным через Объект[ИмяТЧ] или подставьте имя в текст запроса
  5. 5
    Проверьте результат: количество строк или выполнение запроса без ошибок
Контрольные точки

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

Обращение Объект[ИмяТЧ]
Норма

Возвращается коллекция строк, Количество() даёт число

Тревожный признак

Ошибка «Поле объекта не обнаружено» — имя не совпадает с метаданными

Метод Найти(Имя)
Норма

Возвращает элемент коллекции, а не Неопределено

Тревожный признак

Неопределено — табличной части с таким именем нет

Динамический запрос
Норма

Запрос выполняется и возвращает строки

Тревожный признак

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

Итог

Что важно запомнить

Имя табличной части получают из метаданных: Ссылка.Метаданные().ТабличныеЧасти[i].Имя. Обращение к данным по имени — через квадратные скобки Объект[Имя]. Всегда проверяйте существование табличной части через Найти() и не путайте имя с синонимом.

Частые вопросы

Как получить имена всех табличных частей конфигурации сразу?

Переберите виды объектов верхнего уровня: Метаданные.Документы, Метаданные.Справочники и т.д., а внутри каждого объекта — коллекцию ТабличныеЧасти. Так строят полную карту табличных частей, например для обработки поиска ссылок или аудита структуры.

Можно ли узнать имя табличной части на форме документа?

Да. У формы есть реквизит с данными объекта — получите его метаданные через РеквизитФормыВЗначение() или используйте Объект.Ссылка.Метаданные() в серверной процедуре. Также имя элемента формы (таблицы) часто совпадает с именем табличной части, но полагаться на это нельзя — элементы формы могут называться иначе.

Чем имя отличается от синонима табличной части?

Имя — технический идентификатор, используемый в коде, запросах и обращениях через квадратные скобки. Синоним — пользовательское представление для интерфейса, может содержать пробелы и меняться локализацией. В программном коде работает только имя.

Почему Объект[ИмяТЧ] возвращает ошибку, хотя табличная часть есть?

Чаще всего имя содержит лишние пробелы, переносы или перепутан регистр — сравните строку с Метаданные().ТабличныеЧасти.Найти(Имя). Также проверьте, что обращаетесь именно к объекту данных, а не к ссылке: у ссылки прямой доступ к строкам табличной части отсутствует.

Как получить имя табличной части у строки табличной части?

У строки есть метод Владелец() (в ряде контекстов) или доступ через родительскую коллекцию, но надёжнее передавать имя отдельным параметром туда, где обрабатывается строка. Самостоятельного свойства с именем табличной части у строки нет.

Работает ли этот способ внешне, из запроса к информационной базе?

Через встроенный язык — да, в любом контексте, где доступна ссылка или объект. При обращении извне (COM, веб-сервисы, OData) имена табличных частей видны в метаданных публикации, но механика перебора зависит от используемого интерфейса доступа.