Экспертное сообщество по ремонту ванных комнат

Группировка в запросе. Группировка в запросе Форма оператора В для проверки совпадения значения с одним из результата запроса

Язык запросов является одним из основополагающих механизмов 1С 8.3 для разработчиков. При помощи запросов можно быстро получить любые данные, хранящиеся в базе. Его синтаксис очень похож на SQL, но есть и отличия.

Основные достоинства языка запросов 1С 8.3 (8.2) перед SQL:

  • разыменование ссылочных полей (обращение черед одну или несколько точек к реквизитам объектов);
  • работа с итогами очень удобная;
  • возможность создавать виртуальные таблицы;
  • запрос можно писать как на английском, так и на русском языках;
  • возможность блокировать данные для исключения взаимных блокировок.

Недостатки языка запросов в 1С:

  • в отличие от SQL, в 1С запросы не позволяют изменять данные;
  • отсутствие хранимых процедур;
  • невозможность преобразования строки в число.

Рассмотрим наш мини учебник по основным конструкциям языка запросов 1С.

В связи с тем, что запросы в 1С позволяют лишь получать данные, любой запрос должен начинаться со слова «ВЫБРАТЬ». После этой команды указываются поля, данные из которых нужно получить. Если указать «*», то будут выбраны все доступные поля. Место, откуда будут выбираться данные (документы, регистры, справочники и прочее) указывается после слова «ИЗ».

В рассмотренном ниже примере выбираются наименования всей номенклатуры из справочника «Номенклатура». После слова «КАК» указываются псевдонимы (имена) для таблиц и полей.

ВЫБРАТЬ
Номенклатура.Наименование КАК НаименованиеНоменклатуры
ИЗ
Справочник.Номенклатура КАК Номенклатура

Рядом с командой «ВЫБРАТЬ» можно указать ключевые слова:

  • РАЗЛИЧНЫЕ . Запрос будет отбирать только отличающиеся хотя бы по одному полю строки (без дублей).
  • ПЕРВЫЕ n , где n – количество строк с начала результата, которые необходимо отобрать. Чаще всего такая конструкция используется совместно с сортировкой (УПОРЯДОЧИТЬ ПО). Например, когда нужно отобрать определенное количество последних по дате документов.
  • РАЗРЕШЕННЫЕ . Данная конструкция позволяет выбирать из базы только те записи, которые доступны текущему пользователю. Баз использования этого ключевого слова пользователю будет выведено сообщение об ошибке при попытке обращения запроса к тем записям, доступа к которым у него нет.

Эти ключевые слова могут использоваться как все вместе, так и по отдельности.

ДЛЯ ИЗМЕНЕНИЯ

Это предложение блокирует данные для исключения взаимных конфликтов. Заблокированные данные не будут считываться из другого соединения до окончания транзакции. В данном предложении можно указывать конкретные таблицы, которые нужно заблокировать. В противном случае будут заблокированы все. Конструкция актуальна лишь для режима автоматических блокировок.

Чаще всего предложение «ДЛЯ ИЗМЕНЕНИЯ» используется при получении остатков. Ведь при одновременной работе нескольких пользователей в программе, пока один получает остатки, другой может их изменить. В таком случае полученный остаток будет уже не верен. Если же заблокировать данные этим предложением, то пока первый сотрудник не получит корректный остаток и не совершит с ним все необходимые манипуляции, второй сотрудник будет вынужден ждать.

ВЫБРАТЬ
Взаиморасчеты.Сотрудник,
Взаиморасчеты.СуммаВзаиморасчетовОстаток
ИЗ
РегистрНакопления.ВзаиморасчетыССотрудниками.Остатки КАК Взаиморасчеты
ДЛЯ ИЗМЕНЕНИЯ

ГДЕ (WHERE)

Конструкция необходима для наложения какого-либо отбора на выгружаемые данные. В некоторых случая получения данных из регистров разумнее прописывать условия отборов в параметрах виртуальных таблиц. При использовании «ГДЕ», сначала получаются все записи, и только потом применяется отбор, что значительно замедляет выполнение запроса.

Ниже приведен пример запроса получения контактных лиц с определенной должностью. Параметр отбора имеет формат: &ИмяПараметра (имя параметра произвольное).

ВЫБОР (CASE)

Конструкция позволяет указывать условия непосредственно в теле запроса.

В приведенном ниже примере «ДополнительноеПоле» будет содержать текст в зависимости от того проведен документ или нет:

ВЫБРАТЬ
ПоступлениеТиУ.Ссылка,
ВЫБОР
КОГДА ПоступлениеТиУ.Проведен
ТОГДА «Документ проведен!»
ИНАЧЕ «Документ не проведен…»
КОНЕЦ КАК ДополнительноеПоле
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТиУ

СОЕДИНЕНИЕ (JOIN)

Соединения связывают две таблицы по определенному условию связи.

ЛЕВОЕ/ПРАВОЕ СОЕДИНЕНИЕ

Суть ЛЕВОГО соединения заключается в том, что полностью берется первая указанная таблица и к ней по условию связи привязывается вторая. Если записей, соответствующих первой таблице во второй не нашлось, то в качестве их значений подставляется NULL. Проще говоря, главной является первая указанная таблица и к её данным уже подставляются данные второй таблицы (если они есть).

Например, необходимо получить номенклатурные позиции из документов «Поступление товаров и услуг» и цены из регистра сведений «Цены номенклатуры». В данном случае, если цена у какой-либо позиции не найдена, вместо нее подставиться NULL. Из документа все позиции будут выбраны вне зависимости от того, есть ли на них цена или нет.

ВЫБРАТЬ
ПоступлениеТиУ.Номенклатура,
Цены.Цена
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТиУ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены
ПО ПоступлениеТиУ.Номенклатура = Цены.Номенклатура

В ПРАВОМ все в точности да наоборот.

ПОЛНОЕ СОЕДИНЕНИЕ

Данный вид соединения отличается от предыдущих тем, что в результате будут возвращены все записи как первой таблицы, так и второй. Если по заданному условию связи в первой или второй таблице не найдено записей, вместо них будет возвращено значение NULL.

При использовании в предыдущем примере полного соединения будут выбраны все позиции номенклатуры из документа «Поступление товаров и услуг» и все последние цены из регистра «Цены номенклатуры». Значения не найденных записей, как в первой, так и во второй таблице будут равняться NULL.

ВНУТРЕННЕЕ СОЕДИНЕНИЕ

Отличием ВНУТРЕННЕГО соединения от ПОЛНОГО является то, что если хотя бы в одной из таблиц не найдена запись, то запрос не выведет ее вообще. В результате будут выбраны только те номенклатурные позиции из документа «Поступление товаров и услуг», для которых в регистре сведений «Цены номенклатуры» есть записи, если в предыдущем примере заменить «ПОЛНОЕ» на «ВНУТРЕННЕЕ».

СГРУППИРОВАТЬ ПО (GROUP BY)

Группировка в запросах 1С позволяет сворачивать строки таблицы (группировочные поля) по определенному общему признаку (группируемым полям). Группировочные поля могут выводиться только с применением агрегатных функций.

Результатом следующего запроса будет список видов номенклатуры с максимальными ценами по ним.

ВЫБРАТЬ
,
МАКСИМУМ(Цены.Цена) КАК Цена
ИЗ

СГРУППИРОВАТЬ ПО
Цены.Номенклатура.ВидНоменклатуры

ИТОГИ

В отличие от группировки при использовании итогов выводятся все записи и уже к ним добавляются итоговые строки. Группировка выводит лишь обобщенные записи.

Итоги можно подводить по всей таблице целиком (с использованием ключевого слова «ОБЩИЕ»), по нескольким полям, по полям с иерархической структурой (ключевые слова «ИЕРАРХИЯ», «ТОЛЬКО ИЕРАРХИЯ»). При подведении итогов не обязательно использовать агрегатные функции.

Рассмотрим пример, аналогичный примеру выше с использованием группировки. В данном случае результат запроса вернет не только сгруппированные поля, но и детальные записи.

ВЫБРАТЬ
Цены.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
Цены.Цена КАК Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены
ИТОГИ
МАКСИМУМ(Цена)
ПО
ВидНоменклатуры

ИМЕЮЩИЕ (HAVING)

Данный оператор схож с оператором «ГДЕ», но используется только для агрегатных функций. Остальные поля, кроме используемых этим оператором, должны быть сгруппированы. Оператор «ГДЕ» не применим для агрегатных функций.

В рассмотренном ниже примере отбираются максимальные цены номенклатуры, если они превышают 1000, сгруппированные по виду номенклатуры.

ВЫБРАТЬ

МАКСИМУМ(Цены.Цена) КАК Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК Цены
СГРУППИРОВАТЬ ПО
Цены.Номенклатура.ВидНоменклатуры
ИМЕЮЩИЕ
МАКСИМУМ(Цены.Цена) > 1000

УПОРЯДОЧИТЬ ПО

Оператор «УПОРЯДОЧИТЬ ПО» сортирует результат запроса. Для того, чтобы гарантированно выводить записи в постоянном порядке, используется АВТОУПОРЯДОЧИВАНИЕ. Примитивные типы сортируются по обычным правилам. Ссылочные типы сортируются по GUID.

Пример получения списка сотрудников, отсортированного по наименованию:

