Получение списка объектов из ЭлементыФормы.СправочникСписок/ДокументСписок с учетом отборов и сортировки

Бывает нужно получить список ссылок из ЭлементыФормы.ДокументСписок или ЭлементыФормы.СправочникСписок, причем именно тот, который видит пользователь. А пользователь может настроить кучу отборов и сортировку… Данная функция позволяет сделать это.

Использование:

СписокДок = ПолучитьТаблицуСписка("Справочник.Номенклатура", ЭлементыФормы.ОбъектСписок);

Функция ПолучитьТаблицуСписка(ОбъектЗапроса, ЭлементыФормыСписок)

ВидыСравнения = Новый Соответствие;
ВидыСравнения.Вставить(ВидСравнения.Равно,   " = ");
ВидыСравнения.Вставить(ВидСравнения.НеРавно,   " <> ");
ВидыСравнения.Вставить(ВидСравнения.Больше,   " > ");
ВидыСравнения.Вставить(ВидСравнения.Меньше,   " < ");
ВидыСравнения.Вставить(ВидСравнения.БольшеИлиРавно,  " >= ");
ВидыСравнения.Вставить(ВидСравнения.МеньшеИлиРавно,  " <= ");
ВидыСравнения.Вставить(ВидСравнения.ВСписке,   " В ");
ВидыСравнения.Вставить(ВидСравнения.НеВСписке,   " В ");
ВидыСравнения.Вставить(ВидСравнения.ВИерархии,   " В ИЕРАРХИИ ");
ВидыСравнения.Вставить(ВидСравнения.НеВИерархии,  " В ИЕРАРХИИ ");
ВидыСравнения.Вставить(ВидСравнения.ВСпискеПоИерархии,  " В ИЕРАРХИИ ");
ВидыСравнения.Вставить(ВидСравнения.НеВСпискеПоИерархии, " В ИЕРАРХИИ ");
ВидыСравнения.Вставить(ВидСравнения.Содержит,   " ПОДОБНО ");
ВидыСравнения.Вставить(ВидСравнения.НеСодержит,   " ПОДОБНО ");
ВидыСравнения.Вставить(ВидСравнения.ИнтервалВключаяГраницы, " МЕЖДУ ");
ВидыСравнения.Вставить(ВидСравнения.Интервал,   " МЕЖДУ ");
ВидыСравнения.Вставить(ВидСравнения.ИнтервалВключаяНачало, " МЕЖДУ ");
ВидыСравнения.Вставить(ВидСравнения.ИнтервалВключаяОкончание, " МЕЖДУ ");

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОбъектЗапроса.Ссылка
|ИЗ
| "+ОбъектЗапроса+" КАК ОбъектЗапроса ";

пОтбор = ЭлементыФормыСписок.Значение.Отбор;
Если пОтбор.Количество() > 0 Тогда

СтрокаОтбора = "ГДЕ ";
Для Каждого ТекОтбор Из пОтбор Цикл

Если ТекОтбор.Использование = Истина Тогда
Если ТекОтбор.ВидСравнения = ВидСравнения.НеВСписке
ИЛИ ТекОтбор.ВидСравнения = ВидСравнения.НеВИерархии
ИЛИ ТекОтбор.ВидСравнения = ВидСравнения.НеВСпискеПоИерархии
ИЛИ ТекОтбор.ВидСравнения = ВидСравнения.НеСодержит Тогда
сНЕ = "НЕ ";
Иначе
сНЕ = "";
КонецЕсли;

Если ВидыСравнения.Получить(ТекОтбор.ВидСравнения) = " МЕЖДУ " Тогда
СтрокаОтбора = СтрокаОтбора + сНе +"ОбъектЗапроса." + ТекОтбор.Имя + ВидыСравнения.Получить(ТекОтбор.ВидСравнения) +"&" + ТекОтбор.Имя + "С И &" + ТекОтбор.Имя + "По И ";
Запрос.УстановитьПараметр(""+ТекОтбор.Имя+"С", ТекОтбор.ЗначениеС);
Запрос.УстановитьПараметр(""+ТекОтбор.Имя+"По", ТекОтбор.ЗначениеПо);

Если ТекОтбор.ВидСравнения = ВидСравнения.Интервал Тогда
СтрокаОтбора = СтрокаОтбора + "ОбъектЗапроса." + ТекОтбор.Имя +"<> &" + ТекОтбор.Имя + "С И " + "ОбъектЗапроса." + ТекОтбор.Имя +"<> &" + ТекОтбор.Имя + "По И ";
ИначеЕсли ТекОтбор.ВидСравнения = ВидСравнения.ИнтервалВключаяНачало Тогда
СтрокаОтбора = СтрокаОтбора + "ОбъектЗапроса." + ТекОтбор.Имя +"<> &" + ТекОтбор.Имя + "По И ";
ИначеЕсли ТекОтбор.ВидСравнения = ВидСравнения.ИнтервалВключаяОкончание Тогда
СтрокаОтбора = СтрокаОтбора + "ОбъектЗапроса." + ТекОтбор.Имя +"<> &" + ТекОтбор.Имя + "С И ";
КонецЕсли;
Иначе
СтрокаОтбора = СтрокаОтбора + сНе +"ОбъектЗапроса." + ТекОтбор.Имя + ВидыСравнения.Получить(ТекОтбор.ВидСравнения) +" ( &" + ТекОтбор.Имя + ") И ";
Запрос.УстановитьПараметр(ТекОтбор.Имя, ТекОтбор.Значение);
КонецЕсли;

КонецЕсли;
КонецЦикла;
Если СтрДлина(СтрокаОтбора)>4 Тогда
СтрокаОтбора = Лев(СтрокаОтбора, СтрДлина(СтрокаОтбора) - 2);
Запрос.Текст = Запрос.Текст + СтрокаОтбора;
КонецЕсли;
КонецЕсли;

пПорядок = ЭлементыФормыСписок.Значение.Порядок;
Если пПорядок.Количество() > 0 И Не (пПорядок.Количество() = 1 И пПорядок.Получить(0).Имя = "Порядок") Тогда

СтрокаПорядка = "УПОРЯДОЧИТЬ ПО ";
Для Каждого ТекПорядок Из пПорядок Цикл
Если ТекПорядок.Имя = "Порядок" Тогда
Продолжить;
КонецЕсли;
СтрокаПорядка = СтрокаПорядка + ТекПорядок.Имя + ?(ТекПорядок.Направление = НаправлениеСортировки.Убыв, " УБЫВ", "") + ", ";
КонецЦикла;

Если СтрДлина(СтрокаПорядка)>15 Тогда
СтрокаПорядка = Лев(СтрокаПорядка, СтрДлина(СтрокаПорядка) - 2);
Запрос.Текст = Запрос.Текст + СтрокаПорядка;
КонецЕсли;
КонецЕсли;

Возврат Запрос.Выполнить().Выгрузить();

КонецФункции

4 Comments

  1. ojiojiowka

    Я правильно понимаю, что Ваша обработка работает только в случае указания таблицы в качестве источника данных динамического списка? Т.е. если указан произвольный запрос (что бывает довольно часто) от неё толку нет. Также если включён RLS разве не будет возникать ошибка из-за отсутствия слова «разрешенные» в запросе?

    Reply
  2. webstep

    Обработка дана только в качестве примера использования функции.

    Да, функция предназначена для работы с динамическим списком и решает только одну специфическую проблему.

    Кому будет мешать RLS, могут вставить в запрос слово «разрешенные».

    Извините, я не стремился написать функцию, которая может помочь абсолютно всем. 🙂

    Reply
  3. BigB

    В 8.3.6 эта задача будет решаться очень просто.

    Вот статья Получение данных динамического списка

    Reply
  4. ya.Avoronov

    Здорово помогло, спасибо!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *