Разработка и Конфигурация · 11 мин
Как получить имя табличной части документа в 1С
Способы получить имя табличной части документа в 1С: через метаданные в конфигураторе, перебором в коде, по строке таблицы. Примеры кода и частые ошибки.
Имя табличной части документа нужно разработчику в самых разных сценариях: при универсальной обработке данных, построении динамических запросов, выгрузке в XML или обмене между конфигурациями. В отличие от реквизитов шапки, табличные части не имеют фиксированного состава — у одного документа их может быть несколько, а у другого ни одной, поэтому имя приходится получать программно через объект метаданных.
Основной инструмент — коллекция Метаданные.ТабличныеЧасти у объекта метаданных документа. Обратившись к ней, можно перебрать все табличные части, узнать их имена, синонимы и состав реквизитов. Это работает как на сервере, так и в толстом клиенте, а в управляемом приложении — в серверных процедурах модуля.
Ниже разобраны рабочие способы: от простого просмотра имени в конфигураторе до универсального кода, который получает имя табличной части по ссылке на документ, по объекту и даже по строке таблицы на форме. Отдельно рассмотрены типичные ошибки и ограничения платформы.
Где посмотреть имя табличной части без программирования
Если задача разовая — например, нужно узнать имя для запроса или обработки — быстрее всего посмотреть его в конфигураторе. Откройте дерево конфигурации, найдите нужный документ и разверните ветку «Табличные части». Имена, которые вы видите в дереве, — это и есть те самые имена, которые используются в коде и запросах.
Обратите внимание: в дереве отображается именно имя, а не синоним. Синоним — это представление для пользователя (например, «Товары и услуги»), а имя — идентификатор без пробелов (например, ТоварыУслуги). В запросах и обращениях через точку используется только имя.
В пользовательском режиме имя не видно напрямую, но его можно вычислить косвенно: открыть палитру свойств элемента формы в конфигураторе или посмотреть запрос, который формирует печатную форму документа — там табличная часть обычно указана по имени.
Получение имени через метаданные документа
Универсальный способ — обратиться к объекту метаданных документа и перебрать коллекцию табличных частей. Код работает для любого документа, если известна его ссылка или объект:
ДокументСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000000001", ТекущаяДата());
МетаданныеДокумента = ДокументСсылка.Метаданные();
Для Каждого ТабличнаяЧасть Из МетаданныеДокумента.ТабличныеЧасти Цикл
Сообщить("Имя: " + ТабличнаяЧасть.Имя + ", синоним: " + ТабличнаяЧасть.Синоним);
КонецЦикла;
Если документа в базе ещё нет и ссылку получить неоткуда, можно обратиться к метаданным напрямую по имени вида документа:
МетаданныеДокумента = Метаданные.Документы.РеализацияТоваровУслуг;
Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
Сообщить(ТЧ.Имя);
КонецЦикла;
Коллекция ТабличныеЧасти содержит объекты типа «ОбъектМетаданных: ТабличнаяЧасть», у которых доступны свойства Имя, Синоним и вложенная коллекция Реквизиты. Это позволяет за один проход собрать полное описание структуры документа.
- 1Получите ссылку или объект документа либо обратитесь к Метаданные.Документы.<ИмяДокумента>
- 2Вызовите метод Метаданные() у ссылки или используйте объект метаданных напрямую
- 3Переберите коллекцию ТабличныеЧасти в цикле
- 4Считайте свойство Имя у каждого элемента коллекции
- 5Проверьте результат через Сообщить() или запись в журнал регистрации
Проверка существования табличной части по имени
Частая задача — перед обращением к табличной части убедиться, что она вообще есть у данного вида документа. Это критично в универсальных обработках, которые работают с разными видами документов: обращение к несуществующей табличной части вызовет ошибку исполнения.
Проверка выполняется методом Найти коллекции метаданных:
МетаданныеДокумента = ДокументСсылка.Метаданные();
Если МетаданныеДокумента.ТабличныеЧасти.Найти("Товары") <> Неопределено Тогда
// Табличная часть "Товары" существует, можно обращаться
Для Каждого Строка Из ДокументСсылка.Товары Цикл
// обработка строк
КонецЦикла;
КонецЕсли;
Метод Найти выполняет поиск по имени с учётом регистра, заданного в конфигураторе, однако на практике имена метаданных регистронезависимы. Если табличная часть не найдена, метод возвращает Неопределено — это и есть признак безопасного ветвления логики.
Получение имени табличной части на форме документа
Когда код работает в модуле формы, задача меняется: часто нужно узнать, какая табличная часть связана с конкретной таблицей на форме, или наоборот — найти элемент формы по имени табличной части. В управляемой форме таблица, как правило, привязана к реквизиту формы, имя которого совпадает с именем табличной части объекта.
Получить имя активной табличной части можно через текущий элемент формы:
&НаКлиенте
Процедура ПоказатьИмяТабличнойЧасти(Команда)
ТекущийЭлементФормы = ЭтаФорма.ТекущийЭлемент;
Если ТипЗнч(ТекущийЭлементФормы) = Тип("ТаблицаФормы") Тогда
ИмяТЧ = ТекущийЭлементФормы.Имя; // обычно совпадает с именем табличной части
Сообщить(ИмяТЧ);
КонецЕсли;
КонецПроцедуры
Учтите ограничение: разработчик формы мог назвать элемент произвольно, отличным от имени табличной части. Надёжнее читать свойство ПутьКДанным таблицы формы — оно содержит путь вида «Объект.Товары», из которого имя табличной части извлекается после точки:
ПутьКДанным = ТекущийЭлементФормы.ПутьКДанным; // "Объект.Товары"
ЧастиПути = СтрРазделить(ПутьКДанным, ".");
ИмяТабличнойЧасти = ЧастиПути[ЧастиПути.Количество() - 1];
Имя табличной части в запросе и при обращении через точку
В языке запросов табличная часть документа доступна как отдельная виртуальная таблица с полным именем вида Документ.РеализацияТоваровУслуг.Товары. Здесь последний сегмент — это и есть имя табличной части, полученное любым из описанных способов:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.Количество
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Товары
|ГДЕ
| Товары.Ссылка = &Ссылка";
Если запрос строится динамически, имя табличной части подставляется в текст запроса строкой. Перед подстановкой обязательно проверьте её существование через метаданные — иначе конструктор запроса вернёт ошибку о несуществующей таблице уже на этапе выполнения.
При обращении через точку в коде имя используется как имя свойства объекта документа: ДокументОбъект.Товары. Для динамического обращения по строке с именем применяйте квадратные скобки: ДокументОбъект[ИмяТабличнойЧасти] — это безопасный приём для универсальных алгоритмов.
ИмяТЧ = "Товары";
Если ДокументСсылка.Метаданные().ТабличныеЧасти.Найти(ИмяТЧ) <> Неопределено Тогда
Для Каждого Строка Из ДокументСсылка[ИмяТЧ] Цикл
Сообщить(Строка.Номенклатура);
КонецЦикла;
КонецЕсли;Типичные ошибки и ограничения платформы
Первая распространённая ошибка — попытка получить табличные части у объекта, у которого их нет по определению: у некоторых видов документов табличные части отсутствуют, а у справочников коллекция называется так же, но реквизиты могут отличаться. Всегда проверяйте количество элементов коллекции перед перебором.
Вторая ошибка — обращение к метаданным в клиентском контексте тонкого или веб-клиента. Объекты метаданных полностью доступны только на сервере; в управляемом приложении код получения имён нужно размещать в серверных процедурах с директивой &НаСервере или &НаСервереБезКонтекста, а на клиент передавать уже готовый массив имён.
Третья ошибка — использование синонима вместо имени при построении запроса или обращении через квадратные скобки. Синоним может содержать пробелы и кириллицу в произвольном виде, и платформа не сможет разрешить такое обращение.
Отдельно стоит помнить про права: если у пользователя нет прав на чтение документа, код получения данных табличной части завершится ошибкой доступа, хотя чтение метаданных при этом может быть доступно. В универсальных обработках оборачивайте обращения к данным в попытку-исключение.
Проверка результата и практические приёмы
После написания кода проверьте результат на нескольких видах документов: с одной табличной частью, с несколькими и без них. Для отладки удобно выводить не только имя, но и количество строк в каждой табличной части конкретного документа — это сразу показывает, что обращение прошло корректно:
МетаданныеДокумента = ДокументСсылка.Метаданные();
Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
КоличествоСтрок = ДокументСсылка[ТЧ.Имя].Количество();
Сообщить(ТЧ.Имя + ": строк — " + КоличествоСтрок);
КонецЦикла;
Для универсальных обработок полезно собрать имена табличных частей в массив или список значений один раз при открытии формы и дальше работать с кэшированным списком — это снижает число обращений к метаданным и упрощает отладку.
Как проверить результат
Имена совпадают с веткой 'Табличные части' в конфигураторе
Имя содержит пробелы или не совпадает — вероятно, выведен синоним
Количество строк совпадает с видимым в документе
Ошибка 'Поле объекта не обнаружено' — табличной части нет или имя неверно
Код выполняется в серверной процедуре без ошибок
Ошибка доступности метаданных на клиенте
Что важно запомнить
Имя табличной части получают через коллекцию Метаданные().ТабличныеЧасти, проверяют существование методом Найти, а на форме надёжнее читать ПутьКДанным таблицы. В коде и запросах используется только имя, не синоним.
Частые вопросы
Можно ли получить имя табличной части в тонком клиенте без вызова сервера?
Нет. Объекты метаданных доступны только на сервере. Решение — вызвать серверную процедуру, которая вернёт массив или список значений с именами, и дальше работать с ним на клиенте.
Чем имя табличной части отличается от синонима?
Имя — внутренний идентификатор без пробелов, который используется в коде, запросах и при выгрузке данных. Синоним — произвольное представление для пользователя в интерфейсе. Обращение по синониму в коде невозможно.
Как узнать, сколько табличных частей у документа?
Используйте выражение ДокументСсылка.Метаданные().ТабличныеЧасти.Количество(). Если результат равен нулю, у документа табличных частей нет, и перебирать нечего.
Можно ли обратиться к табличной части, если её имя хранится в переменной?
Да, через квадратные скобки: ДокументОбъект[ИмяТабличнойЧасти]. Перед обращением рекомендуется проверить существование табличной части методом Найти у коллекции метаданных, чтобы избежать ошибки исполнения.
Работает ли этот подход для справочников и других объектов?
Да, коллекция ТабличныеЧасти есть у объектов метаданных справочников, документов, обработок, отчётов и некоторых других видов. Код перебора идентичен, меняется только обращение к нужной ветке метаданных.
Почему запрос к табличной части возвращает пустой результат?
Чаще всего причина не в имени, а в отборе: проверьте условие по ссылке и то, проведён ли документ. Также убедитесь, что у текущего пользователя есть права на чтение документа — при их отсутствии запрос может вернуть пустую выборку без явной ошибки.