Подчинённые справочники в 1С: владелец, права доступа и код

· 9 мин

Содержание

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

Чаще всего вопрос возникает в двух ситуациях. Либо нужно подчинить свой справочник другому (как договоры подчинены контрагентам), либо у существующих элементов владелец заполнен неверно, и пользователь «не видит» записи. Механизм общий для платформы 8.3 и не зависит от конфигурации: в БП, ЗУП и УТ подчинение работает одинаково, различаются только сами справочники.

Что такое владелец в структуре данных 1С

Подчинённый справочник хранит элементы, которые без владельца не имеют смысла. Классические примеры из типовых конфигураций:

  • 📄 Договоры контрагентов — владелец Контрагенты;
  • 🏦 Банковские счета — владельцы Контрагенты и Организации;
  • 📦 Единицы измерения номенклатуры в ряде конфигураций — владелец Номенклатура.

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

Что даёт подчинение на практике:

  • 🔗 список подчинённого справочника открывается из формы владельца уже отфильтрованным;
  • 🧭 в панели навигации формы владельца появляется команда перехода к подчинённым элементам;
  • 🔢 коды можно нумеровать отдельно для каждого владельца;
  • 🗑️ при непосредственном удалении владельца платформа удаляет и подчинённые элементы.

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

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

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

Работа идёт в конфигураторе, под пользователем с правами администратора. Перед изменением структуры сделайте резервную копию базы (Администрирование → Выгрузить информационную базу), потому что реструктуризация затронет таблицу справочника.

Пошагово

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

Если справочник типовой

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

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

Связь в документах

Чтобы в документе в поле «Договор» выбирались только договоры выбранного контрагента, у реквизита Договор настраивают свойство Связи параметров выбора: Отбор.Владелец ← Объект.Контрагент. Без этой связи пользователь увидит договоры всех контрагентов подряд, и ошибка с «чужим» договором — вопрос времени.

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

Как проверить результат

  • ✅ в пользовательском режиме откройте карточку владельца: в панели навигации есть переход к подчинённому списку;
  • ✅ создайте элемент из этого списка: поле «Владелец» заполнено само;
  • ✅ создайте элемент из общего списка: форма требует указать владельца;
  • ✅ в документе с настроенной связью выбора в поле договора видны только элементы выбранного владельца.

Права доступа к подчинённому справочнику

Владелец сам по себе права не раздаёт. Доступ к подчинённому справочнику задаётся отдельно, в ролях, и может отличаться от доступа к владельцу.

Частая ловушка: пользователю дали роль на Контрагенты, но забыли про Договоры контрагентов. Карточку контрагента он открывает, а список договоров пустой или выдаёт ошибку Недостаточно прав для просмотра.

В типовых конфигурациях на БСП

В БП 3.0, ЗУП 3.1, УТ 11 права раздают не ролями напрямую, а профилями:

  1. Откройте Администрирование → Настройки пользователей и прав.
  2. Перейдите в Профили групп доступа и проверьте, что в профиле пользователя есть роль на чтение или изменение подчинённого справочника.
  3. В Группах доступа убедитесь, что пользователь входит в группу с этим профилем.

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

Что у пользователяЧто он видит
Право на владельца, нет права на подчинённыйКарточку владельца, но не подчинённые элементы
Право на подчинённый, нет права на владельцаЭлементы списком, но поле «Владелец» без представления
Оба права, RLS только на владельцаВсе подчинённые элементы, даже у недоступных владельцев
Оба права, RLS на оба справочникаСогласованную картину

Третья строка — типичная дыра в безопасности. Если ограничили контрагентов по менеджеру, а договоры нет, менеджер увидит договоры всех клиентов.

Как заполнить владельца из кода

Программно владельца ставят при создании элемента или меняют у существующего. Код выполняется на сервере.

Новый элемент

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

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

Смена владельца у существующего элемента

Объект = СсылкаНаДоговор.ПолучитьОбъект();
Объект.Владелец = НовыйКонтрагент;
Объект.Родитель = Справочники.ДоговорыКонтрагентов.ПустаяСсылка();
Объект.Записать();

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

Выборка подчинённых элементов

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

Слово РАЗРЕШЕННЫЕ здесь не для красоты. Без него запрос под пользователем с ограничением на уровне записей упадёт с ошибкой прав, если хотя бы одна запись ему недоступна.

Массовая смена владельца у элементов

Когда владельца нужно поменять у десятков или сотен элементов (контрагента объединили с дублем, договоры завели не на тот элемент), руками это долго.

Способы

СпособКогда подходитРиски
Групповое изменение реквизитовТиповая конфигурация на БСП, десятки элементовПоле «Владелец» может отсутствовать в списке реквизитов
Объединение элементов (поиск и удаление дублей)Владелец-дубль должен исчезнуть совсемСсылки переписываются по всей базе
Внешняя обработка с кодомСложное условие отбора, сотни элементовНужен разработчик и тестовая база

