Как сделать цикл в запросе

Добавил пользователь Дмитрий К.
Обновлено: 10.09.2024

При разработке очередного отчета понадобилось получить таблицу дат за период, но с разными интервалами (День, Месяц, Квартал, Год). Поиск готовых решений в интернетене не дал приемлемых результатов. Пришлось разбираться самому. И вот, что из этого получилось.

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

// Возвращает таблицу значений с датами за период
//
// Параметры:
// НачДата - Дата - Начало периода
// КонДата - Дата - Конец периода
// Интервал - Строка - одно из следующих значений:
// (Секунда, Минута, Час, День, Неделя, Месяц, Квартал, Полугодие, Год)
//
// Возвращаемое значение:
// Таблица значений с датами за период. Содержит одну колонку "НачИнтервала"
//
Функция ПолучитьТаблицуДатЗаПериод ( НачДата , КонДата , Интервал )

тзИнтервалов = Новый ТаблицаЗначений ;
тзИнтервалов . Колонки . Добавить ( "НачИнтервала" , Новый ОписаниеТипов ( "Дата" ));

Запрос = Новый Запрос ;
Запрос . Текст = "ВЫБРАТЬ
| НАЧАЛОПЕРИОДА(&НачДата, День) КАК НачИнтервала
|УПОРЯДОЧИТЬ ПО
| НачИнтервала
|ИТОГИ ПО
| НачИнтервала ПЕРИОДАМИ(" + Интервал + ", &НачДата, &КонДата)" ;
//Параметры запроса
Запрос . УстановитьПараметр ( "НачДата" , НачДата );
Запрос . УстановитьПараметр ( "КонДата" , КонДата );

Выборка = Запрос . Выполнить (). Выбрать ( ОбходРезультатаЗапроса . ПоГруппировкам , "НачИнтервала" , "ВСЕ" );
Пока Выборка . Следующий () Цикл
НоваяСтрока = тзИнтервалов . Добавить ();
НоваяСтрока . НачИнтервала = Выборка . НачИнтервала ;
КонецЦикла;

Для примера прилагаю демонстрационную обработку. В ней можно выбрать Период, Интервал и сгенерировать таблицу Дат. Внешний вид обработки представлен на скриншотах.

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

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

Изображение

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

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

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

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

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

Реализация

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

Изображение

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

Изображение

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

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

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

Что в итоге?

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

Изображение

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

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

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

Схема компоновки данных представляет большие возможности по отборам, группировкам и оформлению выходного макета


Журнал регистрации 1С в отдельной SQL-базе


Игра "Самоцветы" (Bejeweled теперь и в 1С) + звук

Читайте также: