новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Динамическое формирование запроса

  • Добавить свою публикацию
  • для этого требуется регистрация

Задача

Предположим, что пользователю необходимо видеть все документы в информационной базе одним списком. Несмотря на протесты разработчика из-за отрицательного влияния на производительность этой разработки, под давлением руководства было решено сделать такой отчет.

Изображение

Чтож, раз задача требует реализации - давайте выполним ее!

Как это сделать

Сразу оговоримся, что в отчете будут выводиться два поля: "Ссылка" и "Проведен". Эти стандартные реквизиты есть у всех документов. Запрос для получения всех документом мы будем формировать программным образом, обходя коллекцию метаданных "Метаданные.Документы". Для каждого элемента коллекции будем создавать запрос к его таблице по реквизитам "Ссылка" и "Проведен", а дальше объединять его результат с результатом аналогичного запроса к другому документу.

 

"ВЫБРАТЬ
|	Док.Ссылка КАК Ссылка,
|	Док.Проведен КАК Проведен
|ИЗ
|	Документ.ABCКлассификацияПокупателей КАК Док
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ
|	Док.Ссылка КАК Ссылка,
|	Док.Проведен КАК Проведен
|ИЗ
|	Документ.АвансовыйОтчет КАК Док
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ
|	Док.Ссылка КАК Ссылка,
|	Док.Проведен КАК Проведен
|ИЗ
|	Документ.АккредитивПереданный КАК Док
|ОБЪЕДИНИТЬ ВСЕ
| ... "

 

В случае, когда нужно выводить вообще все реквизиты, доступные во всех документах, то программное формирование запроса будет выглядеть намного сложнее. Чтобы не усложнять пример мы будем выводить только названные стандартные реквизиты.

 

При компоновке результата отчета будет необходимо поместить сформированный запрос в основной набор данных. Остальные действия при программном формировании отчета будут стандартными.

Реализация

Теперь по порядку. Создав внешний отчет, добавим в него схему компоновки данных. В качестве запроса в наборе данных добавим следующий запрос:

Изображение

Вообще, в нашем случае не важно, какой запрос будет для набора данных. Его мы добавили только для того, чтобы удобно было настраивать структуру отчета в конструкторе, поскольку иначе бы поля на закладке "Настройка" отсутствовали. Конечная настройка структуры отчета следующая:

Изображение

Теперь в обработчике события "ПриКомпоновкеРезультата" отключим стандартную обработку и выполним формирование отчета программно. Программный код формирования отчета на СКД представлен на следующем листинге:

 

 Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь; // отключаем стандартный вывод отчета - будем выводить программно 
	Настройки = КомпоновщикНастроек.Настройки;// Получаем настройки отчета 
		
	ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; // Создаем данные расшифровки 
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; // Создаем компоновщик макета 
	// Инициализируем макет компоновки используя схему компоновки данных 
	// и созданные ранее настройки и данные расшифровки
	СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	         	
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
	
	// Скомпонуем результат
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
	
	ДокументРезультат.Очистить();
	
	// Выводим результат в табличный документ
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);	
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
				
КонецПроцедуры

 

Все стандартно. Теперь главное. Текст запроса для набора данных мы должны заменить до компоновки макета. Как было сказано выше, программный код запроса будет формироваться при обходе коллекции метаданных документа. На следующем листинге представлен программный код для динамического формирования текста запроса:

 

	// ..................................................................
 	СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"); // Получаем схему компоновки данных
	
	СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = ""; // Очищаем запрос в наборе данных
	ДокументыКонфигурации = Метаданные.Документы; 				 // Получаем коллекцию метаданных документов 
	КоличествоДокументов = ДокументыКонфигурации.Количество();   // Определяем общее количество документов в конфигурации
	Сч = 1;
	ТекстЗапроса = "";
	Для Каждого Док Из ДокументыКонфигурации Цикл
		ТекстЗапроса = ТекстЗапроса + 		// Для каждого документа формируем текст запроса к его таблице
		"ВЫБРАТЬ							
		|	Док.Ссылка КАК Ссылка,
		|	Док.Проведен КАК Проведен
		|ИЗ
		|	Документ."+Док.Имя+" КАК Док";  // В текст запроса нам необходимо лишь подставить имя таблицы документа в дереве метаданных
		
		Если Сч  КоличествоДокументов Тогда // Если документ не последний в коллекции - добавляем инструкцию "ОБЪЕДИНИТЬ ВСЕ" для
			ТекстЗапроса = ТекстЗапроса +     // объединения результатов запросов по документам в единый список
			"
			|ОБЪЕДИНИТЬ ВСЕ
			|";
		КонецЕсли;			
		Сч = Сч + 1;
	КонецЦикла;
	СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = ТекстЗапроса; // Помещаем новый текст запроса в набор данных
         	
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки); // Компонуем макет
	// ....................................................................

 

Отчет готов к тестированию.

Что в итоге?

Запустим отчет в режиме 1С:Предприятие. Отчет успешно выполнится и мы увидим список всех документов в информационной базе.

Изображение

При всех проделанных действия отчет имеет все стандартные возможности СКД: расшифровка, настройка структуры отчета, отборы, условное оформление и прочее. 

 

Запрос к таблицам всех документом не самое оптимальное решение для просмотра полного списка документов в информационной базе, поскольку формирует относительно "тяжелый" запрос СУБД. Наиболее правильно было бы использовать объект конфигурации "Журнал документов", но это уже выходит за рамки статьи.

 
0
Читайте также
Консоль компоновки данных
Обработка для анализа данных , отладки запросов, написания отчетов без конфигуратора - предназанчена для программистов и продвинутых пользователей
[СКД] Организация простейшего отчета с помощью схемы компоновки данных
Схема компоновки данных представляет большие возможности по отборам, группировкам и оформлению выходного макета
Управление видом отчета на СКД
Настройка отчета на СКД без кодирования
Разработки
Журнал регистрации 1С в отдельной SQL-базе
Ведение журнала регистрации в 1С 8.1 в SQL базе
Монитор дисковых ресурсов
Мониторинг ресурсов диска
Игра "Самоцветы" (Bejeweled теперь и в 1С) + звук
Красивая логическая игра Самоцветы в 1С
Еще от автора
≡ к списку статей