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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с метаданными в 1С часто возникает задача получить доступ к определенному объекту конфигурации по его имени. Для этого существует удобный метод Метаданные.НайтиПоПолномуИмени(). Однако, когда дело доходит до стандартных табличных частей планов видов расчета, таких как "ВедущиеВидыРасчета" или "БазовыеВидыРасчета", разработчики сталкиваются с проблемой: привычный подход не работает. Давайте разберемся, почему так происходит и как правильно получить доступ к этим метаданным.

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

Основная проблема, с которой столкнулся автор вопроса, заключается в попытке передать в метод НайтиПоПолномуИмени() строку вида "ПланВидовРасчета.ИмяПлана.СтандартныеТабличныеЧасти.ИмяТабличнойЧасти". Такая конструкция не сработает, и причина кроется в архитектуре метаданных платформы 1С.

Ключевой момент: стандартные табличные части планов видов расчета (ВедущиеВидыРасчета, БазовыеВидыРасчета, ВытесняющиеВидыРасчета) не являются самостоятельными объектами конфигурации верхнего уровня. Они представляют собой подчиненные элементы, а точнее — свойства конкретного объекта метаданных плана видов расчета.

Метод Метаданные.НайтиПоПолномуИмени() предназначен для поиска только основных, корневых объектов, таких как "Справочник.Номенклатура" или "Документ.РеализацияТоваровУслуг". У стандартных табличных частей нет собственного "полного имени", которое можно было бы использовать для прямого поиска.

Более того, их существование в метаданных напрямую зависит от настроек самого плана видов расчета:

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

Правильный способ: доступ через родительский объект

Алгоритм получения метаданных стандартной табличной части всегда состоит из двух шагов:

  1. Получаем объект метаданных родительского плана видов расчета.
  2. Обращаемся к его коллекции СтандартныеТабличныеЧасти и находим в ней нужный элемент.

Рассмотрим каждый шаг и различные способы реализации на примерах.

Шаг 1. Получение метаданных плана видов расчета

Сначала нам нужен объект метаданных, описывающий сам план видов расчета. Это можно сделать двумя способами.

1. Прямое обращение, если имя объекта известно на этапе разработки:

ОбъектПВР = Метаданные.ПланыВидовРасчета.ОсновныеНачисленияОрганизаций;

2. Поиск по полному имени, если имя хранится в переменной строкового типа:


ИмяПВР = "ОсновныеНачисленияОрганизаций";
ПолноеИмяПВР = "ПланВидовРасчета." + ИмяПВР;
ОбъектПВР = Метаданные.НайтиПоПолномуИмени(ПолноеИмяПВР);

Оба этих варианта вернут один и тот же объект, с которым мы будем работать дальше.

Шаг 2. Поиск нужной табличной части в коллекции

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

Решение 1: Прямое обращение к элементу коллекции по имени

Это самый простой и лаконичный способ. Коллекция СтандартныеТабличныеЧасти позволяет обращаться к своим элементам как к свойствам родительского объекта.


// Получаем родительский объект
ОбъектПВР = Метаданные.НайтиПоПолномуИмени("ПланВидовРасчета.ОсновныеНачисленияОрганизаций");

// Обращаемся к нужной ТЧ по имени
МетаданныеВедущихВидовРасчета = ОбъектПВР.СтандартныеТабличныеЧасти.ВедущиеВидыРасчета;

Если МетаданныеВедущихВидовРасчета <> Неопределено Тогда
    Сообщить("Метаданные табличной части '" + МетаданныеВедущихВидовРасчета.Имя + "' успешно получены!");
КонецЕсли;

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

Решение 2: Перебор коллекции в цикле

Это самый надежный и универсальный метод. Он позволяет безопасно найти нужную табличную часть или проанализировать все доступные стандартные ТЧ для данного плана видов расчета.


ОбъектПВР = Метаданные.ПланыВидовРасчета.ОсновныеНачисленияОрганизаций;
ИскомоеИмяТЧ = "ВедущиеВидыРасчета";
НайденнаяТЧ = Неопределено;

Для Каждого ОписаниеТЧ Из ОбъектПВР.СтандартныеТабличныеЧасти Цикл
    Если ОписаниеТЧ.Имя = ИскомоеИмяТЧ Тогда
        НайденнаяТЧ = ОписаниеТЧ;
        Прервать; // Выходим из цикла, т.к. нашли то, что искали
    КонецЕсли;
КонецЦикла;

Если НайденнаяТЧ <> Неопределено Тогда
    Сообщить("Найдена табличная часть: " + НайденнаяТЧ.ПолноеИмя());
    // Здесь можно выполнять дальнейшие действия с объектом НайденнаяТЧ
КонецЕсли;

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

Решение 3: Проверка наличия через структуру и ЗаполнитьЗначенияСвойств()

Это элегантный способ проверить наличие нужной табличной части без цикла и без риска получить исключение. Он особенно удобен, если нужно проверить существование сразу нескольких табличных частей.


ОбъектПВР = Метаданные.ПланыВидовРасчета.ОсновныеНачисленияОрганизаций;

// Создаем структуру, где ключ - имя искомой ТЧ
СтруктураПроверки = Новый Структура("ВедущиеВидыРасчета");

// Пытаемся заполнить значения свойств структуры из коллекции ТЧ
// Если в коллекции есть элемент с именем "ВедущиеВидыРасчета",
// то соответствующее свойство структуры будет заполнено объектом метаданных.
// В противном случае оно останется Неопределено.
ЗаполнитьЗначенияСвойств(СтруктураПроверки, ОбъектПВР.СтандартныеТабличныеЧасти);

Если СтруктураПроверки.ВедущиеВидыРасчета <> Неопределено Тогда
    // Полезный код
    НужнаяТЧ = СтруктураПроверки.ВедущиеВидыРасчета;
    Сообщить("Табличная часть '" + НужнаяТЧ.Имя + "' существует и доступна для работы.");
Иначе
    Сообщить("Табличная часть 'ВедущиеВидыРасчета' не найдена.");
КонецЕсли;

Этот метод сочетает в себе краткость и безопасность, что делает его отличным выбором для проверки доступности элементов коллекции.

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

← На главную