Как устроено подчинение в метаданных 1С:Предприятия 8.3: владельцы, иерархия, регистраторы
Содержание
Подчиненные объекты конфигурации 1С:Предприятие — это объекты, которые не живут сами по себе, а принадлежат другому объекту. В метаданных так связаны три вида отношений: состав объекта (реквизиты, табличные части, формы, макеты внутри справочника или документа), подчинение справочника справочнику-владельцу (договоры у контрагента) и подчинение записей регистра документу-регистратору (движения у проведенного документа).
Все три вида настраиваются в Конфигураторе, в палитре свойств объекта. Ошибка в выборе подчинения потом дорого стоит: поменять его в рабочей базе можно, но это реструктуризация таблиц и правка кода, который уже опирается на старую схему. Тема общая для платформы 8.3, а не для конкретной конфигурации.
Подчиненный объект в метаданных: три смысла одного слова
В дереве конфигурации у каждого прикладного объекта есть «ветки». Раскройте справочник Номенклатура — под ним окажутся Реквизиты, Табличные части, Формы, Команды, Макеты. Это подчиненные объекты в самом прямом смысле: без родителя они не существуют. Удалили справочник — удалились и его формы.
Второй смысл — подчинение данных. Элемент справочника Договоры принадлежит конкретному контрагенту. В таблице базы у договора есть служебное поле Владелец, а в интерфейсе список договоров открывается из карточки контрагента.
Третий смысл — подчинение движений. Запись регистра накопления не вводят руками: её создает документ при проведении. Документ здесь — регистратор, а запись — его движение. Отменили проведение — движения исчезли: без регистратора они не существуют.
Разработчики часто путают подчинение (поле Владелец) и иерархию (поле Родитель). Владелец — элемент другого справочника. Родитель — группа или элемент того же справочника.
Какие бывают подчиненные объекты конфигурации 1С
Сводная таблица поможет быстро понять, где искать настройку и какое служебное поле появится в данных.
| Вид подчинения | Пример | Где настраивается | Служебное поле |
|---|---|---|---|
| Состав объекта | Реквизит «Артикул» у номенклатуры | Вкладка «Данные» объекта | — |
| Табличная часть | Товары в документе | Вкладка «Данные» объекта | НомерСтроки, Ссылка |
| Подчиненный справочник | Договоры у контрагента | Справочник, вкладка «Владельцы» | Владелец |
| Иерархия | Группы номенклатуры | Справочник, вкладка «Иерархия» | Родитель, ЭтоГруппа |
| Движения регистра | Остатки товаров от документа | Регистр, свойства; документ, вкладка «Движения» | Регистратор |
| Подчиненные подсистемы | Раздел «Склад» внутри «Запасов» | Ветка «Подсистемы» | — |
Подчинение ввода на основании (заказ → реализация → счет-фактура) — отдельная история. Это не подчинение в метаданных, а ссылки между документами: в документе-наследнике есть реквизит со ссылкой на основание. Цепочку видно через команду структуры подчиненности или «Связанные документы» в типовых конфигурациях, но в таблицах базы никакого поля «Владелец» там нет.
Реквизиты и табличные части
Реквизит объекта хранится в основной таблице объекта, табличная часть — в отдельной таблице со ссылкой на объект. Для иерархического справочника у реквизита и у табличной части есть свойство Использование: только для элемента, только для группы или для группы и элемента. Это экономит место и не засоряет форму группы лишними полями.
Настройка подчинения справочников в конфигураторе
Возьмем учебный пример: справочник Контрагенты и справочник ДоговорыКонтрагентов, который должен принадлежать контрагенту.
Шаг 1. Создать или открыть подчиненный справочник
- Откройте Конфигуратор и дерево конфигурации (
Конфигурация → Открыть конфигурацию). - В ветке
Справочникисоздайте справочникДоговорыКонтрагентовили откройте существующий двойным щелчком. - Перейдите на вкладку
Владельцы.
Шаг 2. Указать владельца
- В списке владельцев нажмите кнопку редактирования и отметьте справочник
Контрагенты. - Если договор может принадлежать и контрагенту, и, скажем, физлицу — отметьте оба справочника. Поле
Владелецстанет составного типа. - В свойстве
Использование подчинениявыберите, кому подчиняются элементы:Элементам,ГруппамилиГруппам и элементамвладельца.
Для договоров почти всегда нужно Элементам: договор заключают с конкретным контрагентом, а не с группой «Покупатели».
Шаг 3. Проверить формы и обновить базу
- Нажмите
F7(Конфигурация → Обновить конфигурацию базы данных). Платформа добавит в таблицу договоров поле владельца. - Запустите режим «1С:Предприятие» и откройте карточку контрагента. В панели навигации формы появится переход к подчиненному списку договоров.
- Создайте договор из карточки — владелец заполнится сам.
Если подчинение добавляется к справочнику, где уже есть данные, у существующих элементов владелец окажется пустым. Заполните его обработкой до того, как отдавать базу пользователям. Обновление структуры рабочей базы делайте только после резервной копии и в нерабочее время: на это время нужен монопольный доступ, и сеансы пользователей придется завершить.
Иерархические справочники: группы, элементы, уровни
Иерархия включается на вкладке Иерархия справочника флажком Иерархический справочник. Дальше выбирают вид:
- 📁 Иерархия групп и элементов — есть отдельные группы-папки и элементы внутри. Классика для номенклатуры и контрагентов.
- 🌳 Иерархия элементов — любой элемент может быть родителем другого. Подходит для структуры подразделений, где отдел одновременно и единица учета, и «папка» для своих секторов.
Рядом еще три настройки:
Ограничение количества уровней иерархиии число уровней. Полезно, когда пользователи плодят вложенность в 10 уровней, а отчеты рассчитаны на 3.Размещать группы сверху— группы в списке выводятся перед элементами.- Свойство
Использованиеу реквизитов — чтобы у групп не было полей «Ставка НДС» и «Единица измерения».
Чем иерархия отличается от подчинения
| Признак | Иерархия | Подчинение |
|---|---|---|
| Связь внутри | одного справочника | двух разных справочников |
| Служебное поле | Родитель | Владелец |
| Можно перенести элемент | да, в другую группу | да, сменив владельца |
| Обязательна ли связь | нет, элемент может лежать в корне | по смыслу да |
| Вложенность | многоуровневая | один уровень, но подчиненный справочник сам может быть владельцем |
Подчиненный справочник тоже может быть иерархическим. Например, договоры внутри контрагента можно раскладывать по группам «Действующие» и «Архив». Это сочетание работает, но усложняет выбор в формах, так что включайте его только по реальной необходимости.
Пометка удаления в иерархии и у владельца
Когда пользователь помечает на удаление группу, платформа помечает и все ее содержимое. Так же с владельцем: пометка контрагента ставит пометку на его договоры. Физически объекты удаляются при удалении помеченных, после проверки ссылок. Если на договор ссылается проведенный документ, удаление не пройдет — и контрагент тоже останется.
Подчиненные документы и регистры: регистратор и движения
У документа на вкладке Движения перечислены регистры, в которые он пишет при проведении. Там же задают, разрешено ли проведение и как удаляются движения при отмене проведения. Какие регистры подчинены регистратору:
- 📊 Регистр накопления — всегда. Самостоятельных записей у него нет.
- 📒 Регистр бухгалтерии — всегда. Проводки появляются от документа, в том числе от «Операции, введенной вручную».
- 🧮 Регистр расчета — всегда.
- 📋 Регистр сведений
— по выбору. Свойство
Режим записи:НезависимыйилиПодчинение регистратору.
Когда регистр сведений подчинять регистратору
Подчинение нужно, если запись — следствие документа и должна исчезнуть при отмене проведения. Пример: цены, установленные документом «Установка цен». Отменили документ — старые цены вернулись.
Независимый режим — для справочной информации, которую правят напрямую: курсы валют, адреса, настройки. У такого регистра нет поля Регистратор, зато его записи можно открыть и поправить вручную.
У подчиненного регистра сведений появляется возможность периодичности По позиции регистратора. Тогда две записи от документов с одинаковой датой и временем упорядочиваются по моменту документа.
Как документ пишет движения
В модуле объекта документа, в обработчике проведения, пишут в набор записей, который уже отобран по регистратору:
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ТоварыНаСкладах.Записывать = Истина;
Для Каждого СтрокаТовара Из Товары Цикл
Движение = Движения.ТоварыНаСкладах.ДобавитьПриход();
Движение.Период = Дата;
Движение.Склад = Склад;
Движение.Номенклатура = СтрокаТовара.Номенклатура;
Движение.Количество = СтрокаТовара.Количество;
КонецЦикла;
КонецПроцедуры
Здесь ТоварыНаСкладах — регистр накопления вида «Остатки» с измерениями Склад и Номенклатура и ресурсом Количество. После выхода из обработчика платформа сама запишет набор, потому что выставлен флаг Записывать. Поле Регистратор заполнять не нужно: набор уже отобран по текущему документу.
Записывать движения документа в обход набора (из обработки, отдельным набором с другим регистратором) можно, но это верный способ получить «осиротевшие» записи. При перепроведении документ их не увидит.
Подчиненные объекты в запросах и коде
Подчинение и иерархия дают стандартные поля, по которым удобно отбирать данные.
Отбор по владельцу
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Договоры.Ссылка,
| Договоры.Наименование
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК Договоры
|ГДЕ
| Договоры.Владелец = &Контрагент
| И НЕ Договоры.ПометкаУдаления";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Выборка = Запрос.Выполнить().Выбрать();
Без запроса то же можно получить методом менеджера: Справочники.ДоговорыКонтрагентов.Выбрать(, Контрагент). Первый параметр — родитель, второй — владелец.
Создание подчиненного элемента и группы
НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
НовыйДоговор.Владелец = Контрагент;
НовыйДоговор.Наименование = "Основной договор";
НовыйДоговор.Записать();
НоваяГруппа = Справочники.Номенклатура.СоздатьГруппу();
НоваяГруппа.Наименование = "Готовая продукция";
НоваяГруппа.Записать();
Отбор по иерархии
Чтобы получить все элементы группы вместе с вложенными подгруппами, используйте В ИЕРАРХИИ:
"ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка В ИЕРАРХИИ (&Группа)
| И НЕ Номенклатура.ЭтоГруппа"
Условие Номенклатура.Родитель = &Группа вернет только прямых потомков, без вложенных подгрупп. Для итогов по группам в отчете есть конструкция ИТОГИ ... ПО Номенклатура ИЕРАРХИЯ.
Производительность подчинения и иерархии: где теряется скорость
Подчинение само по себе не тормозит: поля Владелец и Родитель платформа индексирует. Проблемы возникают из-за того, как с ними работают.
| Ситуация | Почему медленно | Что сделать |
|---|---|---|
В ИЕРАРХИИ по огромному дереву | платформа сначала собирает всех потомков группы | ограничить уровни, отбирать по прямому Родитель, если подгрупп нет |
| Выбор договора без отбора по владельцу | в форме выбора открывается весь справочник | связь параметров выбора по владельцу на форме документа |
Обращение через точку Договор.Владелец.ИНН в цикле | на каждой итерации — отдельное чтение | один запрос с нужными полями |
| Регистр сведений «подчинен регистратору» вместо независимого | лишние записи при каждом перепроведении | независимый режим для справочной информации |
| Глубокая иерархия 7–10 уровней | сложные отчеты, медленная группировка | Ограничение количества уровней иерархии |
| Большие документы с десятком регистров | при перепроведении перезаписываются все наборы | писать только регистры, которые реально меняются |
Еще один частый случай — составной тип владельца из 4–5 справочников. Каждый лишний тип расширяет поле и усложняет запросы с соединениями. Если владельцев столько, проверьте, не лучше ли обычный реквизит со ссылкой.
Смена режима записи регистра или набора владельцев справочника на рабочей базе — это реструктуризация. На больших таблицах она идет долго, пользователи в это время работать не смогут.