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

; Вложенные запросы (в разработке).

Поступление товаров и услуг .

Новые вкладки: Группировка

Теоретическая часть урока №5

Группировка в запросе — это объединение нескольких строк выборки в одну, при этом используется два вида полей:

  • Группировочные . Строки, в которых набор этих полей принимает одинаковые значения, сворачиваются одну строку;
  • Группируемые. Для свернутых строк значения этих полей рассчитываются при помощи агрегатных функций:
    • Сумма . Значения поля суммируется по всем сгруппированным строкам;
    • Среднее . Рассчитывается среднее значение поля среди сгруппированных строк;
    • Максимум . Вычисляется максимальное значение поля среди сгруппированных строк;
    • Минимум . Вычисляется минимальное значение поля среди сгруппированных строк;
    • Количество . Вычисляется количество сгруппированных строк, вне зависимости от того к какому полю применяется данная агрегатная функция;
    • Количество различных . Вычисляется количество различных значений данного поля по всем сгруппированным строкам.

Пример 1. Пусть у нас есть таблица с двумя полями: Фрукт и Количество . Сгруппировать строки с одинаковыми фруктами и посчитать общее количество по каждому фрукту.

По условиям примера поле Фрукт — группировочное, а поле Количество — группируемое при помощи агрегатной функции Сумма .

После группировки наша таблица будет выглядеть так:

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

Таким образом у нас есть таблица с тремя полями Фрукт , Тара , Цена. Необходимо сгруппировать строки по полям Фрукт и Тара , а по полю Цена посчитать Максимум .

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

Теперь посмотрим, как реализован механизм группировки в конструкторе запросов 1с. В конструкторе перейдем на вкладку Группировка , она состоит из трех разделов:

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

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

Практическая часть урока №5

Разберем решение задачи, приведенной в начале урока. Напомню условия:

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

  • Создадим новый запрос;
  • Запустим конструктор запросов;
  • Выберем таблицу ПоступлениеТоваровУслуг из ветки Документы ;
  • Из таблицы ПоступлениеТоваровУслуг выберем поля Дата и СуммаДокумента;
  • Выделим поле Дата и нажмем кнопку Изменить текущий элемент , чтобы открыть его в редакторе произвольных выражений;

  • В разделе Функции языка запросов найдем ветку Функции работы с датами ;
  • Из данной ветки перетащим в раздел выражений функцию Месяц и заменим параметр Дата на выбранное нами поле с датой поступления;

  • Нажмем кнопку ОК, в нижней части редактора произвольных выражений;
  • Перейдем на вкладку Объединения / Псевдонимы и установим для поля с номером месяца псевдоним Месяц ;

  • Перейдем на вкладку Условия;
  • В разделе Поля , раскроем ветку ПоступлениеТоваровУслуг при помощи кнопки «+»;
  • Найдем реквизит Дата и перетащим его в раздел условия, выберем оператор сравнения Между и укажем параметры начала и окончания года, например НачалоГода и КонецГода ;
  • Из раздела Поля перетащим реквизит Проведен , поставим в строке с условием флаг Произвольное и сотрем лишнюю часть условия «= &Проведен»;
  • Перейдем на вкладку Группировка ;
  • В раздел группировочных полей перетащим поле МЕСЯЦ(ПоступлениеТоваровУслуг.Дата) , а в раздел группируемых полей ПоступлениеТоваровУслуг.СуммаДокумента . По умолчанию установится агрегатная функция Сумма , в данном случае она нас вполне устраивает;


  • Написание запроса завершено, нажмем кнопку ОК , чтобы закрыть конструктор запросов;

В итоге у нас получится запрос со следующим текстом.

<Разыменование поля> |

<Агрегатная функция> |

<Встроенная функция> |

<Операция выбора> |

<Приведение типа>[.<Разыменование поля>] |

<3начение> |

<Выражение> <Бинарная операция> <Выражение> |

<Унарная операция> <Выражение> |

Выражения в списке полей выборки, в предложениях ИМЕЮЩИЕ, ИТОГИ, УПОРЯДОЧИТЬ ПО могут быть агрегатными функциями . Агрегатные функции описаны на .

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

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

Разыменование полей

