Прочитать табличную часть как вложенный результат запроса

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

В таблице Справочник.УчебныйКаталог поле Детали имеет тип РезультатЗапроса. Для него создаётся собственная выборка.

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

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

Подготовка

  1. Создайте справочник УчебныеВладельцы и иерархический справочник УчебныйКаталог: иерархия групп и элементов, владелец УчебныеВладельцы, использование подчинения Для групп и элементов.

  2. В УчебныйКаталог добавьте Цена (Число 15.2), использование реквизита Для групп и элементов. Код — Строка 10 с автонумерацией, Наименование — Строка 100.

  3. В отдельной учебной конфигурации создайте общий реквизит УчебныйИсточник типа Строка 20. Разделение данных — Не использовать. В составе явно включите только учебный объект этого урока; использование — Использовать.

  4. Если общий реквизит не выведен на форму, его пустое строковое значение допустимо. Запрос всё равно покажет именованную колонку УчебныйИсточник. Это не разделитель данных и не механизм ограничения доступа.

  5. Обновите учебную базу. Создайте владельца Учебный магазин, под ним группу Книги и элемент Справочник 1С: родитель Книги, цена 450. Предопределённых элементов не создавайте.

  6. Запрос выполняйте в серверной процедуре учебной обработки. Результат содержит группу и элемент; порядок строк здесь не задан.

  7. Дополните только подготовленный учебный объект: Справочники → УчебныйКаталог → Табличные части → Детали. Добавьте Наименование (Строка 100) и Количество (Число 10.0). Для иерархических объектов табличную часть используйте для элементов, не для групп.

  8. Выведите Детали на основную форму объекта, обновите учебную базу. В одном подготовленном элементе, счёте, узле или документе вручную заполните две строки: Книга, 2; Ручка, 3. Запишите объект.

  9. В модуле объекта отдельный код чтения не нужен: основной запрос запускается в серверной процедуре учебной обработки.

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Данные.Ссылка,
| Данные.Детали.(НомерСтроки, Наименование, Количество) КАК Детали
|ИЗ Справочник.УчебныйКаталог КАК Данные";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить("Объект: " + Строка(Выборка.Ссылка));
    СтрокиДеталей = Выборка.Детали.Выбрать();
    Пока СтрокиДеталей.Следующий() Цикл
        Сообщить(Строка(СтрокиДеталей.НомерСтроки) + ": "
            + СтрокиДеталей.Наименование + ", количество "
            + Строка(СтрокиДеталей.Количество));
    КонецЦикла;
КонецЦикла;

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

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

  2. Скобки после Детали явно задают три поля вложенного результата.

  3. Второй цикл читает строки только текущего объекта; пустая табличная часть даёт пустой внутренний цикл.

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

  1. У заполненного объекта показаны 1: Книга, количество 2 и 2: Ручка, количество 3.

  2. У объекта с пустыми Детали показана его ссылка, но строки деталей не выдумываются.

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

Табличная часть прочитана в виде отдельного вложенного результата, без разворачивания объекта в дублирующиеся внешние строки.

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

  1. Поле Детали не является строкой и не является сразу ТаблицаЗначений: это вложенный РезультатЗапроса.

  2. Имена табличной части и её реквизитов должны точно совпадать с подготовкой; создание их выполняется в конфигураторе, не в запросе.

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

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

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

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

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