Настроить отборы динамического списка. Устанавливает в условие ГДЕ динамического списка постоянные отборы
// Устанавливает в условие ГДЕ динамического списка постоянные отборы
// на основе разрешенных значений доступа указанных типов в рамках всех групп доступа.
// Это позволяет в отдельных случаях ускорить открытие динамического списка.
// Если количество разрешенных значений в общей сложности получилось более 100, отбор не устанавливается.
//
// Для работы процедуры у динамического списка должна быть установлена основная таблица,
// установлен произвольный запрос, а также должно поддерживаться преобразование вида:
// СхемаЗапроса = Новый СхемаЗапроса;
// СхемаЗапроса.УстановитьТекстЗапроса(Список.ТекстЗапроса);
// Список.ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
// Если это условие выполнить не удается, тогда следует добавлять отборы самостоятельно
// с использованием функции РазрешенныеЗначенияДляДинамическогоСписка, как в этой процедуре.
//
// Параметры:
// Список - ДинамическийСписок - динамический список, в который нужно установить отборы.
// ОписаниеОтборов - Соответствие - со свойствами:
// * Ключ - Строка - имя поля основной таблицы динамического списка, для которого
// нужно установить условие <Поле> В (&РазрешенныеЗначения).
// * Значение - Тип - тип значений доступа, которые нужно включить в состав
// параметра "&РазрешенныеЗначения".
// - Массив - массив указанных выше типов.
//
Процедура НастроитьОтборыДинамическогоСписка(Список, ОписаниеОтборов) Экспорт
Если Не ОграничиватьДоступНаУровнеЗаписей()
Или УправлениеДоступомСлужебный.ОграничиватьДоступНаУровнеЗаписейУниверсально()
Или Пользователи.ЭтоПолноправныйПользователь(,, Ложь) Тогда
Возврат;
КонецЕсли;
Если ТипЗнч(Список) <> Тип("ДинамическийСписок") Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Ошибка вызова процедуры НастроитьОтборыДинамическогоСписка общего модуля УправлениеДоступом.
|Значение параметра Список ""%1"" не является динамическим списком.'"), Строка(Список));
КонецЕсли;
Если Не ЗначениеЗаполнено(Список.ОсновнаяТаблица) Тогда
ВызватьИсключение
НСтр("ru = 'Ошибка вызова процедуры НастроитьОтборыДинамическогоСписка общего модуля УправлениеДоступом.
|У переданного динамического списка не указана основная таблица.'");
КонецЕсли;
Если Не Список.ПроизвольныйЗапрос Тогда
ВызватьИсключение
НСтр("ru = 'Ошибка вызова процедуры НастроитьОтборыДинамическогоСписка общего модуля УправлениеДоступом.
|У переданного динамического списка не установлен флажок ""Произвольный запрос"".'");
КонецЕсли;
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(Список.ТекстЗапроса);
Параметры = Новый Соответствие;
Для Каждого ОписаниеОтбора Из ОписаниеОтборов Цикл
ИмяПоля = ОписаниеОтбора.Ключ;
Значения = УправлениеДоступомСлужебный.РазрешенныеЗначенияДляДинамическогоСписка(
Список.ОсновнаяТаблица, ОписаниеОтбора.Значение);
Если Значения = Неопределено Тогда
Продолжить;
КонецЕсли;
Источники = СхемаЗапроса.ПакетЗапросов[0].Операторы[0].Источники;
Псевдоним = "";
Для Каждого Источник Из Источники Цикл
Если Источник.Источник.ИмяТаблицы = Список.ОсновнаяТаблица Тогда
Псевдоним = Источник.Источник.Псевдоним;
Прервать;
КонецЕсли;
КонецЦикла;
Если Не ЗначениеЗаполнено(Псевдоним) Тогда
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Ошибка вызова процедуры НастроитьОтборыДинамическогоСписка общего модуля УправлениеДоступом.
|У переданного динамического списка не удалось найти псевдоним основной таблицы
|""%1"".'"), Список.ОсновнаяТаблица);
КонецЕсли;
Отбор = СхемаЗапроса.ПакетЗапросов[0].Операторы[0].Отбор;
ИмяПараметра = "РазрешенныеЗначенияПоля" + ИмяПоля;
Параметры.Вставить(ИмяПараметра, Значения);
Условие = Псевдоним + "." + ИмяПоля + " В (&" + ИмяПараметра + ")";
Отбор.Добавить(Условие);
КонецЦикла;
Список.ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
Для Каждого КлючИЗначение Из Параметры Цикл
ОбновитьЗначениеПараметраКомпоновкиДанных(Список, КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЦикла;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
ОтборДинамическогоСписка (БСП)
Получение данных динамического списка
УстановитьЭлементОтбораДинамическогоСписка (БСП)
УдалитьЭлементыГруппыОтбораДинамическогоСписка (БСП)
Установить элемент отбора динамического списка
БыстрыйОтборСписокПриИзменении (БСП)
Канал FastCode 1C в Телеграм! Шаблоны кода, статьи, полезные советы, курсы по 1С (8К участников)