При разработке универсальных механизмов загрузки данных, обмена или обработки объектов часто возникает необходимость динамически определить структуру справочника. Одной из ключевых задач является выяснение того, является ли справочник подчиненным другому объекту, и если да — кто выступает его владельцем. Рассмотрим подробно, как это реализовать в среде 1С:Предприятие 8, избегая типичных ошибок начинающих разработчиков.
Часто программисты, переходящие с версии 7.7 или только начинающие изучать 8.х, пытаются найти владельца через коллекцию обычных реквизитов или используют методы, предназначенные для поиска данных, а не метаданных. Проанализируем основные заблуждения:
Реквизиты. В 1С 8.х поле Владелец является стандартным реквизитом. Он не создается вручную программистом в дереве реквизитов, а добавляется платформой автоматически при настройке подчиненности. Поэтому поиск через ОбъектМетаданных.Реквизиты.Найти("Владелец") всегда будет возвращать Неопределено.НайтиПоНаименованию() или НайтиПоКоду() применим к элементам справочника в базе данных, но его нельзя вызвать у объекта метаданных.Самый правильный и надежный способ узнать, является ли справочник подчиненным — обратиться к коллекции Владельцы в объекте метаданных этого справочника. Если эта коллекция содержит хотя бы один элемент, значит, справочник имеет владельца.
Рассмотрим пример кода, который позволяет получить объект метаданных по его полному имени и проверить наличие владельцев:
// Получаем метаданные справочника по его имени
НаименованиеСправочника = "ДоговорыКонтрагентов";
ОбъектМетаданных = Метаданные.Справочники[НаименованиеСправочника];
// Проверяем, есть ли владельцы
Если ОбъектМетаданных.Владельцы.Количество() > 0 Тогда
Сообщить("Справочник '" + НаименованиеСправочника + "' является подчиненным.");
// Переберем всех возможных владельцев
Для Каждого Владелец Из ОбъектМетаданных.Владельцы Цикл
Сообщить("Возможный тип владельца: " + Владелец.Имя);
КонецЦикла;
Иначе
Сообщить("Справочник '" + НаименованиеСправочника + "' является независимым.");
КонецЕсли;
В этом примере мы используем свойство Владельцы, которое возвращает коллекцию объектов метаданных. Каждый элемент этой коллекции представляет собой описание объекта (справочника, плана видов характеристик и т.д.), который может выступать владельцем для нашего справочника.
Если нам нужно проанализировать свойства самого поля связи, мы должны обратиться к коллекции СтандартныеРеквизиты. Выясним причину, по которой это может быть полезно: через этот механизм можно узнать синоним поля «Владелец», его видимость или проверку заполнения, установленную в конфигураторе.
Проанализируем ситуацию, когда нам нужно получить описание типов всех возможных владельцев одной строкой:
// Получаем объект метаданных
ОбъектМетаданных = Метаданные.Справочники.ДоговорыКонтрагентов;
// Проверяем наличие стандартного реквизита "Владелец"
СтандартныйРеквизитВладелец = ОбъектМетаданных.СтандартныеРеквизиты.Найти("Владелец");
Если СтандартныйРеквизитВладелец <> Неопределено Тогда
ТипыВладельцев = СтандартныйРеквизитВладелец.Тип;
Сообщить("Справочник подчинен объектам типов: " + ТипыВладельцев);
КонецЕсли;
При разработке универсальных алгоритмов важно не путать владельца (внешняя связь) и родителя (внутренняя связь внутри иерархического справочника). Для проверки иерархии следует использовать свойства Иерархический и ВидИерархии.
Также стоит обратить внимание на свойство ИспользованиеПодчинения. Оно определяет, к каким именно объектам владельца может быть привязан подчиненный элемент. Разберем возможные значения:
Посмотрим на пример кода, проверяющий это свойство:
Использование = ОбъектМетаданных.ИспользованиеПодчинения;
Если Использование = Метаданные.СвойстваОбъектов.ИспользованиеПодчинения.ГруппамИЭлементам Тогда
Сообщить("Допускается подчинение группам владельца.");
Иначе
Сообщить("Подчинение только элементам владельца.");
КонецЕсли;
Для надежного программного определения подчиненности в 1С 8.3 всегда используйте коллекцию Владельцы объекта метаданных. Это позволяет не только определить факт наличия связи, но и корректно обработать ситуацию с множественными типами владельцев, что критически важно для создания отказоустойчивых систем обмена данными и универсальных обработок.