ВыраженияИндексаСхемыЗапроса.Количество

Методы · Count

Получает количество элементов в коллекции.

Синтаксис

Количество()
Полное описание, параметры и ограничения

ВыраженияИндексаСхемыЗапроса.Количество (QuerySchemaIndexExpressions.Count)

ВыраженияИндексаСхемыЗапроса (QuerySchemaIndexExpressions)

Количество (Count)

Доступен, начиная с версии 8.3.5.

Синтаксис:
Количество()
Возвращаемое значение:
Тип: Число.

Описание:

Получает количество элементов в коллекции.

Доступность:

Сервер, толстый клиент, внешнее соединение.

Использование в версии:

Доступен, начиная с версии 8.3.5.

Методическая информация

Практические примеры

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

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

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

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

Подготовка

  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. В учебной обработке или общем модуле выполните каждый фрагмент отдельно на сервере. Все запросы используют только свои числа и параметры, без справочников, документов и регистров рабочей базы.

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

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

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

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

  1. Индексы и Индекс — разные коллекции: первая содержит наборы, внутри каждого набора находятся ВыраженияИндекса.

  2. Создаём два собственных набора, по Количество и Цена, перемещаем второй на индекс 0 и проверяем его состав.

  3. После Удалить и Очистить старые Первый и Второй не используются. Новому набору Уникальный задаём собственное поле Количество.

  4. Один созданный ряд с количеством 3 удовлетворяет уникальности. Уникальность не означает автоматическое удаление дубликатов.

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

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

  1. Семь сообщений Истина.

  2. Один уникальный набор Количество и проверенный результат 750.

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

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

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

  1. Индексы и Уникальный доступны с 8.3.25; в учебной базе используйте современный режим совместимости.

  2. Уникальный индекс может отклонить пакет с одинаковыми ключами; он не очищает повторяющиеся строки.

  3. Это не настройка индекса физической таблицы SQL и не измерение скорости.

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

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

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

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

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