Как программно определить, является ли справочник подчиненным в 1С 8.3?

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

При разработке универсальных механизмов загрузки данных, обмена или обработки объектов часто возникает необходимость динамически определить структуру справочника. Одной из ключевых задач является выяснение того, является ли справочник подчиненным другому объекту, и если да — кто выступает его владельцем. Рассмотрим подробно, как это реализовать в среде 1С:Предприятие 8, избегая типичных ошибок начинающих разработчиков.

Разбор типичных ошибок при работе с метаданными

Часто программисты, переходящие с версии 7.7 или только начинающие изучать 8.х, пытаются найти владельца через коллекцию обычных реквизитов или используют методы, предназначенные для поиска данных, а не метаданных. Проанализируем основные заблуждения:

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

Использование коллекции «Владельцы» для определения подчиненности

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

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


// Получаем метаданные справочника по его имени
НаименованиеСправочника = "ДоговорыКонтрагентов";
ОбъектМетаданных = Метаданные.Справочники[НаименованиеСправочника];

// Проверяем, есть ли владельцы
Если ОбъектМетаданных.Владельцы.Количество() > 0 Тогда
    Сообщить("Справочник '" + НаименованиеСправочника + "' является подчиненным.");
    
    // Переберем всех возможных владельцев
    Для Каждого Владелец Из ОбъектМетаданных.Владельцы Цикл
        Сообщить("Возможный тип владельца: " + Владелец.Имя);
    КонецЦикла;
Иначе
    Сообщить("Справочник '" + НаименованиеСправочника + "' является независимым.");
КонецЕсли;

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

Работа со стандартными реквизитами

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

Проанализируем ситуацию, когда нам нужно получить описание типов всех возможных владельцев одной строкой:


// Получаем объект метаданных
ОбъектМетаданных = Метаданные.Справочники.ДоговорыКонтрагентов;

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

Если СтандартныйРеквизитВладелец <> Неопределено Тогда
    ТипыВладельцев = СтандартныйРеквизитВладелец.Тип;
    Сообщить("Справочник подчинен объектам типов: " + ТипыВладельцев);
КонецЕсли;

Нюансы подчиненности: иерархия и использование

При разработке универсальных алгоритмов важно не путать владельца (внешняя связь) и родителя (внутренняя связь внутри иерархического справочника). Для проверки иерархии следует использовать свойства Иерархический и ВидИерархии.

Также стоит обратить внимание на свойство ИспользованиеПодчинения. Оно определяет, к каким именно объектам владельца может быть привязан подчиненный элемент. Разберем возможные значения:

Посмотрим на пример кода, проверяющий это свойство:


Использование = ОбъектМетаданных.ИспользованиеПодчинения;
Если Использование = Метаданные.СвойстваОбъектов.ИспользованиеПодчинения.ГруппамИЭлементам Тогда
    Сообщить("Допускается подчинение группам владельца.");
Иначе
    Сообщить("Подчинение только элементам владельца.");
КонецЕсли;

Заключение

Для надежного программного определения подчиненности в 1С 8.3 всегда используйте коллекцию Владельцы объекта метаданных. Это позволяет не только определить факт наличия связи, но и корректно обработать ситуацию с множественными типами владельцев, что критически важно для создания отказоустойчивых систем обмена данными и универсальных обработок.

← На главную