В какой последовательности могут идти ключевые слова в запросе 1с
Запросы в 1С обеспечивают табличный способ доступа к данным. Язык запросов заточен под удобное чтение и преобразование больших массивов информации; изменять данные с его помощью нельзя. Язык запросов - это отдельный язык, не являющийся частью встроенного языка 1С:Предприятие; он достаточно сходен с SQL.
Запрос всегда начинается с ключевого слова ВЫБРАТЬ; собственно кроме него в запросе может и не быть других ключевых слов, если секция ВЫБРАТЬ полностью описывает источник и результат запроса, например:
- группировка
- объединения разных таблиц-источников
- условия, ограничивающие выборку
- порядок представления результата
- расчет итогов по каким-либо полям
Запросы можно набирать просто вручную, но намного удобнее использовать специальный инструмент - конструктор запросов:
Вопрос 07.04 экзамена 1С:Профессионал по платформе. Для повышения скорости выполнения запроса необходимо:
- Задавать параметры большинства реальных таблиц
- Задавать параметры большинства виртуальных таблиц
- Вместо задания параметров у реальной или виртуальной таблицы использовать отбор, заданный конструкцией языка запросов "ГДЕ"
- Верны ответы 1 и 2
Верный ответ второй. Правильно параметризованный запрос работает с таблицей итогов регистра, а не с основной таблицей, такой способ доступа быстрее.
Вопрос 07.15 экзамена 1С:Профессионал по платформе. Можно ли, используя конструктор запроса, повлиять на порядок записей в результирующей таблице запроса?
- Нельзя
- Это можно сделать на закладке "Порядок"
- Это можно сделать на закладке "Объединения/Псевдонимы"
- Верны ответы 2 и 3
Правильный ответ четвертый. Закладка Порядок для этого предназначена очевидно; поля тут можно двигать стрелками, либо включить Автоупорядочивание (по основному представлению объекта):
- Все поля должны делиться на те, по которым производится группировка, и на агрегатные функции (рассчитываемые поля)
- Все поля должны делиться на те, по которым производится группировка, на агрегатные функции (рассчитываемые поля) и на поля вложенных таблиц
- Чем выше определяется группировка, тем выше должно определяться поле в запросе
- Перечисленные ограничения не действуют
Вопрос 07.35 экзамена 1С:Профессионал по платформе. Левое внешнее соединение означает, что в результат соединения войдут:
- Все данные из таблицы №2 и они будут дополнены данными из таблицы №1, для которых выполняется условие соединения
- Данные из обеих таблиц, для которых выполняется условие соединения, но поля, которые берутся из таблицы №1, будут идти первыми (слева)
- Все данные из таблицы №1 и они будут дополнены данными из таблицы №2, для которых выполняется условие соединения
Правильный ответ первый. Из левой таблицы будет выбрано все, из правой - только совпадающее по ключу с левой.
Вопрос 07.36 экзамена 1С:Профессионал по платформе. С помощью какой агрегатной функции можно узнать количество записей в результате запроса?
- КОЛИЧЕСТВО()
- КОЛИЧЕСТВО(*)
- КОЛИЧЕСТВО(Различные …)
- СУММА
Правильный ответ второй - функция КОЛИЧЕСТВО, и в ней нужно специфицировать, по каким полям считать количество (в примере по всем).
Хорошо ли мы знаем синтаксис команд языка запросов 1С ?
Попробуйте расставить порядок выполнения операций в запросе:
Порядок выполнения операций очень важен для понимания оптимизации, влияет на результат запроса. Определим порядок выполнения операций с помощью одной только консоли запросов. Планы запросов, оптимизатор и прочее в этой статье не рассматриваются. Результаты в конце статьи. Дальше будут использоваться вспомогательные таблицы ТабПример1, ТабПример2. Обратите внимание на слово «Все» в ТабПример2.
Чтобы проверить рассуждения, нужно копировать текст запроса временной таблицы и текст запроса выборки данных в консоль, выполнить запрос с полученным текстом. Результаты на файловых и серверных базах одинаковые.
Соединение таблиц VS. Проверка условия ГДЕ
Комментарий. Сначала выполняется Соединение таблиц. Об этом написано в учебниках SQL. Поэтому перед соединением необходимо тщательно подготовить таблицы: убрать «ненужные» записи, подключить индексы. Контрпример на сравнение очередности "Соединение таблиц" - "Проверка условия ГДЕ" пока не придумал.
Проверка условия ГДЕ VS. Расчет агрегатных функций без группировки
Результат: Поле1 = 1.5, Поле2 = 3.
Комментарий. Сначала выполняется Проверка "ГДЕ". Иначе был бы пустой результат.
Расчет агрегатных функций без группировки VS. Опции ПЕРВЫЕ – Упорядочить По.
Результат: Поле1 = 3.5, Поле2 = 7.
Комментарий. Сначала выполняется расчет агрегатных функций без группировки, затем команды ПЕРВЫЕ – Упорядочить По.
Группировка с расчетом агрегатных функций VS. опции ПЕРВЫЕ – Упорядочить По
Результат: Поле1 = 3.5, Поле2 = 7, Поле3 = 0.
Комментарий. Сначала выполняется группировка с расчетом агрегатных функции, затем команды ПЕРВЫЕ – Упорядочить По. Сразу после расчета агрегатных функций проверяется условие «Имеющие». Контрпример на сравнение очередности "Имеющие"-"Различные" пока не придумал.
Группировка с расчетом агрегатных функций VS. опция Различные
Результат: Поле1 = 2, Поле2 = 6.
Комментарий. Сначала выполняется Группировка с расчетом агрегатных функций. Конечно, применение в одном запросе этих операций бессмысленно.
опция Различные VS. опции ПЕРВЫЕ – Упорядочить По
Комментарий. Сначала выполняется Опция "Различные", затем опции Первые -Упорядочить По. Если был бы другой порядок выполнения, то в результате получилось бы не три строки, а две.
Смотрите следующий запрос:
Упорядочить По VS. ПЕРВЫЕРезультат: Поле1 = 1,5, Поле2 = 3.
Комментарий. Сначала выполняется Упорядочить По. Смотрите следующий запрос.
Результат: Поле1 = 2, Поле2 = 4.
Вывод: операции SQL выполняются в последовательности
- Соединение
- Проверка условия "ГДЕ"
- Группировка с расчетом агрегатных функций
- Проверка условия «Имеющие»
- Опция Различные
- Опция Упорядочить по
- Опция Первые
Послесловие
Пока я писал статью, узнал, что упорядочивание может происходить по агрегатным функциям, что вычисление агрегатных функций без группировки существенно отличается от группировки с вычислением агрегатных функций. Спасибо всем, кто проявил интерес к теме, давал конструктивные комментарии. Мне подсказали, что аналогичная информация по SQL содержится
Порядок для SQL в общем, совпадает с 1С, хотя слова другие :-))
WITH CUBE или WITH ROLLUP
Специальные предложения
Есть мнение, что SQL делает так, как ему лучше будет (в соответствии со статистикой). Главное - чтобы результат был таким, какой требует пользователь. Не знаю, как сейчас, но раньше если во временную таблицу вытаскиваешь всю таблицу, а потом агрегируешь ее и берешь оттуда только количество значений, то запрос вообще не выполнялся (на мелкософт скуле по крайней мере).
(5) starik-2005, ТормозИТ не зря в скобочках написал ЛОГИЧЕСКИ.
Не путайте логическое исполнение и физическое. В статье автор описывает логическое исполнение запросов.
- составные типы (да, я до сих пор их люблю, хотя уже 2 года на 1С не пишу),
- виртуальные таблицы
- (expr1, exp2) В (ВЫБРАТЬ)
- в иерархии
- команды построителю и прочий наш сахер синтаксический
Статистикой пользуется анализатор запроса и на ее основе выбирает оптимальный план запроса, планы запроса надо читать для разных случаев
Ошибочно. Оператор TOP (ПЕРВЫЕ) выполняется последним (логически), а ORDER (УПОРЯДОЧИТЬ) предпоследним (логически).
igo1; Chif13; igormiro; Dementor; JesteR; Yashazz; _also; awk; GorDAn; 1cWin; cool.vlad4; mrBart; Diversus; + 13 – Ответить
(7) tormozit, ИМХО, автор имел ввиду, что топ и ордер выполняются сначала, а агрегирование - потом. Хотя. Понимать - вообще штука сложная. Может на форуме сделать кнопку "Вы уверены, что поняли текст, на который отвечаете. и хотите ответить именно так, как написали?" Какому-то школьнику за это дали вкусных плюшек.
(8) В операторе УПОРЯДОЧИТЬ доступны псевдонимы (результаты) полей оператора ВЫБРАТЬ, в том числе выражений с агрегатными функциями, а также непосредственно в операторе УПОРЯДОЧИТЬ можно указывать выражения, содержащие агрегатные функции.
Результат будет 1, 37 . т.е. сначала произошло агрегирование и только потом TOP . понятно, что в целях оптимизации в реальности TOP может выполниться сначала. но говорить надо именно о логической последовательности выполнения. там же по ссылке
Note that the actual physical execution of the statement is determined by the query processor and the order may vary fr om this list.
автор был бы прав в случае если бы указал, что у меня на таком-то сервере, только в этом запросе, в данной таблице, сначала выполняется. и т.д. и то, как у него происходит сначала упорядочивание по агрегатному полю, а потом агрегация, непонятно. но мало ли. может оптимизировалось выполнение так запроса.
Конструктор запросов — инструмент, встроенный в систему 1С предприятие 8.3 и 8.2, существенно облегчающий разработку запросов 1С к базе данных.
Ранее мы обсуждали описание языка запросов 1С и инструмент для отладки отчетов — Консоль запросов 1С 8.3.
Конструктор запроса имеет достаточно простой, интуитивно понятный интерфейс. Тем не менее рассмотрим применение конструктора запроса подробнее.
Запуск конструктора текста запроса производится контекстным меню (правой кнопкой мыши) в нужном месте программного кода.
Описание конструктора запроса 1С
Рассмотрим каждую вкладку конструктора подробнее. Исключение — вкладка Построитель, это тема для отдельного разговора.
Вкладка Таблицы и поля
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
На этой вкладке указывается источник данных и поля, которые необходимо выводить в отчет. По сути, тут описываются конструкции ВЫБРАТЬ … ИЗ.
В качестве источника может служить физическая таблица базы данных, виртуальная таблица регистров, временные таблицы, вложенные запросы и т.д.
В контекстном меню виртуальных таблиц можно задать параметры этих таблиц:
Вкладка Связи
Вкладка служит для описания соединений нескольких таблиц, создает конструкции со словом СОЕДИНЕНИЕ.
Вкладка Группировка
На данной вкладке система позволяет группировать и суммировать нужные поля результата таблицы. Описывается использование конструкций СГРУППИРОВАТЬ ПО, СУММА, МИНИМУМ, СРЕДНЕЕ, МАКСИМУМ, КОЛИЧЕСТВО, КОЛИЧЕСТВО РАЗЛИЧНЫХ.
Вкладка Условия
Отвечает за всё, что идёт в тексте запроса после конструкции ГДЕ, т.е. за все условия, накладываемые на получаемые данные.
Вкладка Дополнительно
Вкладка Дополнительно изобилует всевозможными параметрами, которые являются очень важными. Рассмотрим каждое из свойств.
Группировка Выборка записей:
- Первые N — параметр, возвращающий в запрос только N записей (оператор ПЕРВЫЕ )
- Без повторяющихся — обеспечивает уникальность полученных записей (оператор РАЗЛИЧНЫЕ )
- Разрешенные — позволяет выбирать только те записи, которые позволяет выбрать система с учетом настройки RLS (конструкция РАЗРЕШЕННЫЕ )
Группировка Тип запроса определяет, каким будет тип запроса: выборка данных, создание временных таблицы или же уничтожение временной таблицы.
Ниже существует флаг Блокировать полученные данные для последующего изменения. Он позволяет включить возможность установки блокировки данных, которая обеспечивает сохранность данных от момента их чтения до изменения (актуально только для Автоматического режима блокировок, конструкция ДЛЯ ИЗМЕНЕНИЯ).
Вкладка Объединения/Псевдонимы
На этой вкладке конструктора запросов устанавливается возможность объединения разных таблиц и псевдонимы (конструкция КАК). В левой части указываются таблицы, если установить флаги напротив таблицы, будут использоваться конструкции ОБЪЕДИНИТЬ, иначе — ОБЪЕДИНИТЬ ВСЕ (отличия двух способов тут). В правой части указываются соответствия полей в разных таблицах, если соответствие не указано, запрос будет возвращать NULL.
Вкладка Порядок
Здесь указывается порядок сортировки значений (УПОРЯДОЧИТЬ ПО) — по убыванию (УБЫВ) или возрастанию(ВОЗР).
Также есть интересный флаг — Автоупорядочивание (в запросе — АВТОУПОРЯДОЧИВАНИЕ). По умолчанию, система 1С 8.3 выводит данные в «хаотичном» порядке. Если установить этот флаг, система будет сортировать данные по внутренним данным.
Вкладка Пакет запросов
На вкладке конструктора запросов можно создавать новые пакеты запросов, а также использовать её в роли навигации. В тексте запроса пакеты разделяются символом «;»(точка с запятой).
Кнопка «Запрос» в конструкторе запросов
В левом нижнем углу конструктора запроса есть кнопка Запрос, с помощью которого можно в любой момент просмотреть текст запроса:
В данном окне можно внести коррективы в запрос и выполнить его.
Видео про конструктор запросов:
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
Язык запросов 1С 8 — незаменимый инструмент для программиста 1С, он позволяет писать более лаконичный, простой, понятный код, использовать меньшее количество ресурсов системы при работе с данными. Данная статья открывает серию уроков, посвященных языку запросов 1С 8. На первом уроке мы рассмотри структуру главного оператора данного языка — ВЫБРАТЬ. При помощи этого оператора можно создавать выборки из таблиц базы данных. Выбранные данные таблиц можно сортировать, накладывать на них условия, связывать и объединять с данными других таблиц, группировать по различным полям и много другое.
Язык запросов 1с предприятия 8 — Структура оператора ВЫБРАТЬ
Рассмотрим структуру оператора ВЫБРАТЬ (в квадратных скобках указаны необязательные части оператора). Язык запросов 1С предоставляет широкий набор инструментов для создания выборок данных.
Ключевые слова и блоки работы с полями
- ВЫБРАТЬ — ключевое слово обозначающее начало оператора;
- РАЗРЕШЕННЫЕ— указывает, что в выборку должны попадать записи таблиц, доступ на чтение к которым разрешен для данного пользователя;
- РАЗЛИЧНЫЕ— указывает, что в выборку должны попадать только различные (по всем полям) стоки. Иными словами, из выборки будут исключены повторяющиеся строки;
- ПЕРВЫЕ A— если указать данное ключевое слово, то в выборку попадут только первые A из выбранных запросом строк, где A — натуральное число;
- Блок полей — в данном блоке указываются поля, которые необходимо включить в выборку. Эти поля будут случить столбцами выборки. В самом простом случае поле выглядит следующим образом:
Ключевые слова и блоки работы с таблицами
- ПОМЕСТИТЬ ИмяВременнойТаблицы — ключевое слово ПОМЕСТИТЬ предназначено для создания временной таблицы с определенным именем, которая будет храниться в оперативной памяти в данном сеансе 1С 8, пока он не завершится или пока временная таблица не будет уничтожена. Следует заметить, что имена временных таблиц в одном сеансе 1С 8 не должны повторяться;
- Блок таблиц и связей — в блоке указываются все таблицы используемые в данном запросе, а также связи между ними. Начинается блок с ключевого слова ИЗ, за ним следует имя и псевдоним первой таблицы. Если данная таблица связана с другими таблицами, то указываются связи. Язык запросов 1С содержит следующий набор типов связей:
- ВНУТРЕННЕЕ СОЕДИНЕНИЕ — запись из левой таблицы попадет в выборку только при выполнении условия связи, запись из правой таблицы попадет в выборку только при выполнении условия связи;
- ЛЕВОЕ СОЕДИНЕНИЕ — запись из левой таблицы попадет в выборку в любом случае, запись из правой таблицы попадет в выборку только при выполнении условия связи;
- ПОЛНОЕ СОЕДИНЕНИЕ — запись из левой таблицы попадет в выборку сначала в любом случае, потом только при выполнении условия связи, запись из правой таблицы попадет в выборку сначала в любом случае, потом только при выполнении условия связи. При этом получившиеся в результате связи повторяющиеся строки исключаются из выборки.
Ключевые слова и блоки преобразования данных
- Блок группировок — данный блок служит для группировки строк таблицы. Строки объединяются в одну, если значения полей указанных после ключевого слова СГРУППИРОВАТЬ ПО оказываются одинаковыми. При этом все остальные поля суммируются, усредняются, максимизируются, либо минимизируются при помощи агрегатных функций. Агрегатные функции используют в блоке полей. Пример:
- Блок условий — в данном блоке после ключевого слова ГДЕ указываются условные выражения разделенные логическими операторами И, ИЛИ, для того чтобы любая из выбранных строк попала в выборку, необходимо, чтобы все условия в совокупности имели значение Истина.
- ОБЪЕДИНИТЬ ВСЕ — данное ключевое слово используется для объединения запросов (операторов ВЫБРАТЬ). Язык запросов 1С позволяет объединять несколько запросов в один. Для того, чтобы запросы можно было объединить у них должен быть одинаковый набор полей;
- «;» — точка с запятой используется для разделения не зависимых друг от друга операторов ВЫБРАТЬ;
- ИНДЕКСИРОВАТЬ ПО — ключевое слово используется для индексации полей указанных после него;
- Блок итогов — используется для построения древовидных выборок. По каждому из группировочных полей, указанных после ключевого слова ПО, будет создана отдельная строка в выборке. В этой строке при помощи агрегатных функций будут посчитаны итоговые значения полей указанных после ключевого слова ИТОГИ.
Хотите продолжить изучать язык запросов 1с 8? Тогда прочтите следующую статью: Программная работа с запросом в 1С 8
Научитесь пользоваться конструктором запросов: Конструктор запросов 1С — обучение на примерах
При работе с языком запросов 1С, иногда возникает ситуация, когда требуется проверить выражение, является ли оно ЛОЖЬ или Истина. В случае положительного результата присвоить ему значение выражения для замены.
Конструкция оператора ВЫБОР
Несколько примеров
Пример №1
Есть таблица «Таблица1», в которой перечислены все дни с понедельника по воскресенье.
ДеньНедели Понедельник Вторник Среда Четверг Пятница Суббота Воскресенье Необходимо, для строк со значениями «Суббота» и «Воскресенье» в отдельном поле указать, что это выходной. Во всех остальных случаях, рабочий день. Реализуем поставленную задачу в виде запроса к исходной таблице.
Текст запроса может выглядеть так:
ВЫБРАТЬ
ДеньНедели,
ВЫБОР
КОГДА ДеньНедели =»Суббота »
ИЛИ ДеньНедели = «Воскресенье »
ТОГДА «Выходной»
ИНАЧЕ «Рабочий день»
КОНЕЦ КАК ВидДня
ИЗ
Таблица1. ДеньНедели КАК ДеньНедели
ДеньНедели ВидДня Понедельник Рабочий день Вторник Рабочий день Среда Рабочий день Четверг Рабочий день Пятница Рабочий день Суббота Выходной Воскресенье Выходной В данном примере, используя оператор ВЫБОР, мы перебираем все строки из «Таблица1». Параллельно проверяя каждую на соответствие условию.
КОГДА ДеньНедели =»Суббота »
ИЛИ ДеньНедели = «Воскресенье «
Если сработает одно из них, то в колонку «ВидДня» произойдёт запись выражения замены, расположенного после ключевого слова ТОГДА. Во всех остальных случаях будет записано выражение расположенное после слова ИНАЧЕ. Причём если убрать секцию ИНАЧЕ, программа примет такую конструкцию и не выдаст ошибку. Однако если проверяемое выражение вернёт ЛОЖЬ, тогда строки, в которые должно было подставится выражение замены, получать значение NULL. Рассмотрим подробнее подобную ситуацию.
Пример №2
Возьмём уже известную нам таблицу из первого примера.
ДеньНедели Понедельник Вторник Среда Четверг Пятница Суббота Воскресенье Получите понятные самоучители по 1С бесплатно:
Необходимо вывести в отдельную таблицу количество выходных дней. Причём информацию о количестве рабочих дней, будем считать излишней. Для наглядности решим задачу в несколько этапов. За основу возьмём запрос из примера №1. Уберём из него секцию ИНАЧЕ, а поле для вывода оставим только то, которое получаем конструкцией оператора ВЫБОР.
ВЫБРАТЬ
ВЫБОР
КОГДА ДеньНедели =»Суббота »
ИЛИ ДеньНедели = «Воскресенье »
ТОГДА «Выходной»
КОНЕЦ КАК ВидДня
ИЗ
Таблица1. ДеньНедели КАК ДеньНедели
Из результата запроса видно, что все строки, не вошедшие в условие после ключевого слова КОГДА получили . Как известно это отсутствие значения. Таким образом, нам остаётся только сгруппировать полученную таблицу. Применив к группировке агрегатную функцию КОЛИЧЕСТВО ( ).
Текст запроса может выглядеть так:
ВЫБРАТЬ
КОЛИЧЕСТВО(ВЫБОР
КОГДА ДеньНедели =»Суббота »
ИЛИ ДеньНедели = «Воскресенье »
ТОГДА «Выходной»
КОНЕЦ) КАК ВидДня
ИЗ
Таблица1. ДеньНедели КАК ДеньНедели
В заключении хочется сказать, что оператор ВЫБОР хоть и не часто находит свое применение при написании запросов в 1С, но в некоторых ситуациях является незаменимым инструментом для разработчика.
Читайте также: