понедельник, 25 июня 2018 г.

Используйте преимущества СКД для отборов в динамическом списке

Этот пример покажет как можно при помощи СКД оптимизировать отборы в динамических списках. Это применимо, если на форме присутствует отдельное поле для отбора по динамическому списку.


Допустим имеется справочник "Организации" и регистр "ОтветственныеЛица", в котором хранятся руководители организаций.

Необходимо вывести список всех организаций и иметь возможность отбора по руководителям. на форме. Это значит, что поля необходимые для отбора должны присутствовать в динамическом списке, даже если не выводятся на форму. И самый большой минус - это поле получается всегда, даже если отбор не установлен.

Запрос динамического списка в этом случае будет такой:

ВЫБРАТЬ
  Организации.Ссылка КАК Ссылка,
  Организации.Представление КАК Представление,
  ОтветственныеЛицаОрганизаций.ОтветственноеЛицо КАК ОтветственноеЛицо
ИЗ
  Справочник.Организации КАК Организации
  ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОтветственныеЛицаОрганизаций КАК ОтветственныеЛицаОрганизаций
   ПО Организации.Ссылка = ОтветственныеЛицаОрганизаций.Организация

При изменении поля "Ответственное лицо" выполняется код:

Организации.Отбор.Элементы.Очистить();

ЭлементОтбораДляУстановки = Организации.КомпоновщикНастроек.Настройки.ДоступныеПоляОтбора.Элементы.Найти("ОтветственноеЛицо");

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



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

Но если использовать условия компоновки данных, то соединение с регистром будет только в случае если на форме будет установлен отбор. Для этого переделаем запрос. В конструкторе запроса на вкладке Компоновка данных / Условия добавим условие ОтветственныеЛицаОрганизаций.ОтветственноеЛицо.


А на вкладке Компоновка данных / Таблицы у таблицы ОтветственныеЛицаОрганизаций уберем обязательность.


Запрос будет таким:
ВЫБРАТЬ
  Организации.Ссылка КАК Ссылка,
  Организации.Представление КАК Представление
ИЗ
  Справочник.Организации КАК Организации
  {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ОтветственныеЛицаОрганизаций КАК ОтветственныеЛицаОрганизаций
ПО Организации.Ссылка = ОтветственныеЛицаОрганизаций.Организация}
{ГДЕ

  ОтветственныеЛицаОрганизаций.ОтветственноеЛицо.*}

Готово.

Есть небольшой нюанс, если вы делаете необязательными две таблицы, то конструктор запроса обе выделит в одни скобки, и они будут либо включены обе либо ни одна. Что бы можно было делать необязательными отдельные таблицы - заключите каждую из них в скобки.

Комментариев нет:

Отправить комментарий