Выражения языка запросов в простейшем случае представляют собой ссылки на поля таблиц информационной базы. В общем виде ссылки описываются следующими правилами:

[<Таблица>.]<Имя поля>[.<Имя поля>[...]]

<Имя таблицы> | <Псевдоним источника>

Разыменование поля начинается с имени таблицы, содержащей это поле. Если <Имя поля> уникально - существует только у одной из таблиц среди указанных в списке источников, <Таблица> может быть опущена.

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

Если исходной таблице в списке источников присвоен <Псевдоним источника>, он может использоваться вместо имени таблицы в разыменовании полей этой таблицы. В против­ном случае указывается <Имя таблицы> (см. описание источ­ников данных запроса).

Агрегатные функции языка запросов

В языке запросов предусмотрены агрегатные функции, которые используются при группировке результатов запроса и при подсчете итогов. Агрегатные функции предназначены для обобщения значений указанного параметра. Определены следующие агрегат­ные функции:

СУММА (<Выражение >) |

СРЕДНЕЕ (<Выражение>) |

МИНИМУМ (<Выражение>) |

МАКСИМУМ (<Выражение>) |

КОЛИЧЕСТВО ([РАЗЛИЧНЫЕ] <Выражение> | *)

Выбрать
Накладная.Номенклатура.Наименование,
Сумма(Накладная.Сумма) Как Сумма,
Среднее(Накладная.Сумма) Как Среднее,
Максимум(Накладная.Сумма) Как Максимум,
Минимум(Накладная.Сумма) Как Минимум,
Количество(Накладная.Сумма) Как Колич
Из

Сгруппировать По
Накладная.Номенклатура
Итоги Общие

Результат запроса:

Наименование Сумма Среднее Максимум Минимум Колич
265 955,45 12 511,12 40 000,23 555 8
Брюки детские 28 500,22 9 500,07 15000 3000 3
Рубашка «Ков­бойка» 24000 8000 16000 4000 3
Джинсы жен­ские 63555 6 355,5 30000 555 10
Свитер детский 6400 6400 6400 6400 1
Раковина «Ли­лия» 60 000,23 30000,115 40 000,23 20000 2
Мойдодыр «Ак­вариум» 65500 21 833,33 40000 8000 3
Смеситель «Ультра» 15000 15000 15000 15000 1
Кухонный ком­байн Крупс 3000 3000 3000 3000 1

Агрегатные функции могут использоваться в списке полей вы­борки, предложениях ИМЕЮЩИЕ, ИТОГИ, УПОРЯДОЧИТЬ ПО.

Агрегатная функция СУММА

Функция вычисляет арифметическую сумму всех попавших в выборку значений поля.

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

Если поле не может содержать числовых значений, то примене­ние функции СУММА к такому полю вызовет ошибку. Если поле может содержать числовые значения (имеет составной тип дан­ных), то данная функция может быть применена к такому полю. Но если среди значений поля в выборке встретится нечисловое значение (помимо значений NULL), это вызовет ошибку.

Агрегатная функция СРЕДНЕЕ

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

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

Если поле не может содержать числовых значений, то примене­ние функции СРЕДНЕЕ к такому полю вызовет ошибку. Если поле может содержать числовые значения (имеет составной тип данных), то данная функция может быть применена к такому по­лю. Но если среди значений поля в выборке встретится нечисло­вое значение (помимо значений NULL), это вызовет ошибку.

Агрегатная функция МИНИМУМ

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

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

Агрегатная функция МАКСИМУМ

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

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

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

Агрегатная функция КОЛИЧЕСТВО

Функция подсчитывает количество значений параметра, попав­ших в выборку. В отличие от других агрегатных функций функ­ция КОЛИЧЕСТВО допускает три способа использования.

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

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

Результат запроса:

Всего Разные
24 8

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

В языке запросов определены встроенные функции, которые мо­гут использоваться в выражениях в списке полей выборки (см. стр. 300) и в условии отбора в предложении ГДЕ (см. стр. 315). Опре­делены следующие встроенные функции:

