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

· 9 мин

Содержание

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

Связь по владельцу в 1С работает поверх подчинённых справочников. У подчинённого справочника каждый элемент имеет владельца — ссылку на элемент справочника-хозяина. А свойство «Связь по владельцу» на форме заставляет поле выбора показывать только тех «детей», что принадлежат нужному «родителю», и подставлять владельца автоматически при создании нового элемента.

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

Что такое владелец и подчинённый справочник

Подчинённый справочник — это справочник, элементы которого не существуют сами по себе, а всегда относятся к элементу другого объекта. Этот «другой объект» и есть владелец.

Классический пример — договоры контрагентов. Справочник ДоговорыКонтрагентов подчинён справочнику Контрагенты. Договор без контрагента бессмысленен, поэтому у каждого договора заполнен владелец.

Владельцем могут быть не только справочники. На вкладке настройки подчинения доступны:

  • 📁 справочники;
  • 📊 планы видов характеристик;
  • 🧮 планы счетов;
  • 📐 планы видов расчёта.

Документ владельцем подчинённого справочника быть не может — для связи «документ → его строки» используют табличные части или регистры, а не подчинённые справочники.

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

Подчинение — это не иерархия. Иерархия (группы и элементы) организует справочник внутри себя. Подчинение связывает два разных справочника. Их можно использовать вместе: справочник бывает и иерархическим, и подчинённым одновременно.

Где связь по владельцу реально нужна

Механизм полезен везде, где у сущности есть «хозяин» и список дочерних записей должен сам сужаться под него.

  • Контрагенты → договоры. В документе выбрали контрагента — поле договора показывает только его договоры.
  • Контрагенты → контактные лица. Телефоны и ФИО сотрудников привязаны к конкретной организации.
  • Номенклатура → серии или штрихкоды. Серии показываются только для той номенклатуры, по которой ведётся учёт по сериям.
  • Организации → банковские счета. В платёжке после выбора организации доступны только её расчётные счета.
  • Пользователи → их настройки. Персональные справочники, где у каждого пользователя свой набор значений.

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

Разберём на договорах, как это выглядит в работе. Контрагент «Ромашка» имеет три договора, «Лютик» — один. Бухгалтер создаёт поступление, выбирает «Ромашку» — и поле договора предлагает только её три договора, а четвёртый (от «Лютика») не показывается вообще. Если «Ромашке» нужен новый договор, его создают прямо из этого поля: владелец уже подставлен, руками контрагента выбирать не надо. Та же логика защищает от ошибки — к «Ромашке» физически нельзя привязать чужой договор.

Как настроить подчинение справочника в конфигураторе

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

  1. В дереве конфигурации откройте свойства подчинённого справочника (например, ДоговорыКонтрагентов).
  2. Перейдите на вкладку Владельцы.
  3. Нажмите добавление и выберите справочник-владелец (Контрагенты). Владельцев может быть несколько — тогда в элементе хранится ссылка составного типа.
  4. В поле Использование подчинения укажите, к чему привязываются элементы: Элементам, Группам или Группам и элементам. Для договоров правильно — Элементам: договор относится к конкретному контрагенту, а не к папке.
  5. Сохраните и обновите конфигурацию базы данных.

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

Режим подчинения из шага 4 стоит понимать точнее. Элементам — дочерний элемент привязывается только к элементу-хозяину (договор к контрагенту, а не к папке контрагентов). Группам — владельцем может быть лишь группа хозяина; на практике встречается редко. Группам и элементам — владельцем выступает и то, и другое; берите этот режим, только если у вас действительно есть сценарии привязки к папкам. Для большинства задач правильный выбор — Элементам.

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

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

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

  1. Откройте форму документа или справочника, где лежит поле выбора подчинённого элемента (например, поле Договор в документе).
  2. Выделите это поле и откройте его свойства.
  3. Найдите свойство Связь по владельцу и укажите реквизит формы, который хранит владельца, — обычно Объект.Контрагент.

Теперь при открытии списка договоров платформа покажет только договоры выбранного контрагента, а при создании нового договора прямо из этого поля подставит контрагента в поле «Владелец».

Если владелец ещё не выбран (поле контрагента пустое), список договоров будет пустым или заблокированным — это нормальное поведение, а не ошибка.

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

Связь по владельцу, связи параметров выбора и обычная ссылка

Отобрать список выбора в 1С можно тремя разными инструментами. Их легко перепутать.

ИнструментЧто делаетКогда применять
Обычная ссылка (реквизит)Хранит ссылку на любой элемент без фильтрацииМежду справочниками нет подчинения
Связь по владельцуФильтрует список по стандартному реквизиту Владелец и подставляет владельцаСправочник подчинён, выбор нужно сузить по хозяину
Связи параметров выбораФильтрует список по любому реквизиту через Отбор.<Реквизит>Нужен отбор по обычному реквизиту, не по владельцу

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