ВЫБРАТЬ
Сотрудники.Наименование КАК Наименование
ИЗ
Справочник.Сотрудники КАК Сотрудники
УПОРЯДОЧИТЬ ПО
Наименование
АВТОУПОРЯДОЧИВАНИЕ

Прочие конструкции языка запросов 1С

  • ОБЪЕДИНИТЬ – результаты двух запросов в один.
  • ОБЪЕДИНИТЬ ВСЕ – аналог ОБЪЕДИНИТЬ, но без группировки одинаковых строк.
  • ПУСТАЯ ТАБЛИЦА – иногда используется при объединении запросов для указания пустой вложенной таблицы.
  • ПОМЕСТИТЬ – создает временную таблицу для оптимизации сложных запросов 1С. Такие запросы называются пакетными.

Функции языка запросов

  • ПОДСТРОКА обрезает строку с определенной позиции на указанное количество символов.
  • ГОД…СЕКУНДА позволяют получить выбранное значение числового типа. Входным параметром является дата.
  • НАЧАЛОПЕРИОДА и КОНЕЦПЕРИОДА используются при работе с датами. В качестве дополнительного параметра указывается тип периода (ДЕНЬ, МЕСЯЦ, ГОД и т. п.).
  • ДОБАВИТЬКДАТЕ позволяет прибавить или отнять от даты указанное время определенного типа (СЕКУНДА, МИНУТА, ДЕНЬ и т. п.).
  • РАЗНОСТЬДАТ определяет разницу между двумя датами с указанием типа выходного значения (ДЕНЬ, ГОД, МЕСЯЦ и т. п.).
  • ЕСТЬNULL заменяет отсутствующее значение на указанное выражение.
  • ПРЕДСТАВЛЕНИЕ и ПРЕДСТАВЛЕНИЕССЫЛКИ получают строковое представление указанного поля. Применяются для любых значений и только ссылочных соответственно.
  • ТИП, ТИПЗНАЧЕНИЯ используются для определения типа входного параметра.
  • ССЫЛКА является логическим оператором сравнения для типа значения реквизита.
  • ВЫРАЗИТЬ используется для преобразования значения к нужному типу.
  • ДАТАВРЕМЯ получает значение типа «Дата» из числовых значений (Год, Месяц, День, Час, Минута, Секунда).
  • ЗНАЧЕНИЕ в запросе 1С используется для указания предопределенных значений — справочников, перечислений, планов видов характеристик. Пример использования: «Где ЮрФизЛицо = Значение(Перечисление.ЮрФизЛица.ФизЛицо) «.

Конструктор запросов

Для создания запросов с 1С есть очень удобный встроенный механизм – конструктор запросов. Он содержит следующие основные вкладки:

  • «Таблицы и поля» — содержит поля, которые необходимо выбрать и их источники.
  • «Связи» — описывает условий для конструкции СОЕДИНЕНИЕ.
  • «Группировка» — содержит описание конструкций группировок и суммируемых полей по ним.
  • «Условия» — отвечает за отборы данных в запросе.
  • «Дополнительно» — дополнительные параметры запроса, такие как ключевые слова команды «ВЫБРАТЬ» и пр.
  • «Объединения/Псевдонимы» — указываются возможности объединения таблиц и задаются псевдонимы (конструкция «КАК»).
  • «Порядок» — отвечает за сортировку результата запросов.
  • «Итоги» — аналогична вкладке «Группировка», но применяется для конструкции «ИТОГИ».

Текст самого запроса можно просмотреть, нажав в левом нижнем углу на кнопку «Запрос». В данной форме его можно откорректировать вручную или скопировать.


Консоль запросов

Для быстрого просмотра результата запроса в режиме «Предприятие», либо отладки сложных запросов используется . В ней пишется текст запроса, устанавливаются параметры, и показывается его результат.

Скачать консоль запросов можно на диске ИТС, либо по .

В этой статье рассмотрим группировку в запросах 1С 8 и
агрегатные функции с помощью которых эта группировка и делается.

Проще всего объяснить, что такое группировка, на примере.
Допустим, что у нас есть таблица с количеством товаров на складах:

А мы хотим из этой таблицы получить другую, где для каждого товара будет его общее
количество на всех складах:

Здесь то нам и поможет группировка.

Чтобы вы сами могли поэкспериментировать в консоли запросов, давайте воспроизведем
эту ситуацию с помощью небольшого запроса. Для начала сформируем исходную таблицу:

ВЫБРАТЬ "Центральный" КАК Склад, "Карандаш" КАК Товар, 45 КАК Количество ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Центральный", "Ручка", 30 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Офис", "Карандаш", 15 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Офис", "Ручка", 25

А теперь поместим нашу исходную таблицу во временную и выберем из нее данные с
группировкой по полю Товар

ВЫБРАТЬ "Центральный" КАК Склад, "Карандаш" КАК Товар, 45 КАК Количество ПОМЕСТИТЬ ВТ_Количество ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Центральный", "Ручка", 30 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Офис", "Карандаш", 15 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ "Офис", "Ручка", 25 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ_Количество.Товар, СУММА(ВТ_Количество.Количество) КАК Количество ИЗ ВТ_Количество КАК ВТ_Количество СГРУППИРОВАТЬ ПО ВТ_Количество.Товар

Жирным выделен код, который непосредственно учавствует в группировке.
СУММА() - это агрегатная функция.
СГРУППИРОВАТЬ ПО - это оператор после которого идет список
полей через запятую по которым производится группировка. По сути здесь должны быть
перечислены все поля из раздела ВЫБРАТЬ за исключением тех к которым
применены агрегатные функции. В противном случае выполнение запроса завершится с
ошибкой.

Таким образом группировка как бы схлопывает таблицу по полям идущим после
СГРУППИРОВАТЬ ПО . К остальным полям применяется та или иная агрегатная функция.
Применительно к нашему примеру, до группировки записей с товарами Ручка
и Карандаш у нас по две штуки, а после группировки — по одной.
При работе с таблицами значений аналогичную функцию выполняет метод Свернуть() ,
за тем исключением, что там можно получать только сумму по полям не входящим в группировку.
В запросах же можно использовать несколько агрегатных функций. Давайте их перечислим
и кратко рассмотрим.

СУММА() - суммирует значения поля;
МИНИМУМ() - выбирает из всех значений поля минимальное;
МАКСИМУМ() - выбирает из всех значений поля максимальное;
СРЕДНЕЕ() - рассчитывает среднее значение (Сумма/Количество);
КОЛИЧЕСТВО() - выводит количество записей;
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ) - выводит количество записей у которых различаются значения;
Продемонстрируем их работу на нашем примере. Добавим в наш запрос другие агрегатные
функции кроме СУММЫ .

ВЫБРАТЬ ВТ_Количество.Товар, СУММА(ВТ_Количество.Количество) КАК Сумма, МИНИМУМ(ВТ_Количество.Количество) КАК Минимум, МАКСИМУМ(ВТ_Количество.Количество) КАК Максимум, СРЕДНЕЕ(ВТ_Количество.Количество) КАК Среднее ИЗ ВТ_Количество КАК ВТ_Количество СГРУППИРОВАТЬ ПО ВТ_Количество.Товар

В результате выполнения запроса получим следующую таблицу:

Здесь мы в поле Количество получили общее количество записей в таблице,
а в поле КоличествоРазличные - количество записей, у которых в поле
Товар значения различаются. Применительно к нашей таблице это Карандаш
и Ручка .

Как видно из последнего примера, если ко всем полям в запросе применяются
агрегатные функции, то использовать СГРУППИРОВАТЬ ПО не нужно.

В прошлом уроке была рассмотрена фильтрация результатов запроса. С помощью предложения ГДЕ задавали условия отбора из исходных таблиц, чтобы в запросе обрабатывались только те записи, для которых условие истинно. Причем условие отбора могло быть как простым, так и достаточно сложным логическим выражением. Цель такой обработки - максимально ограничить объем получаемых в результирующем наборе данных. Что дальше делать с тем множеством данных, которые ограничить не удалось, поскольку они по всем параметрам нужны?

1. Зачем группируют данные?

Возможность располагать всеми данными в системе, несомненно, - залог эффективного управления. Однако, как мы уже убедились, все данные всех таблиц базы данных пользователям не нужны. Да и нужные данные существуют не просто так, а для чего-то.

Но даже вполне корректно в этих целях отобранные данные анализировать сложно: их будет слишком много. Все данные контролировать тоже нереально, а управлять ими - просто невозможно. Недаром говорят, что суть управленческого учета сводится к проблеме определенного агрегирования (группирования) информации.

Первая причина группировки - уменьшить количество информации , сведя ее в однородные группы. Например, суммы продаж и покупок сводятся в группы, которыми служат бухгалтерские счета. Затем по этим уже сводным показателям формируются более крупные показатели - балансовые группы, различные отчетные показатели. Однако меньше, чем счетом, уже не оперируют.

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

Вторая причина - нормирование показателей . Стандартные показатели (рентабельность, оборачиваемость и т. п.) можно измерять (например, в количественном выражении) и сравнивать с ними.

Третья причина - упрощение аналитических задач за счет снижения размерности. Если зафиксировать хотя бы одно измерение, сложность снизится на порядок. Например, выбрать марку и анализировать только предложения внутри ее, хотя практически на конкурентных рынках придется анализировать, по крайней мере, несколько марок.

Это не исчерпывающий список (есть еще и хорошее визуальное представление и др.). Но понятно, что группировать информацию важно и нужно, и делать это можно самыми разными способами

