Найти поля своего вложенного источника

Учебные задачи

Описание поля Количество содержит имя и тип, но не число 3 или 2. Числовой результат отдельно получаем выполнением собственной группировки.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

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

  2. СхемаЗапроса редактирует структуру и формирует текст, а Запрос выполняет этот текст. Родительская схема должна оставаться в переменной, пока используются её дочерние объекты.

  3. Не переносите полученные дочерние объекты между разными схемами и не обращайтесь к элементу после его удаления. Упражнения удаления работают только со своей структурой в памяти.

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

Разбор по шагам

  1. Внешний оператор имеет один корневой источник Книги. Находим его по настоящему псевдониму и проверяем тип описания.

  2. ИсточникСхемыЗапроса — оболочка; её Источник содержит ВложенныйЗапросСхемыЗапроса, Соединения — отдельную коллекцию.

  3. ДоступныеПоля описывает колонки вложенного запроса. Поле Количество проверяется на отсутствие и правильный тип.

  4. ТипЗначения показывает числовой тип, не конкретное значение строки. Поля и Роль также описания; диагностические флаги не приравниваем к метаданным регистра.

  5. Выполнение внешнего запроса отдельно даёт одну группу Книга с количеством 5.

Как проверить результат

  1. Все проверки-сравнения Истина, параметры роли и число дочерних полей диагностические.

  2. Описание поля не выдаётся за строку данных; реальный итог 5 получен выполнением запроса.

Ожидаемый результат

Разделены оболочка источника, описания полей и фактические значения результата.

На что обратить внимание

  1. Вложенный запрос не является справочником базы.

  2. Роль поля не даёт права доступа и не создаёт ресурс регистра автоматически.

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

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.