К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как обратиться к владельцу справочника в 1С

Как обратиться к владельцу справочника в 1С 8.3: свойство Владелец, отбор по владельцу, запросы, подчинённые справочники, типовые ошибки и примеры кода.

Подчинённые справочники — стандартный механизм платформы 1С:Предприятие 8, при котором элементы одного справочника привязываются к элементам другого через системный реквизит «Владелец». Классические примеры из типовых конфигураций: «Единицы измерения» подчинены «Номенклатуре», «Договоры контрагентов» — справочнику «Контрагенты», «Банковские счета» — «Организациям» или «Контрагентам». Чтобы получить, изменить или отфильтровать данные по этой связи, нужно обратиться к владельцу справочника.

Обращение к владельцу выполняется через свойство Владелец объекта или ссылки подчинённого элемента. Синтаксис одинаков в модуле объекта, в форме, в запросе и при программном создании элементов, но у каждого сценария есть свои особенности и ограничения. Ниже разобраны рабочие примеры кода, способы отбора по владельцу, типичные ошибки и способы проверить, что связь настроена корректно.

Что такое владелец справочника и где он настраивается

Связь «владелец — подчинённый» задаётся не в коде, а в конфигураторе. Откройте свойства подчинённого справочника, перейдите на вкладку «Владельцы» и отметьте справочник, который будет выступать владельцем. После этого у каждого элемента подчинённого справочника появляется обязательный реквизит «Владелец», без заполнения которого элемент нельзя записать.

У одного справочника может быть несколько владельцев — тогда реквизит «Владелец» получает составной тип. Например, «Банковские счета» могут принадлежать и организациям, и контрагентам. Это важно учитывать при программной проверке: сравнение владельца с конкретной ссылкой нужно выполнять с учётом типа.

Как получить владельца элемента в коде

Самый частый сценарий — у вас есть ссылка на элемент подчинённого справочника, и нужно узнать его владельца. Для ссылки значение реквизита читается напрямую через точку, при этом платформа выполняет обращение к базе данных:

ВладелецЭлемента = ЭлементСсылка.Владелец;

// Например: получить контрагента по договору

Контрагент = ДоговорСсылка.Владелец;

Если вы работаете с объектом (например, в модуле объекта или после ПолучитьОбъект()), синтаксис идентичен: Объект.Владелец. Через владельца можно «подняться» дальше по цепочке реквизитов: ДоговорСсылка.Владелец.ИНН — но каждое такое разыменование обращается к базе, поэтому в циклах лучше использовать запрос.

Проверить тип владельца при составном типе можно так:

Если ТипЗнч(ЭлементСсылка.Владелец) = Тип("СправочникСсылка.Организации") Тогда

// владелец — организация

КонецЕсли;

Как отобрать элементы по владельцу

Отбор запросом

Оптимальный способ получить все элементы, подчинённые конкретному владельцу, — запрос с параметром:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ЕдиницыИзмерения.Ссылка КАК Ссылка,

| ЕдиницыИзмерения.Наименование КАК Наименование

|ИЗ

| Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения

|ГДЕ

| ЕдиницыИзмерения.Владелец = &Владелец";

Запрос.УстановитьПараметр("Владелец", НоменклатураСсылка);

Результат = Запрос.Выполнить().Выгрузить();

Отбор методом Выбрать

Для простых случаев подойдёт метод Выбрать менеджера справочника, где владелец передаётся вторым параметром:

Выборка = Справочники.ЕдиницыИзмерения.Выбрать(, НоменклатураСсылка);

Пока Выборка.Следующий() Цикл

// обработка Выборка.Ссылка

КонецЦикла;

Отбор в динамическом списке формы

На управляемой форме списка подчинённого справочника отбор по владельцу обычно настраивается автоматически: если список размещён на форме элемента-владельца и связь параметров установлена, платформа сама фильтрует записи. Вручную это делается через элемент отбора динамического списка: поле «Владелец», вид сравнения «Равно», значение — ссылка на владельца. Для программной установки используется Список.Отбор.Элементы или параметр Отбор при открытии формы через ОткрытьФорму.

Как открыть список с отбором по владельцу
  1. 1
    Сформируйте структуру параметров: Новый Структура("Отбор", Новый Структура("Владелец", СсылкаНаВладельца))
  2. 2
    Вызовите ОткрытьФорму("Справочник.ЕдиницыИзмерения.ФормаСписка", ПараметрыФормы)
  3. 3
    Проверьте, что в открывшемся списке видны только элементы нужного владельца

Как установить владельца при создании элемента

При программном создании элемента подчинённого справочника реквизит «Владелец» обязателен. Если оставить его пустым, метод Записать() выдаст ошибку о незаполненном обязательном реквизите:

НовыйЭлемент = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();

НовыйЭлемент.Владелец = КонтрагентСсылка; // обязательно до записи

НовыйЭлемент.Наименование = "Договор поставки № 15";

НовыйЭлемент.Записать();

