Загрузка данных



Функция ОбъектыПоКритериюОтбора(ЗначениеКритерияОтбора)

	ШаблонЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	ПсевдонимТаблицы.Ссылка КАК Ссылка
	|ИЗ
	|	ИмяТаблицы КАК ПсевдонимТаблицы
	|ГДЕ
	|	ПсевдонимТаблицы.ИмяРеквизита = &ЗначениеКритерияОтбора";

	ШаблонЗапросаОбъединения = "ВЫБРАТЬ
	|	ПсевдонимТаблицы.Ссылка КАК Ссылка
	|ИЗ
	|	ИмяТаблицы КАК ПсевдонимТаблицы
	|ГДЕ
	|	ПсевдонимТаблицы.ИмяРеквизита = &ЗначениеКритерияОтбора";

	ЧастиЗапроса = Новый Массив;
	ТекстЧастиЗапроса = "";

	Для Каждого ЭлементСостава Из Метаданные.КритерииОтбора.СвязанныеДокументы.Состав Цикл

		Если НЕ ЭлементСостава.Тип.СодержитТип(ТипЗнч(ЗначениеКритерияОтбора)) Тогда
			Продолжить;
		КонецЕсли;

		ПутьКДанным = ЭлементСостава.ПолноеИмя();

		Если СтрНайти(ПутьКДанным, "ТабличнаяЧасть") Тогда
			ОбъектМетаданных = ЭлементСостава.Родитель().Родитель();
		Иначе
			ОбъектМетаданных = ЭлементСостава.Родитель();
		КонецЕсли;

		Если НЕ ПравоДоступа("Чтение", ОбъектМетаданных) Тогда
			Продолжить;
		КонецЕсли;

		Точка = СтрНайти(ПутьКДанным, ".", НаправлениеПоиска.СКонца);
		ИмяРеквизита = Сред(ПутьКДанным, Точка + 1);

		ИмяТаблицы = ЭлементСостава.Родитель().ПолноеИмя();
		ИмяТаблицы = СтрЗаменить(ИмяТаблицы, "ТабличнаяЧасть.", "");

		Точка = СтрНайти(ИмяТаблицы, ".", НаправлениеПоиска.СКонца);
		ПсевдонимТаблицы = "Таблица_" + Сред(ИмяТаблицы, Точка + 1);

		ТекстЧастиЗапроса = ?(ТекстЧастиЗапроса = "", ШаблонЗапроса, ШаблонЗапросаОбъединения);
		ТекстЧастиЗапроса = СтрЗаменить(ТекстЧастиЗапроса, "ИмяТаблицы", ИмяТаблицы);
		ТекстЧастиЗапроса = СтрЗаменить(ТекстЧастиЗапроса, "ПсевдонимТаблицы", ПсевдонимТаблицы);
		ТекстЧастиЗапроса = СтрЗаменить(ТекстЧастиЗапроса, "ИмяРеквизита", ИмяРеквизита);

		ЧастиЗапроса.Добавить(ТекстЧастиЗапроса);

	КонецЦикла;

	Если ЧастиЗапроса.Количество() > 0 Тогда
		Запрос = Новый Запрос;
		Разделитель = Символы.ПС + "ОБЪЕДИНИТЬ" + Символы.ПС;
		Запрос.Текст = СтрСоединить(ЧастиЗапроса, Разделитель);
		Запрос.УстановитьПараметр("ЗначениеКритерияОтбора", ЗначениеКритерияОтбора);
		Возврат Запрос.Выполнить().Выгрузить();
	Иначе
		Возврат Новый ТаблицаЗначений;
	КонецЕсли;

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