2. Что такое группировка?

Группировка - это процесс объединения в логическом порядке столбцов с повторяющимися значениями. На рис. 1 представлен фрагмент таблицы товаров, которая может быть сгруппирована по любому полю. Например, по цвету корпуса - рядом окажутся приборы в корпусах одного цвета, или страна-производитель - тогда мы получим другую группировку, где рядом окажутся товары одной страны. На рисунке голубым цветом выделены товары в серебристых корпусах; желтым - товары производства Тайваня. Разумеется, это различные группировки и они могут и не пересекаться. Нужного нам товара производства Тайваня может и не быть в серебристом корпусе.

3. Как осуществляется группировка?

Группировка данных - это понятный и технически достаточно простой процесс.

Исходные данные в запросе могут быть сгруппированы по одинаковым значениям полей, и к ним можно применить различные агрегатные функции. Группируются записи, которые содержат одинаковые значения группировочного поля. Допустим, поле Родитель - и будет сгруппирована вся посуда, алкоголь и т. д., поле Цвет - и сгруппировано все проданное по цветам и т. п.).

Если применить еще и агрегатную функцию, результат возвратит количество имеющихся аппаратов в серебристых корпусах, в черных корпусах и т. д. по всем встречающимся в группам, которые будут определяться цветом.

Для иллюстрации этого примера на рисунке 1 можно применить функцию КОЛИЧЕСТВО (Цветкорпуса) . Строки в результате запроса будут содержать результаты вычисления указанных агрегатных функций (СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ) , рассчитанные (сгруппированные) по данным исходных столбцов.

Агрегатные функции указывают в списке полей выборки в предложениях СГРУППИРОВАТЬ ПО , при этом обязательно нужно указать список полей, по которым необходимо проводить группировку. Если совсем не указать группировку, по умолчанию будет одно число (для текстовых полей - количество, для числовых - сумма всех записей).

4. Место в запросе предложения СГРУППИРОВАТЬ ПО

Чтобы создавать запросы, стоит знать, куда попадают визуально указанные вами параметры при трансляции их конструктором. Вот место предложения СГРУППИРОВАТЬ ПО среди других предложений запроса.

Как видите, оно следует после предложения ГДЕ и перед предложением УПОРЯДОЧИТЬ (если таковые имеются в запросе).

5. Пример создания запроса с группировкой с помощью конструктора запросов «1С:Предприятия 8.0»

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

Воспользуемся запросом, который мы уже создали. Ниже приведен его текст (блок в зеленой рамке), который мы уже написали, и изменять его не будем. Копию предыдущего запроса можно сделать в окне Сервис - Консоль Отчетов , пользуясь инструментами верхней панели, и вызвать на редактирование с помощью кнопки F2 .

Конструктор запросов вызывается с помощью кнопки на нижней панели инструментов окна редактирования запроса.

Еще раз вернемся к той части текста, которую мы уже создали. Мы выбрали поля с названием проданной номенклатуры, сумму продажи (назвали ее выручкой). Воспользовались возможностью получить сразу результат вычисления полей, содержащих выручку и себестоимость (назвали эту разность прибылью). Все это сделано с помощью закладок Таблицы и поля , Псевдонимы конструктора запросов «1С:Предприятия». Выбор полей сделан из таблиц справочника номенклатура и регистра накопления продажи компании.

На закладке Связи установлено соединение таблиц. Конечно, для данного запроса мы могли бы обойтись и одной таблицей, если предпочли бы иную группировку. Но поскольку задача предполагает разделить товары по группам, а сведения о принадлежности к группе (т. е. о поле Родитель ) находятся в таблице самого справочника, но не регистра накопления, приходится соединять таблицы. Период выборки мы задавали через передачу параметров виртуальной таблицы (это одна из важных особенностей конструктора по ограничению выборки, которую мы тоже рассматривали).

Теперь мы можем приступать к группировке. Для этого используются закладки Группировки и Итоги .

На закладке Группировки мы выбираем поле, по которому будем группировать, - по полю Родитель (рис. 2 ). Остальные поля (текст запроса в голубой рамке) с представлением элементов поставит конструктор. И ниже в Суммируемом поле (рис. 3 ) мы поставим агрегатные функции, значения которых нам нужны - сумму выручки по группе и среднюю прибыль по продажам.

Что здесь важно? То, что группировать можно только по полям, которые указаны в списке выборки. Это вполне логично: если значения поля не выбраны, они неизвестны, и нельзя осуществить группировку. Если же мы хотим наложить впоследствии условие на значение группировочного поля предложением ИМЕЮЩИЕ (например, посчитали среднюю оборачиваемость и выбрали только те группы, по которым этот показатель ниже нормы), обязательно должны быть группировки по таким полям. Это условие необходимо соблюдать, даже если не нужно видеть эти поля в итогах.

Это тоже понятно: сначала нужно сгруппировать и рассчитать, а только потом можно увидеть, отвечает ли результат каким-то условиям. Сообщения о таких ошибках вы получите при проверке запроса, но лучше сразу иметь это в виду.

Теперь перейдем к закладке Итоги . Здесь мы укажем группировочные поля, которые хотим видеть в итогах (рис. 4 ). В данном случае это тоже поле Родитель . Когда в качестве одного из источников данных указана таблица справочника, очень часто одной из группировок будет его иерархия.

Далее указываются агрегатные функции, значения которых нужно получить, - а мы хотим знать сумму выручки по группе и среднюю прибыль (рис. 5 ). Как параметры этой закладки преобразованы в текст запроса, видно в желтом блоке текста запроса.

На закладке Порядок мы указали сортировку по полю Выручка по убыванию. Обычно, когда нас интересуют какие-то показатели, более удачной бывает сортировка по числовым полям. Если этого не сделать, будет принята сортировка первой из объединенных таблиц (а это таблица справочника «Номенклатура»). Наименования товаров будут отсортированы по алфавиту.

Везде в итогах, группировках и сортировках, если мы квалифицировали столбцы (дали им псевдонимы - товар, выручка, прибыль), можно использовать квалифицированные имена. Теперь можно нажать кнопку ОК в конструкторе - будет выполнена синтаксическая проверка, и если все нормально, можно выполнить запрос.

Если мы хотим наложить условие на группы, нужно наложить условия на значения агрегатных функций группировочных полей с помощью предложения ИМЕЮЩИЕ (следует непосредственно за предложением СГРУППИРОВАТЬ ). Например, ИМЕЮЩИЕ СРЕДНЕЕ (Прибыль) > 500 - и в наборе не будет ни одной группы, в которой средняя по группе прибыль не достигла 500,01 грн.

На рисунке 6 представлено то, что у нас получилось в итоге (фрагмент получившейся таблицы, сделанной по данным демонстрационной версии конфигурации «Управление торговлей для Украины 8.0» ред. 2.1, чтобы можно было воспроизвести результаты).

Запрос такой сложности уже вполне подходит для работы. Более того, если добавить сюда еще одно поле - рентабельность товарных запасов (прибыль, разделенная на среднедневной остаток товаров за период), в таблицу будут включены основные показатели, с которыми работают менеджеры по управлению запасами. Для этого в запрос нужно добавить еще таблицу «ОстаткиТоваровКомпании», соединить таблицы и снова пройти все закладки.

ВЫБРАТЬ <поля1,поля2>

ИЗ<таблица1,таблица2>

ГДЕ<условия>

СГРУППИРОВАТЬ ПО <поля1,поля2>

УПОРЯДОЧИТЬ ПО <поля1, поля2>

ИТОГИ <фукция1,функция2>

ПО <поле1,поля2>

СпрНоменклатура.Предста-вление,

ПродажиКомпанииОбороты. СуммаПродажиОборот

КАК Выручка,

ПродажиКомпанииОборо-ты.СуммаПродажиОборот ПродажиКомпанииОбороты. СебестоимостьОборот КАК Прибыль

ИЗ Справочник. Номенклатура

КАК СпрНоменклатура

ВНУТРЕННЕЕ СОЕДИНЕНИЕРе-гистрНакопления.ПродажиКомпании.Обороты(&ДатаНа-чала, &ДатаКонца,)

КАК ПродажиКомпании Обороты

ПО ПродажиКомпанииОбо-роты.Номенклатура = СпрНоменклатура.

СГРУППИРОВАТЬ ПО

СпрНоменклатура.Родитель,

СпрНоменклатура.Представ-ление

УПОРЯДОЧИТЬ ПО

Язык запросов в 1С 8 — это упрощенный аналог широко известного «структурированного языка программирования» (как чаще его называют, SQL). Но в 1С он используется только для чтения данных, для изменения данных применяется объектная модель данных.

Еще одно интересное отличие – русский синтаксис. Хотя на самом деле Вы можете использовать и англоязычные конструкции.

Пример запроса:

ВЫБРАТЬ
Банки.Наименование,
Банки.КоррСчет
ИЗ
Справочник.Банки КАК Банки

Данный запрос позволит увидеть нам информацию о наименовании и корреспондентском счете всех существующих в базе данных банков.

Язык запросов – самой простой и эффективный способ получения информации. Как видно из примера выше, в языке запросов нужно апеллировать именами метаданных ( – это список объектов системы, из которых состоит конфигурация, т.е справочники, документы, регистры и т.д.).

Описание конструкций языка запросов

Структура запросов

