Запросы 1С:Предприятие 8. Вложенные запросы
Вложенные запросы – это запросы, вызываемые другим, внешним, запросом. Они всегда заключаются в круглые скобки и им обязательно должен присваиваться псевдоним. Некоторые считают вложенный запрос аналогом временных таблиц, однако эти два инструмента имеют ряд отличий, которые мы рассмотрим в данной статье.
Вложенный запрос видит только себя, он не видит внешний запрос. Это значит, что нельзя, например, установить во вложенном запросе условие по значению поля внешнего запроса.
Большинство представленных запросов не имеют какой-либо ценности и могли бы быть выполнены проще. Они приведены только для иллюстрации механизма вложенных запросов.
Вложенные запросы могут использоваться в конструкции ИЗ:
Запрос . Текст = «ВЫБРАТЬ
ВложенныйЗапрос.Поле1,
ВложенныйЗапрос.Поле2
ИЗ
(ВЫБРАТЬ
Таблица1.Поле1,
Таблица1.Поле2
ИЗ ТаблицаДанных КАК Таблица1) КАК ВложенныйЗапрос» ;
В том числе в соединениях:
Запрос . Текст = «ВЫБРАТЬ
ВложенныйЗапрос.Наименование,
ЧерныйСписокСрезПоследних.Состояние
ИЗ
(ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка,
Контрагенты.Наименование КАК Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты) КАК ВложенныйЗапрос
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЧерныйСписок.СрезПоследних КАК ЧерныйСписокСрезПоследних
ПО ВложенныйЗапрос.Ссылка = ЧерныйСписокСрезПоследних.Котрагент» ;
И в условиях запроса со сравнением В или В ИЕРАРХИИ:
Запрос . Текст = «ВЫБРАТЬ
ЧерныйСписокСрезПоследних.Состояние
ИЗ
РегистрСведений.ЧерныйСписок.СрезПоследних КАК ЧерныйСписокСрезПоследних
ГДЕ
ЧерныйСписокСрезПоследних.Котрагент В
(ВЫБРАТЬ ПЕРВЫЕ 10
Контрагенты.Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты)» ;
При этом количество выбираемых полей вложенного запроса должно соответствовать количеству операндов в левой части выражения В или В ИЕРАРХИИ.
Существует мнение, что вложенные запросы в сложных конструкциях выполняются платформой 1С нерационально, требуют бОльших ресурсов и времени, нежели те же самые запросы, выполненные иначе, без использования вложенных запросов. Однако в ряде случаев, обойтись без вложенных запросов невозможно.
Вместе с тем, обычно эффективнее работает один большой запрос с вложенными, чем последовательность запросов из модуля.
Практически всегда альтернативой вложенному запросу является использование временных таблиц. Этот инструмент имеет ряд преимуществ:
- Запрос становится более структурированным, его легче читать.
- Результат, загруженный во временную таблицу можно использовать несколько раз, и при этом нет необходимости заново выполнять запрос, чтобы этот результат получить. А вложенный запрос будет каждый раз выполняться заново, излишне загружая ресурсы системы.
Подведем итог: вложенные запросы лучше всего применять в достаточно простых конструкциях, при этом использовать их стоит только тогда, когда по-другому задачу не решить; в сложных запросах лучше использовать временные таблицы.
Раздел: Программирование Статьи по 1С Метки: Основы программирования в 1С, язык запросов 1С
Запросы 1С:Предприятие 8. Вложенные запросы : 1 комментарий
- Евгений02.04.2018 При соединении подзапроса с другой таблицей на уровне СУБД всегда будет использоваться способ соединения nested loops, т.к для подзапроса нет статистики. Хорошо это или плохо — зависит от самого запроса и количества выбираемых данных. Именно поэтому при выполнении запроса, содержащего подзапрос, может проявляться замедление.
Добавить комментарий Отменить ответ
Теперь мы в соцсетях! Подписывайтесь, чтобы получать информацию о последних обновлениях или задать вопрос.
Вложенные запросы в 1С 8.3
Вложенный запрос – это запрос, который вложен в другой запрос. Синтаксически выглядит, как запрос, заключенный в круглые скобки. Ему присваивается псевдоним. Как правило, используется для получения отборов, группировок и агрегатных функций с последующим соединением в запросе верхнего уровня, также в операторах «В», «ИЗ», «ГДЕ» и других.
Рассмотрим примеры вложенного запроса. В следующем запросе показано, как найти пять партий поступлений товара с максимальным количеством покупки выбранных наименований в заданном периоде и по какому документу, и в каком количестве были реализованы. Ниже приведено решение с использованием вложенного запроса.
ВЫБРАТЬ ПартииТоваров.Номенклатура КАК Номенклатура, ПодЗапрос.ПриходнаяНакладная КАК Приходная, ПодЗапрос.КоличествоПриход КАК Приход, ВЫРАЗИТЬ(ПартииТоваров.Регистратор КАК Документ.РеализацияТоваров) КАК Регистратор, ПартииТоваров.КоличествоРасход КАК КоличествоРасход ИЗ (ВЫБРАТЬ ПЕРВЫЕ 5 ПартииТоваров.Номенклатура КАК Товар, ПартииТоваров.ДокументПоступления КАК ПриходнаяНакладная, МАКСИМУМ(ПартииТоваров.КоличествоПриход) КАК КоличествоПриход ИЗ РегистрНакопления.ПартииТоваров.Обороты(&НачалоПериода, &КонецПериода, Регистратор,Номенклатура В (&Товары)) КАК ПартииТоваров СГРУППИРОВАТЬ ПО ПартииТоваров.Номенклатура, ПартииТоваров.ДокументПоступления УПОРЯДОЧИТЬ ПО КоличествоПриход УБЫВ) КАК ПодЗапрос ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваров.Обороты(, , Регистратор,Номенклатура В (&Товары)) КАК ПартииТоваров ПО ПодЗапрос.Товар = ПартииТоваров.Номенклатура И ПодЗапрос.ПриходнаяНакладная = ПартииТоваров.ДокументПоступления
Как было сказано, вложенные запросы могут применяться в условиях оператора «ИЗ» как источник данных. В следующем демонстрационном примере показано, как получить количество товара в выбранной накладной и остаток этого товара на складе.
ВЫБРАТЬ ТоварыНаСкладах.Номенклатура КАК Товар, ЕСТЬNULL(ТоварыНаСкладах.ВНаличииОстаток, 0) КАК Остаток, Товары.Количество КАК Количество ИЗ Документ.РеализацияТоваровУслуг.Товары КАК Товары ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки( &МоментВремени, Номенклатура В (ВЫБРАТЬ РеализацияТовары.Номенклатура КАК Товар ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары ГДЕ РеализацияТовары.Ссылка = &Документ СГРУППИРОВАТЬ ПО РеализацияТовары.Номенклатура)) КАК ТоварыНаСкладах ПО Товары.Номенклатура = ТоварыНаСкладах.Номенклатура ГДЕ Товары.Ссылка = &Документ
Еще пример вложенного запроса с использованием оператора-условия «В» в свойствах виртуальной таблицы регистра накопления. Вложенный запрос здесь используется как отбор данных, который будет использован в запросе верхнего уровня.
ВЫБРАТЬ ПодЗапрос.Товар КАК Товар, ВЫБОР КОГДА ЕСТЬNULL(ТоварыНаСкладах.ВНаличииОстаток, 0) >= ПодЗапрос.Количество ТОГДА "Товар достаточно" ИНАЧЕ "Товара не достаточно" КОНЕЦ КАК Достаточность ИЗ (ВЫБРАТЬ РасходнаяНакладная.Номенклатура КАК Товар, СУММА(РасходнаяНакладная.Количество) КАК Количество ИЗ Документ.РеализацияТоваровУслуг.Товары КАК РасходнаяНакладная ГДЕ РасходнаяНакладная.Ссылка = &Документ СГРУППИРОВАТЬ ПО РасходнаяНакладная.Номенклатура) КАК ПодЗапрос ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ВыбДата, ) КАК ТоварыНаСкладах ПО ПодЗапрос.Товар = ТоварыНаСкладах.Номенклатура
Фирма 1С не рекомендует использовать вложенные запросы без особой потребности и предлагает заменять их временными таблицами или соединениями таблиц, замечая при этом, что результат такого изменения может быть другим. Такая рекомендация объясняется тем, что при использовании вложенных запросов оптимизатор СУБД не всегда может правильно определить размер выборки вложенного запроса и построить оптимальный план обращений к физическим таблицам базы данных, что сильно (иногда в десятки раз) может замедлить выполнение запроса.
Главное отличие вложенного запроса от временной таблицы – это то, что временную таблицу можно использовать многократно в пакетном запросе, также передавать через менеджер временных таблиц в другие запросы, а вложенный запрос нужно вызывать каждый раз, когда он потребуется и в каждом случае явно указывать текст запроса, что затрудняет читаемость синтаксических конструкций. Также применение временных таблиц дает независимость от вида применяемого СУБД.
Тем не менее, вложенные запросы по-прежнему востребованы и используются в случаях:
- При работе в 1С:Предприятие с версиями платформы 1С 8.3.7 и ниже и при использовании обратной совместимости с такими платформами по-прежнему невозможно использовать временные таблицы в динамических списках;
- Во вложенных динамических списках эффективность применения временных таблиц может быть сильно снижена из-за того, что таблицы требуется создавать при каждом вызове (и поэтому данные не кэшируются). В противном случае данные сохраненной таблицы могут оказаться уже не актуальными;
- Вложенные запросы нужно применять для заведомо небольших выборок, где временные таблицы менее эффективны, так как занимают оперативную память, а при использовании индексирования на больших выборках могут выгружать индексные файлы на носитель, что критически скажется на скорости получения данных из запроса.
Нужно заметить, что еще существуют неявные вложенные запросы. Это:
-
Запросы с использованием вложенных соединений. Конструкция вида:
ВЫБРАТЬ Поле1, Поле2, … ИЗ Источник1 ЛЕВОЕ СОЕДИНЕНИЕ Источник_2 ЛЕВОЕ СОЕДИНЕНИЕ Источник_3 ПО (условия для Источник_2 = условие Источник_3) ПО (условия для Источник_2 = условие Источник_1)
Пример в 1С УТ (ред. 11.2.3.300):
ВЫБРАТЬ Товары.Наименование КАК Наименование, ЦеныТовара.Цена КАК Цена, ТоварыОрганизаций.КоличествоПриход КАК Приход ИЗ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныТовара ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыОрганизаций.Обороты(, , Регистратор, ) КАК ТоварыОрганизаций ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Товары ПО (ТоварыОрганизаций.Аналитика.Номенклатура = Товары.Ссылка) ПО (ЦеныТовара.Регистратор = ТоварыОрганизаций.Регистратор)
Средства СУБД предоставляют механизмы для оптимизации запросов и повышения производительности. Это визуализация построения плана выполнения запроса, проведение трассировки запросов для сбора статистики и выявления узких мест, изучение кода итогового запроса на SQL. Эти механизмы помогут определить, что и как лучше использовать в конкретном случае, – подзапрос, временную таблицу или соединение.
Как работает вложенный запрос 1с
Войти через uID
—>$ Поблагодарить —>
—> Юманей (Яндекс)
Сбербанк 4279380024684518 —>
—>Мои программы —>
—>
Менеджер буфера обмена с поддержкой 1С — ClipAngel |
—>
—>
« Ноябрь 2023 » | ||||||
Пн | Вт | Ср | Чт | Пт | Сб | Вс |
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
—>
—> —>Архив записей —>
Консоль запросов
- для программного вызова (отладки запроса) служит функция Отладить(Запрос, *Модально) или коротко От(Запрос) для использования в точке останова, при этом запрос открывается (на сервере предварительно сохраняется в снимок) в консоли с сохранением работоспособности, включая параметры и временные таблицы
- поддержка типов запросов
- Обычный (1С)
- Построитель (1С)
- Компоновка (1С)
- WQL (WMI)
- ADO
- поддержка пакетных запросов
- поддержка временных таблиц
- конструктор запроса и контекстная подсказка «понимают» типы полей существующих временных таблиц
- автоматический вывод содержимого созданной временной таблицы
- возможность использования постоянного менеджера временных таблиц
- дерево запроса — режим структурного представления текста запроса, позволяющий работать с целостными фрагментами запроса и сразу видеть использованные в запросе таблицы
- включается из командной панели формы
- для работы режима дерева запроса требуется регистрация
COM-компоненты GoldParser.DLL, которая выполняется автоматически - Понимает любые синтаксически правильные тексты
- режим сворачивания вложенных запросов в тексте
- работает и для чужеродных (с неизвестными
метаданными) запросов - колонка «Длительность чистая», вычисляемая как длительность полная, уменьшенная на сумму длительностей всех дочерних подзапросов, облегчает локализацию долгих операций в дереве
- возможность выполнить все подзапросы текущего узла
- функции для преобразования текста запроса
- Вынести в новый запрос
- Преобразовать в подзапрос
- понимает имена запросов и частей объединений расставленные в комментариях вида «» и «»
- в дереве запросов и в дереве запроса фиксируется длительность и число строк результата последнего выполнения
- в дереве запросов скрытая по умолчанию колонка «Возраст выполнения, минут»
- сохранение и восстановление позиции текущей строки в дереве запросов
- Редактор текста запроса
- кнопка для открытия конструктора запроса ИР
- кнопка для открытия стандартного конструктора запроса
- контекстная подсказка (если имеются вложенные запросы, то для улучшения ее работы лучше включать режим дерева запроса)
- кнопка «Вставить ссылку на объект БД» для удобной вставки ссылки на любой объект в виде параметра
- кнопка «Копировать текст в буфер обмена в виде выражения встроенного языка»
- Подменю установки генерируемого текста
- Все типы ссылок
- Даты за период
- Объединение сcылочных таблиц
- Объединение cсылочных таблиц изменений
- вывод результата в
- Таблица значений
- Дерево значений
- Сводная таблица
- передача выбранных данных из результата в другие инструменты
- Подбор и обработка объектов
- Поиск дублей и замена ссылок
- замер времени выполнения
- параметры запроса
- типы параметров
- значение
- список
- выражение, редактор с контекстной подсказкой
- выражение СКД, редактор с контекстной подсказкой
- кнопка вычисления параметров
- кнопка заполнения параметров по тексту
- копирование выбранных параметров между запросами путем их перетаскивания на строку дерева запросов
- кнопка Период добавляет группу параметров для задания интервала времени только при первом
нажатии, а при повторном открывает диалог редактирования периода
- типы параметров
- настройка динамического отбора и порядка в режиме компоновки (в режиме
построителя поддерживается настройка только отбора и только с 11-го релиза)- просмотр результирующего запроса
- открытие сгенерированной по запросу компоновки в консоли компоновки
- обработчики «перед выполнением», «обработка строки результата» и «обработка результата» с контекстной подсказкой с возможностью отладки в
штатном отладчике платформы через выполнение в консоли кода через
динамическую внешнюю обработку - переход (по F12) к определению таблицы или во вложенный запрос в режиме
дерева запроса - Над коллекцией результата информационное поле с длительностью выборки данных
- Рядом с коллекцией результата сворачиваемая таблица свойств строки с указанием типов значений
- пошаговое выполнение пакетного запроса (по F10)
- для коллекции результата предусмотрен режим частичной
загрузки, включаемый автоматически, если выборка превышает порог (по умолчанию 100000 строк), и загружает первую ее часть. Кнопка «Загрузить» загружает
выборку полностью - в командной панели таблицы результата переключатель «Показывать подвал с итогами»
- Интерактивное помещение во временную таблицу
- текущего результата типа Таблица
- результатов ветки запросов в дереве запросов
- Закладка «Выборки итогов» запроса для управления обходом выборок в дерево значений и служебными колонками
- Выборка
- Уровень
- Число потомков
- Группировка
- Имя группировки
- генераторы текста модуля для обработчиков результата и строки таблицы результата
- команда «Расшифровать строку» результата рассмотрена в статье Отладка логики запроса в консоли запросов ИР
- кнопка «Трасса» для анализа трассы выполненного запроса в инструменте «Анализ техножурнала»
- Кнопка «Статистика MSSQL» для открытия инструмента Статистка по запросам MSSQL с передачей интервала последнего выполнения запроса
- восстановление сессии консоли после ее нештатного прерывания (например аварийного)
- поддержка WQL
- типы источников
- MSSQL
- MSVisualFoxPro
- DB2
- Oracle
- Postgres SQL
- MSJet
- MySQL
Дерево запроса
Имена запросов и частей объединений в дереве запроса
Передача запроса из отладчика в варианте Расширение
Передача запроса из отладчика в варианте Портативный
Как работает вложенный запрос 1с
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: условный оператор
Автор уроков и преподаватель школы: Владимир Милькин
Условный оператор в запросе
Давайте напишем запрос, который получает названия и калорийность еды:
ВЫБРАТЬ Наименование, Калорийность ИЗ Справочник.Еда
А теперь добавим в результат запроса колонку, в которую будем выводить жирность еды по следующим правилам:
- если калорийность меньше 100, то жирность низкая;
- если калорийность от 100 до 200, то жирность нормальная;
- если калорийность больше 200, то жирность высокая.
Как этого можно добиться, ведь в таблице Справочник.Еда нет колонки Жирность?
Оказывается, эту колонку мы можем добавить сами, используя условный оператор внутри запроса:
ВЫБРАТЬ Наименование, Калорийность, ВЫБОР КОГДА Калорийность 100 ТОГДА "Низкая" КОГДА Калорийность 200 ТОГДА "Нормальная" ИНАЧЕ "Высокая" КОНЕЦ ИЗ Справочник.Еда
Давайте внимательнее присмотримся к тексту запроса:
В секции ВЫБРАТЬ идёт перечисление полей выборки: Наименование, Калорийность, а затем вместо третьего поля идёт конструкция условного оператора, результат которого и попадает в третью колонку.
Условия оператора обрабатываются последовательно . Если одно из них оказалось верным, то в качестве результата возвращается соответствующее значение. Если же ни одно из условий не выполнилось, то возвращается значение из секции ИНАЧЕ. Если же ни одно из условий не выполнилось, и в операторе отсутствует секция ИНАЧЕ, то возвращается значение NULL (о нём мы поговорим в одном из следующих уроков).
Поэтому новый запрос вернёт такую таблицу:
Отступление
Обратите внимание, что третья колонка в таблице, которую вернул запрос, называется Поле1. Это имя было сгенерировано системой автоматически, потому что третьей колонке не соответствует никакого реального поля в таблице Справочник.Еда, откуда можно было бы это имя получить.
Но в наших силах дать ей это имя. Для этого сразу после описания поля нужно написать ключевое слово КАК, а после этого через пробел указать само имя. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Такое имя будет называться псевдонимом поля .
ВЫБРАТЬ Наименование, Калорийность, ВЫБОР КОГДА Калорийность 100 ТОГДА "Низкая" КОГДА Калорийность 200 ТОГДА "Нормальная" ИНАЧЕ "Высокая" КОНЕЦ КАК Жирность ИЗ Справочник.Еда
Псевдонимы можно присваивать любым полям, в том числе тем, у которых уже есть имя. Давайте сделаем псевдоним Еда для поля Наименование:
ВЫБРАТЬ Наименование КАК Еда ИЗ Справочник.Еда
Но вернёмся к условному оператору в запросах.
Более сложные логические выражения в условиях оператора
В логических условиях оператора выбора можно использовать и более сложные выражения.
Пример использования логического оператора ПОДОБНО:
ВЫБРАТЬ Наименование, ВЫБОР КОГДА Наименование ПОДОБНО "Б%" ТОГДА "Начинается на Б" КОГДА Наименование ПОДОБНО "К%" ТОГДА "Начинается на К" ИНАЧЕ "Начинается на другую букву" КОНЕЦ ИЗ Справочник.Еда
Пример использования функции ПОДСТРОКА:
ВЫБРАТЬ Наименование, ВЫБОР КОГДА ПОДСТРОКА(Наименование, 1, 3) = "Бан" ТОГДА "Это банан" КОГДА ПОДСТРОКА(Наименование, 1, 2) = "Чи" ТОГДА "Это чипсы" ИНАЧЕ "Что-то другое" КОНЕЦ ИЗ Справочник.Еда
Более сложные результаты условного оператора
Конечно, результатом условного оператора может быть не только константная строка, но и любое другое выражение, допустимое в запросе.
Рассмотрим более общий пример:
ВЫБРАТЬ Наименование, ВЫБОР КОГДА Код = "000000001" ТОГДА "Банан" КОГДА Код = "000000002" ТОГДА Наименование КОГДА Код= "000000003" ТОГДА 555 КОГДА Код = "000000004" ТОГДА Калорийность КОГДА Код = "000000005" ТОГДА ДАТАВРЕМЯ(2014, 01, 01) КОГДА Код = "000000006" ТОГДА ИСТИНА КОГДА Код = "000000007" ТОГДА Ссылка КОНЕЦ ИЗ Справочник.Еда
- типы источников