В типовых конфигурациях групповое изменение находится в Администрирование → Обслуживание → Корректировка данных. Выберите справочник, отберите элементы, в списке реквизитов найдите «Владелец». Если его там нет, переходите к обработке с кодом.

Обработка с кодом

Выборка = Справочники.ДоговорыКонтрагентов.Выбрать(, , Новый Структура("Владелец", СтарыйКонтрагент));
Пока Выборка.Следующий() Цикл
	Объект = Выборка.ПолучитьОбъект();
	Объект.Владелец = НовыйКонтрагент;
	Объект.Записать();
КонецЦикла;

Документы, где был выбран договор, сохранят ссылку на тот же договор. Но в шапке у них остался старый контрагент, поэтому пара «контрагент — договор» станет несогласованной. Документы тоже придётся поправить и перепровести.

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

Перед массовой сменой владельца
Выполнено: 0 / 5

Пользователь не видит элементы: отладка RLS

Ограничение доступа на уровне записей (RLS) работает молча. Список просто показывает меньше строк, и пользователь уверен, что данные «пропали».

Где включается

В типовых конфигурациях на БСП флажок ограничения на уровне записей находится в Администрирование → Настройки пользователей и прав. Без него разрезы доступа (по организациям, группам партнёров и т. п.) не работают, даже если они заданы в группах доступа.

В своей конфигурации ограничение пишут прямо в роли, на вкладке ограничений для права «Чтение». Пример для подчинённого справочника, где ограничение наследуется от владельца:

ДоговорыКонтрагентов ГДЕ ДоговорыКонтрагентов.Владелец.Ответственный = &ТекущийПользователь

Здесь ТекущийПользователь — параметр сеанса, который должен быть объявлен и заполнен в модуле сеанса. Иначе ограничение вернёт ошибку при первом обращении.

Порядок проверки

  1. Откройте элемент под администратором и посмотрите, кто владелец. Пустой или «не тот» владелец — самая частая причина.
  2. Проверьте, есть ли у пользователя роль на подчинённый справочник, а не только на владельца.
  3. Посмотрите, входит ли владелец в разрешённые значения группы доступа пользователя.
  4. Запустите базу под этим пользователем и откройте список без отборов. Если строки появились, дело в сохранённом отборе формы, а не в правах.
  5. Проверьте свои запросы и отчёты на РАЗРЕШЕННЫЕ.
Диагностика: выберите симптом

Автоматическое заполнение владельца при создании

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

Для остальных случаев (ввод на основании, создание из другой формы, загрузка) владельца заполняют в модуле объекта, в обработчике ОбработкаЗаполнения:

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
	Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Контрагенты") Тогда
		Владелец = ДанныеЗаполнения;
	КонецЕсли;
КонецПроцедуры

Чтобы пустой владелец не попал в базу из кода и загрузок, добавьте проверку в ПередЗаписью:

Процедура ПередЗаписью(Отказ)
	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;
	Если Не ЗначениеЗаполнено(Владелец) Тогда
		ВызватьИсключение "Не указан владелец элемента";
	КонецЕсли;
КонецПроцедуры

Проверка ОбменДанными.Загрузка пропускает данные, пришедшие по обмену: их правят в узле-источнике, а не блокируют на приёме.

В типовой конфигурации эти обработчики пишут не в основном модуле, а в расширении, с аннотацией &После("ОбработкаЗаполнения") или &Перед("ПередЗаписью"). Тогда обновления конфигурации их не затрут.

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

Можно ли у одного справочника указать несколько владельцев?
Да. В список на вкладке «Владельцы» добавляют несколько справочников, и реквизит «Владелец» получает составной тип. Так устроены банковские счета: ими владеют и организации, и контрагенты.
Как сделать, чтобы коды нумеровались отдельно по каждому владельцу?
На вкладке «Нумерация» выберите серию кодов «В пределах подчинения». У каждого владельца нумерация пойдёт с начала, а контроль уникальности будет работать внутри владельца.
Что будет с договорами, если удалить контрагента?
При непосредственном удалении владельца платформа удалит и подчинённые элементы, а ссылки на них в документах станут битыми. Поэтому удаляйте через пометку и удаление помеченных объектов с контролем ссылок.
Можно ли сделать подчинённым справочник, в котором уже есть данные?
Можно. После обновления конфигурации у старых элементов владелец будет пустым. Заполните его обработкой до того, как пользователи начнут работать с отборами и связями выбора.
Почему в поле «Владелец» видно «<Объект не найден>»?
Элемент ссылается на удалённого владельца. Найдите такие элементы запросом с условием Владелец.Ссылка ЕСТЬ NULL при непустом владельце и переназначьте их.