Связи параметров выбора — более общий механизм. Он отбирает по произвольному реквизиту (например, показать номенклатуру только нужного вида), но и настроить его сложнее: нужно задать имя параметра отбора и источник значения.

Не путайте это со «Связью по типу» (СвязьПоТипу): она не фильтрует элементы, а ограничивает набор доступных типов у поля составного типа. Это про типы данных, а не про владельца.

Какой механизм отбора выбрать?

Работа со связью по владельцу в коде

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

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

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |    Договоры.Ссылка КАК Ссылка,
    |    Договоры.Наименование КАК Наименование
    |ИЗ
    |    Справочник.ДоговорыКонтрагентов КАК Договоры
    |ГДЕ
    |    Договоры.Владелец = &Контрагент
    |    И НЕ Договоры.ПометкаУдаления";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Выборка = Запрос.Выполнить().Выбрать();

Создание элемента с владельцем. Владелец заполняется до записи:

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

Чтение владельца. У любого дочернего элемента владелец доступен через точку: Договор.Владелец вернёт ссылку на контрагента.

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

Отбор по владельцу в СКД. В системе компоновки данных подчинённый справочник тоже отбирают по владельцу — поле Владелец доступно наравне с другими реквизитами. Чтобы пользователь сам задавал хозяина, добавьте параметр отчёта (например, Контрагент) и используйте его в отборе набора данных: Владелец = &Контрагент. Если параметр не заполнен, выводятся все элементы — предусмотрите это поведение заранее, иначе отчёт по пустому владельцу вернёт весь справочник.

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

Производительность и типичные ошибки

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

  • 🐢 Выгрузка всего справочника и отбор в коде. Не читайте весь подчинённый справочник, чтобы потом в цикле отобрать нужных. Фильтруйте в запросе условием по владельцу — это и быстрее, и не грузит память.
  • 🧱 Отбор по непроиндексированному реквизиту вместо владельца. Если фильтруете дочерние элементы по дополнительному реквизиту, а не по владельцу, добавьте индекс этому реквизиту — иначе платформе придётся перебирать всю таблицу.
  • 🗂 Много владельцев в составном типе. Когда у справочника несколько типов владельца, запросы и отборы усложняются: учитывайте, что Владелец становится составного типа, и приводите его к нужному типу в условиях.

Теперь — где чаще всего ломается именно связь по владельцу.

  • Пустой список выбора. Поле договора не показывает ничего. Причина — не заполнен источник владельца (контрагент), на который указывает свойство «Связь по владельцу». Пока хозяин не выбран, фильтровать нечего.
  • Связь настроена не на тот реквизит. В свойстве поля указан реквизит, который не хранит владельца (например, менеджер вместо контрагента). Список отбирается по постороннему значению и почти всегда пуст.
  • Элементы с пустым владельцем. После превращения наполненного справочника в подчинённый у старых элементов владелец не заполнен. Такие записи не попадают ни в один отфильтрованный список — их нужно «раздать» хозяевам обработкой.
  • Ожидание отбора в запросе «само собой». Настройка на форме не действует на запросы и СКД. В отчётах и обработках условие по владельцу пишите руками.
Проверка настройки связи по владельцу
Выполнено: 0 / 5

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

Можно ли у подчинённого справочника указать несколько владельцев?
Да. На вкладке «Владельцы» добавьте несколько объектов — реквизит «Владелец» станет составного типа. В запросах и коде тогда учитывайте, что в нём может лежать ссылка разных типов.
Чем связь по владельцу отличается от связей параметров выбора?
Связь по владельцу фильтрует только по стандартному реквизиту «Владелец» и работает «из коробки» для подчинённых справочников. Связи параметров выбора фильтруют по любому реквизиту, но их нужно настраивать явнее.
Почему отбор по владельцу работает на форме, но не в моём отчёте?
Настройка формы не распространяется на запросы, СКД и обработки. В отчёте добавьте условие Владелец = &Хозяин или отбор по полю «Владелец» самостоятельно.
Можно ли сменить владельца у готового элемента?
Программно — да, присвоив реквизиту «Владелец» другую ссылку. Но элемент переедет к новому хозяину, а старые документы продолжат на него ссылаться. Делайте это только осознанно и с проверкой последствий.
Нужно ли вручную индексировать поле владельца для скорости?
Нет. Стандартный реквизит «Владелец» платформа индексирует сама, поэтому отбор по нему быстрый. Индекс добавляют дополнительным реквизитам, если фильтруют по ним.