Как показать в списке только элементы нужного владельца: способы для 1С 8.3
Содержание
Быстрее всего установить отбор по владельцу в 1С без единой строки кода: в Конфигураторе откройте реквизит, который ссылается на подчинённый справочник (например, Договор), и в свойстве «Связи параметров выбора» задайте Отбор.Владелец → Контрагент. После этого при выборе договора программа покажет только договоры выбранного контрагента. Если отбор нужен в списке или в чужой форме — передайте параметр формы Отбор или добавьте элемент отбора в динамический список кодом.
Тема общая для платформы 1С:Предприятие 8.3 и управляемых форм. Приёмы одинаково работают в 1С:Бухгалтерии 3.0, ЗУП 3.1, УТ 11 и в самописных базах. Разница только в том, какие справочники подчинены и можно ли менять конфигурацию.
Владелец справочника: что это и где отбор по нему нужен
Справочник может быть подчинён другому справочнику. Тогда у каждого его элемента есть стандартный реквизит Владелец. Классический пример — ДоговорыКонтрагентов, где владелец каждого договора — контрагент. Другие примеры: банковские счета контрагента, контактные лица, единицы измерения номенклатуры.
Отбор по владельцу решает три практические задачи:
- 📋 Выбор из короткого списка. В документе бухгалтер выбирает договор только среди договоров своего контрагента, а не из тысячи строк.
- 🔒 Защита от ошибок. Нельзя случайно подставить договор чужого контрагента — потом это всплывает в оборотно-сальдовой ведомости как «чужие» расчёты.
- 👤 Разграничение доступа. Менеджер видит только договоры своих клиентов.
Первые две задачи решаются отбором в форме. Третья — только ограничением доступа на уровне записей: отбор в форме пользователь может обойти, открыв справочник другим путём.
Что проверить в конфигурации перед настройкой
Прежде чем ставить отбор, убедитесь, что подчинение действительно существует и данные к нему готовы. Пять минут проверки избавят от отбора, который «ничего не показывает».
- Откройте справочник в дереве конфигурации, закладку «Владельцы». В списке владельцев должен быть нужный справочник. Если владельцев несколько, реквизит
Владелецбудет составного типа. - Посмотрите свойство «Использование подчинения»:
Элементам,ГруппамилиГруппам и элементам. От него зависит, у каких записей заполнен владелец. - Проверьте, что у старых элементов владелец заполнен. Простой запрос в консоли запросов:
ВЫБРАТЬ
Договоры.Ссылка,
Договоры.Наименование
ИЗ
Справочник.ДоговорыКонтрагентов КАК Договоры
ГДЕ
Договоры.Владелец = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
- Если форма списка построена на произвольном запросе, убедитесь, что поле
Владелецесть в выборке. Без него отбор по полю просто не к чему применить. - Определите, можно ли менять конфигурацию. Если типовая на поддержке и снимать её нельзя — делайте правки в расширении (расширения доступны с платформы 8.3.6).
Если в типовой конфигурации отбор по владельцу нужен только вам как пользователю, программировать ничего не нужно. Откройте список, в меню Ещё выберите настройку списка, на закладке «Отбор» добавьте поле владельца (в списке договоров оно может называться «Контрагент») и выберите значение.
Способ 1. Связи параметров выбора — отбор без кода
Это основной приём, который типовые конфигурации используют повсеместно. Отбор подставляется автоматически и меняется вместе с выбранным владельцем.
Настройка в свойствах реквизита
- В Конфигураторе откройте документ, например
РеализацияТоваровУслуг. - Найдите реквизит
ДоговорКонтрагентаи откройте его палитру свойств. - В свойстве «Связи параметров выбора» нажмите кнопку выбора.
- Добавьте строку: имя параметра —
Отбор.Владелец, реквизит —Контрагент. - В колонке изменения значения выберите
Очищать, если договор должен сбрасываться при смене контрагента. - Сохраните конфигурацию и обновите конфигурацию базы данных.
Теперь в любой форме, где выводится этот реквизит, выбор договора ограничен договорами текущего контрагента.
То же самое для одного поля формы
Если связь нужна только в одной форме, задайте её у элемента формы. В редакторе формы выделите поле, найдите то же свойство «Связи параметров выбора» и заполните его аналогично, только реквизит указывайте путём к данным: Объект.Контрагент.
Кодом это делается так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Связи = Новый Массив;
Связи.Добавить(Новый СвязьПараметраВыбора("Отбор.Владелец", "Объект.Контрагент",
РежимИзмененияСвязанногоЗначения.Очищать));
Элементы.ДоговорКонтрагента.СвязиПараметровВыбора = Новый ФиксированныйМассив(Связи);
КонецПроцедуры
Связи параметров выбора ограничивают только выбор из формы. Если пользователь вставит договор через буфер обмена или значение придёт из обмена данными, проверку никто не сделает. Для жёсткого контроля добавьте проверку в ОбработкаПроверкиЗаполнения документа.
Фиксированный владелец: параметры выбора
Когда владелец заранее известен и не зависит от другого поля, используйте свойство «Параметры выбора» с фиксированным значением:
Параметры = Новый Массив;
Параметры.Добавить(Новый ПараметрВыбора("Отбор.Владелец", ОсновнаяОрганизация));
Элементы.БанковскийСчет.ПараметрыВыбора = Новый ФиксированныйМассив(Параметры);
Способ 2. Отбор по владельцу программно в модулях формы
Код нужен, когда отбор зависит от условий, которые не выразить связью: роли пользователя, настройки, значения из другой формы.
Передача отбора при открытии формы
Платформа понимает параметр Отбор у стандартных форм списка и выбора. Ключи структуры — имена полей, значения — то, по чему отбирать:
&НаКлиенте
Процедура ДоговорНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПараметрыФормы = Новый Структура("Отбор", Новый Структура("Владелец", Объект.Контрагент));
ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры
Отбор из параметра платформа ставит сама. Пользователь видит его, но значение подставлено заранее.
Отбор в динамическом списке
Если вы пишете свою форму со списком, добавьте элемент отбора при создании формы на сервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Не ЗначениеЗаполнено(Параметры.Владелец) Тогда
Возврат;
КонецЕсли;
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Владелец");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Параметры.Владелец;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
КонецПроцедуры
Здесь Параметры.Владелец — параметр формы, который нужно создать в редакторе формы на закладке «Параметры». Режим отображения Недоступный убирает отбор из пользовательских настроек, и снять его из интерфейса нельзя.
В конфигурациях на БСП (а это все современные типовые) короче вызвать готовую процедуру:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
Список, "Владелец", Параметры.Владелец,
ВидСравненияКомпоновкиДанных.Равно, , Истина);
Процедура не плодит дубли: при повторном вызове она обновит существующий элемент отбора, а не добавит второй.
Владелец меняется прямо в форме
Если владельца выбирают в той же форме (поле над списком), повесьте обработчик ПриИзменении на это поле и вызовите ту же процедуру установки отбора. Использование передавайте как ЗначениеЗаполнено(Владелец): пустое поле — отбор выключен, а не «показать записи с пустым владельцем».
Отбор в запросе
В отчётах и обработках отбор по владельцу — обычное условие:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Договоры.Ссылка
ИЗ
Справочник.ДоговорыКонтрагентов КАК Договоры
ГДЕ
Договоры.Владелец = &Контрагент
И НЕ Договоры.ПометкаУдаления
Слово РАЗРЕШЕННЫЕ пригодится, если в базе включены ограничения на уровне записей — о них ниже.
Способ 3. Автоматический отбор подчинённого справочника из формы владельца
У подчинённых справочников есть встроенное поведение платформы, о котором часто забывают. Его не нужно программировать.
- 🔗 Переход из карточки владельца. Если в командном интерфейсе формы контрагента есть ссылка на договоры, список откроется уже с отбором по этому контрагенту. Так устроены ссылки «Договоры», «Банковские счета», «Контактные лица» в карточке контрагента в БП 3.0.
- ✍️ Заполнение нового элемента. Если в списке стоит отбор по владельцу с видом сравнения «Равно», новый элемент, созданный из этого списка, получит владельца автоматически.
- 🧭 Добавление ссылки в карточку. В редакторе формы владельца на закладке «Командный интерфейс» включите видимость команды перехода к подчинённому справочнику. Платформа сама предложит её в панели навигации формы.
Если у вас самописный справочник, и в карточке владельца нет ссылки на подчинённые элементы, проверьте именно настройку командного интерфейса формы. Чаще всего команда есть, но выключена.
Способ 4. Ограничение доступа по владельцу (RLS)
Когда задача — не удобство, а запрет, отбор в форме не подходит. Нужен RLS — ограничение доступа к данным на уровне записей.
Как устроено
В роли для справочника задаётся условие для права «Чтение» (и при необходимости «Изменение»). Пример условия: менеджер видит договоры только тех контрагентов, у которых он указан ответственным:
ГДЕ Владелец.ОсновнойМенеджер = &ТекущийПользователь
Здесь ТекущийПользователь — параметр сеанса, а ОсновнойМенеджер — реквизит контрагента. Имена у вас будут свои: подставьте реквизиты своей конфигурации.
Порядок настройки в самописной базе
- Создайте или откройте роль, перейдите в редактор прав.
- Выберите справочник, право «Чтение».
- В нижней части окна введите условие ограничения доступа к данным.
- Проверьте, что параметр сеанса заполняется при входе пользователя (обычно в
УстановкаПараметровСеансамодуля сеанса). - Назначьте роль пользователю и обновите конфигурацию базы данных.
Типовые конфигурации
В типовых на БСП условия RLS в роли руками не пишут. Ограничения настраивают через группы доступа. В 1С:Бухгалтерии 3.0 сначала включается флажок ограничения доступа на уровне записей в разделе Администрирование → Настройки пользователей и прав. Состав видов доступа зависит от конфигурации: в БП ограничивают в основном по организациям, в УТ 11 и ERP набор шире.
Ограничение на уровне записей замедляет запросы и может «сломать» доработки, в которых запросы написаны без РАЗРЕШЕННЫЕ: пользователь получит ошибку нехватки прав. Сначала включайте его в копии базы.
Какой способ выбрать
| Задача | Способ | Код | Защищает от обхода |
|---|---|---|---|
| Выбор договора по контрагенту в документе | Связи параметров выбора | Нет | Нет |
| Фиксированный владелец в одном поле | Параметры выбора | Минимум | Нет |
| Своя форма списка с отбором | Отбор динамического списка | Да | Нет |
| Открыть список из своей команды | Параметр формы Отбор | Да | Нет |
| Пользователь не должен видеть чужое | RLS / группы доступа | Условие в роли | Да |
Связь параметров выбора и RLS часто ставят вместе: первое делает выбор удобным, второе — безопасным.
Где отбор по владельцу ломается
Отдельно о расширениях. Если связь параметров выбора нужно добавить в типовой документ, заимствуйте форму документа в расширение и задайте связь у поля формы кодом в ПриСозданииНаСервере после вызова основного обработчика. Свойства реквизита метаданных в расширении меняются ограниченно, а элемент формы — свободно.
Проверяем, что отбор работает
Проверку делайте под тем пользователем, для которого настраивали отбор, а не под администратором. У полноправного пользователя RLS не действует, и тест ничего не покажет.
- Выбор в документе. Создайте документ, выберите контрагента, откройте выбор договора. В списке только его договоры, отбор виден в шапке списка.
- Смена владельца. Поменяйте контрагента. Договор должен очиститься (если стоит режим «Очищать»), а при новом выборе — показаться договоры нового контрагента.
- Обход через справочник. Откройте справочник договоров из раздела напрямую. При отборе в форме здесь будут все договоры — так и задумано. При RLS — только разрешённые.
- Новый элемент. Создайте договор из отфильтрованного списка и проверьте, что владелец заполнился сам.
- Отладка кода. Поставьте точку останова после установки отбора и посмотрите в табло
Список.Отбор.Элементы: сколько элементов, какой вид сравнения, включено ли использование.
Частые вопросы
Можно ли сделать отбор по владельцу владельца?
Владелец.Владелец. Для связи параметров выбора это не работает напрямую — понадобится код.Почему отбор по владельцу работает в одной форме и не работает в другой?
Как разрешить выбирать элементы без владельца вместе с элементами владельца?
Влияет ли отбор в форме на скорость работы?
Владелец индексируется платформой. RLS со сложными условиями через точку замедляет запросы заметнее.