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