При переходе от простых выборок к реальным производственным задачам начинающие разработчики часто сталкиваются с громоздкими пакетными запросами, содержащими множество временных таблиц (ВТ), соединений и вложенных подзапросов. Рассмотрим пошаговый алгоритм, который поможет быстро разобраться в логике чужого сложного запроса, доработать его, а также системно освоить язык запросов платформы 1С:Предприятие.
Когда перед нами большой запрос из нескольких десятков строк или страниц, не нужно пытаться понять его целиком сразу. Разберем алгоритм последовательного анализа:
ПОМЕСТИТЬ. Выпишем названия всех создаваемых временных таблиц и определим, какая таблица из каких источников строится. Это позволит понять поток данных от исходных регистров до итоговой выборки.ВыполнитьПакетСПромежуточнымиДанными(). В отличие от стандартного выполнения, этот метод возвращает массив результатов всех запросов пакета, включая создание временных таблиц.Посмотрим на пример программного просмотра промежуточных данных:
Запрос = Новый Запрос;
Запрос.Текст = ТекстСложногоЗапроса;
// Устанавливаем все требуемые параметры
Запрос.УстановитьПараметр("Период", ТекущаяДата());
Запрос.УстановитьПараметр("Организация", ВыбОрганизация);
// Выполняем пакет с фиксацией промежуточных таблиц
МассивРезультатов = Запрос.ВыполнитьПакетСПромежуточнымиДанными();
// Обходим результаты каждого шага пакета
Для НомерЗапроса = 0 По МассивРезультатов.Количество() - 1 Цикл
ТаблицаШага = МассивРезультатов[НомерЗапроса].Выгрузить();
// На этой точке останова можно открыть ТаблицаШага и изучить данные
КонецЦикла;
Для ускорения разработки и тестирования запросов рекомендуется использовать специализированные внешние консоли запросов:
Разберем основные технические нюансы, которые необходимо соблюдать при создании и доработке пакетных запросов:
ПО) или фильтрациях (секция ГДЕ), обязательно создавайте для нее индексы с помощью инструкции ИНДЕКСИРОВАТЬ ПО. Отсутствие индексов на промежуточных таблицах — основная причина падения производительности отчетов.ГДЕ. Условия обязательно должны быть указаны в параметрах виртуальной таблицы в круглых скобках. Это заставляет СУБД отсекать лишние строки на уровне индексов, а не перебирать всю таблицу целиком.ДокументОснование.Контрагент) порождает неявное соединение со всеми таблицами, входящими в этот тип. Для предотвращения падения производительности явно ограничивайте тип функцией ВЫРАЗИТЬ(Поле КАК Тип).МенеджерВременныхТаблиц, после завершения работы с промежуточными выборками освобождайте ресурсы с помощью оператора УНИЧТОЖИТЬ ИмяТаблицы.Рассмотрим пример правильного создания временной таблицы с индексацией и отбором в параметрах виртуальной таблицы:
ВЫБРАТЬ
Остатки.Номенклатура КАК Номенклатура,
Остатки.Склад КАК Склад,
Остатки.ВНаличииОстаток КАК Количество
ПОМЕСТИТЬ ВТ_ОстаткиТоваров
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК Остатки
ИНДЕКСИРОВАТЬ ПО
Номенклатура;
Для перехода от копирования чужого кода к уверенному самостоятельному проектированию запросов любой сложности рекомендуется изучить следующие материалы: