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

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

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

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

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

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

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

Где посмотреть имя табличной части без программирования

Если задача разовая — например, нужно узнать имя для запроса или обработки — быстрее всего посмотреть его в конфигураторе. Откройте дерево конфигурации, найдите нужный документ и разверните ветку «Табличные части». Имена, которые вы видите в дереве, — это и есть те самые имена, которые используются в коде и запросах.

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

В пользовательском режиме имя не видно напрямую, но его можно вычислить косвенно: открыть палитру свойств элемента формы в конфигураторе или посмотреть запрос, который формирует печатную форму документа — там табличная часть обычно указана по имени.

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

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

ДокументСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000000001", ТекущаяДата());

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

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

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

КонецЦикла;

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

МетаданныеДокумента = Метаданные.Документы.РеализацияТоваровУслуг;

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

Сообщить(ТЧ.Имя);

КонецЦикла;

Коллекция ТабличныеЧасти содержит объекты типа «ОбъектМетаданных: ТабличнаяЧасть», у которых доступны свойства Имя, Синоним и вложенная коллекция Реквизиты. Это позволяет за один проход собрать полное описание структуры документа.

Порядок действий
  1. 1
    Получите ссылку или объект документа либо обратитесь к Метаданные.Документы.<ИмяДокумента>
  2. 2
    Вызовите метод Метаданные() у ссылки или используйте объект метаданных напрямую
  3. 3
    Переберите коллекцию ТабличныеЧасти в цикле
  4. 4
    Считайте свойство Имя у каждого элемента коллекции
  5. 5
    Проверьте результат через Сообщить() или запись в журнал регистрации

Проверка существования табличной части по имени

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

Проверка выполняется методом Найти коллекции метаданных:

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

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

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

Для Каждого Строка Из ДокументСсылка.Товары Цикл

// обработка строк

КонецЦикла;

КонецЕсли;

Метод Найти выполняет поиск по имени с учётом регистра, заданного в конфигураторе, однако на практике имена метаданных регистронезависимы. Если табличная часть не найдена, метод возвращает Неопределено — это и есть признак безопасного ветвления логики.

Получение имени табличной части на форме документа

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

Получить имя активной табличной части можно через текущий элемент формы:

&НаКлиенте

Процедура ПоказатьИмяТабличнойЧасти(Команда)

ТекущийЭлементФормы = ЭтаФорма.ТекущийЭлемент;

Если ТипЗнч(ТекущийЭлементФормы) = Тип("ТаблицаФормы") Тогда

ИмяТЧ = ТекущийЭлементФормы.Имя; // обычно совпадает с именем табличной части

Сообщить(ИмяТЧ);

КонецЕсли;

КонецПроцедуры

Учтите ограничение: разработчик формы мог назвать элемент произвольно, отличным от имени табличной части. Надёжнее читать свойство ПутьКДанным таблицы формы — оно содержит путь вида «Объект.Товары», из которого имя табличной части извлекается после точки:

ПутьКДанным = ТекущийЭлементФормы.ПутьКДанным; // "Объект.Товары"

ЧастиПути = СтрРазделить(ПутьКДанным, ".");

ИмяТабличнойЧасти = ЧастиПути[ЧастиПути.Количество() - 1];

Имя табличной части в запросе и при обращении через точку

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Товары.Номенклатура,

| Товары.Количество

|ИЗ

| Документ.РеализацияТоваровУслуг.Товары КАК Товары

|ГДЕ

| Товары.Ссылка = &Ссылка";

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

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

bsl
ИмяТЧ = "Товары";
Если ДокументСсылка.Метаданные().ТабличныеЧасти.Найти(ИмяТЧ) <> Неопределено Тогда
    Для Каждого Строка Из ДокументСсылка[ИмяТЧ] Цикл
        Сообщить(Строка.Номенклатура);
    КонецЦикла;
КонецЕсли;

Типичные ошибки и ограничения платформы

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

Вторая ошибка — обращение к метаданным в клиентском контексте тонкого или веб-клиента. Объекты метаданных полностью доступны только на сервере; в управляемом приложении код получения имён нужно размещать в серверных процедурах с директивой &НаСервере или &НаСервереБезКонтекста, а на клиент передавать уже готовый массив имён.

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

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

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

Проверка результата и практические приёмы

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

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

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

КоличествоСтрок = ДокументСсылка[ТЧ.Имя].Количество();

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

КонецЦикла;

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

Контрольные точки

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

Вывод имён через Сообщить
Норма

Имена совпадают с веткой 'Табличные части' в конфигураторе

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

Имя содержит пробелы или не совпадает — вероятно, выведен синоним

Обращение к данным по имени
Норма

Количество строк совпадает с видимым в документе

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

Ошибка 'Поле объекта не обнаружено' — табличной части нет или имя неверно

Работа в управляемом приложении
Норма

Код выполняется в серверной процедуре без ошибок

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

Ошибка доступности метаданных на клиенте

Итог

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

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

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

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

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

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

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

Как узнать, сколько табличных частей у документа?

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

Можно ли обратиться к табличной части, если её имя хранится в переменной?

Да, через квадратные скобки: ДокументОбъект[ИмяТабличнойЧасти]. Перед обращением рекомендуется проверить существование табличной части методом Найти у коллекции метаданных, чтобы избежать ошибки исполнения.

Работает ли этот подход для справочников и других объектов?

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

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

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