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