Бывает нужно получить список ссылок из ЭлементыФормы.ДокументСписок или ЭлементыФормы.СправочникСписок, причем именно тот, который видит пользователь. А пользователь может настроить кучу отборов и сортировку… Данная функция позволяет сделать это.
Использование:
СписокДок = ПолучитьТаблицуСписка("Справочник.Номенклатура", ЭлементыФормы.ОбъектСписок);
Функция ПолучитьТаблицуСписка(ОбъектЗапроса, ЭлементыФормыСписок)
ВидыСравнения = Новый Соответствие;
ВидыСравнения.Вставить(ВидСравнения.Равно, " = ");
ВидыСравнения.Вставить(ВидСравнения.НеРавно, " <> ");
ВидыСравнения.Вставить(ВидСравнения.Больше, " > ");
ВидыСравнения.Вставить(ВидСравнения.Меньше, " < ");
ВидыСравнения.Вставить(ВидСравнения.БольшеИлиРавно, " >= ");
ВидыСравнения.Вставить(ВидСравнения.МеньшеИлиРавно, " <= ");
ВидыСравнения.Вставить(ВидСравнения.ВСписке, " В ");
ВидыСравнения.Вставить(ВидСравнения.НеВСписке, " В ");
ВидыСравнения.Вставить(ВидСравнения.ВИерархии, " В ИЕРАРХИИ ");
ВидыСравнения.Вставить(ВидСравнения.НеВИерархии, " В ИЕРАРХИИ ");
ВидыСравнения.Вставить(ВидСравнения.ВСпискеПоИерархии, " В ИЕРАРХИИ ");
ВидыСравнения.Вставить(ВидСравнения.НеВСпискеПоИерархии, " В ИЕРАРХИИ ");
ВидыСравнения.Вставить(ВидСравнения.Содержит, " ПОДОБНО ");
ВидыСравнения.Вставить(ВидСравнения.НеСодержит, " ПОДОБНО ");
ВидыСравнения.Вставить(ВидСравнения.ИнтервалВключаяГраницы, " МЕЖДУ ");
ВидыСравнения.Вставить(ВидСравнения.Интервал, " МЕЖДУ ");
ВидыСравнения.Вставить(ВидСравнения.ИнтервалВключаяНачало, " МЕЖДУ ");
ВидыСравнения.Вставить(ВидСравнения.ИнтервалВключаяОкончание, " МЕЖДУ ");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОбъектЗапроса.Ссылка
|ИЗ
| "+ОбъектЗапроса+" КАК ОбъектЗапроса ";
пОтбор = ЭлементыФормыСписок.Значение.Отбор;
Если пОтбор.Количество() > 0 Тогда
СтрокаОтбора = "ГДЕ ";
Для Каждого ТекОтбор Из пОтбор Цикл
Если ТекОтбор.Использование = Истина Тогда
Если ТекОтбор.ВидСравнения = ВидСравнения.НеВСписке
ИЛИ ТекОтбор.ВидСравнения = ВидСравнения.НеВИерархии
ИЛИ ТекОтбор.ВидСравнения = ВидСравнения.НеВСпискеПоИерархии
ИЛИ ТекОтбор.ВидСравнения = ВидСравнения.НеСодержит Тогда
сНЕ = "НЕ ";
Иначе
сНЕ = "";
КонецЕсли;
Если ВидыСравнения.Получить(ТекОтбор.ВидСравнения) = " МЕЖДУ " Тогда
СтрокаОтбора = СтрокаОтбора + сНе +"ОбъектЗапроса." + ТекОтбор.Имя + ВидыСравнения.Получить(ТекОтбор.ВидСравнения) +"&" + ТекОтбор.Имя + "С И &" + ТекОтбор.Имя + "По И ";
Запрос.УстановитьПараметр(""+ТекОтбор.Имя+"С", ТекОтбор.ЗначениеС);
Запрос.УстановитьПараметр(""+ТекОтбор.Имя+"По", ТекОтбор.ЗначениеПо);
Если ТекОтбор.ВидСравнения = ВидСравнения.Интервал Тогда
СтрокаОтбора = СтрокаОтбора + "ОбъектЗапроса." + ТекОтбор.Имя +"<> &" + ТекОтбор.Имя + "С И " + "ОбъектЗапроса." + ТекОтбор.Имя +"<> &" + ТекОтбор.Имя + "По И ";
ИначеЕсли ТекОтбор.ВидСравнения = ВидСравнения.ИнтервалВключаяНачало Тогда
СтрокаОтбора = СтрокаОтбора + "ОбъектЗапроса." + ТекОтбор.Имя +"<> &" + ТекОтбор.Имя + "По И ";
ИначеЕсли ТекОтбор.ВидСравнения = ВидСравнения.ИнтервалВключаяОкончание Тогда
СтрокаОтбора = СтрокаОтбора + "ОбъектЗапроса." + ТекОтбор.Имя +"<> &" + ТекОтбор.Имя + "С И ";
КонецЕсли;
Иначе
СтрокаОтбора = СтрокаОтбора + сНе +"ОбъектЗапроса." + ТекОтбор.Имя + ВидыСравнения.Получить(ТекОтбор.ВидСравнения) +" ( &" + ТекОтбор.Имя + ") И ";
Запрос.УстановитьПараметр(ТекОтбор.Имя, ТекОтбор.Значение);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если СтрДлина(СтрокаОтбора)>4 Тогда
СтрокаОтбора = Лев(СтрокаОтбора, СтрДлина(СтрокаОтбора) - 2);
Запрос.Текст = Запрос.Текст + СтрокаОтбора;
КонецЕсли;
КонецЕсли;
пПорядок = ЭлементыФормыСписок.Значение.Порядок;
Если пПорядок.Количество() > 0 И Не (пПорядок.Количество() = 1 И пПорядок.Получить(0).Имя = "Порядок") Тогда
СтрокаПорядка = "УПОРЯДОЧИТЬ ПО ";
Для Каждого ТекПорядок Из пПорядок Цикл
Если ТекПорядок.Имя = "Порядок" Тогда
Продолжить;
КонецЕсли;
СтрокаПорядка = СтрокаПорядка + ТекПорядок.Имя + ?(ТекПорядок.Направление = НаправлениеСортировки.Убыв, " УБЫВ", "") + ", ";
КонецЦикла;
Если СтрДлина(СтрокаПорядка)>15 Тогда
СтрокаПорядка = Лев(СтрокаПорядка, СтрДлина(СтрокаПорядка) - 2);
Запрос.Текст = Запрос.Текст + СтрокаПорядка;
КонецЕсли;
КонецЕсли;
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Я правильно понимаю, что Ваша обработка работает только в случае указания таблицы в качестве источника данных динамического списка? Т.е. если указан произвольный запрос (что бывает довольно часто) от неё толку нет. Также если включён RLS разве не будет возникать ошибка из-за отсутствия слова «разрешенные» в запросе?
Обработка дана только в качестве примера использования функции.
Да, функция предназначена для работы с динамическим списком и решает только одну специфическую проблему.
Кому будет мешать RLS, могут вставить в запрос слово «разрешенные».
Извините, я не стремился написать функцию, которая может помочь абсолютно всем. 🙂
В 8.3.6 эта задача будет решаться очень просто.
Получение данных динамического списка
Вот статья
Здорово помогло, спасибо!