Для получения данных достаточно использовать конструкции «ВЫБРАТЬ» (select) и «ИЗ» (from). Простейший запрос выглядит следующим образом:

ВЫБРАТЬ * ИЗ Справочники.Номенклатура

Где «*» означает выбор всех полей таблицы, а Справочники.Номенклатура – имя таблицы в базе данных.

Рассмотрим более сложный и общий пример:

ВЫБРАТЬ
<ИмяПоля1> КАК <ПредставлениеПоля1>,
Сумма(<ИмяПоля2>) КАК <ПредставлениеПоля2>
ИЗ
<ИмяТаблицы1> КАК <ПредставлениеТаблицы1>
<ТипСоединения> СОЕДИНЕНИЕ <ИмяТаблицы2> КАК <ПредставлениеТаблицы2>
ПО <УсловиеСоединениеТаблиц>

ГДЕ
<УсловиеОтбораДанных>

СГРУППИРОВАТЬ ПО
<ИмяПоля1>

УПОРЯДОЧИТЬ ПО
<ИмяПоля1>

ИТОГИ
<ИмяПоля2>
ПО
<ИмяПоля1>

В данном запросе мы выбираем данные полей «ИмяПоля1» и «ИмяПоля1» из таблиц «ИмяТаблицы1» и «ИмяТаблицы», присваиваем полям синонимы с помощью оператора «КАК», соединяем их по некому условию «УсловиеСоединениеТаблиц».

Из полученных данных мы отбираем только данные, соответствующие условию из «ГДЕ» «УсловиеОтбораДанных».Далее мы группируем запрос по полю «ИмяПоля1», при этом суммируя «ИмяПоля2».Создаём итоги по полю «ИмяПоля1» и итоговым полем «ИмяПоля2».

Последним действием мы сортируем запрос с помощью конструкции «УПОРЯДОЧИТЬ ПО».

Общие конструкции

Рассмотрим общие конструкции языка запросов 1С 8.2.

ПЕРВЫЕ n

С помощью данного оператора можно получить n количество первых записей. Порядок записей определяется порядком в запросе.

ВЫБРАТЬ ПЕРВЫЕ 100
Банки.Наименование,
Банки.Код КАК БИК
ИЗ
Справочник.Банки КАК Банки
УПОРЯДОЧИТЬ ПО
Банки.Наименование

Запросом будет получено первых 100 записей справочника «Банки», упорядоченных по алфавиту.

РАЗРЕШЕННЫЕ

Эта конструкция актуальна для работы с механизмом . Суть механизма в ограничении чтения (и других действий) пользователям для конкретных записей в таблице базы данных, а не таблицы в целом.

Если пользователь пытается с помощью запроса прочитать записи недоступные ему, он получит сообщение об ошибке. Чтобы этого избежать, следует использовать конструкцию «РАЗРЕШЕННЫЕ», т.е запрос будет читать только разрешенные ему записи.

ВЫБРАТЬ РАЗРЕШЕННЫЕ
ХранилищеДополнительнойИнформации.Ссылка
ИЗ
Справочник.ХранилищеДополнительнойИнформации

РАЗЛИЧНЫЕ

Использование «РАЗЛИЧНЫЕ» позволит исключить попадание строк-дублей в результат запроса 1С. Дублирование означает совпадение всех полей запроса.

ВЫБРАТЬ ПЕРВЫЕ 100
Банки.Наименование,
Банки.Код КАК БИК
ИЗ
Справочник.Банки КАК Банки

ПустаяТаблица

Данная конструкция используется очень редко для объединения запросов. При объединении может возникнуть необходимость указать в одной из таблиц пустую вложенную таблицу. Для этого как раз подойдет оператор «ПустаяТаблица»

Пример из справки 1С 8:

ВЫБРАТЬ Ссылка.Номер, ПУСТАЯТАБЛИЦА.(Ном, Тов, Кол) КАК Состав
ИЗ Документ.РасхНакл
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ Ссылка.Номер, Состав.(НомерСтроки, Товар, Количество)
ИЗ Документ.РасхНакл Документ.РасходнаяНакладная.Состав.*

ЕСТЬNULL

Очень полезная функция, которая позволяет избежать многих ошибок. ЕстьNULL() позволяет заменить значение NULL на нужное. Очень часто используется в проверках на наличие значения в присоединенных таблицах, например:

ВЫБРАТЬ
НоменклатураСпр.Ссылка,
ЕстьNULL(ОстаткиТовара.КоличествоОстаток,0) КАК КоличествоОстаток
ИЗ


Можно использовать и по-другому. Например, если для каждой строки не известно, в какой таблице существует значение:

ЕСТЬNULL(СчетФактураПолученный.Дата, СчетФактураВыданный.Дата)

КАК – оператор, который позволяет нам присвоить имя (синоним) таблицы или полю. Пример использования мы видели выше.

Данные конструкции очень похожи – они позволяют получить строковое представление нужного значения. Единственное отличие в том, что ПРЕДСТАВЛЕНИЕ преобразует любые значения в строковый тип, а ПРЕДСТАВЛЕНИЕССЫЛКИ — только ссылочные. ПРЕДСТАВЛЕНИЕССЫЛКИ рекомендуется применять в запросах системы компоновки данных для оптимизации, если, конечно, поле ссылочных данных не планируется использовать в отборах .

ВЫБРАТЬ
Представление(Ссылка), //строка, например «Авансовый отчет №123 от 10.10.2015
Представление(ПометкаУдаления) КАК ПометкаУдаленияТекст, //строка, «Да» или «Нет»
ПредставлениеСсылки(ПометкаУдаления) КАК ПометкаУдаленияБулево //булево, Истина или Ложь
ИЗ
Документ.АвансовыйОтчет

ВЫРАЗИТЬ

Выразить позволяет преобразовать значения поля к нужному типу данных. Можно преобразовать значение как к примитивному типу, так и к ссылочному типу.

Выразить для ссылочного типа используется для ограничения запрашиваемых типов данных в полях составного типа, часто используется для оптимизации работы системы. Пример:

ВЫРАЗИТЬ(ТаблицаЗатрат.Субконто1 КАК Справочник.СтатьиЗатрат).ВидДеятельностиДляНалоговогоУчетаЗатрат

Для примитивных типов эта функция часто используется для ограничения количества символов в полях неограниченной длины (с такими полями нельзя сравнивать). Чтобы избежать ошибки «Неверные параметры в операции сравнения. Нельзя сравнивать поля
неограниченной длины и поля несовместимых типов
», необходимо выразить такие поля следующим образом:

ВЫРАЗИТЬ(Комментарий КАК Строка(150))

РАЗНОСТЬДАТ

Получите 267 видеоуроков по 1С бесплатно:

Пример использования ЕСТЬ NULL в запросе 1С:

ВЫБРАТЬ * ИЗ
Спр
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ОстаткиТовара
ПО НоменклатураСпр.Ссылка = РеализованныеТоварыКомитентовОстатки.Номенклатура
ГДЕ НЕ ОстаткиТовара.КоличествоОстаток ЕСТЬ NULL

Тип данных в запросе можно определить следующим образом: с помощью функций ТИП() и ТИПЗНАЧЕНИЯ() или с помощью логического оператора ССЫЛКА. Эти две функции аналогичны.

Предопределенные значения

Помимо использования в запросах переданных параметров в языке запросов 1С можно использовать предопределенные значения или . Например, перечисления, предопределенные справочники, планы счетов и так далее.Для этого используется конструкция «Значение()».

Пример использования:

ГДЕ Номенклатура.ВидНоменклатуры = Значение(Справочник.ВидыНоменклатуры.Товар)

ГДЕ Контрагенты.ВидКонтактнойИнформации = Значение(Перечисление.ВидыКонтактнойИнформации.Телефон)

ГДЕ ОстаткиПоСчетам.СчетУчета = Значение(ПланСчетов.Хозрасчетный.ПрибылиУбытки)

Соединения

Соединения бывают 4 типов: ЛЕВОЕ , ПРАВОЕ , ПОЛНОЕ, ВНУТРЕННЕЕ .

ЛЕВОЕ и ПРАВОЕ СОЕДИНЕНИЕ

Соединения используются для связи двух таблиц по определенному условию. Особенность при ЛЕВОМ СОЕДИНЕНИИ в том, что мы берём первую указанную таблицу полностью и привязываем по условию вторую таблицу. Поля второй таблицы, которые не удалось привязать по условию, заполняются значением NULL .

Например:

Вернет всю таблицу Контрагентов и заполнит поле “Банк” лишь в тех местах, где будет соблюдаться условие “Контрагенты.Наименование = Банки.Наименование”. Если условие не соблюдается, в поле Банк будет установлено NULL .

ПРАВОЕ СОЕДИНЕНИЕ в языке 1С абсолютно аналогично ЛЕВОМУ соединению , за исключением одного отличия – в ПРАВОМ СОЕДИНЕНИИ “главная” таблица – вторая, а не первая.

ПОЛНОЕ СОЕДИНЕНИЕ

ПОЛНОЕ СОЕДИНЕНИЕ отличается от левого и правого тем, что выводит все записи из двух таблиц, соединяет лишь те, которые может соединить по условию.

Например:

ИЗ

ПОЛНОЕ СОЕДИНЕНИЕ
Справочник.Банки КАК Банки

ПО

Язык запросов вернет обе таблицы полностью лишь по выполненному условию соединить записи. В отличие от левого/правого соединения возможно появления NULL в двух полях.