ПОДСТРОКА(<Выражение>, <3начение>, <3начение>) |
ГОД(<Выражение>) |
КВАРТАЛ(<Выражение>) |
МЕСЯЦ(<Выражение>) |
ДЕНЬГОДА(<Выражение>) |
ДЕНЬ(<Выражение>) |
НЕДЕЛЯ(<Выражение>) |
ДЕНЬНЕДЕЛИ(<Выражение>) |
ЧАС(<Выражение>) |
МИНУТА(<Выражение>) |
СЕКУНДА(<Выражение>)

Данная функция предназначена для выделения подстроки из строки.

<Выражение>

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

<3начение>

Позиция символа, с которого начинается вы­деляемая из строки подстрока. Значение типа Число.

<3начение>

Длина выделяемой подстроки. Значение типа Число.

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

Выбрать
Справочних.Контрагенты.Наименование,
Подстрока(Справочник.Контрагенты.Наименование, 3, 5) Как Подстрока

Результат запроса:

Данная функция предназначена для вычисления номера года из значения типа Дата.

Данная функция предназначена для вычисления номера квартала из з гачения типа Дата. Номер квартала находится в диапазоне 1-4.

Параметр функции - это выражение, имеющее тип Дата.

Если в качестве параметра фигурирует значение типа Дата, то результатом функции будет значение типа Число. Если в качест­ве параметра будет использовано значение NULL, то результатом функции также будет значение NULL. Другие значения считаются недопустимыми и вызывают состояние ошибки.

Данная функция предназначена для вычисления номера месяца из значения типа Дата. Номер месяца находится в диапазоне 1 -12.

Параметр функции - это выражение, имеющее тип Дата-

Данная функция предназначена для вычисления дня года из зна­чения типа Дата. День года находится в диапазоне 1 - 366.

Параметр функции - это выражение, имеющее тип Дата.

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

Данная функция предназначена для вычисления дня месяца из значения типа Дата. День месяца находится в диапазоне 1 - 31.

Параметр функции - это выражение, имеющее тип Дата.

Данная функция предназначена для вычисления номера недели года из значения типа Дата.

Параметр функции - это выражение, имеющее тип Дата.

Если в качестве параметра фигурирует значение типа Дата, то результатом функции будет значение типа Число. Если в качест­ве параметра будет использовано значение NULL, то результатом функции также будет значение NULL. Другие значения считаются недопустимыми и вызывают состояние ошибки.

Данная функция предназначена для вычисления дня недели из значения типа Дата. День недели находится в диапазоне 1 (по­недельник) - 7 (воскресенье).

Параметр функции - это выражение, имеющее тип Дата.

Если в качестве параметра фигурирует значение типа Дата, то результатом функции будет значение типа Число. Если в качест­ве параметра будет использовано значение NULL, то результатом функции также будет значение NULL. Другие значения считаются недопустимыми и вызывают состояние ошибки.

Данная функция предназначена для вычисления часа суток из значения типа Дата. Час суток находится в диапазоне 0 - 23.

Параметр функции - это выражение, имеющее тип Дата.

Если в качестве параметра фигурирует значение типа Дата, то результатом функции будет значение типа Число. Если в качест­ве параметра будет использовано значение NULL, то результатом функции также будет значение NULL. Другие значения считаются недопустимыми и вызывают состояние ошибки.

Данная функция предназначена для вычисления минуты часа из значения типа Дата. Минута часа находится в диапазоне 0 - 59.

Параметр функции - это выражение, имеющее тип Дата.

Если в качестве параметра фигурирует значение типа Дата, то результатом функции будет значение типа Число. Если в качест­ве параметра будет использовано значение NULL, то результатом функции также будет значение NULL. Другие значения считаются недопустимыми и вызывают состояние ошибки.

Данная функция предназначена для вычисления секунды минуты из значения типа Дата. Секунда минуты находится в диапазоне 0 - 59.

Параметр функции - это выражение, имеющее тип Дата.

Если в качестве параметра фигурирует значение типа Дата, то результатом функции будет значение типа Число. Если в качест­ве параметра будет использовано значение NULL, то результатом функции также будет значение NULL. Другие значения считаются недопустимыми и вызывают состояние ошибки.

Операции выбора в языке запросов

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

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

ВЫБОР
<Альтернативы выбора>
[ИНАЧЕ
<Выражение>]
КОНЕЦ

<Одиночный выбор> [<Альтернативы выбора>]

