ПоляСхемыЗапроса.Индекс

Методы · IndexOf

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

Синтаксис

Индекс(<Элемент>)
Полное описание, параметры и ограничения

ПоляСхемыЗапроса.Индекс (QuerySchemaFields.IndexOf)

ПоляСхемыЗапроса (QuerySchemaFields)

Индекс (IndexOf)

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

Синтаксис:
Индекс(<Элемент>)
Параметры:

<Элемент> (обязательный)
Тип: ВыражениеСхемыЗапроса, ВложеннаяТаблицаСхемыЗапроса.
Элемент, индекс которого определяется.
Возвращаемое значение:
Тип: Число.
Если не найдено, то возвращается -1.
Описание:

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

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

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

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

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

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

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

Добавить вычисляемую сумму в свою схему

Добавляем выражение 3 * 250 в выбираемые поля, находим соответствующую колонку по объекту выражения и задаём ей псевдоним Сумма.

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

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

Подготовка

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

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

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

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

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

  1. Добавить со строкой разбирает новое выражение в текущем собственном операторе.

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

  3. Выражение 3 * 250 не является агрегатным СУММА(...): это умножение в одной строке.

  4. Проверяем фактически выгруженное значение Сумма=750.

  5. После выполнения удаляем поле по проверенному индексу и очищаем собственную коллекцию. Удалённое выражение и колонка больше не читаются.

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

  1. Шесть сравнений Истина.

  2. Изменяется только схема в памяти; результат 750 вычислен до разрушения её структуры.

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

Добавлена и проверена вычисляемая колонка; показан безопасный порядок удаления дочерних полей.

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

  1. Колонки не имеют метода Добавить: новую колонку формирует добавление выражения в поля.

  2. Нельзя исполнять прежнюю выборку после очистки её полей, как если бы они сохранились.

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

Заменить выражение количества и пересчитать четыре книги

В единственном операторе собственного запроса заменяем выражение 3 на 4. Установить получает объект ВыражениеСхемыЗапроса, а не произвольный текст.

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

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

Подготовка

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

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

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

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

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

  1. Один запрос и один оператор проверяются до доступа по индексу 0.

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

  3. Конструктор ВыражениеСхемыЗапроса разбирает собственный текст 4; Установить заменяет элемент по индексу.

  4. СодержитАгрегатнуюФункцию и ТипЗначения — методы выражения, а не свойства. Для числа 4 ожидается неагрегатное числовое выражение.

  5. Выполняем изменённый текст: количество стало 4, цена осталась 250, собственный расчёт равен 1000.

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

  1. Шесть сравнений Истина плюс диагностическое представление оператора.

  2. Нет выдуманного результата: 1000 вычисляется из фактически выгруженной строки.

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

Проверена точечная замена выражения и её влияние на вычисление.

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

  1. Не передавайте строку непосредственно вторым параметром Установить: по API нужен объект выражения.

  2. Не переносите привязанные выражения из другой схемы.

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

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

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

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

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