Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.03.2019
Просмотров: 51759
Скачиваний: 8724
Выражение языка запросов может содержать:
Литералы типов: число, строка (в кавычках), булево (значения Истина и Ложь), Null,
Неопределено. Чтобы указать литерал типа Дата, можно воспользоваться
ключевым словом языка запросов ДАТАВРЕМЯ или передать дату через параметр
запроса.
Арифметические операции (+, -, /, *). Операция получения остатка % в языке
запросов не поддерживается.
Операцию конкатенации строк (+). Операцию конкатенации нельзя использовать для
виртуальных полей.
Встроенные функции языка запросов (ДЕНЬ, МЕСЯЦ, ГОД и т. д.).
Агрегатные функции (СУММА, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, КОЛИЧЕСТВО).
Операцию выбора ВЫБОР – позволяет получить одно из возможных значений в
соответствии с указанными условиями.
Операцию приведения типов ВЫРАЗИТЬ – позволяет привести значение составного
типа к одному из составляющих это значение типов. А также функцию ВЫРАЗИТЬ()
используют для получения результатов нужной длины и точности.
Рассмотрим несколько чисто демонстрационных задач, позволяющих показать
применение выражений в списке выборки запросов.
Например, мы хотим вывести записи из иерархического справочника Товары. При этом
после поля Наименование в скобках мы хотим видеть Код товара. Также для каждой
записи справочника мы хотим видеть текстовое обозначение, является ли эта запись
группой или нет («Это группа»/«Это элемент»). Это можно сделать с помощью
следующего запроса (листинг 1.63).
Листинг 1.63. Примеры использования выражений в списке полей выборки
Результат выполнения запроса представлен на рис. 1.60.
Рис. 1.60. Примеры использования выражений в списке полей выборки
Для формирования поля выборки Товар в данном запросе используется операция
конкатенации (сложения) строк, в результате наименование и код товара выводятся в
одном текстовом поле выборки результата запроса.
Для формирования поля выборки ПризнакГруппы используется операция выбора
(ВЫБОР (КОГДА … ТОГДА) ИНАЧЕ … КОНЕЦ). В этой операции после ключевого слова
КОГДА записывается условие выбора, после ключевого слова ТОГДА следует значение
поля выборки в случае, если условие истинно. В общем случае в операции выбора может
указываться неограниченное количество альтернативных одиночных выборов КОГДА …
ТОГДА. Значение выражения, указанного после слова ИНАЧЕ используется в качестве
результата операции выбора в том случае, если ни одно из ранее указанных
альтернативных условий выбора не было выполнено.
В операции выбора проверяется значение логического поля Товары.ЭтоГруппа, и
результат выбора выводится как строковой («Это группа»/«Это элемент») литерал.
Рассмотрим следующую задачу. Допустим, мы хотим вывести даты начала и окончания
поступлений товаров и узнать, сколько дней прошло между ними. Это можно сделать с
помощью следующего запроса (листинг 1.64).
Листинг 1.64. Примеры использования выражений в списке полей выборки
Результат выполнения запроса представлен на рис. 1.61.
Рис. 1.61. Примеры использования выражений в списке полей выборки
Для формирования полей выборки Начало и Окончание используются агрегатные
функции МИНИМУМ() и МАКСИМУМ(). В данном запросе группировка записей не
используется, поэтому значения агрегатных функций вычисляются для всех записей
запроса, и результат запроса составляет одна строка. В данном случае вычисляются
минимальная и максимальные даты приходных накладных.
Для формирования поля выборки Период используется функция РАЗНОСТЬДАТ() с
параметром ДЕНЬ, которая вычисляет, сколько прошло дней между началом и
окончанием поступлений товаров.
Рассмотрим следующую задачу. Допустим, мы хотим вывести общее количество и сумму
всех заказов товара и узнать среднюю сумму одного заказа. Это можно сделать с
помощью следующего запроса (листинг 1.65).
Листинг 1.65. Примеры использования выражений в списке полей выборки
Результат выполнения запроса представлен на рис. 1.62.
Рис. 1.62. Примеры использования выражений в списке полей выборки
Для формирования поля выборки Количество используется агрегатная функция
КОЛИЧЕСТВО(). В данном запросе группировка записей не используется, поэтому
значения агрегатных функций вычисляются для всех записей запроса, и результат
запроса составляет одна строка. В данном случае выводится общее количество всех
заказов товара.
Для формирования поля выборки СуммаЗаказа используется агрегатная функция
СУММА(). В результате вычисляется общая сумма всех заказов.
Для формирования поля выборки СреднийЗаказ сумма всех заказов (значение поля
СуммаЗаказа) делится на общее количество заказов клиентов (значение поля
Количество). Затем к результату деления применяется функция ВЫРАЗИТЬ(), с
помощью которой получается результат заданной длины и точности (в данном случае
результат деления округляется до двух десятых). Таким образом, мы можем узнать
среднюю сумму заказа.
Обратите внимание (см. листинг 1.64, 1.65), что в качестве параметров функций должны
указываться имена полей, а не их псевдонимы, и результат предыдущих вычислений с
помощью псевдонима нельзя использовать при расчете других полей.
Рассмотрим следующую задачу. Допустим, мы хотим вывести движения регистра
накопления ОстаткиТоваров за определенный период. Причем дату движений мы хотим
видеть на начало текущей недели, а в качестве контрагента мы хотим вывести
поставщиков из приходных накладных и покупателей из расходных накладных. Это можно
сделать с помощью следующего запроса (листинг 1.66).
Листинг 1.66. Примеры использования выражений в списке полей выборки
Результат выполнения запроса представлен на рис. 1.63.
Рис. 1.63. Примеры использования выражений в списке полей выборки
В данном запросе накладывается условие на нахождение периода движений регистра
накопления ОстаткиТоваров в интервале между двумя датами. В условии отбора
используется оператор МЕЖДУ, который проверяет результат вхождения значения в
диапазон вместе с границами диапазона.
Для формирования поля выборки Период используется функция НАЧАЛОПЕРИОДА() с
параметром НЕДЕЛЯ, позволяющая представить дату движений регистра как начало
недели, за которую производились эти движения.
Мы знаем, что регистраторами регистра накопления ОстаткиТоваров являются
документы ПриходнаяНакладная и РасходнаяНакладная, следовательно, поле
Регистратор регистра накопления является полем составного типа.
Для формирования поля выборки Контрагент используется операция выбора, в условии
которой при помощи оператора ССЫЛКА проверяется, ссылкой на какой документ
является поле Регистратор регистра накопления. Затем с помощью функции
ВЫРАЗИТЬ() значение поля составного типа приводится к одному из составляющих это
значение типов, но из приходных накладных выводится поле Поставщик, а из расходных
накладных – поле Покупатель.
Применение функции ВЫРАЗИТЬ() для приведения значений составного типа к какому-
либо определенному типу весьма желательно, так как позволяет более оптимально
выполнить запрос.
подробнее
Раздел «
Ограничить получение данных через точку от полей составного ссылочного типа
».
Иногда функцию ВЫРАЗИТЬ() пытаются использовать не по назначению – для
преобразования типов, например строки, в число и т. п. Это неправильно. Функция
ВЫРАЗИТЬ() используется только для тех случаев, о которых было рассказано выше
(листинг 1.65, 1.66).
Выражения в языке запросов используются не только в списке полей выборки, но и в
условиях отбора, в предложении упорядочивания, при описании итогов и т. д. Выражения
в условиях отбора мы уже рассматривали ранее в разделе "
таблицы, отобранные по некоторому условию
", другие примеры использования выражений
в языке запросов будут рассмотрены нами позднее.
Подробнее
Документация «1С:Предприятие 8.3. Руководство разработчика», раздел 8.2 «Язык
запросов», а также встроенная справка
Справка > Содержание справки >
1С:Предприятие > Встроенный язык > Работа с запросами > Синтаксис текста
запросов > Использование выражений в языке запросов
.
Примеры использования языка запросов для получения данных из нескольких
таблиц
Как использовать данные одного запроса внутри другого запроса
Иногда внутри одного запроса необходимо использовать данные другого запроса.
Например, требуется ограничить выборку значений в условии отбора одного запроса
данными другого запроса. Второй запрос по отношению к первому является вложенным,
а первый запрос по отношению ко второму является основным или внешним. Причем
уровней вложенности запросов друг в друга в общем случае может быть несколько.
Рассмотрим эту ситуацию на примере. Допустим, необходимо узнать, в каких расходных