При работе с метаданными в 1С часто возникает задача получить доступ к определенному объекту конфигурации по его имени. Для этого существует удобный метод Метаданные.НайтиПоПолномуИмени(). Однако, когда дело доходит до стандартных табличных частей планов видов расчета, таких как "ВедущиеВидыРасчета" или "БазовыеВидыРасчета", разработчики сталкиваются с проблемой: привычный подход не работает. Давайте разберемся, почему так происходит и как правильно получить доступ к этим метаданным.
Основная проблема, с которой столкнулся автор вопроса, заключается в попытке передать в метод НайтиПоПолномуИмени() строку вида "ПланВидовРасчета.ИмяПлана.СтандартныеТабличныеЧасти.ИмяТабличнойЧасти". Такая конструкция не сработает, и причина кроется в архитектуре метаданных платформы 1С.
Ключевой момент: стандартные табличные части планов видов расчета (ВедущиеВидыРасчета, БазовыеВидыРасчета, ВытесняющиеВидыРасчета) не являются самостоятельными объектами конфигурации верхнего уровня. Они представляют собой подчиненные элементы, а точнее — свойства конкретного объекта метаданных плана видов расчета.
Метод Метаданные.НайтиПоПолномуИмени() предназначен для поиска только основных, корневых объектов, таких как "Справочник.Номенклатура" или "Документ.РеализацияТоваровУслуг". У стандартных табличных частей нет собственного "полного имени", которое можно было бы использовать для прямого поиска.
Более того, их существование в метаданных напрямую зависит от настроек самого плана видов расчета:
БазовыеВидыРасчета появляется, только если у плана видов расчета свойство "Зависимость от базы" имеет значение "Зависит по периоду действия" или "Зависит по периоду регистрации".ВытесняющиеВидыРасчета становится доступной, когда установлен флаг "Использует период действия".Таким образом, для доступа к метаданным этих табличных частей необходимо действовать через их "владельца" — объект метаданных соответствующего плана видов расчета.
Алгоритм получения метаданных стандартной табличной части всегда состоит из двух шагов:
СтандартныеТабличныеЧасти и находим в ней нужный элемент.Рассмотрим каждый шаг и различные способы реализации на примерах.
Сначала нам нужен объект метаданных, описывающий сам план видов расчета. Это можно сделать двумя способами.
1. Прямое обращение, если имя объекта известно на этапе разработки:
ОбъектПВР = Метаданные.ПланыВидовРасчета.ОсновныеНачисленияОрганизаций;
2. Поиск по полному имени, если имя хранится в переменной строкового типа:
ИмяПВР = "ОсновныеНачисленияОрганизаций";
ПолноеИмяПВР = "ПланВидовРасчета." + ИмяПВР;
ОбъектПВР = Метаданные.НайтиПоПолномуИмени(ПолноеИмяПВР);
Оба этих варианта вернут один и тот же объект, с которым мы будем работать дальше.
После того как мы получили объект ОбъектПВР, мы можем обратиться к его свойству СтандартныеТабличныеЧасти. Это коллекция, в которой и содержатся метаданные нужных нам табличных частей. Проанализируем несколько способов найти в ней то, что нам нужно.
Это самый простой и лаконичный способ. Коллекция СтандартныеТабличныеЧасти позволяет обращаться к своим элементам как к свойствам родительского объекта.
// Получаем родительский объект
ОбъектПВР = Метаданные.НайтиПоПолномуИмени("ПланВидовРасчета.ОсновныеНачисленияОрганизаций");
// Обращаемся к нужной ТЧ по имени
МетаданныеВедущихВидовРасчета = ОбъектПВР.СтандартныеТабличныеЧасти.ВедущиеВидыРасчета;
Если МетаданныеВедущихВидовРасчета <> Неопределено Тогда
Сообщить("Метаданные табличной части '" + МетаданныеВедущихВидовРасчета.Имя + "' успешно получены!");
КонецЕсли;
Важно: этот способ может вызвать ошибку времени выполнения, если табличной части с таким именем не существует (например, из-за настроек плана видов расчета). Поэтому его следует использовать либо внутри блока Попытка ... Исключение, либо после предварительной проверки на существование.
Это самый надежный и универсальный метод. Он позволяет безопасно найти нужную табличную часть или проанализировать все доступные стандартные ТЧ для данного плана видов расчета.
ОбъектПВР = Метаданные.ПланыВидовРасчета.ОсновныеНачисленияОрганизаций;
ИскомоеИмяТЧ = "ВедущиеВидыРасчета";
НайденнаяТЧ = Неопределено;
Для Каждого ОписаниеТЧ Из ОбъектПВР.СтандартныеТабличныеЧасти Цикл
Если ОписаниеТЧ.Имя = ИскомоеИмяТЧ Тогда
НайденнаяТЧ = ОписаниеТЧ;
Прервать; // Выходим из цикла, т.к. нашли то, что искали
КонецЕсли;
КонецЦикла;
Если НайденнаяТЧ <> Неопределено Тогда
Сообщить("Найдена табличная часть: " + НайденнаяТЧ.ПолноеИмя());
// Здесь можно выполнять дальнейшие действия с объектом НайденнаяТЧ
КонецЕсли;
Этот подход гарантирует отсутствие ошибок и является предпочтительным в общем случае, особенно в коде, который должен быть устойчив к изменениям в конфигурации.
Это элегантный способ проверить наличие нужной табличной части без цикла и без риска получить исключение. Он особенно удобен, если нужно проверить существование сразу нескольких табличных частей.
ОбъектПВР = Метаданные.ПланыВидовРасчета.ОсновныеНачисленияОрганизаций;
// Создаем структуру, где ключ - имя искомой ТЧ
СтруктураПроверки = Новый Структура("ВедущиеВидыРасчета");
// Пытаемся заполнить значения свойств структуры из коллекции ТЧ
// Если в коллекции есть элемент с именем "ВедущиеВидыРасчета",
// то соответствующее свойство структуры будет заполнено объектом метаданных.
// В противном случае оно останется Неопределено.
ЗаполнитьЗначенияСвойств(СтруктураПроверки, ОбъектПВР.СтандартныеТабличныеЧасти);
Если СтруктураПроверки.ВедущиеВидыРасчета <> Неопределено Тогда
// Полезный код
НужнаяТЧ = СтруктураПроверки.ВедущиеВидыРасчета;
Сообщить("Табличная часть '" + НужнаяТЧ.Имя + "' существует и доступна для работы.");
Иначе
Сообщить("Табличная часть 'ВедущиеВидыРасчета' не найдена.");
КонецЕсли;
Этот метод сочетает в себе краткость и безопасность, что делает его отличным выбором для проверки доступности элементов коллекции.
В заключение, запомним главное правило: для программной работы со стандартными табличными частями плана видов расчета всегда сначала получаем метаданные самого плана, а затем обращаемся к его коллекции СтандартныеТабличныеЧасти одним из рассмотренных способов. Прямой поиск через НайтиПоПолномуИмени() для них не предусмотрен архитектурой платформы.