Разработка и Конфигурация · 10 мин
Как обратиться к владельцу справочника в 1С
Как обратиться к владельцу справочника в 1С 8.3: свойство Владелец, отбор по владельцу, запросы, подчинённые справочники, типовые ошибки и примеры кода.
Подчинённые справочники — стандартный механизм платформы 1С:Предприятие 8, при котором элементы одного справочника привязываются к элементам другого через системный реквизит «Владелец». Классические примеры из типовых конфигураций: «Единицы измерения» подчинены «Номенклатуре», «Договоры контрагентов» — справочнику «Контрагенты», «Банковские счета» — «Организациям» или «Контрагентам». Чтобы получить, изменить или отфильтровать данные по этой связи, нужно обратиться к владельцу справочника.
Обращение к владельцу выполняется через свойство Владелец объекта или ссылки подчинённого элемента. Синтаксис одинаков в модуле объекта, в форме, в запросе и при программном создании элементов, но у каждого сценария есть свои особенности и ограничения. Ниже разобраны рабочие примеры кода, способы отбора по владельцу, типичные ошибки и способы проверить, что связь настроена корректно.
Что такое владелец справочника и где он настраивается
Связь «владелец — подчинённый» задаётся не в коде, а в конфигураторе. Откройте свойства подчинённого справочника, перейдите на вкладку «Владельцы» и отметьте справочник, который будет выступать владельцем. После этого у каждого элемента подчинённого справочника появляется обязательный реквизит «Владелец», без заполнения которого элемент нельзя записать.
У одного справочника может быть несколько владельцев — тогда реквизит «Владелец» получает составной тип. Например, «Банковские счета» могут принадлежать и организациям, и контрагентам. Это важно учитывать при программной проверке: сравнение владельца с конкретной ссылкой нужно выполнять с учётом типа.
Как получить владельца элемента в коде
Самый частый сценарий — у вас есть ссылка на элемент подчинённого справочника, и нужно узнать его владельца. Для ссылки значение реквизита читается напрямую через точку, при этом платформа выполняет обращение к базе данных:
ВладелецЭлемента = ЭлементСсылка.Владелец;
// Например: получить контрагента по договору
Контрагент = ДоговорСсылка.Владелец;
Если вы работаете с объектом (например, в модуле объекта или после ПолучитьОбъект()), синтаксис идентичен: Объект.Владелец. Через владельца можно «подняться» дальше по цепочке реквизитов: ДоговорСсылка.Владелец.ИНН — но каждое такое разыменование обращается к базе, поэтому в циклах лучше использовать запрос.
Проверить тип владельца при составном типе можно так:
Если ТипЗнч(ЭлементСсылка.Владелец) = Тип("СправочникСсылка.Организации") Тогда
// владелец — организация
КонецЕсли;
Как отобрать элементы по владельцу
Отбор запросом
Оптимальный способ получить все элементы, подчинённые конкретному владельцу, — запрос с параметром:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЕдиницыИзмерения.Ссылка КАК Ссылка,
| ЕдиницыИзмерения.Наименование КАК Наименование
|ИЗ
| Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
|ГДЕ
| ЕдиницыИзмерения.Владелец = &Владелец";
Запрос.УстановитьПараметр("Владелец", НоменклатураСсылка);
Результат = Запрос.Выполнить().Выгрузить();
Отбор методом Выбрать
Для простых случаев подойдёт метод Выбрать менеджера справочника, где владелец передаётся вторым параметром:
Выборка = Справочники.ЕдиницыИзмерения.Выбрать(, НоменклатураСсылка);
Пока Выборка.Следующий() Цикл
// обработка Выборка.Ссылка
КонецЦикла;
Отбор в динамическом списке формы
На управляемой форме списка подчинённого справочника отбор по владельцу обычно настраивается автоматически: если список размещён на форме элемента-владельца и связь параметров установлена, платформа сама фильтрует записи. Вручную это делается через элемент отбора динамического списка: поле «Владелец», вид сравнения «Равно», значение — ссылка на владельца. Для программной установки используется Список.Отбор.Элементы или параметр Отбор при открытии формы через ОткрытьФорму.
- 1Сформируйте структуру параметров: Новый Структура("Отбор", Новый Структура("Владелец", СсылкаНаВладельца))
- 2Вызовите ОткрытьФорму("Справочник.ЕдиницыИзмерения.ФормаСписка", ПараметрыФормы)
- 3Проверьте, что в открывшемся списке видны только элементы нужного владельца
Как установить владельца при создании элемента
При программном создании элемента подчинённого справочника реквизит «Владелец» обязателен. Если оставить его пустым, метод Записать() выдаст ошибку о незаполненном обязательном реквизите:
НовыйЭлемент = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
НовыйЭлемент.Владелец = КонтрагентСсылка; // обязательно до записи
НовыйЭлемент.Наименование = "Договор поставки № 15";
НовыйЭлемент.Записать();
Сменить владельца у существующего элемента тоже можно, но делать это нужно осознанно: элемент фактически «переезжает» к другому владельцу, и все отчёты и подборы, построенные на этой связи, начнут показывать его в новом месте. Перед такой операцией проверьте, нет ли в конфигурации логики, которая запрещает перенос (например, в обработчике ПередЗаписью).
Обращение к владельцу в запросах и СКД
В языке запросов поле «Владелец» доступно как обычный реквизит. Через него можно соединять таблицы и получать данные владельца без дополнительного соединения — используйте разыменование через точку:
ВЫБРАТЬ
Договоры.Ссылка КАК Договор,
Договоры.Владелец КАК Контрагент,
Договоры.Владелец.ИНН КАК ИННКонтрагента
ИЗ
Справочник.ДоговорыКонтрагентов КАК Договоры
В схеме компоновки данных поле «Владелец» доступно в списке полей набора данных, его можно выводить в отчёт, использовать в отборах и группировках. Если отчёт строится по подчинённому справочнику, группировка по владельцу даст структуру «владелец → его элементы» без дополнительных настроек.
Как проверить и изменить связь владельца в конфигураторе
Если обращение к Владелец вызывает ошибку «Поле объекта не обнаружено», первым делом проверьте настройку справочника: откройте его в конфигураторе, вкладка «Владельцы» должна содержать хотя бы один справочник. Если вкладка пуста, справочник не является подчинённым, и свойство недоступно.
Добавление владельца к существующему справочнику, в котором уже есть данные, — потенциально опасная операция. При обновлении конфигурации базы данных платформа потребует реструктуризацию, а существующие элементы окажутся с пустым владельцем. Их потребуется обработать: либо заполнить владельца обработкой, либо удалить. Выполняйте такое изменение только на копии базы с последующей проверкой данных.
Как проверить результат
Возвращает заполненную ссылку нужного типа
Ошибка «Поле объекта не обнаружено» или пустая ссылка
Видны только элементы выбранного владельца
Список пуст или показывает все элементы
Записать() выполняется без ошибок
Сообщение о незаполненном обязательном реквизите Владелец
Альтернативы подчинённым справочникам
Подчинение — не единственный способ связать объекты. Если один элемент может относиться к нескольким владельцам одновременно или связь должна быть исторической (меняться во времени), подчинённый справочник не подойдёт. В таких случаях используют обычный реквизит типа «СправочникСсылка» или регистр сведений с измерениями «объект — владелец».
Выбор зависит от задачи: подчинение даёт удобную навигацию в интерфейсе (переход от владельца к его элементам) и автоматические отборы, но жёстко фиксирует связь «один ко многим» без истории.
Способы связать объекты
Один владелец у элемента, автоматический отбор в интерфейсе. Не подходит для связей «многие ко многим» и исторических данных
Гибкая связь без обязательного заполнения, но отборы и навигацию нужно реализовывать вручную
Поддерживает периодичность и связи «многие ко многим», но требует больше кода и отдельных форм
Что важно запомнить
Обращение к владельцу выполняется через системное свойство Владелец: ЭлементСсылка.Владелец в коде, поле Владелец в запросе и СКД. Отбор по владельцу делается параметром запроса, методом Выбрать или отбором динамического списка. При создании элемента владелец заполняется до записи, а массовые изменения связи выполняются только после резервного копирования.
Частые вопросы
Как получить владельца, если у меня только наименование элемента?
Сначала найдите ссылку методом НайтиПоНаименованию менеджера справочника, затем обратитесь к свойству Владелец найденной ссылки. Учтите, что наименования могут повторяться, поэтому надёжнее искать по коду или по комбинации реквизитов.
Почему отбор по владельцу возвращает пустой список?
Чаще всего причина в несовпадении типов: в отбор передаётся не ссылка, а, например, строка или объект другого типа. Проверьте, что параметр имеет тип СправочникСсылка нужного вида, и что у элементов владелец действительно заполнен.
Можно ли обратиться к владельцу владельца?
Да, если справочник-владелец сам подчинён другому справочнику: ЭлементСсылка.Владелец.Владелец. Однако каждое разыменование — обращение к базе, поэтому в массовых операциях такую цепочку лучше реализовать соединениями в запросе.
Как запретить пользователю менять владельца у элемента?
Стандартный способ — в модуле объекта в обработчике ПередЗаписью сравнить ЭтотОбъект.Владелец со значением из базы (получить через Ссылка.Владелец) и при несовпадении вызвать Отказ = Истина с сообщением пользователю. Дополнительно можно ограничить доступность поля на форме.
Работает ли свойство Владелец на клиенте в управляемом приложении?
Для ссылок чтение реквизита доступно и в клиентском контексте, но вызывает серверный вызов. Если значение нужно многократно, лучше получить его один раз на сервере (например, в обработчике ПриСозданииНаСервере) и хранить в реквизите формы.
Что делать, если в типовой конфигурации справочник не подчинён, а связь нужна?
Не изменяйте типовой объект напрямую без необходимости — это усложнит обновление. Рассмотрите добавление связи через расширение конфигурации или через дополнительный регистр сведений, который свяжет элементы без изменения структуры типового справочника.