Возвращает тип значения выражения.
Синтаксис
ТипЗначения()Полное описание, параметры и ограничения
ВыражениеСхемыЗапроса.ТипЗначения (QuerySchemaExpression.ValueType)
ВыражениеСхемыЗапроса (QuerySchemaExpression)
ТипЗначения (ValueType)
Доступен, начиная с версии 8.3.5.
Синтаксис:
ТипЗначения()
Возвращаемое значение:
Тип: ОписаниеТипов.
Описание:
Возвращает тип значения выражения.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Использование в версии:
Доступен, начиная с версии 8.3.5.
Методическая информация
Практические примеры
Изменить условие соединения и проверить исчезновение строки
Добавляем к совпадению имени условие количества больше 3. У книги количество ровно 3: внутреннее соединение временно даёт пустой результат.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
В учебной обработке или общем модуле выполните каждый фрагмент отдельно на сервере. Все запросы используют только свои числа и параметры, без справочников, документов и регистров рабочей базы.
СхемаЗапроса редактирует структуру и формирует текст, а Запрос выполняет этот текст. Родительская схема должна оставаться в переменной, пока используются её дочерние объекты.
Не переносите полученные дочерние объекты между разными схемами и не обращайтесь к элементу после его удаления. Упражнения удаления работают только со своей структурой в памяти.
Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса("ВЫБРАТЬ 3 КАК Количество, 250 КАК Цена");
Если Схема.ПакетЗапросов.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один собственный запрос";
КонецЕсли;
Выбор = Схема.ПакетЗапросов.Получить(0);
Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Тогда
ВызватьИсключение "Первый собственный запрос не является выборкой";
КонецЕсли;
Если Выбор.Операторы.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один собственный оператор ВЫБРАТЬ";
КонецЕсли;
Оператор = Выбор.Операторы.Получить(0);
Источники = Оператор.Источники;
ТоварыИсточник = Источники.Добавить(Тип("ВложенныйЗапросСхемыЗапроса"), "Товары");
ЦеныИсточник = Источники.Добавить(Тип("ВложенныйЗапросСхемыЗапроса"), "Цены");
ТоварыИсточник.Источник.Запрос.УстановитьТекстЗапроса("ВЫБРАТЬ ""Книга"" КАК Наименование, 3 КАК Количество ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ""Ручка"", 1");
ЦеныИсточник.Источник.Запрос.УстановитьТекстЗапроса("ВЫБРАТЬ ""Книга"" КАК Наименование, 250 КАК Цена");
Поля = Оператор.ВыбираемыеПоля;
Поля.Очистить();
ПолеИмя = Поля.Добавить("Товары.Наименование");
ПолеКоличество = Поля.Добавить("Товары.Количество");
ПолеЦена = Поля.Добавить("ЕСТЬNULL(Цены.Цена, 0)");
КолонкаИмя = Выбор.Колонки.Найти(ПолеИмя);
КолонкаКоличество = Выбор.Колонки.Найти(ПолеКоличество);
КолонкаЦена = Выбор.Колонки.Найти(ПолеЦена);
Если КолонкаИмя = Неопределено Или КолонкаКоличество = Неопределено Или КолонкаЦена = Неопределено Тогда
ВызватьИсключение "Нет колонок собственных товаров и цен";
КонецЕсли;
КолонкаИмя.Псевдоним = "Наименование";
КолонкаКоличество.Псевдоним = "Количество";
КолонкаЦена.Псевдоним = "Цена";
Соединения = ТоварыИсточник.Соединения;
Связь = Соединения.Добавить(ЦеныИсточник, "Товары.Наименование = Цены.Наименование");
Связь.ТипСоединения = ТипСоединенияСхемыЗапроса.ЛевоеВнешнее;
Связь.ТипСоединения = ТипСоединенияСхемыЗапроса.Внутреннее;
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
До = Запрос.Выполнить().Выгрузить();
Если До.Количество() <> 1 Тогда
ВызватьИсключение "Неожиданное число собственных строк соединения";
КонецЕсли;
Связь.Условие = Новый ВыражениеСхемыЗапроса("Товары.Наименование = Цены.Наименование И Товары.Количество > 3");
Сообщить(Не Связь.Условие.СодержитАгрегатнуюФункцию());
Сообщить(Связь.Условие.ТипЗначения().СодержитТип(Тип("Булево")));
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
После = Запрос.Выполнить().Выгрузить();
Если После.Количество() <> 0 Тогда
ВызватьИсключение "Неожиданное число собственных строк соединения";
КонецЕсли;
Связь.Условие = Новый ВыражениеСхемыЗапроса("Товары.Наименование = Цены.Наименование");
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
Восстановлено = Запрос.Выполнить().Выгрузить();
Если Восстановлено.Количество() <> 1 Тогда
ВызватьИсключение "Неожиданное число собственных строк соединения";
КонецЕсли;
Сообщить(До[0].Количество = 3);
Сообщить(После.Количество() = 0);
Сообщить(Восстановлено[0].Количество * Восстановлено[0].Цена = 750);Разбор по шагам
Сначала внутреннее соединение находит собственную книгу; число строк проверено до индексного доступа.
Условие — объект ВыражениеСхемыЗапроса, не строковое свойство. Создаём выражение конструктором и присваиваем целиком.
Логическое выражение не содержит агрегатной функции; рекомендуемый тип содержит Булево.
Число 3 не больше 3, поэтому совпадений после изменения нет. Пустой результат не индексируем.
Восстановив прежнее условие, отдельно выполняем запрос и проверяем сумму 750.
Как проверить результат
Пять сообщений Истина.
Количество строк До/После/Восстановлено: 1/0/1.
Ожидаемый результат
Видно влияние настоящего условия связи, а не только чтение свойства.
На что обратить внимание
Условия соединения и внешний ГДЕ могут давать разные результаты для внешних соединений.
Не подставляйте непроверенный пользовательский текст в выражение. Здесь весь текст собственный.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Заменить выражение количества и пересчитать четыре книги
В единственном операторе собственного запроса заменяем выражение 3 на 4. Установить получает объект ВыражениеСхемыЗапроса, а не произвольный текст.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
В учебной обработке или общем модуле выполните каждый фрагмент отдельно на сервере. Все запросы используют только свои числа и параметры, без справочников, документов и регистров рабочей базы.
СхемаЗапроса редактирует структуру и формирует текст, а Запрос выполняет этот текст. Родительская схема должна оставаться в переменной, пока используются её дочерние объекты.
Не переносите полученные дочерние объекты между разными схемами и не обращайтесь к элементу после его удаления. Упражнения удаления работают только со своей структурой в памяти.
Схема = Новый СхемаЗапроса;
Схема.УстановитьТекстЗапроса("ВЫБРАТЬ 3 КАК Количество, 250 КАК Цена");
Если Схема.ПакетЗапросов.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один собственный запрос";
КонецЕсли;
Выбор = Схема.ПакетЗапросов.Получить(0);
Если ТипЗнч(Выбор) <> Тип("ЗапросВыбораСхемыЗапроса") Тогда
ВызватьИсключение "Первый собственный запрос не является выборкой";
КонецЕсли;
Если Выбор.Операторы.Количество() <> 1 Тогда
ВызватьИсключение "Ожидался один собственный оператор ВЫБРАТЬ";
КонецЕсли;
Оператор = Выбор.Операторы.Получить(0);
Поля = Оператор.ВыбираемыеПоля;
Если Поля.Количество() <> 2 Тогда
ВызватьИсключение "Ожидались свои количество и цена";
КонецЕсли;
Прежнее = Поля.Найти("3");
Если Прежнее = Неопределено Тогда
ВызватьИсключение "Не найдено собственное выражение количества";
КонецЕсли;
ИндексКоличества = Поля.Индекс(Прежнее);
Если ИндексКоличества < 0 Или ИндексКоличества >= Поля.Количество() Тогда
ВызватьИсключение "Нет допустимого индекса собственного поля";
КонецЕсли;
Новое = Новый ВыражениеСхемыЗапроса("4");
Поля.Установить(ИндексКоличества, Новое);
Сообщить(Поля.Получить(ИндексКоличества) <> Неопределено);
Сообщить(Не Новое.СодержитАгрегатнуюФункцию());
Сообщить(Новое.ТипЗначения().СодержитТип(Тип("Число")));
Сообщить("Оператор: " + Оператор.Представление());
Запрос = Новый Запрос(Схема.ПолучитьТекстЗапроса());
Таблица = Запрос.Выполнить().Выгрузить();
Если Таблица.Количество() <> 1 Тогда
ВызватьИсключение "Ожидалась одна собственная строка";
КонецЕсли;
Сообщить(Таблица[0].Количество = 4);
Сообщить(Таблица[0].Цена = 250);
Сообщить(Таблица[0].Количество * Таблица[0].Цена = 1000);Разбор по шагам
Один запрос и один оператор проверяются до доступа по индексу 0.
Найти ищет выражение, не псевдоним колонки. После поиска проверяем результат и индекс.
Конструктор ВыражениеСхемыЗапроса разбирает собственный текст 4; Установить заменяет элемент по индексу.
СодержитАгрегатнуюФункцию и ТипЗначения — методы выражения, а не свойства. Для числа 4 ожидается неагрегатное числовое выражение.
Выполняем изменённый текст: количество стало 4, цена осталась 250, собственный расчёт равен 1000.
Как проверить результат
Шесть сравнений Истина плюс диагностическое представление оператора.
Нет выдуманного результата: 1000 вычисляется из фактически выгруженной строки.
Ожидаемый результат
Проверена точечная замена выражения и её влияние на вычисление.
На что обратить внимание
Не передавайте строку непосредственно вторым параметром Установить: по API нужен объект выражения.
Не переносите привязанные выражения из другой схемы.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.