КОГДА
<Логическое выражение>
ТОГДА
<Выражение>

В операции выбора может указываться неограниченное количест­во альтернативных одиночных выборов КОГДА... ТОГДА. Они обрабатываются в запросе последовательно; если <Логическое выражение> имеет значение ИСТИНА, обработка операции вы­бора завершается; результатом операции является значение вы­ражения, указанного после слова ТОГДА. Логические выражения описаны на .

Значение выражения, указанного после слова ИНАЧЕ использует­ся в качестве результата операции выбора в том случае, если во всех ранее указанных альтернативных одиночных выборах преди­кат имел значение ЛОЖЬ.

Выбрать
,
Выбор
Когда Справочник.Номенклатура.ЭтоГруппа = Истина Тогда "Это Группа"
Когда Справочник.Номенклатура.ЗакупочнаяЦена > 1000 Тогда "1000 -"
Когда Справочник.Номенклатура.ЗакупочнаяЦена > 100 Тогда "100 - 1000"
Когда Справочник.Номенклатура.ЗакупочнаяЦена > 10 Тогда "10 - 100"
Когда Справочник.Номенклатура.ЗакупочнаяЦена > 0 Тогда «0 - 10»
Иначе "Не Задана"
Конец Цена

Результат запроса:

Наименование Цена
Брюки детские 100 - 1000
Рубашка «Ковбойка» 1000-
Одежда Это группа
Джинсы женские 1000-
Свитер детский Не задана
Сантехника Это группа
Бытовая техника Это группа
Раковина «Лилия» Не задана
Мойдодыр «Аквариум» Не задана
Смеситель «Ультра» 100 - 1000
Кухонный комбайн Крупе 1000-
Мясорубка Браун Не задана
Электронож Крупе Не задана
Зажигалка для газовой плиты «Огонек» Не задана
Калькулятор бухгалтерский Не задана
Кухонная техника Это группа
Оргтехника Это группа

Приведение типа в языке запросов

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

ВЫРАЗИТЬ (<Выражение> КАК <Тип значения>)

БУЛЕВО | ЧИСЛО | СТРОКА | ДАТА | <Имя таблицы>

<Выражение> приводится к одному из базовых типов, или к ссылочному типу данных; в последнем случае <Имя таблицы> указывает на соответствующую таблицу информационной базы.

Если <Выражение> содержит в составном типе требуемый <Тип значения>, то приведение типа считается осуществи­мым, и для каждого значения указанного типа результатом будет это самое значение. Для значений других типов результатом при­ведения типа будет значение NULL.

Если <Выражение> не содержит в составном типе требуемый <Тип значения>, то выполнение данного запроса завершится ошибкой из-за принципиальной невозможности совершить при­ведение типов.

Константы и параметры в языке запросов

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

ИСТИНА |
ЛОЖЬ |
<Литерал типа ЧИСЛО> |
<Литерал типа СТРОКА> |
<Литерал типа ДАТА> |
<Имя параметра>

<Целое число> [.<Целое число>]

<Последовательность символов>

ДАТАВРЕМЯ (<Целое число>, <Целое число>, <Целое число>[, <Целое число>, <Целое число>, <Целое число>])

Значения типа булево, число, строка в языке запросов зада­ются так же, как и во встроенном языке.

Значения типа дата задаются с помощью ключевого слова ДАТАВРЕМЯ, после которого в скобках последовательно указы­ваются год, месяц, день, час, минута, секунда. Последние три ука­зывать необязательно.

В запрос могут передаваться параметры (см. описание объекта Запрос). Значения параметров могут использоваться в выраже­ниях языка запросов, для этого необходимо указать символ & и после него <Имя параметра>.

Условия в языке запросов

В языке запросов используются условия отбора, в соответствии с которыми осуществляется отбор данных в предложениях ГДЕ, ИМЕЮЩИЕ и СОЕДИНЕНИЕ. Условия описываются по следующим правилам:

<Логическое слагаемое> [ИЛИ <Логическое слагаемое>]

<Логический сомножитель> [И <Логический сомножитель>]

НЕ <Логический сомножитель> | (<Условие отбора>) | <Логическое выражение>

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