ВНУТРЕННЕЕ СОЕДИНЕНИЕ

ВНУТРЕННЕЕ СОЕДИНЕНИЕ отличается от полного тем, что выводит только те записи, которые смогли соединить по заданному условию.

Например:

ИЗ
Справочник.Контрагенты КАК Клиенты

ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Справочник.Банки КАК Банки

ПО
Клиенты.Наименование = Банки.Наименование

Данный запрос вернет только строки, в которых у банка и контрагента будет одинаковое наименование.

Объединения

Конструкция ОБЪЕДИНИТЬ и ОБЪЕДИНИТЬ ВСЕ объединяет два результата в один. Т.е. результат выполнения двух будет «слит» в один, общий.

Т.е система работает точно так же, как и обычные , только для временной таблицы.

Как использовать ИНДЕКСИРОВАТЬ ПО

Однако следует учесть один момент. Построение индекса временной таблицы также требует времени на выполнение. Поэтому целесообразно использовать конструкцию ” ”, только если точно известно, что во временной таблице будет не 1-2 записи. В противном случае эффект может быть обратным – быстродействие от индексированных полей не компенсирует времени построения индекса.

ВЫБРАТЬ
КурсыВалютСрезПоследних.Валюта КАК Валюта,
КурсыВалютСрезПоследних.Курс
ПОМЕСТИТЬ КурсыВалют
ИЗ
РегистрСведений.КурсыВалют.СрезПоследних(&Период,) КАК КурсыВалютСрезПоследних
ИНДЕКСИРОВАТЬ ПО
Валюта
;
ВЫБРАТЬ
ЦеныНоменклатуры.Номенклатура,
ЦеныНоменклатуры.Цена,
ЦеныНоменклатуры.Валюта,
КурсыВалют.Курс
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период,
Номенклатура В (&Номенклатура) И ТипЦен = &ТипЦен) КАК ЦеныНоменклатуры
ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК КурсыВалют
ПО ЦеныНоменклатуры.Валюта = КурсыВалют.Валюта

Группировка

Язык запросов 1С позволяет использовать специальные агрегатные функции при группировке результатов запросов. Группировку можно также использовать без агрегатных функций, для «устранения» дублей.

Существуют следующие функции:

Сумма, Количество, Количество разных, Максимум, Минимум, Среднее.

Пример №1:

ВЫБРАТЬ
РеализацияТоваровУслугТовары.Номенклатура,
СУММА(РеализацияТоваровУслугТовары.Количество) КАК Количество,
СУММА(РеализацияТоваровУслугТовары.Сумма) КАК Сумма
ИЗ

СГРУППИРОВАТЬ ПО
РеализацияТоваровУслугТовары.Номенклатура

Запрос получает все строки с товарами и суммирует их по количеству и суммам в разрезе номенклатуры.

Пример №2

ВЫБРАТЬ
Банки.Код,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Банки.Ссылка) КАК КоличествоДублей
ИЗ
Справочник.Банки КАК Банки
СГРУППИРОВАТЬ ПО
Банки.Код

Данный пример отобразит список БИКов справочника «Банки» и покажет, сколько дублей существует по каждому из них.

Итоги

Итоги – способ получения данных из системы с иерархической структурой. Для итоговых полей могут использоваться агрегатные функции, как для группировок.

Один из самых популярных способов использования итогов в практике – партионное списание товаров.

ВЫБРАТЬ




ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
УПОРЯДОЧИТЬ ПО

ИТОГИ
СУММА(Количество),
СУММА(Сумма)
ПО
Номенклатура

В результате запроса получится следующее иерархическое :

Общие итоги

Если необходимо получить итоги по всем «итогам», используйте оператор «ОБЩИЕ».

ВЫБРАТЬ
РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
РеализацияТоваровУслугТовары.Ссылка КАК Документ,
РеализацияТоваровУслугТовары.Количество КАК Количество,
РеализацияТоваровУслугТовары.Сумма КАК Сумма
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
УПОРЯДОЧИТЬ ПО
РеализацияТоваровУслугТовары.Ссылка.Дата
ИТОГИ
СУММА(Количество),
СУММА(Сумма)
ПО
ОБЩИЕ,
Номенклатура

В результате выполнения запроса получим следующий результат:

В котором 1 уровень группировки – агрегирование всех нужных полей.

Упорядочивание

Оператор УПОРЯДОЧИТЬ ПО используется для сортировки результата запроса.

Сортировка для примитивных типов (строка, число, булево) происходит по обычным правилам. Для полей ссылочных типов сортировка происходит по внутреннему представлению ссылки (уникальный идентификатор), а не по коду или по представлению ссылки.

ВЫБРАТЬ

ИЗ
Справочник.Номенклатура КАК Номенклатура
УПОРЯДОЧИТЬ ПО
Наименование

Запрос выведет список наименований справочника номенклатуры, отсортированного по алфавиту.

Автоупорядочивание

Результат запроса без сортировки представляет собой хаотично представленный набор строк. Разработчики платформы 1С не гарантируют вывод строк в одинаковой последовательности при выполнении одинаковых запросов.

Если необходимо выводить записи таблицы в постоянном порядке, необходимо использовать конструкцию «Автоупорядочивание».

ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
АВТОУПОРЯДОЧИВАНИЕ

Виртуальные таблицы

Виртуальные таблицы в 1С – это уникальная особенность языка запросов 1С, которой нет в других аналогичных синтаксисах. Виртуальная таблица – быстрый способ получения профильной информации из регистров.

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

  • срез первых;
  • срез последних.
  • остатки;
  • обороты;
  • остатки и обороты.
  • движения с субконто;
  • обороты;
  • обороты Дт Кт;
  • остатки;
  • остатки и обороты
  • субконто.
  • база;
  • данные графика;
  • фактический период действия.

Для разработчика решения данные берутся из одной (виртуальной) таблицы, но на самом деле платформа 1С берёт из множества таблиц, преобразуя их в нужных вид.

ВЫБРАТЬ
ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
ТоварыНаСкладахОстаткиИОбороты.КоличествоНачальныйОстаток,
ТоварыНаСкладахОстаткиИОбороты.КоличествоОборот,
ТоварыНаСкладахОстаткиИОбороты.КоличествоПриход,
ТоварыНаСкладахОстаткиИОбороты.КоличествоРасход,
ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты КАК ТоварыНаСкладахОстаткиИОбороты

Такой запрос позволяет быстро получить большое количество данных.

Параметры виртуальных таблиц

Очень важный аспект работы с виртуальными таблицами – использование параметров. Параметры виртуальных таблиц – специализированные параметры для отбора и настройки.

Для таких таблиц считается неверным использования отбора в конструкции «ГДЕ». Помимо того, что запрос становится не оптимальным, возможно получение неверных данных.

Пример использования таких параметров:

РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Месяц, ДвиженияИГраницыПериода, Номенклатура = &НужнаяНоменклатура)

Алгоритм работы виртуальных таблиц

Например, наиболее используемая виртуальная таблица типа «Остатки» хранит данные двух физических таблиц – остатков и движений.

При использовании виртуальной таблицы система проделывает следующие манипуляции:

  1. Получаем ближайшее по дате и измерениям рассчитанное значение в таблице итогов.
  2. «Прибавляем» сумму из таблицы движения к сумме из таблицы итогов.


Такие простые действия могут существенно повысить производительность системы в целом.

Использование конструктора запросов

Конструктор запросов – инструмент, встроенный в систему 1С предприятие, существенно облегчающий разработку запросов к базе данных.

Конструктор запроса имеет достаточно простой, интуитивно понятный интерфейс. Тем не менее рассмотрим применение конструктора запроса подробнее.

Запуск конструктора текста запроса производится контекстным меню (правой кнопкой мыши) в нужном месте программного кода.

Описание конструктора запроса 1С

Рассмотрим каждую вкладку конструктора подробнее. Исключение – вкладка Построитель, это тема для отдельного разговора.

Вкладка Таблицы и поля

На этой вкладке указывается источник данных и поля, которые необходимо выводить в отчет. По сути тут описываются конструкции ВЫБРАТЬ.. ИЗ.

В качестве источника может служить физическая таблица базы данных, виртуальная таблица регистров, временные таблицы, вложенные запросы и т.д.

В контекстном меню виртуальных таблиц можно задать параметры виртуальной таблицы:

Вкладка Связи

Вкладка служит для описания соединений нескольких таблиц, создает конструкции со словом СОЕДИНЕНИЕ.

Вкладка Группировка

На данной вкладке система позволяет группировать и суммировать нужные поля результата таблицы. Описывается использование конструкций СГРУППИРОВАТЬ ПО, СУММА, МИНИМУМ, СРЕДНЕЕ, МАКСИМУМ, КОЛИЧЕСТВО, КОЛИЧЕСТВО РАЗЛИЧНЫХ.

Вкладка Условия

Отвечает за всё, что идёт в тексте запроса после конструкции ГДЕ, т.е за все условия, накладываемые на получаемые данные.

Вкладка Дополнительно

Вкладка Дополнительно изобилует всевозможными параметрами, которые являются очень важными. Рассмотрим каждое из свойств.

Группировка Выборка записей :

  • Первые N – параметр, возвращающий в запрос только N записей (оператор ПЕРВЫЕ)
  • Без повторяющихся – обеспечивает уникальность полученных записей (оператор РАЗЛИЧНЫЕ)
  • Разрешенные – позволяет выбирать только те записи, которые позволяет выбрать система с учетом (конструкция РАЗРЕШЕННЫЕ)

Группировка Тип запроса определяет, какой будет тип запроса: выборка данных, создание временной таблицы или же уничтожение временной таблицы.

Ниже существует флаг Блокировать полученные данные для последующего изменения . Он позволяет включить возможность установки блокировки данных, которая обеспечивает сохранность данных от момента их чтения до изменения (актуально только для Автоматического режима блокировок, конструкция ДЛЯ ИЗМЕНЕНИЯ).

Вкладка Объединения/Псевдонимы

На этой вкладке конструктора запросов устанавливается возможность объединения разных таблиц и псевдонимов(конструкция КАК). В левой части указываются таблицы. Если установить флаги напротив таблицы, будет использоваться конструкция ОБЪЕДИНИТЬ, иначе – ОБЪЕДИНИТЬ ВСЕ (отличия двух способов ). В правой части указываются соответствия полей в разных таблицах, если соответствие не указано, запрос будет возвращать NULL.

Вкладка Порядок

Здесь указывается порядок сортировки значений (УПОРЯДОЧИТЬ ПО) – по убыванию (УБЫВ) или возрастанию(ВОЗР).

Также есть интересный флаг – Автоупорядочивание (в запросе – АВТОУПОРЯДОЧИВАНИЕ). По умолчанию система 1С выводит данные в “хаотичном” порядке. Если установить этот флаг, система будет сортировать данные по внутренним данным.

Вкладка Пакет запросов

На вкладке конструктора запросов можно создавать новые , а также использовать её в роли навигации. В тексте запроса пакеты разделяются символом “;”(точка запятая).

Кнопка “Запрос” в конструкторе запросов

В левом нижнем углу конструктора запроса есть кнопка Запрос, с помощью которого можно в любой момент просмотреть текст запроса:

В данном окне можно внести коррективы в запрос и выполнить его.


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

Консоль запросов – простой и удобный способ для отладки сложных запросов и быстрого получения информации. В этой статье я постараюсь описать, как пользоваться консолью запросов, и дам ссылку для скачивания консоли запросов.

Рассмотрим этот инструмент подробнее.

Скачать консоль запросов 1С

Первым делом, чтобы начать работу с консолью запросов, её нужно откуда-то скачать. Обработки обычно делятся на два вида – на управляемых формах и обычных (или, иногда, их называют на 8.1 и на 8.2/8.3).

Я постарался объединить эти два вида в одной обработке – в нужном режиме работы открывается нужная форма (в управляемом режиме консоль работает только в толстом режиме).

Описание консоли запросов 1С

Начнем рассмотрение консоли запросов с описания главной панели обработки:

В шапке консоли запросов можно увидеть время выполнения последнего запроса с точностью до миллисекунды, это позволяет сравнивать разные конструкции по производительности.

Первая группа кнопок в командной панели отвечает за сохранение текущих запросов во внешнем файле. Это очень удобно, Вы всегда сможете вернуться к написанию сложного запроса. Или же, например, хранить список типичных примеров тех или иных конструкций.

Слева, в поле “Запрос”, можно создавать новые запросы и сохранять их в древовидной структуре. Вторая группа кнопок как раз отвечает за управление списком запросов. С помощью неё можно создать, скопировать, удалить, переместить запрос.

  • Выполнить запрос – простое выполнение и получение результата
  • Выполнить пакет – позволяет просмотреть все промежуточные запросы в пакете запросов
  • Просмотр временных таблиц – позволяет увидеть результаты, которые возвращают временные запросы в таблице

Параметры запроса:

Позволяют установить текущие параметры для запроса.

В окне параметров запроса интересно следующее:

  • Кнопка Получить из запроса автоматически находит все параметры в запросе для удобства разработчика.
  • Флаг Единые параметры для всех запросов – при установке его обработка не очищает параметры при переходе от запроса к запросу в общем списке запросов.

Задать параметр списком значений очень просто, достаточно при выборе значения параметра нажать на кнопку очистки значения (крестик), система предложит выбрать тип данных, где надо выбрать “Список значения”:

Также в верхней панели очень есть кнопка вызова настроек консоли запросов:

Здесь можно указать параметры автосохранения запросов и параметры выполнения запроса.

В поле запроса консоли заносится текст запроса. Сделать это можно простым набором теста запроса или же вызовом специального инструмента – конструктора запросов.

Конструктор запроса 1С 8 вызывается из контекстного меню (правая кнопка мыши) при нажатии на поле ввода:

Также в этом меню есть такие полезные функции, как очистка или добавление в запрос символов переноса строки (“|”) или же получения кода запроса вот в таком удобном виде:

Запрос = Новый Запрос;
Запрос.Текст = ”
|ВЫБРАТЬ
| Валюты.Ссылка
|ИЗ
| Справочник.Валюты КАК Валюты”;
РезультатЗапроса = Запрос.Выполнить();

В нижнем поле консоли запросов отображается поле результата запроса, ради чего и создана эта обработка:



Также консоль запросов кроме списка умеет отображать данные в виде дерева — для запросов, содержащих итоги.

Оптимизация запросов

Одним из важнейших пунктов в повышении производительности работы 1С предприятия 8.3 является оптимизация запросов . Этот пункт также очень важен при сдаче аттестации . Ниже пойдет речь о типичных причинах не оптимальной работы запросов и способах из оптимизации.

Отборы в виртуальной таблице с помощью конструкции ГДЕ

Накладывать фильтры на реквизиты виртуальной таблицы необходимо только через параметры ВТ. Ни в коем случае для отбора в виртуальной таблице нельзя использовать конструкцию ГДЕ, это грубейшая ошибка с точки зрения оптимизации. В случае с отбором с помощью ГДЕ по факту система получит ВСЕ записи и только потом отберет нужные.

ПРАВИЛЬНО :

ВЫБРАТЬ

ИЗ
РегистрНакопления.ВзаиморасчетыСДепонентамиОрганизаций.Остатки(
,
Организация = &Организация
И Физлицо = &Физлицо) КАК ВзаиморасчетыСДепонентамиОрганизацийОстатки

НЕПРАВИЛЬНО :

ВЫБРАТЬ
ВзаиморасчетыСДепонентамиОрганизацийОстатки.СуммаОстаток
ИЗ
РегистрНакопления.ВзаиморасчетыСДепонентамиОрганизаций.Остатки(,) КАК ВзаиморасчетыСДепонентамиОрганизацийОстатки
ГДЕ
ВзаиморасчетыСДепонентамиОрганизацийОстатки.Организация = &Организация
И ВзаиморасчетыСДепонентамиОрганизацийОстатки.Физлицо = &Физлицо

Получение значения поля составного типа через точку

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

Например, крайне нежелательно для оптимизации обращаться к полю записи регистра – регистратор. Регистратор имеет составной тип данных, среди которых все возможные типы документов, которые могут писать данные в регистр.

НЕПРАВИЛЬНО:

ВЫБРАТЬ
НаборЗаписей.Регистратор.Дата,
НаборЗаписей.Количество
ИЗ
РегистрНакопления.ТоварыОрганизации КАК НаборЗаписей

Т.е по факту вот такой запрос будет обращаться не к одной таблице, а к 22 таблицам базы данных (у этого регистра 21 тип регистратора).

ПРАВИЛЬНО:

ВЫБРАТЬ
ВЫБОР
КОГДА ТоварыОрг.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
ТОГДА ВЫРАЗИТЬ(ТоварыОрг.Регистратор КАК Документ.РеализацияТоваровУслуг).Дата
КОГДА ТоварыОрг.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
ТОГДА ВЫРАЗИТЬ(ТоварыОрг.Регистратор КАК Документ.ПоступлениеТоваровУслуг).Дата
КОНЕЦ КАК Дата,
ТоварыОрг.Количество
ИЗ
РегистрНакопления.ТоварыОрганизаций КАК ТоварыОрг

Либо второй вариант – добавление такой информации в реквизит, например, в нашем случае – добавление даты.

ПРАВИЛЬНО:

ВЫБРАТЬ
ТоварыОрганизаций.Дата,
ТоварыОрганизаций.Количество
ИЗ
РегистрНакопления.ТоварыОрганизаций КАК ТоварыОрганизаций

Подзапросы в условии соединения

Для оптимизации недопустимо использовать подзапросы в условиях соединения, это существенно замедляет работу запроса. Желательно в таких случаях использовать ВТ. Для соединения нужно использовать только объекты метаданных и ВТ, предварительно проиндексировав их по полям соединения.

НЕПРАВИЛЬНО:

ВЫБРАТЬ …

ЛЕВОЕ СОЕДИНЕНИЕ (
ВЫБРАТЬ ИЗ РегистрСведений.Лимиты
ГДЕ …
СГРУППИРОВАТЬ ПО …
) ПО …

ПРАВИЛЬНО:

ВЫБРАТЬ …
ПОМЕСТИТЬ Лимиты
ИЗ РегистрСведений.Лимиты
ГДЕ …
СГРУППИРОВАТЬ ПО …
ИНДЕКСИРОВАТЬ ПО …;

ВЫБРАТЬ …
ИЗ Документ.РеализацияТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ Лимиты
ПО …;

Соединение записей с виртуальными таблицами