Сменить владельца у существующего элемента тоже можно, но делать это нужно осознанно: элемент фактически «переезжает» к другому владельцу, и все отчёты и подборы, построенные на этой связи, начнут показывать его в новом месте. Перед такой операцией проверьте, нет ли в конфигурации логики, которая запрещает перенос (например, в обработчике ПередЗаписью).

Обращение к владельцу в запросах и СКД

В языке запросов поле «Владелец» доступно как обычный реквизит. Через него можно соединять таблицы и получать данные владельца без дополнительного соединения — используйте разыменование через точку:

ВЫБРАТЬ

Договоры.Ссылка КАК Договор,

Договоры.Владелец КАК Контрагент,

Договоры.Владелец.ИНН КАК ИННКонтрагента

ИЗ

Справочник.ДоговорыКонтрагентов КАК Договоры

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

Типичные ошибки
01
Сравнение владельца с данными формы вместо ссылки: отбор не срабатывает, потому что типы не совпадают
02
Запись элемента без заполнения Владельца — ошибка обязательного реквизита при Записать()
03
Чтение ЭлементСсылка.Владелец внутри цикла по тысячам записей вместо запроса — резкое падение производительности
04
Поиск реквизита Владелец у справочника, для которого в конфигураторе не заданы владельцы — такого свойства у объекта нет

Как проверить и изменить связь владельца в конфигураторе

Если обращение к Владелец вызывает ошибку «Поле объекта не обнаружено», первым делом проверьте настройку справочника: откройте его в конфигураторе, вкладка «Владельцы» должна содержать хотя бы один справочник. Если вкладка пуста, справочник не является подчинённым, и свойство недоступно.

Добавление владельца к существующему справочнику, в котором уже есть данные, — потенциально опасная операция. При обновлении конфигурации базы данных платформа потребует реструктуризацию, а существующие элементы окажутся с пустым владельцем. Их потребуется обработать: либо заполнить владельца обработкой, либо удалить. Выполняйте такое изменение только на копии базы с последующей проверкой данных.

Контрольные точки

Как проверить результат

Свойство Владелец в коде
Норма

Возвращает заполненную ссылку нужного типа

Тревожный признак

Ошибка «Поле объекта не обнаружено» или пустая ссылка

Отбор в списке по владельцу
Норма

Видны только элементы выбранного владельца

Тревожный признак

Список пуст или показывает все элементы

Запись нового элемента
Норма

Записать() выполняется без ошибок

Тревожный признак

Сообщение о незаполненном обязательном реквизите Владелец

Альтернативы подчинённым справочникам

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

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

Способы связать объекты

Подчинённый справочник

Один владелец у элемента, автоматический отбор в интерфейсе. Не подходит для связей «многие ко многим» и исторических данных

Реквизит типа СправочникСсылка

Гибкая связь без обязательного заполнения, но отборы и навигацию нужно реализовывать вручную

Регистр сведений

Поддерживает периодичность и связи «многие ко многим», но требует больше кода и отдельных форм

Итог

Что важно запомнить

Обращение к владельцу выполняется через системное свойство Владелец: ЭлементСсылка.Владелец в коде, поле Владелец в запросе и СКД. Отбор по владельцу делается параметром запроса, методом Выбрать или отбором динамического списка. При создании элемента владелец заполняется до записи, а массовые изменения связи выполняются только после резервного копирования.

Частые вопросы

Как получить владельца, если у меня только наименование элемента?

Сначала найдите ссылку методом НайтиПоНаименованию менеджера справочника, затем обратитесь к свойству Владелец найденной ссылки. Учтите, что наименования могут повторяться, поэтому надёжнее искать по коду или по комбинации реквизитов.

Почему отбор по владельцу возвращает пустой список?

Чаще всего причина в несовпадении типов: в отбор передаётся не ссылка, а, например, строка или объект другого типа. Проверьте, что параметр имеет тип СправочникСсылка нужного вида, и что у элементов владелец действительно заполнен.

Можно ли обратиться к владельцу владельца?

Да, если справочник-владелец сам подчинён другому справочнику: ЭлементСсылка.Владелец.Владелец. Однако каждое разыменование — обращение к базе, поэтому в массовых операциях такую цепочку лучше реализовать соединениями в запросе.

Как запретить пользователю менять владельца у элемента?

Стандартный способ — в модуле объекта в обработчике ПередЗаписью сравнить ЭтотОбъект.Владелец со значением из базы (получить через Ссылка.Владелец) и при несовпадении вызвать Отказ = Истина с сообщением пользователю. Дополнительно можно ограничить доступность поля на форме.

Работает ли свойство Владелец на клиенте в управляемом приложении?

Для ссылок чтение реквизита доступно и в клиентском контексте, но вызывает серверный вызов. Если значение нужно многократно, лучше получить его один раз на сервере (например, в обработчике ПриСозданииНаСервере) и хранить в реквизите формы.

Что делать, если в типовой конфигурации справочник не подчинён, а связь нужна?

Не изменяйте типовой объект напрямую без необходимости — это усложнит обновление. Рассмотрите добавление связи через расширение конфигурации или через дополнительный регистр сведений, который свяжет элементы без изменения структуры типового справочника.