gifts2017

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

Опубликовал Игорь Степанов (webstep) в раздел Программирование - Универсальные функции

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

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

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

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

Скачать файлы

Наименование Файл Версия Размер
Обработка с примером 2
.epf 10,80Kb
18.09.14
2
.epf 1 10,80Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Николай Терновой (ojiojiowka) 19.09.14 09:59
Я правильно понимаю, что Ваша обработка работает только в случае указания таблицы в качестве источника данных динамического списка? Т.е. если указан произвольный запрос (что бывает довольно часто) от неё толку нет. Также если включён RLS разве не будет возникать ошибка из-за отсутствия слова "разрешенные" в запросе?
2. Игорь Степанов (webstep) 19.09.14 10:55
Обработка дана только в качестве примера использования функции.
Да, функция предназначена для работы с динамическим списком и решает только одну специфическую проблему.
Кому будет мешать RLS, могут вставить в запрос слово "разрешенные".
Извините, я не стремился написать функцию, которая может помочь абсолютно всем. :)
3. BigB (BigB) 19.09.14 23:38
В 8.3.6 эта задача будет решаться очень просто.
Вот статья Получение данных динамического списка
4. Александр Воронов (ya.Avoronov) 11.03.15 09:52
Здорово помогло, спасибо!