Бывают ситуации, когда при соединении виртуальной таблицы с другими система работает не оптимально. В таком случае для оптимизации работы запроса можно попробовать поместить виртуальную таблицу во временную, не забыв проиндексировать соединяемые поля в запросе временной таблицы. Связано это с тем, что ВТ часто содержатся в нескольких физических таблицах СУБД, в итоге для их выборки составляется подзапрос, и проблема получается аналогичной предыдущему пункту.

Использование отборов по не индексируемым полям

Одна из самых распространенных ошибок при составления запросов – использование условий по не индексируемым полям, это противоречитправилам оптимизации запросов. СУБД не может выполнить запрос оптимально, если в запросе накладывается отбор по неиндексируемым полям. Если же берется временная таблица – также необходимо индексировать поля соединения.

Обязательно для каждого условия должен существовать подходящий индекс. Подходящим является индекс, удовлетворяющий следующим требованиям:

  1. Индекс содержит все поля, перечисленные в условии.
  2. Эти поля находятся в самом начале индекса.
  3. Эти отборы идут подряд, то есть между ними не «вклиниваются» значения, не участвующие в условии запроса.

Если СУБД не подобрал правильные индексы, то будет просканирована таблица полностью – это очень негативно скажется на производительности и может привести к продолжительной блокировке всего набора записей.

Использование логического ИЛИ в условиях

Вот и всё, в данной статье были освещены основы аспекты оптимизации запросов, которые должен знать каждый эксперт 1С.

Очень полезный бесплатный видеокурс по разработке и оптимизации запросов, категорически рекомендую новичкам и не только!

В этой статье мы хотим обсудить с Вами все функции языка запросов 1с , а также конструкции языка запросов . Чем же отличается функция от конструкции? Функция вызывается со скобками и возможными параметрами в них, а конструкция пишется без скобок. Безусловно все конструкции и функции языка запросов 1с делают процесс получения данных гибким и многофункциональным. Данные функции и конструкции применимы к полям запроса, а некоторые также применимы в условиях.

Функции языка запросов 1с

Поскольку понятное описание функций языка запросов 1с встречается намного реже, чем описание конструкций, мы решили начать рассматривать именно функции. Теперь давайте разберем каждую по отдельности, описав ее назначение, синтаксис и пример использования, итак:

1. Функция ДАТАВРЕМЯ - данная функция создает константное поле с типом "Дата".

Синтаксис: ДАТАВРЕМЯ(<Год>,<Месяц>,<День>,<Час>,<Минута>,<Секунда>)

Пример использования:

2. Функция РАЗНОСТЬДАТ - возвращает разность двух дат в одном из измерений (год, месяц, день, час, минута, секунда). Измерение передается в параметре.

Синтаксис: РАЗНОСТЬДАТ(<Дата1>, <Дата2>, <Тип>)

Пример использования:

Запрос.Текст = "ВЫБРАТЬ | РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2015, 4, 17), ДАТАВРЕМЯ(2015, 2, 1), ДЕНЬ) | КАК КолвоДней";

3. Функция ЗНАЧЕНИЕ - задает константное поле с предопределенной записью из базы данных, также можно получить пустую ссылку любого типа.

Синтаксис: ЗНАЧЕНИЕ(<Имя>)

Пример использования:

Запрос.Текст = "ВЫБРАТЬ //предопределенный элемент | ЗНАЧЕНИЕ(Справочник.Валюты.Доллар) КАК Доллар, //пустая ссылка | ЗНАЧЕНИЕ(Документ.ПоступлениеТоваровУслуг.ПустаяСсылка) КАК Поступление, //знач. перечисления | ЗНАЧЕНИЕ(Перечисление.ЮрФизЛицо.ФизЛицо) КАК ФизЛицо, //предопределенный счет | ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы) КАК Счет_10" ;

4. Функция ВЫБОР - перед нами аналог конструкции ЕСЛИ который используется в коде, только эта используется в запросах 1С.

Синтаксис: ВЫБОР КОГДА <Выражение> ТОГДА <Выражение> ИНАЧЕ <Выражение> КОНЕЦ

Пример использования:

Запрос.Текст = //если сумма больше 7500, тогда должна быть скидка 300 рублей, //поэтому если условие срабатывает то функция //возвращает Сумма - 300 //в противном случае запрос вернет просто Сумма "ВЫБРАТЬ | ВЫБОР | КОГДА ТЧПоступления.Сумма > 7500 | ТОГДА ТЧПоступления.Сумма - 300 | ИНАЧЕ ТЧПоступления.Сумма | КОНЕЦ КАК СуммаСоСкидкой |ИЗ | Документ.ПоступлениеТоваровУслуг.Товары КАК ТЧПоступления";

5. Функция ВЫРАЗИТЬ - позволяет выразить константное поле определенным типом.

Синтаксис: ВЫРАЗИТЬ(НазваниеПоля КАК НазваниеТипа)

Пример использования:

Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ | Продажи.Регистратор.Номер, | ВЫБОР | КОГДА Продажи.Регистратор ССЫЛКА Документ.Расходная | ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.Расходная) | ИНАЧЕ ВЫБОР | КОГДА Продажи.Регистратор ССЫЛКА Документ.Реализация | ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.Реализация) | КОНЕЦ | ... | КОНЕЦ КАК Номер | ИЗ | РегистрНакопления.Закупки КАК Закупки";

Еще есть вариант использования функции ВЫРАЗИТЬ в полях смешанных типах, где такие встречаются? Самый простой пример это "Регистратор" у любого регистра. Так зачем нам может понадобиться уточнять тип в регистраторе? Давайте рассмотрим ситуацию когда мы из регистратора выбираем поле "Номер", из какой таблицы будет выбран номер? Правильный ответ из всех! Поэтому чтобы наш запрос работал быстро следует указывать явный тип с помощью функции ВЫРАЗИТЬ

Пример использования:

Запрос.Текст = "ВЫБРАТЬ | ВЫРАЗИТЬ(Номенклатура.Комментарий КАК Строка(300)) КАК Комментарий, | ВЫРАЗИТЬ(Номенклатура.Сумма КАК Число(15,2)) КАК Сумма |ИЗ | Справочник.Номенклатура КАК Номенклатура";

6. Функция ISNULL (альтернативное написание ЕСТЬNULL) - если поле имеет тип NULL, то оно заменяется на второй параметр функции.

Синтаксис: ЕСТЬNULL(<Поле>, <ПодставляемоеЗначение>)

Пример использования:

Также отметим что тип NULL желательно ВСЕГДА заменять на какое-то значение, т.к. сравнение с типом NULL всегда дает ЛОЖЬ даже если вы сравниваете NULL с NULL. Чаще всего значения NULL образуются в результате соединения таблиц (все виды соединений кроме внутреннего).

Запрос.Текст = //Выбираем всю номенклатуру и остатки по ней //если остатокв но какой-то номенклатуре нет то будет поле //NULL которое заменится значением 0 "ВЫБРАТЬ | Ном.Ссылка, | ЕСТЬNULL(ТоварыНаСкладахОстатки.ВНаличииОстаток, 0) КАК Остаток |ИЗ | Справочник.Номенклатура КАК Ном | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки | ПО (ТоварыНаСкладахОстатки.Номенклатура = Ном.Ссылка)";

7. Функция ПРЕДСТАВЛЕНИЕ - позволяет получить представление поля запроса.

Синтаксис: ПРЕДСТАВЛЕНИЕ(<НаименованиеПоля>)

Пример использования:

Запрос.Текст = "ВЫБРАТЬ | ПРЕДСТАВЛЕНИЕ(СвободныеОстаткиОстатки.Номенклатура) КАК Номенклатура, | ПРЕДСТАВЛЕНИЕ(СвободныеОстаткиОстатки.Склад) КАК Склад, | СвободныеОстаткиОстатки.ВНаличииОстаток |ИЗ | РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки";

Конструкции в языке запросов 1с

Выше мы рассмотрели с Вами функции языка запросов 1с , теперь пришло время рассмотреть конструкции в языке запросов 1с , они не менее важны и полезны, приступаем.

1. Конструкция ССЫЛКА - представляет из себя логический оператор проверки ссылочного типа. Наиболее часто встречается при проверки поля составного типа на конкретный тип. Синтаксис: ССЫЛКА <Имя таблицы>

Пример использования:

Запрос.Текст = //если тип значения регистратора документ Приходная, //тогда запрос вернет "Поступление товаров", иначе "Реализация товаров" "ВЫБРАТЬ | ВЫБОР | КОГДА Остатки.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг | ТОГДА ""Приход"" | ИНАЧЕ ""Расход"" | КОНЕЦ КАК ВидДвижения |ИЗ | РегистрНакопления.ОстаткиТоваровНаСкладах КАК Остатки" ;

2. Конструкция МЕЖДУ - данный оператор проверяет входит ли значение в указанный диапазон.

Синтаксис: МЕЖДУ <Выражение> И <Выражение>

Пример использования:

Запрос.Текст = //получим всю номенклатуру код которой лежит в диапазоне от 1 до 100 "ВЫБРАТЬ | Номенклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Номенклатура.Код МЕЖДУ 1 И 100" ;

3. Конструкция В и В ИЕРАРХИИ - проверяют находится ли значение в передаваемом списке (в качестве списка могут передаваться массивы, таблицы значений и т.д.). Оператор В ИЕРАРХИИ позволяет просматривать иерархию (пример использования ПланСчетов).