Условия могут определяться и как более сложные логические выражения, где фигурируют простые логические выражения, со­единенные между собой с помощью логических операторов И, ИЛИ, НЕ.

Логические операторы имеют приоритет:

Самый высокий приоритет имеет логический оператор НЕ.

Следующим по приоритету является оператор И.

Самый низкий приоритет у оператора ИЛИ.

В условиях сначала вычисляются простые логические выражения, затем операции НЕ, затем операции И, в последнюю очередь -операции ИЛИ. Для того, чтобы обеспечить другой порядок вы­числений, можно использовать круглые скобки ().

Логические выражения в языке запросов

В языке запросов в операциях выбора и в условиях отборов ис­пользуются логические выражения:

<Выражение> |
<Выражение> <Операция сравнения> <Выражение> |
<Выражение> [НЕ] В [ИЕРАРХИИ] (<Список значений>)

<Выражение> [НЕ] В [ИЕРАРХИИ] <Описание запроса> |
<Выражение> [НЕ] МЕЖДУ <Выражение> И <Выражение> |
<Выражение> ЕСТЬ [НЕ] NULL |
<Выражение> ССЫЛКА <Имя таблицы> |
<Выражение> [НЕ] ПОДОБНО <Литерал типа СТРОКА> [СПЕЦСИМВОЛ <Литерал типа СТРОКА>]

<Выражение> [, <Выражение> [, ...] ]

Логическим выражением может быть:

Обычное <Выражение> языка запросов, если его результат имеет логический тип;

<Операция сравнения> двух выражений языка запросов; выполняются в соответствии с правилами сравнения значений описанными на ;

Оператор проверки совпадения / не совпадения значения выражения с одним из перечисленных или со значениями, со­держащимися в результате другого запроса;

Оператор проверки вхождения значения выражения в диапа­зон;

Оператор проверки значения выражения на NULL;

Оператор проверки ссылочного значения выражения на ссыл­ку на определенную таблицу;

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

При сравнении значений используются правила сравнения значе­ний, описанные на .

Оператор В позволяет проверить, совпадает ли значение выраже­ния, указанного справа от него, с одним из значений, описанных слева. Если совпадает хотя бы с одним - результатом оператора будет ИСТИНА, иначе - ЛОЖЬ. Применение НЕ изменяет дейст­вие оператора на обратное. Сравнение значений производится по правилам, описанным на .

Выбрать
Справочник.Номенклатура.Наименование
Где
Справочник.Номенклатура.Родитель.Наименование В ("Бытовая техника", "Оргтехника")

Для справочников проверка может осуществляться и на принад­лежность по иерархии. Результатом оператора В ИЕРАРХИИ бу­дет ИСТИНА, если значение выражения слева является ссылкой на элемент справочника и входит во множество значений справа или иерархически принадлежит какой-нибудь группе, содержа­щейся в этом множестве.

//В качестве параметра Группа в запрос передается ссылка
//на какую-либо группу справочника Номенклатура.
Выбрать
Справочник.Номенклатура.Наименование
Где
Справочник.Номенклатура.Ссылка В ИЕРАРХИИ (&Группа)

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

Выбрать
Справочник.Номенклатура.Наименование
Где
Справочник.Номенклатура.Ссылка В ИЕРАРХИИ
(ВЫБРАТЬ
Справочник.Номенклатура.Ссылка
ГДЕ
Справочник.Номенклатура.Наименование = "Одежда")

Оператор МЕЖДУ позволяет проверить, входит ли значение выра­жения, указанного справа от него, в диапазон, указанный слева. Если входит - результатом оператора будет ИСТИНА, иначе -ЛОЖЬ Применение НЕ изменяет действие оператора на обратное. Сравнение значений производится по правилам, описанным на .

Выбрать

Справочник.Номенклатура.ЗакупочнаяЦена
Где
Справочник.Номенклатура.ЗакупочнаяЦена МЕЖДУ 100 И 1000

Оператор ЕСТЬ NULL позволяет проверить значение выражения слева от него на NULL. Если значение равно NULL результатом оператора будет ИСТИНА, иначе - ЛОЖЬ. Применение НЕ изме­няет действие оператора на обратное.

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

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

Справочник.Номенклатура.ЗакупочнаяЦена Есть NULL

