Тип: Строка. Псевдоним вложенного запроса.
Полное описание, параметры и ограничения
ВложенныйЗапросСхемыЗапроса.Псевдоним (QuerySchemaNestedQuery.Alias)
ВложенныйЗапросСхемыЗапроса (QuerySchemaNestedQuery)
Псевдоним (Alias)
Доступен, начиная с версии 8.3.5.
Использование:
Чтение и запись.
Описание:
Тип: Строка.
Псевдоним вложенного запроса.
Доступность:
Сервер, толстый клиент.
Использование в версии:
Доступен, начиная с версии 8.3.5.
Методическая информация
Практические примеры
Изменить вложенный запрос, сохраняя его родителя
Внутренние числа 3 и 2 заменяем числами 4 и 2. Внешние отбор и группировка остаются прежними, итог меняется с 5 на 6.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
В учебной обработке или общем модуле выполните каждый фрагмент отдельно на сервере. Все запросы используют только свои числа и параметры, без справочников, документов и регистров рабочей базы.
СхемаЗапроса редактирует структуру и формирует текст, а Запрос выполняет этот текст. Родительская схема должна оставаться в переменной, пока используются её дочерние объекты.
Не переносите полученные дочерние объекты между разными схемами и не обращайтесь к элементу после его удаления. Упражнения удаления работают только со своей структурой в памяти.
Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса("ВЫБРАТЬ Книги.Название КАК Название, СУММА(Книги.Количество) КАК Количество
|ИЗ (ВЫБРАТЬ ""Книга"" КАК Название, 3 КАК Количество ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Книга"", 2) КАК Книги
|ГДЕ Книги.Количество > 1
|СГРУППИРОВАТЬ ПО Книги.Название");
Если Схема.ПакетЗапросов.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один свой запрос";
КонецЕсли;
Выбор = Схема.ПакетЗапросов.Получить(0);
Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Тогда
ВызватьИсключение "Ожидалась своя выборка";
КонецЕсли;
Если Выбор.Операторы.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один внешний оператор своего запроса";
КонецЕсли;
Оператор = Выбор.Операторы.Получить(0);
Источники = Оператор.Источники;
Если Источники.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один собственный вложенный источник";
КонецЕсли;
Источник = Источники.НайтиПоПсевдониму("Книги");
Если Источник = Неопределено Тогда
ВызватьИсключение "Не найден собственный псевдоним Книги";
КонецЕсли;
Вложенный = Источник.Источник;
Если ТипЗнч(Вложенный) <> Тип("ВложенныйЗапросСхемыЗапроса") Тогда
ВызватьИсключение "Источник Книги не является вложенным запросом";
КонецЕсли;
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
До = Запрос.Выполнить().Выгрузить();
Если До.Количество() <> 1 Тогда
ВызватьИсключение "Ожидалась одна группа собственных книг";
КонецЕсли;
Сообщить(До[0].Название = "Книга" И До[0].Количество = 5);
Дочерний = Вложенный.Запрос;
Дочерний.УстановитьТекстЗапроса("ВЫБРАТЬ ""Книга"" КАК Название, 4 КАК Количество ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Книга"", 2");
Сообщить(Вложенный.Псевдоним = "Книги");
Сообщить(Дочерний.Колонки.Количество() = 2);
Сообщить(Дочерний.Операторы.Количество() = 2);
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
После = Запрос.Выполнить().Выгрузить();
Если После.Количество() <> 1 Тогда
ВызватьИсключение "Ожидалась одна группа собственных книг";
КонецЕсли;
Сообщить(После[0].Название = "Книга" И После[0].Количество = 6);
Разбор по шагам
Родительская Схема остаётся в переменной на протяжении всего урока.
Вложенный.Запрос даёт дочерний ЗапросВыбораСхемыЗапроса, а не новую независимую схему.
Устанавливаем полный собственный текст внутренней выборки с теми же именами колонок Название и Количество.
Псевдоним Книги сохранён, поэтому внешние выражения по нему остаются применимыми.
Заново формируем текст всей схемы и выполняем: сумма 4+2 стала 6.
Как проверить результат
Пять сообщений Истина.
Итоги До=5 и После=6 получены отдельными выполнениями одной собственной схемы.
Ожидаемый результат
Проверена связь дочерней выборки и результата внешнего запроса.
На что обратить внимание
Смена имён колонок могла бы нарушить выражения родителя; здесь они намеренно сохраняются.
Не переносите объект Дочерний в другую схему и не используйте его после удаления источника.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Найти поля своего вложенного источника
Описание поля Количество содержит имя и тип, но не число 3 или 2. Числовой результат отдельно получаем выполнением собственной группировки.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
В учебной обработке или общем модуле выполните каждый фрагмент отдельно на сервере. Все запросы используют только свои числа и параметры, без справочников, документов и регистров рабочей базы.
СхемаЗапроса редактирует структуру и формирует текст, а Запрос выполняет этот текст. Родительская схема должна оставаться в переменной, пока используются её дочерние объекты.
Не переносите полученные дочерние объекты между разными схемами и не обращайтесь к элементу после его удаления. Упражнения удаления работают только со своей структурой в памяти.
Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса("ВЫБРАТЬ Книги.Название КАК Название, СУММА(Книги.Количество) КАК Количество
|ИЗ (ВЫБРАТЬ ""Книга"" КАК Название, 3 КАК Количество ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Книга"", 2) КАК Книги
|ГДЕ Книги.Количество > 1
|СГРУППИРОВАТЬ ПО Книги.Название");
Если Схема.ПакетЗапросов.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один свой запрос";
КонецЕсли;
Выбор = Схема.ПакетЗапросов.Получить(0);
Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Тогда
ВызватьИсключение "Ожидалась своя выборка";
КонецЕсли;
Если Выбор.Операторы.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один внешний оператор своего запроса";
КонецЕсли;
Оператор = Выбор.Операторы.Получить(0);
Источники = Оператор.Источники;
Если Источники.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один собственный вложенный источник";
КонецЕсли;
Источник = Источники.НайтиПоПсевдониму("Книги");
Если Источник = Неопределено Тогда
ВызватьИсключение "Не найден собственный псевдоним Книги";
КонецЕсли;
Вложенный = Источник.Источник;
Если ТипЗнч(Вложенный) <> Тип("ВложенныйЗапросСхемыЗапроса") Тогда
ВызватьИсключение "Источник Книги не является вложенным запросом";
КонецЕсли;
Сообщить(Источники.Индекс(Источник) = 0);
Сообщить(Источники.Получить(0) <> Неопределено);
Сообщить(Источники.ПолучитьКорневыеИсточники().Количество() = 1);
Сообщить(Источник.Соединения.Количество() = 0);
Сообщить(Вложенный.Псевдоним = "Книги");
ДоступныеПоля = Вложенный.ДоступныеПоля;
ПолеКоличество = ДоступныеПоля.Найти("Количество");
Если ПолеКоличество = Неопределено Тогда
ВызватьИсключение "В своих данных нет поля количества";
КонецЕсли;
Если ТипЗнч(ПолеКоличество) <> Тип("ДоступноеПолеСхемыЗапроса") Тогда
ВызватьИсключение "Нужно обычное описание поля, не вложенная таблица";
КонецЕсли;
Сообщить(ДоступныеПоля.Количество() = 2);
Сообщить(ПолеКоличество.Имя = "Количество");
Сообщить(ПолеКоличество.ТипЗначения.СодержитТип(Тип("Число")));
Сообщить(ДоступныеПоля.Индекс(ПолеКоличество) >= 0);
Сообщить(ДоступныеПоля.Получить(0) <> Неопределено);
Сообщить("Дочерних описаний поля: " + Строка(ПолеКоличество.Поля.Количество()));
Сообщить("Роль: измерение " + Строка(ПолеКоличество.Роль.Измерение) + "; ресурс " + Строка(ПолеКоличество.Роль.Ресурс));
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
Итог = Запрос.Выполнить().Выгрузить();
Если Итог.Количество() <> 1 Тогда
ВызватьИсключение "Ожидалась одна группа собственных книг";
КонецЕсли;
Сообщить(Итог[0].Название = "Книга" И Итог[0].Количество = 5);
Разбор по шагам
Внешний оператор имеет один корневой источник Книги. Находим его по настоящему псевдониму и проверяем тип описания.
ИсточникСхемыЗапроса — оболочка; её Источник содержит ВложенныйЗапросСхемыЗапроса, Соединения — отдельную коллекцию.
ДоступныеПоля описывает колонки вложенного запроса. Поле Количество проверяется на отсутствие и правильный тип.
ТипЗначения показывает числовой тип, не конкретное значение строки. Поля и Роль также описания; диагностические флаги не приравниваем к метаданным регистра.
Выполнение внешнего запроса отдельно даёт одну группу Книга с количеством 5.
Как проверить результат
Все проверки-сравнения Истина, параметры роли и число дочерних полей диагностические.
Описание поля не выдаётся за строку данных; реальный итог 5 получен выполнением запроса.
Ожидаемый результат
Разделены оболочка источника, описания полей и фактические значения результата.
На что обратить внимание
Вложенный запрос не является справочником базы.
Роль поля не даёт права доступа и не создаёт ресурс регистра автоматически.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.