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

· 9 мин

Содержание

Подчиненные объекты конфигурации 1С:Предприятие — это объекты, которые не живут сами по себе, а принадлежат другому объекту. В метаданных так связаны три вида отношений: состав объекта (реквизиты, табличные части, формы, макеты внутри справочника или документа), подчинение справочника справочнику-владельцу (договоры у контрагента) и подчинение записей регистра документу-регистратору (движения у проведенного документа).

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

Подчиненный объект в метаданных: три смысла одного слова

В дереве конфигурации у каждого прикладного объекта есть «ветки». Раскройте справочник Номенклатура — под ним окажутся Реквизиты, Табличные части, Формы, Команды, Макеты. Это подчиненные объекты в самом прямом смысле: без родителя они не существуют. Удалили справочник — удалились и его формы.

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

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

Разработчики часто путают подчинение (поле Владелец) и иерархию (поле Родитель). Владелец — элемент другого справочника. Родитель — группа или элемент того же справочника.

Какие бывают подчиненные объекты конфигурации 1С

Сводная таблица поможет быстро понять, где искать настройку и какое служебное поле появится в данных.

Вид подчиненияПримерГде настраиваетсяСлужебное поле
Состав объектаРеквизит «Артикул» у номенклатурыВкладка «Данные» объекта—
Табличная частьТовары в документеВкладка «Данные» объектаНомерСтроки, Ссылка
Подчиненный справочникДоговоры у контрагентаСправочник, вкладка «Владельцы»Владелец
ИерархияГруппы номенклатурыСправочник, вкладка «Иерархия»Родитель, ЭтоГруппа
Движения регистраОстатки товаров от документаРегистр, свойства; документ, вкладка «Движения»Регистратор
Подчиненные подсистемыРаздел «Склад» внутри «Запасов»Ветка «Подсистемы»—

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

Реквизиты и табличные части

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

Настройка подчинения справочников в конфигураторе

Возьмем учебный пример: справочник Контрагенты и справочник ДоговорыКонтрагентов, который должен принадлежать контрагенту.

Шаг 1. Создать или открыть подчиненный справочник

  1. Откройте Конфигуратор и дерево конфигурации (Конфигурация → Открыть конфигурацию).
  2. В ветке Справочники создайте справочник ДоговорыКонтрагентов или откройте существующий двойным щелчком.
  3. Перейдите на вкладку Владельцы.

Шаг 2. Указать владельца

  1. В списке владельцев нажмите кнопку редактирования и отметьте справочник Контрагенты.
  2. Если договор может принадлежать и контрагенту, и, скажем, физлицу — отметьте оба справочника. Поле Владелец станет составного типа.
  3. В свойстве Использование подчинения выберите, кому подчиняются элементы: Элементам, Группам или Группам и элементам владельца.

Для договоров почти всегда нужно Элементам: договор заключают с конкретным контрагентом, а не с группой «Покупатели».

Шаг 3. Проверить формы и обновить базу

  1. Нажмите F7 (Конфигурация → Обновить конфигурацию базы данных). Платформа добавит в таблицу договоров поле владельца.
  2. Запустите режим «1С:Предприятие» и откройте карточку контрагента. В панели навигации формы появится переход к подчиненному списку договоров.
  3. Создайте договор из карточки — владелец заполнится сам.

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

Какую связь выбрать между двумя справочниками?

Иерархические справочники: группы, элементы, уровни

Иерархия включается на вкладке Иерархия справочника флажком Иерархический справочник. Дальше выбирают вид:

  • 📁 Иерархия групп и элементов — есть отдельные группы-папки и элементы внутри. Классика для номенклатуры и контрагентов.
  • 🌳 Иерархия элементов — любой элемент может быть родителем другого. Подходит для структуры подразделений, где отдел одновременно и единица учета, и «папка» для своих секторов.

Рядом еще три настройки:

  1. Ограничение количества уровней иерархии и число уровней. Полезно, когда пользователи плодят вложенность в 10 уровней, а отчеты рассчитаны на 3.
  2. Размещать группы сверху — группы в списке выводятся перед элементами.
  3. Свойство Использование у реквизитов — чтобы у групп не было полей «Ставка НДС» и «Единица измерения».

Чем иерархия отличается от подчинения

ПризнакИерархияПодчинение
Связь внутриодного справочникадвух разных справочников
Служебное полеРодительВладелец
Можно перенести элементда, в другую группуда, сменив владельца
Обязательна ли связьнет, элемент может лежать в корнепо смыслу да
Вложенностьмногоуровневаяодин уровень, но подчиненный справочник сам может быть владельцем

Подчиненный справочник тоже может быть иерархическим. Например, договоры внутри контрагента можно раскладывать по группам «Действующие» и «Архив». Это сочетание работает, но усложняет выбор в формах, так что включайте его только по реальной необходимости.

Пометка удаления в иерархии и у владельца

Когда пользователь помечает на удаление группу, платформа помечает и все ее содержимое. Так же с владельцем: пометка контрагента ставит пометку на его договоры. Физически объекты удаляются при удалении помеченных, после проверки ссылок. Если на договор ссылается проведенный документ, удаление не пройдет — и контрагент тоже останется.

Подчиненные документы и регистры: регистратор и движения

У документа на вкладке Движения перечислены регистры, в которые он пишет при проведении. Там же задают, разрешено ли проведение и как удаляются движения при отмене проведения. Какие регистры подчинены регистратору:

  • 📊 Регистр накопления — всегда. Самостоятельных записей у него нет.
  • 📒 Регистр бухгалтерии — всегда. Проводки появляются от документа, в том числе от «Операции, введенной вручную».
  • 🧮 Регистр расчета — всегда.
  • 📋 Регистр сведений — по выбору. Свойство Режим записи: Независимый или Подчинение регистратору.

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

Подчинение нужно, если запись — следствие документа и должна исчезнуть при отмене проведения. Пример: цены, установленные документом «Установка цен». Отменили документ — старые цены вернулись.

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

У подчиненного регистра сведений появляется возможность периодичности По позиции регистратора. Тогда две записи от документов с одинаковой датой и временем упорядочиваются по моменту документа.

Как документ пишет движения

В модуле объекта документа, в обработчике проведения, пишут в набор записей, который уже отобран по регистратору:

Процедура ОбработкаПроведения(Отказ, Режим)

	Движения.ТоварыНаСкладах.Записывать = Истина;

	Для Каждого СтрокаТовара Из Товары Цикл
		Движение = Движения.ТоварыНаСкладах.ДобавитьПриход();
		Движение.Период = Дата;
		Движение.Склад = Склад;
		Движение.Номенклатура = СтрокаТовара.Номенклатура;
		Движение.Количество = СтрокаТовара.Количество;
	КонецЦикла;

КонецПроцедуры

Здесь ТоварыНаСкладах — регистр накопления вида «Остатки» с измерениями Склад и Номенклатура и ресурсом Количество. После выхода из обработчика платформа сама запишет набор, потому что выставлен флаг Записывать. Поле Регистратор заполнять не нужно: набор уже отобран по текущему документу.

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

Подчиненные объекты в запросах и коде

Подчинение и иерархия дают стандартные поля, по которым удобно отбирать данные.

Отбор по владельцу

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

Без запроса то же можно получить методом менеджера: Справочники.ДоговорыКонтрагентов.Выбрать(, Контрагент). Первый параметр — родитель, второй — владелец.

Создание подчиненного элемента и группы

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

НоваяГруппа = Справочники.Номенклатура.СоздатьГруппу();
НоваяГруппа.Наименование = "Готовая продукция";
НоваяГруппа.Записать();

Отбор по иерархии

Чтобы получить все элементы группы вместе с вложенными подгруппами, используйте В ИЕРАРХИИ:

"ВЫБРАТЬ
|	Номенклатура.Ссылка
|ИЗ
|	Справочник.Номенклатура КАК Номенклатура
|ГДЕ
|	Номенклатура.Ссылка В ИЕРАРХИИ (&Группа)
|	И НЕ Номенклатура.ЭтоГруппа"

Условие Номенклатура.Родитель = &Группа вернет только прямых потомков, без вложенных подгрупп. Для итогов по группам в отчете есть конструкция ИТОГИ ... ПО Номенклатура ИЕРАРХИЯ.

Производительность подчинения и иерархии: где теряется скорость

Подчинение само по себе не тормозит: поля Владелец и Родитель платформа индексирует. Проблемы возникают из-за того, как с ними работают.

СитуацияПочему медленноЧто сделать
В ИЕРАРХИИ по огромному деревуплатформа сначала собирает всех потомков группыограничить уровни, отбирать по прямому Родитель, если подгрупп нет
Выбор договора без отбора по владельцув форме выбора открывается весь справочниксвязь параметров выбора по владельцу на форме документа
Обращение через точку Договор.Владелец.ИНН в циклена каждой итерации — отдельное чтениеодин запрос с нужными полями
Регистр сведений «подчинен регистратору» вместо независимоголишние записи при каждом перепроведениинезависимый режим для справочной информации
Глубокая иерархия 7–10 уровнейсложные отчеты, медленная группировкаОграничение количества уровней иерархии
Большие документы с десятком регистровпри перепроведении перезаписываются все наборыписать только регистры, которые реально меняются

Еще один частый случай — составной тип владельца из 4–5 справочников. Каждый лишний тип расширяет поле и усложняет запросы с соединениями. Если владельцев столько, проверьте, не лучше ли обычный реквизит со ссылкой.

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

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

Можно ли перенести подчиненный элемент к другому владельцу?
Да, достаточно поменять поле «Владелец» в карточке или в коде и записать объект. Ссылки из документов при этом сохранятся: они указывают на сам элемент, а не на владельца.
Может ли справочник быть одновременно подчиненным и владельцем?
Может. Например, договоры подчинены контрагентам, а дополнительные соглашения подчинены договорам. Цепочка выстраивается через вкладку «Владельцы» каждого справочника.
Почему в форме выбора договоров видны договоры чужих контрагентов?
На форме документа не настроена связь параметров выбора: поле договора не знает, по какому контрагенту отбирать. Ее задают в свойствах реквизита формы или реквизита объекта.
Есть ли подчинение у документов, как у справочников?
Нет. У документов нет свойства «Владельцы». Связь документов строят через реквизит-основание и ввод на основании, а подчиненными у документа бывают только движения регистров и его собственные табличные части.
Что будет с договорами, если удалить контрагента?
Пометка удаления контрагента помечает и его договоры. При удалении помеченных объектов платформа проверит ссылки: если на договор ссылаются документы, ни договор, ни контрагент не удалятся.