Print
Category: Все материалы
Hits: 11209

User Rating: 0 / 5

Star InactiveStar InactiveStar InactiveStar InactiveStar Inactive
 

Добрый день.

Сегодня расскажу о том, как программно настраивать отборы в динамических списках. По сути, теперь любая форма списка справочника или объекта является динамическим списком. Новый возможности позволяют нам мышкой, без программирования, решить практически все основные задачи. Простые отборы настраиваются связью параметров, сложные прописываются прямо в запросе динамического списка. Однако иногда проще и эффективнее контролировать это дело программно. Об этом и поговорим.

 



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

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

Теперь к небольшому практическому примеру.

Допустим у нас есть список задачек. У задачки есть её статус (создана, в работе, на согласовании, утверждена...). У задачки есть автор и исполнитель. У каждого пользователя есть его роль, в зависимости от которой, он должен делать с задачками те или иные действия (согласовывать, утверждать, прекращать). Так же у каждой задачи есть проект и каждый пользователь закреплен за своим проектом. И роль на разных проектах у нас будет разная. Требуется, чтобы пользователь видел задачи, в которых он является автором или исполнителем, или ему по статусу положено их видеть (все которые надо согласовать в данный момент).

Допустим мы как-то получили текущего пользователя и запросом получили комбинации "текущий статус задачи"/"Проект" доступные данному пользователю. Далее надо все это сунуть в отбор.

Делать это будем при создании формы на сервере. Все условия у нас будут соединены группой "ИЛИ", поэтому сначала создаем группу:

//создадим группу с типом ИЛИ
отборГруппаИЛИ = Список.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
отборГруппаИЛИ.Использование = Истина;
отборГруппаИЛИ.Представление = "список комбинаций проект/статус";
отборГруппаИЛИ.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИли;
отборГруппаИЛИ.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;

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

далее в цикле переберем все доступные комбинации "Проект/статус" для текущего пользователя. Комбинации идут через "ИЛИ", но сами условия одной комбинации объединены через "И".

Тут будет единственный сходу непонятный нюанс. Левое и правое значение условия (оба, а не только правое как раньше) могут быть конкретным значением (числом, ссылкой, строкой...) или полем динамического списка. Т.е. грубо говоря, мы можем указать отбор, где автор = исполнителю или то, что статус "выполнена" равен статусу "завершена", что "ИСТИНА" равна "ЛОЖЬ" или еще что-то из этой оперы. Так вот, чтобы в левую или правую часть сравнения засунуть поле, то нужно создать объект "ПолеКомпоновкиДанных" с именем равным имени поля списка, а чтобы сунуть туда значение, просто присвойте его туда.

к=1;
Пока выб.Следующий() Цикл
     //на каждую комбинацию делаем папку И
     отборГруппаИ = отборГруппаИЛИ.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
     отборГруппаИ.Использование = Истина;
     отборГруппаИ.Представление = "комбинация проект/статус №"+к;
     отборГруппаИ.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
     отборГруппаИ.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
     отборСтатус = отборГруппаИ.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
     отборСтатус.ЛевоеЗначение    = Новый ПолеКомпоновкиДанных("ТекущееСостояние");
     отборСтатус.ВидСравнения     = ВидСравненияКомпоновкиДанных.Равно;
     отборСтатус.Использование    = Истина;
     отборСтатус.ПравоеЗначение   = выб.ИсходноеСостояние;
     отборСтатус.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
     отборПроект = отборГруппаИ.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
     отборПроект.ЛевоеЗначение    = Новый ПолеКомпоновкиДанных("Проект");
     отборПроект.ВидСравнения     = ВидСравненияКомпоновкиДанных.Равно;
     отборПроект.Использование    = Истина;
     отборПроект.ПравоеЗначение   = выб.Проект;
     отборПроект.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
КонецЦикла;

Не смотря на недоступность пользователю для обозрения нашего отбора, я все равно заполняю поля "Представление" и "РежимОтображения". Это не обязательно, просто для примера.

Далее добавим отбор по автору задачи.

//2. Мы всегда должны видеть заявки автором которых мы являемся
отборПоАвтору = отборГруппаИЛИ.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
отборПоАвтору.ЛевоеЗначение    = Новый ПолеКомпоновкиДанных("Автор");
отборПоАвтору.ВидСравнения     = ВидСравненияКомпоновкиДанных.Равно;
отборПоАвтору.Использование    = Истина;
отборПоАвтору.ПравоеЗначение   = ПараметрыСеанса.ТекущийПользователь;
отборПоАвтору.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;

По исполнителю кусок кода такой же в точности.

 

Собственно это все. Вот такая коротенькая статья.