Синтаксис: В(<СписокЗначений>), В ИЕРАРХИИ(<СписокЗначений>)

Пример использования:

Запрос.Текст = //выбираем все субсчета счета "ВЫБРАТЬ | Хозрасчетный.Ссылка КАК Счет |ИЗ | ПланСчетов.Хозрасчетный КАК Хозрасчетный |ГДЕ | Хозрасчетный.Ссылка В ИЕРАРХИИ ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)";

4. Конструкция ПОДОБНО - эта функция позволяет нам сравнивать строку с шаблоном строки.

Синтаксис: ПОДОБНО "<ТекстШаблона>"

Варианты шаблона строки:

% - последовательность, содержащая любое количество произвольных символов.

Один произвольный символ.

[...] - любой одиночный символ, либо последовательность символов из перечисленных внутри квадратных скобок. В перечислении могут задаваться диапазоны, например a-z, означающие произвольный символ, входящий в диапазон, включая концы диапазона.

[^...] - любой одиночный символ, либо последовательность символов из перечисленных внутри квадратных скобок кроме тех, которые перечислены следом за значком отрицания.

Пример использования:

Запрос.Текст = //найдем всю номенклатуру которая содержит корень ТАБУР и начинается //либо с маленькой либо с большой буквы т "ВЫБРАТЬ | Номенклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК Номенклатура |ГДЕ | Товары.Наименование ПОДОБНО ""[Тт]абур%""" ;

5. Конструкция РАЗРЕШЕННЫЕ - этот оператор позволяет выбрать только те записи из БД, на которые вызывающий имеет право чтения. Данные права настраиваются на уровне записей (RLS).

Синтаксис: РАЗРЕШЕННЫЕ пишется после ключевого слова ВЫБРАТЬ

Пример использования:

Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ | Контрагенты.Ссылка |ИЗ | Справочник.Контрагенты КАК Контрагенты";

6. Конструкция РАЗЛИЧНЫЕ - позволяет выбрать записи в которых отсутствуют повторные записи.

Синтаксис: РАЗЛИЧНЫЕ пишется после ключевого слова ВЫБРАТЬ

Пример использования:

Запрос.Текст = //выбирает записи на которые есть права у читающего "ВЫБРАТЬ РАЗЛИЧНЫЕ | Контрагенты.Наименование |ИЗ | Справочник.Контрагенты КАК Контрагенты" ;

Также Конструкция РАЗЛИЧНЫЕ может использоваться с оператором РАЗРЕШЕННЫЕ и другими операторами.

Пример использования:

Запрос.Текст = //выбирает различные записи на которые есть права у читающего "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | Контрагенты.Наименование |ИЗ | Справочник.Контрагенты КАК Контрагенты";

7. Конструкция ПЕРВЫЕ - выбирает указанное в параметре число записей из результата запроса.

Синтаксис: ПЕРВЫЕ <число>

Пример использования:

Запрос.Текст = //выбирают первые 4 номера ГТД из справочника "ВЫБРАТЬ ПЕРВЫЕ 4 | НомераГТД.Ссылка |ИЗ | Справочник.НомераГТД КАК НомераГТД";

8. Конструкция ДЛЯ ИЗМЕНЕНИЯ - позволяет заблокировать таблицу, работает только в транзакциях (актуально только для автоматических блокировок).

Синтаксис: ДЛЯ ИЗМЕНЕНИЯ <НаименованиеТаблицы>

Пример использования:

Запрос.Текст = "ВЫБРАТЬ | СвободныеОстаткиОстатки.Номенклатура, | СвободныеОстаткиОстатки.Склад, | СвободныеОстаткиОстатки.ВНаличииОстаток |ИЗ | РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки |ДЛЯ ИЗМЕНЕНИЯ | РегистрНакопления.СвободныеОстатки.Остатки";

9. Конструкция УПОРЯДОЧИТЬ ПО - упорядочивает данные по определенному полю. Если полем является ссылка то при установке флага АВТОУПОРЯДОЧИВАНИЕ будет происходить сортировка по представлению ссылки, если флаг выключен то ссылки сортируются по старшинству адреса ссылки в памяти.

Синтаксис: УПОРЯДОЧИТЬ ПО <НаименованиеПоля> АВТОУПОРЯДОЧИВАНИЕ

Пример использования:

Запрос.Текст = "ВЫБРАТЬ | СвободныеОстаткиОстатки.Номенклатура КАК Номенклатура, | СвободныеОстаткиОстатки.Склад КАК Склад, | СвободныеОстаткиОстатки.ВНаличииОстаток |ИЗ | РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки | |УПОРЯДОЧИТЬ ПО | Номенклатура |АВТОУПОРЯДОЧИВАНИЕ";

10. Конструкция СГРУППИРОВАТЬ ПО - используется для группировки строк запроса по определенным полям. Числовые поля должны использоваться с любой агрегатной функцией.

Синтаксис: СГРУППИРОВАТЬ ПО <НаименованиеПоля1>, .... , <НаименованиеПоляN>

Пример использования:

Запрос.Текст = "ВЫБРАТЬ | ТоварыНаСкладах.Номенклатура КАК Номенклатура, | ТоварыНаСкладах.Склад, | СУММА(ТоварыНаСкладах.ВНаличии) КАК ВНаличии |ИЗ | РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах | |СГРУППИРОВАТЬ ПО | ТоварыНаСкладах.Номенклатура, | ТоварыНаСкладах.Склад";

11. Конструкция ИМЕЮЩИЕ - позволяет применить агрегатную функцию к условию выборки данных, похожа на конструкцию ГДЕ.

Синтаксис: ИМЕЮЩИЕ <агрегатная функция с условием>

Пример использования:

Запрос.Текст = //выбирает сгруппированные записи где поле ВНаличии больше 3 "ВЫБРАТЬ | ТоварыНаСкладах.Номенклатура КАК Номенклатура, | ТоварыНаСкладах.Склад, | СУММА(ТоварыНаСкладах.ВНаличии) КАК ВНаличии |ИЗ | РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах | |СГРУППИРОВАТЬ ПО | ТоварыНаСкладах.Номенклатура, | ТоварыНаСкладах.Склад | |ИМЕЮЩИЕ | СУММА(ТоварыНаСкладах.ВНаличии) > 3" ;

12. Конструкция ИНДЕКСИРОВАТЬ ПО - используется для индексации поле запроса. Запрос с индексацией дольше выполняется, но ускоряет поиск по индексированным полям. Можно использовать только в виртуальных таблицах.

Синтаксис: ИНДЕКСИРОВАТЬ ПО <Поле1, ... , ПолеN>

Пример использования:

Запрос.Текст = "ВЫБРАТЬ | Тз.НаименованиеОС, | Тз.НомерПапки, | Тз.КодОС, | Тз.Срок, | Тз.Тип |ПОМЕСТИТЬ ДанныеТз |ИЗ | &Тз КАК Тз | |ИНДЕКСИРОВАТЬ ПО | Тз.НаименованиеОС, | Тз.КодОС";

13. Конструкция ГДЕ - позволяет наложить условие на любые поля выборки. В результат попадут записи только удовлетворяющие условию.

Синтаксис: ГДЕ <Условие1 ОператорЛогСоединения УсловиеN>

Пример использования:

Запрос.Текст = //выбираются все записи у которых КомпенсацияОстаток <> 0 и //СуммаДляРасчКомпОстаток > 100 "ВЫБРАТЬ | КомпенсацияРПОстатки.Контрагент, | КомпенсацияРПОстатки.Ребенок, | КомпенсацияРПОстатки.КомпенсацияОстаток, | КомпенсацияРПОстатки.СуммаДляРасчКомпОстаток |ПОМЕСТИТЬ ДанныеТз |ИЗ | РегистрНакопления.КомпенсацияРП.Остатки КАК КомпенсацияРПОстатки |ГДЕ | КомпенсацияРПОстатки.КомпенсацияОстаток <> 0 | И КомпенсацияРПОстатки.СуммаДляРасчКомпОстаток > 100" ;

14. Конструкция ИТОГИ... ПО ОБЩИЕ - применяется для подсчета итогов, в конструкции указываются поля по которым будут считаться итоги и агрегатные функции применяемые к итоговым полям. При использовании итогов на каждое поле следующее после конструкции ИТОГИ производится группировка данных. Есть необязательная конструкция ОБЩИЕ, ее использование также обеспечивает дополнительную группировку. Пример результата запроса вы увидите ниже.

Синтаксис: ИТОГИ <АгрегатнаяФункция1, ... , АгрегатнаяФункцияN> ПО <ОБЩИЕ> <Поле1, ... , ПолеN>

Пример использования:

Запрос.Текст = "ВЫБРАТЬ | Расчеты.ДоговорКонтрагента.ВидДоговора КАК ВидДоговора, | Расчеты.ДоговорКонтрагента КАК Договор, | Расчеты.Контрагент, | Расчеты.СуммаВзаиморасчетовОстаток КАК Остаток |ИЗ | РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки КАК Расчеты |ИТОГИ | СУММА(Остаток) |ПО | ОБЩИЕ, | ВидДоговора";

На рисунке обведены группировки которые образовались в ходе выполнения запроса, самая верхняя относится к секции ОБЩИЕ, а вторая к полю ДоговорКонтрагентаВидДоговора.

Похожие публикации