Собрать выражения одного индекса временной таблицы

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

Добавляем Количество и Цена в индекс своей временной таблицы, переставляем поля и восстанавливаем их перед выполнением пакета.

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

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

Подготовка

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

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

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

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

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

  1. Создание.ТаблицаДляПомещения проверено: индекс относится только к УчебныеКниги.

  2. Индекс — коллекция выражений для одного индекса. Добавить по строке сначала ищет колонку, поэтому Выражение элемента может быть колонкой, не только объектом выражения.

  3. Положение двух полей проверяется через Индекс. Переместить использует абсолютный индекс, Сдвинуть относительное смещение.

  4. После удаления Цена и очистки не используем старые дочерние объекты. Создаём новое выражение Количество.

  5. Пакет выполняется с новым собственным менеджером. Читаем результат второй операции, проверяем 750 и закрываем менеджер при любом исходе.

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

  1. Девять сообщений-сравнений Истина и диагностическое описание элемента.

  2. После восстановления один индексируемый столбец; результат своего запроса 750.

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

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

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

  1. В режиме совместимости 8.3.10 и ниже Сдвинуть имеет старую семантику; здесь нужен современный режим.

  2. По одной строке нельзя доказать ускорение запроса: пример проверяет структуру и данные, не производительность.

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

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

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

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

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