Подчинение справочников и связь по владельцу в конфигураторе
Содержание
Открываете карточку договора, а список контрагентов в поле «Владелец» показывает всех подряд — хотя логично видеть договоры только выбранного контрагента. За это поведение отвечает связь по владельцу: механизм, который привязывает элемент одного справочника к элементу другого и фильтрует выбор по этой привязке.
Связь по владельцу в 1С работает поверх подчинённых справочников. У подчинённого справочника каждый элемент имеет владельца — ссылку на элемент справочника-хозяина. А свойство «Связь по владельцу» на форме заставляет поле выбора показывать только тех «детей», что принадлежат нужному «родителю», и подставлять владельца автоматически при создании нового элемента.
Ниже — как устроено подчинение, как включить связь по владельцу в конфигураторе и в коде, чем она отличается от связей параметров выбора и где на ней спотыкаются.
Что такое владелец и подчинённый справочник
Подчинённый справочник — это справочник, элементы которого не существуют сами по себе, а всегда относятся к элементу другого объекта. Этот «другой объект» и есть владелец.
Классический пример — договоры контрагентов. Справочник ДоговорыКонтрагентов подчинён справочнику Контрагенты. Договор без контрагента бессмысленен, поэтому у каждого договора заполнен владелец.
Владельцем могут быть не только справочники. На вкладке настройки подчинения доступны:
- 📁 справочники;
- 📊 планы видов характеристик;
- 🧮 планы счетов;
- 📐 планы видов расчёта.
Документ владельцем подчинённого справочника быть не может — для связи «документ → его строки» используют табличные части или регистры, а не подчинённые справочники.
Владелец хранится в стандартном реквизите Владелец. Платформа индексирует его автоматически, поэтому отбор элементов по владельцу выполняется быстро даже на больших справочниках.
Подчинение — это не иерархия. Иерархия (группы и элементы) организует справочник внутри себя. Подчинение связывает два разных справочника. Их можно использовать вместе: справочник бывает и иерархическим, и подчинённым одновременно.
Где связь по владельцу реально нужна
Механизм полезен везде, где у сущности есть «хозяин» и список дочерних записей должен сам сужаться под него.
- Контрагенты → договоры. В документе выбрали контрагента — поле договора показывает только его договоры.
- Контрагенты → контактные лица. Телефоны и ФИО сотрудников привязаны к конкретной организации.
- Номенклатура → серии или штрихкоды. Серии показываются только для той номенклатуры, по которой ведётся учёт по сериям.
- Организации → банковские счета. В платёжке после выбора организации доступны только её расчётные счета.
- Пользователи → их настройки. Персональные справочники, где у каждого пользователя свой набор значений.
Общий признак: дочерний элемент теряет смысл без родителя, а список выбора должен автоматически отфильтровываться по этому родителю. Если такой зависимости нет — подчинение не нужно, хватит обычного реквизита-ссылки.
Разберём на договорах, как это выглядит в работе. Контрагент «Ромашка» имеет три договора, «Лютик» — один. Бухгалтер создаёт поступление, выбирает «Ромашку» — и поле договора предлагает только её три договора, а четвёртый (от «Лютика») не показывается вообще. Если «Ромашке» нужен новый договор, его создают прямо из этого поля: владелец уже подставлен, руками контрагента выбирать не надо. Та же логика защищает от ошибки — к «Ромашке» физически нельзя привязать чужой договор.
Как настроить подчинение справочника в конфигураторе
Сначала справочник нужно сделать подчинённым — без этого свойства формы не появятся.
- В дереве конфигурации откройте свойства подчинённого справочника (например,
ДоговорыКонтрагентов). - Перейдите на вкладку
Владельцы. - Нажмите добавление и выберите справочник-владелец (
Контрагенты). Владельцев может быть несколько — тогда в элементе хранится ссылка составного типа. - В поле
Использование подчиненияукажите, к чему привязываются элементы:Элементам,ГруппамилиГруппам и элементам. Для договоров правильно —Элементам: договор относится к конкретному контрагенту, а не к папке. - Сохраните и обновите конфигурацию базы данных.
После этого у каждого элемента подчинённого справочника появится обязательный для заполнения владелец. Создать элемент без владельца через стандартный интерфейс не получится.
Режим подчинения из шага 4 стоит понимать точнее. Элементам — дочерний элемент привязывается только к элементу-хозяину (договор к контрагенту, а не к папке контрагентов). Группам — владельцем может быть лишь группа хозяина; на практике встречается редко. Группам и элементам — владельцем выступает и то, и другое; берите этот режим, только если у вас действительно есть сценарии привязки к папкам. Для большинства задач правильный выбор — Элементам.
Если справочник уже наполнен данными, превращать его в подчинённый задним числом рискованно: существующим элементам владелец не проставится автоматически. Сначала продумайте, как заполнить владельца у старых записей (обработкой или при миграции), иначе получите элементы с пустым владельцем, которые нигде не отбираются.
Как включить связь по владельцу на форме
Подчинение само по себе только добавляет поле «Владелец». Чтобы список выбора сужался автоматически, настраивают связь на форме-хозяине (там, где выбирают дочерний элемент).
- Откройте форму документа или справочника, где лежит поле выбора подчинённого элемента (например, поле
Договорв документе). - Выделите это поле и откройте его свойства.
- Найдите свойство
Связь по владельцуи укажите реквизит формы, который хранит владельца, — обычноОбъект.Контрагент.
Теперь при открытии списка договоров платформа покажет только договоры выбранного контрагента, а при создании нового договора прямо из этого поля подставит контрагента в поле «Владелец».
Если владелец ещё не выбран (поле контрагента пустое), список договоров будет пустым или заблокированным — это нормальное поведение, а не ошибка.
Для колонки таблицы (например, строки табличной части) связь по владельцу настраивается так же, в свойствах колонки. Путь к реквизиту указывают от строки таблицы или от объекта.
Связь по владельцу, связи параметров выбора и обычная ссылка
Отобрать список выбора в 1С можно тремя разными инструментами. Их легко перепутать.
| Инструмент | Что делает | Когда применять |
|---|---|---|
| Обычная ссылка (реквизит) | Хранит ссылку на любой элемент без фильтрации | Между справочниками нет подчинения |
| Связь по владельцу | Фильтрует список по стандартному реквизиту Владелец и подставляет владельца | Справочник подчинён, выбор нужно сузить по хозяину |
| Связи параметров выбора | Фильтрует список по любому реквизиту через Отбор.<Реквизит> | Нужен отбор по обычному реквизиту, не по владельцу |
Связь по владельцу — частный, «готовый» случай. Она работает только со стандартным реквизитом Владелец и ничего не требует настраивать в выбираемом справочнике.
Связи параметров выбора — более общий механизм. Он отбирает по произвольному реквизиту (например, показать номенклатуру только нужного вида), но и настроить его сложнее: нужно задать имя параметра отбора и источник значения.
Не путайте это со «Связью по типу» (СвязьПоТипу): она не фильтрует элементы, а ограничивает набор доступных типов у поля составного типа. Это про типы данных, а не про владельца.
Отбор.<Реквизит> и источник значения на форме.Работа со связью по владельцу в коде
На форме связь настраивается мышью, но в коде владельца приходится учитывать вручную — автоматический отбор форму не затрагивает запросы.
Отбор по владельцу в запросе. Самый частый сценарий — выбрать дочерние элементы конкретного хозяина:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Договоры.Ссылка КАК Ссылка,
| Договоры.Наименование КАК Наименование
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК Договоры
|ГДЕ
| Договоры.Владелец = &Контрагент
| И НЕ Договоры.ПометкаУдаления";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Выборка = Запрос.Выполнить().Выбрать();
Создание элемента с владельцем. Владелец заполняется до записи:
НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
НовыйДоговор.Владелец = Контрагент;
НовыйДоговор.Наименование = "Основной договор";
НовыйДоговор.Записать();
Чтение владельца. У любого дочернего элемента владелец доступен через точку: Договор.Владелец вернёт ссылку на контрагента.
Программная установка отбора в списке. Если форму строите динамически, фильтр по владельцу задают в отборе динамического списка или в параметрах выбора поля — через имя стандартного реквизита Владелец. Конкретный способ зависит от того, динамический это список или поле ввода; в сомнительных случаях сверяйтесь с синтакс-помощником по свойству формы, а не подбирайте имена наугад.
Отбор по владельцу в СКД. В системе компоновки данных подчинённый справочник тоже отбирают по владельцу — поле Владелец доступно наравне с другими реквизитами. Чтобы пользователь сам задавал хозяина, добавьте параметр отчёта (например, Контрагент) и используйте его в отборе набора данных: Владелец = &Контрагент. Если параметр не заполнен, выводятся все элементы — предусмотрите это поведение заранее, иначе отчёт по пустому владельцу вернёт весь справочник.
Менять владельца у существующего элемента (Элемент.Владелец = ДругойКонтрагент) технически можно, но это переносит элемент к другому хозяину. Все документы, где этот элемент уже использован, останутся на него ссылаться — проверьте, что перенос не нарушит учёт, прежде чем так делать.
Производительность и типичные ошибки
Отбор по владельцу — лёгкая операция: реквизит Владелец проиндексирован платформой, и запрос с ГДЕ Владелец = &Хозяин отрабатывает по индексу. Даже у справочника на сотни тысяч элементов выборка дочерних записей одного хозяина остаётся быстрой. Проблемы возникают не от самого механизма, а от того, как его применяют.
- 🐢 Выгрузка всего справочника и отбор в коде. Не читайте весь подчинённый справочник, чтобы потом в цикле отобрать нужных. Фильтруйте в запросе условием по владельцу — это и быстрее, и не грузит память.
- 🧱 Отбор по непроиндексированному реквизиту вместо владельца. Если фильтруете дочерние элементы по дополнительному реквизиту, а не по владельцу, добавьте индекс этому реквизиту — иначе платформе придётся перебирать всю таблицу.
- 🗂 Много владельцев в составном типе. Когда у справочника несколько типов владельца, запросы и отборы усложняются: учитывайте, что
Владелецстановится составного типа, и приводите его к нужному типу в условиях.
Теперь — где чаще всего ломается именно связь по владельцу.
- Пустой список выбора. Поле договора не показывает ничего. Причина — не заполнен источник владельца (контрагент), на который указывает свойство «Связь по владельцу». Пока хозяин не выбран, фильтровать нечего.
- Связь настроена не на тот реквизит. В свойстве поля указан реквизит, который не хранит владельца (например, менеджер вместо контрагента). Список отбирается по постороннему значению и почти всегда пуст.
- Элементы с пустым владельцем. После превращения наполненного справочника в подчинённый у старых элементов владелец не заполнен. Такие записи не попадают ни в один отфильтрованный список — их нужно «раздать» хозяевам обработкой.
- Ожидание отбора в запросе «само собой». Настройка на форме не действует на запросы и СКД. В отчётах и обработках условие по владельцу пишите руками.
Частые вопросы
Можно ли у подчинённого справочника указать несколько владельцев?
Чем связь по владельцу отличается от связей параметров выбора?
Почему отбор по владельцу работает на форме, но не в моём отчёте?
Владелец = &Хозяин или отбор по полю «Владелец» самостоятельно.