Оператор ССЫЛКА позволяет проверить, является ли значение выражения, указанного справа от него, ссылкой на таблицу, ука­занную слева Если да - результатом оператора будет ИСТИНА, иначе - ЛОЖЬ. Разыменование таблиц описано на .

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

Оператор ПОДОБНО позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка. Если значение выражения удовлетворяет шаблону - результатом оператора бу­дет ИСТИНА, иначе - ЛОЖЬ.

Следующие символы в строке шаблона являются служебными и имеют смысл, отличный от символа строки:

% (процент): последовательность, содержащая любое количе­ство произвольных символов

_ (подчеркивание): один произвольный символ.

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

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

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

Если в качестве самого себя необходимо записать один из пере­численных символов, то ему должен предшествовать <Спецсимвол>. Сам <Спецсимвол> (любой подходящий символ) определяется в этом же операторе после ключевого слова СПЕЦСИМВОЛ.

Например, шаблон "%АБВ[абвг]\_абв%" СПЕЦСИМВОЛ "\" означает подстроку, состоящую из последовательности символов:

буквы А, буквы Б; буквы В; одной цифры, одной из букв а, 6, в или г; символа подчеркивания; буквы а; буквы б; буквы в. Причем перед этой последовательностью может располагаться произволь­ный набор символов.

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

Развернуть группировку после выполнения запроса и узнать, какие строки в нее вошли, после выполнения запроса невозможно (в отличие от применения Итогов ).

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

Группировочные столбцы обозначаются в особой секции запроса, которая начинается с фразы СГРУППИРОВАТЬ ПО . Группируемые столбцы обозначаются через агрегатные функции в секции ВЫБРАТЬ .

Существует 6 видов агрегатных функций, применяемых при группировках:

  1. СУММА — суммирует значения группируемого столбца, применяется только для числовых значений.
  2. СРЕДНЕЕ — вычисляет среднее арифметическое из значений группируемого столбца, применяется только для числовых значений.
  3. МАКСИМУМ — может применяться для любых типов значений группируемого столбца, при этом возвращается максимальное значение из всех группируемых. Если значения не числовые, то возвращается последнее при сортировке по возрастанию.
  4. МИНИМУМ — может применяться для любых типов значений группируемого столбца, при этом возвращается минимальное значение из всех группируемых. Если значения не числовые, то возвращается первое при сортировке по возрастанию.
  5. КОЛИЧЕСТВО — возвращает количество значений в группируемом столбце, может использоваться для любых типов значений. В расчет не берутся значения типа NULL.
  6. КОЛИЧЕСТВО РАЗЛИЧНЫЕ — возвращает количество различных значений в группируемом столбце, может использоваться для любых типов значений. В расчет не берутся значения типа NULL.

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

Рассмотрим применение группировок в запросах 1С на примерах.

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

Задача 1.

Узнать, какие поставщики поставляли товары.

Решение: Одним из вариантов решений может быть выбор единственного стобца Поставщик и группировка по нему.

Запрос. Текст= "ВЫБРАТЬ
Поставки.Поставщик
ИЗ
Поставки КАК Поставки
СГРУППИРОВАТЬ ПО
Поставки.Поставщик"
;

Задача 2.

Узнать общее количество поставленного товара каждого вида.

Решение: Необходимо выбрать два столбца: товар и количество, сгруппировать полученный результат по полю Товар, применив агрегатную функцию Сумма .

Запрос. Текст= "ВЫБРАТЬ
Поставки.Товар,
СУММА (Поставки.Количество) КАК Количество
ИЗ
Поставки КАК Поставки
СГРУППИРОВАТЬ ПО
Поставки.Товар"
;

Задача 3.

Определить, сколько в среднем единиц товара поставляет каждый поставщик.

Решение: Необходимо выбрать два столбца: поставщик и количество, сгруппировать полученный результат по полю Поставщик, применив агрегатную функцию Среднее .

Запрос. Текст= "ВЫБРАТЬ
Поставки.Поставщик,
СРЕДНЕЕ (Поставки.Количество) КАК Количество
ИЗ
Поставки КАК Поставки
СГРУППИРОВАТЬ ПО
Поставки.Поставщик"
;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Top