При разработке и доработке конфигураций 1С часто возникает задача: при выборе сотрудника из документа необходимо показывать не весь список, а только сотрудников с основным местом работы. Однако попытка жестко прописать отбор в самой форме списка или форме выбора справочника Сотрудники приводит к неприятным последствиям. Отбор начинает применяться везде, откуда бы ни открывался справочник, а галочка отбора в интерфейсе становится неактивной, не позволяя пользователю сбросить условие.
Разберем подробнее причины такого поведения платформы 1С и рассмотрим правильные механизмы управления отборами из вызывающих документов.
Выясним, почему при открытии формы галочка установки отбора становится серой и недоступной для снятия пользователем. Это происходит по следующим причинам:
ФиксированныеНастройки.Отбор динамического списка, платформа 1С считает такое условие обязательным. Чтобы пользователь случайно не нарушил логику заполнения документа, возможность отключения такого отбора в интерфейсе блокируется.РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный либо у него принудительно отключена доступность.Попытка прописать условие отбора непосредственно в модуле формы справочника Сотрудники (например, в событии ПриСозданииНаСервере) или проверка типа документа-владельца внутри справочника является критической архитектурной ошибкой.
Во-первых, изменение основной формы влияет на всю систему: отбор начинает работать даже там, где требуется выбрать внешнего совместителя. Во-вторых, попытка определить, из какого документа открыта форма (через ВладелецФормы), создает жесткую связность кода. При добавлении новых документов вам придется постоянно дорабатывать форму справочника. Правильное правило разработки в 1С гласит: логика отбора должна определяться вызывающей стороной (документом), а не получателем (справочником).
Рассмотрим самый простой и рекомендуемый способ, не требующий написания программного кода. Если отбор должен действовать всегда при выборе из конкретного поля документа, достаточно настроить параметры в палитре свойств элемента формы.
Разберем по шагам:
Сотрудники.ПараметрыВыбора).Отбор.ВидЗанятости, а в качестве значения — Перечисление.ВидыЗанятости.ОсновноеМестоРаботы.При открытии формы выбора платформа автоматически применит отбор к динамическому списку, не затрагивая вызов справочника из других мест конфигурации.
Проанализируем ситуацию, когда форму выбора необходимо открыть программно из кода документа (например, при нажатии на специальную кнопку или в обработчике НачалоВыбора).
В этом случае сформируем структуру параметров и передадим её в процедуру ОткрытьФорму. Посмотрим на пример кода:
&НаКлиенте
Процедура ИмяПоляНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("ВидЗанятости", ПредопределенноеЗначение("Перечисление.ВидыЗанятости.ОсновноеМестоРаботы"));
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("Отбор", СтруктураОтбора);
ОткрытьФорму("Справочник.Сотрудники.ФормаВыбора", ПараметрыОткрытия, Элемент);
КонецПроцедуры
Этот метод гарантирует точечное применение условий выбора без изменения общих форм справочника.
Бывают задачи, когда при открытии формы отбор по основному месту работы должен быть установлен по умолчанию, но у пользователя должна оставаться возможность снять флажок и выбрать совместителя.
Для этого в форму справочника передается произвольный параметр, а элемент добавляется в пользовательские настройки динамического списка:
ПараметрыОткрытия = Новый Структура("УстанавливатьОтборПоЗанятости", Истина);
ОткрытьФорму("Справочник.Сотрудники.ФормаВыбора", ПараметрыОткрытия, Элемент);
Сотрудники в событии ПриСозданииНаСервере обрабатываем полученный параметр:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("УстанавливатьОтборПоЗанятости") И Параметры.УстанавливатьОтборПоЗанятости Тогда
ЭлементОтбора = Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВидЗанятости");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Перечисления.ВидыЗанятости.ОсновноеМестоРаботы;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;
КонецЕсли;
КонецПроцедуры
Благодаря добавлению отбора в ПользовательскиеНастройки и указанию режима БыстрыйДоступ, флажок на форме остается активным, и пользователь может легко сбросить условие при необходимости.