К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как установить отбор по владельцу в 1С

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

Отбор по владельцу — одна из базовых задач при работе с подчинёнными справочниками в 1С. Классический пример: справочник «Договоры контрагентов» подчинён справочнику «Контрагенты», и при открытии списка договоров пользователь должен видеть только договоры выбранного контрагента, а не все договоры базы. Тот же принцип применяется к единицам измерения номенклатуры, банковским счетам организаций и другим подчинённым объектам.

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

Что такое владелец в 1С и где используется отбор по нему

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

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

Отбор по владельцу при открытии формы списка

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

ПараметрыФормы = Новый Структура;

Отбор = Новый Структура;

Отбор.Вставить("Владелец", КонтрагентСсылка);

ПараметрыФормы.Вставить("Отбор", Отбор);

ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаСписка", ПараметрыФормы);

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

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

Программная установка отбора в модуле формы списка

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

&НаСервере

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

Если Параметры.Свойство("ВладелецДляОтбора") Тогда

ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Владелец");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = Параметры.ВладелецДляОтбора;

ЭлементОтбора.Использование = Истина;

ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;

КонецЕсли;

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

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

Порядок установки отбора по владельцу
  1. 1
    Определите, где нужен отбор: при открытии формы, внутри модуля формы или в запросе
  2. 2
    Для открытия формы передайте структуру Отбор с ключом «Владелец» в параметрах формы
  3. 3
    Для отбора в модуле формы добавьте ЭлементОтбораКомпоновкиДанных в Список.Отбор
  4. 4
    Установите ВидСравнения «Равно» и правое значение — ссылку на владельца
  5. 5
    Проверьте результат: в списке должны остаться только элементы выбранного владельца

Отбор по владельцу в форме выбора и поле ввода

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

Программно то же самое делается добавлением связи в коллекцию СвязиПараметровВыбора элемента формы:

НоваяСвязь = Новый СвязьПараметраВыбора("Отбор.Владелец", "Объект.Контрагент");

Элементы.Договор.СвязиПараметровВыбора.Добавить(НоваяСвязь);

После этого при открытии списка выбора договора автоматически применяется отбор по текущему контрагенту документа. Если контрагент не заполнен, список договоров будет пустым — это нормальное поведение связи параметров, а не ошибка.

Отбор по владельцу в запросах и отчётах

В запросах отбор по владельцу задаётся через параметр виртуальной таблицы или условие ГДЕ. Для справочников оба варианта корректны, но условие в секции ГДЕ читается проще:

ВЫБРАТЬ

Договоры.Ссылка,

Договоры.Наименование

ИЗ

Справочник.ДоговорыКонтрагентов КАК Договоры

ГДЕ

Договоры.Владелец = &Контрагент

В отчётах на СКД отбор по владельцу добавляется на закладке «Настройки» в раздел «Отбор» — поле «Владелец» доступно, если в запросе набора данных выбран подчинённый справочник. Пользователь сможет сам менять значение отбора в форме отчёта, если поле включено в пользовательские настройки.

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

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

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

Типичные ошибки
01
Передача в отбор строки с наименованием вместо ссылки — отбор ничего не найдёт, так как типы не совпадают
02
Опечатка в имени поля: «Владелец» пишется именно так, без пробелов; у составного владельца ссылка должна быть нужного типа
03
Установка отбора до заполнения динамического списка на сервере — используйте ПриСозданииНаСервере, а не ПриОткрытии
04
Попытка снять фиксированный отбор через пользовательские настройки — отбор, переданный параметром формы, пользователю недоступен
05
Отбор по владельцу в форме, где список построен произвольным запросом без поля Владелец — поле нужно добавить в текст запроса динамического списка
Контрольные точки

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

Состав списка
Норма

Видны только элементы выбранного владельца

Тревожный признак

Показываются элементы всех владельцев или список пуст при наличии данных

Панель отборов формы
Норма

Отображается отбор «Владелец = <значение>»

Тревожный признак

Отбор отсутствует — значит, он не применился

Смена владельца
Норма

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

Тревожный признак

Список не меняется — отбор зафиксирован на старом значении

Когда отбор по владельцу не сработает: ограничения

Отбор по полю «Владелец» возможен только если справочник действительно подчинён другому справочнику в конфигурации. Если подчинённость не настроена, реквизита «Владелец» у объекта нет, и попытка установить по нему отбор завершится ошибкой «Поле не найдено».

Во внешних обработках и расширениях учитывайте, что в разных конфигурациях имена справочников могут отличаться (например, «ДоговорыКонтрагентов» в одной конфигурации и «Договоры» в другой). Перед внедрением кода проверьте фактические имена объектов в конфигураторе конкретной базы.

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

Итог

Что важно запомнить

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

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

Как установить отбор по владельцу в обычных формах (толстый клиент)?

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

Можно ли установить отбор сразу по нескольким владельцам?

Да. Сформируйте список значений со ссылками владельцев и используйте вид сравнения «ВСписке» вместо «Равно». В параметре формы при открытии это тоже работает: передайте в структуру отбора массив или список значений.

Почему отбор по владельцу пропадает после «Ещё — Настроить список»?

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

Как отобрать элементы, у которых владелец не заполнен?

Используйте вид сравнения «НеЗаполнено» для элемента отбора динамического списка или условие запроса ГДЕ Владелец = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка). На практике у подчинённых справочников владелец обычно обязателен, поэтому такие элементы встречаются редко.

Работает ли отбор по владельцу в мобильном клиенте и веб-клиенте?

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