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

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

Предположим, что на наших складах имеется такой товар:

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

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

Товар в данном случае - это поле по которому осуществляется группировка, а Количество - группируемое поле. СУММА - это агрегатная функция, она указывает запросу что все данные по количеству одинаковых товаров нужно просуммировать. Результатом выполнения этого запроса будет таблица вида:

Агрегатные функции

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

СУММА - применяется только для числовых полей, складывает переданные ей числа. Ее результат приведен на рисунке выше.

СРЕДНЕЕ - применяется только для числовых полей, вычисляет среднее - сумма переданных параметров / количество параметров:

МАКСИМУМ - может использоваться для любых полей, получает максимальный из переданных параметров. Допустим текст запроса имеет вид:

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

Т.е. имеем опять одно группировочное поле Товар и два группируемых поля: Склад и Количество. Результат выполнения этого запроса будет выглядеть следующим образом:

МИНИМУМ - может использоваться для любых полей, получает минимальный из переданных параметров:

КОЛИЧЕСТВО - может использоваться для любых полей, получает количество переданных параметров:

КОЛИЧЕСТВО РАЗЛИЧНЫХ - может использоваться для любых полей, получает количество различных параметров. Т.е. если функции передать параметры (1,1,2,3,3,3,4,4,4,4,4,5), то она вернет 5 . Функция КОЛИЧЕСТВО вернула бы 12. Запрос с использованием функции КОЛИЧЕСТВО РАЗЛИЧНЫХ будет выглядеть так:

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

Результат:

Пусть мы группируем по двум полям: Товар и Склад:

Запрос.Текст = "
|ВЫБРАТЬ
| Товары.Товар,
| Товары.Склад КАК Склад,
| <АГРЕГАТНАЯ ФУНКЦИЯ>(Товары.Количество) КАК Количество
|ИЗ
| Справочник.Товары КАК Товары
|СГРУППИРОВАТЬ ПО
| Товары.Товар,
| Товары.Склад";

для различных агрегатных функций результат будет следующим:

Подведем итоги:

Если в запросе используется группировка, то все поля должны делиться на группируемые (которые будут "свернуты") и группировочные (по которым осуществляется группировка - "сворачивание"). К группируемым полям должна быть применена одна из агрегатных функций, причем такие функции как СУММА и СРЕДНЕЕ могут быть применены только к числовым полям.

Редактор текста и модуля - это один из инструментов разработки. Он используется для редактирования текстовых документов и для редактирования программных модулей конфигурации.

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

  • для редактирования текстовых документов;
  • для редактирования текстов модулей (как составную часть редактора формы).

Редактирование текстовых документов

В режиме редактирования текстовых документов редактор поддерживает все стандартные функции редактирования текста:

  • создание нового документа или открытие одного из существующих документов;
  • ввод и редактирование текста;
  • сохранение отредактированного текста;
  • печать текста.

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

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

Редактирование текстов модулей

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

Помимо стандартных действий, присущих любому текстовому редактору, редактор текстов и модулей имеет ряд специфических особенностей:

Выделение цветом синтаксических конструкций

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

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

Группировка

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

Свернутый текст замещается специальным маркером, который позволяет просмотреть содержимое свернутой группы в виде подсказки:

Разработчику предоставляется возможность настраивать режим группировки, указывая, какие синтаксические конструкции могут группироваться, и каким должно быть исходное состояние группировки (свернутая или развернутая) при открытии документа. Таким образом, он может настроить, например, использование группировок "по максимуму":

Области

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

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

Области выделяются с помощью двух инструкций препроцессора: #Область и #КонецОбласти . Единственное назначение этих инструкций - обозначить группируемые и сворачиваемые строки модуля.

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

Операции с блоками

Редактор позволяет выполнять ряд операций над выделенными блоками текста модуля: автоматическое форматирование, изменение отступа, добавление/удаление комментариев и переносов строк.

Форматирование модуля

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

Исходный текст:

Результат автоматического форматирования:

Увеличение/уменьшение отступа

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

Это облегчает ручное форматирование больших фрагментов кода.

Добавление/удаление комментариев

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

Добавление/удаление переноса строки

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

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

Переход по процедурам и функциям

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

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

Переход к определению процедур и функций

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

Контекстная подсказка

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

Контекстная подсказка также работает и для параметров некоторых методов, если эти параметры задаются строковыми литералами.

Копирование имен объектов и реквизитов

При написании текста модуля разработчик может просто перетаскивать мышью имена объектов или их реквизитов из дерева метаданных в нужное место модуля:

Проверка модуля

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

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

Кроме этого конфигуратор поддерживает выполнение полной проверки всех модулей, содержащихся в прикладном решении.

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

Ограничение доступа к модулю

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

Использование шаблонов

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

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

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,
ДАТАВРЕМЯ(2017,1,12),
ОстаткиТМЦ.Склад.Наименование
ИЗ
РегистрНакопления.ОстаткиТМЦ КАК ОстаткиТМЦ

СГРУППИРОВАТЬ ПО
ОстаткиТМЦ.Склад

Функции группировки (агрегатные)

  • СУММА (<Поле>)
  • КОЛИЧЕСТВО(<Поле>)
  • КОЛИЧЕСТВО (РАЗЛИЧНЫЕ <Поле>)
  • МАКСИМУМ (<Поле>)
  • МИНИМУМ (<Поле>)
  • СРЕДНЕЕ(<Поле>)

Другие возможности группировки

Допускается использование математических операторов над функциями группировки (+,*,/,-), а также конструкция ВЫБОР и поверх агрегата и внутри (в зависимости от потребностей)

ВЫБРАТЬ
,
СУММА(ОстаткиТМЦОбороты.СуммаОборот) КАК СуммаОборот,
СУММА(ОстаткиТМЦОбороты.КоличествоОборот) КАК КоличествоОборот,
ВЫБОР
КОГДА СУММА(ОстаткиТМЦОбороты.КоличествоОборот) = 0
ТОГДА 0
ИНАЧЕ СУММА(ОстаткиТМЦОбороты.СуммаОборот) / СУММА(ОстаткиТМЦОбороты.КоличествоОборот)
КОНЕЦ КАК СредняяЦена
ИЗ

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

Пример запроса без функций:
ВЫБРАТЬ
ОстаткиТМЦОбороты.Номенклатура
ИЗ
РегистрНакопления.ОстаткиТМЦ.Обороты КАК ОстаткиТМЦОбороты

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

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

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

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

СпрНоменклатура.Ссылка

Группировка в конструкторе запроса

Производится на одноименной вкладке.

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

Язык запросов 1С — одно из основных отличий между версиями 7.7 и 8. Одним из важнейших пунктов в изучении 1С-программирования является язык запросов. В 1С 8.3 запросы — самый мощный и эффективный инструмент получения данных. Язык запросов позволяет в удобном виде получать информацию из базы данных.

Сам синтаксис очень сильно напоминает классический T-SQL, за исключением того, что в 1С с помощью языка запросов можно только получать данные, используя конструкцию Выбрать(select). Язык поддерживает и более сложные конструкции, например, (запрос в запросе). Запросы в 1С 8 можно составлять как на кириллице, так и на латинице.

В статье я постараюсь рассказать про основные ключевые слова в языке запросов 1С:

  • выбрать
  • разрешенные
  • различные
  • выразить
  • первые
  • для изменения
  • значение
  • тип значения (и оператор ССЫЛКА)
  • выбор
  • сгруппировать по
  • имеющие
  • ЕСТЬNULL
  • Есть NULL
  • соединения — правые, левые, внутренние, полные .

А так же небольшие хитрости языка 1С, применяя которые вы сможете оптимально построить текст запроса.

Для отладки запросов в системе 1С 8.2 предусмотрен специальный инструмент — консоль запросов. Увидеть описание и скачать его можно по ссылке — .

Рассмотрим самые важные и интересные операторы языка запросов 1С.

ВЫБРАТЬ (SELECT)

В языке запросов 1С предприятия 8 любой запрос начинается с ключевого слова ВЫБРАТЬ . В языке 1С нет конструкций UPDATE, DELETE, CREATE TABLE, INSERT, эти манипуляции производятся в объектной технике. Предназначение его — только чтение данных.

Например:

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

Запрос вернёт таблицу с наименованиями номенклатуры.

Рядом с конструкцией ВЫБРАТЬ можно встретить ключевые слова ДЛЯ ИЗМЕНЕНИЯ , РАЗРЕШЕННЫЕ , РАЗЛИЧНЫЕ , ПЕРВЫЕ

РАЗРЕШЕННЫЕ — выбирает только записи из таблицы, на которые есть права у текущего пользователя.

РАЗЛИЧНЫЕ — означает, что в результат не попадет дублирующих строк.

ВЫБОР (CASE)

Очень часто данная конструкция недооценивается программистами. Пример её использования:

ТекущийСправочник.Наименование,

КОГДА ТекущийСправочник.Услуга ТОГДА

«Услуга»

КОНЕЦ КАК ВидНоменклатуры

Справочник.Номенклатура КАК ТекущийСправочник

Пример возвратит в поле «ВидНоменклатуры» текстовое значение — «Товар» или «Услуга».

ГДЕ (WHERE)

Конструкция языка запросов 1C, позволяющая наложить отбор на получаемые данные. Учтите, что от сервера система получает все данные, а только потом они отбираются по данному параметру.

ВЫБРАТЬ
Справочник.Наименование
ИЗ
ТекущийСправочник.Номенклатура КАК ТекущийСправочник
ГДЕ ТекущийСправочник.Услуга = ИСТИНА

В примере мы отбираем записи, у которых значение реквизита «Услуга» установлено в положение «Истина». В данном примере можно было бы обойтись и таким условием:

«ГДЕ Услуга»

По сути, мы отбираем строки, у которых выражение после ключевого слова равно «Истина».

В выражениях можно использовать прямые условия:

ГДЕ Код = «005215»

С помощью оператора «ЗНАЧЕНИЕ()» в условиях использовать обращение к предопределенным элементам и перечислениям в запросе 1С:

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

Значения времени могут указываться следующим образом:

ГДЕ ДатаПоступления > ДАТАВРЕМЯ(2012,01,01):

Чаще всего условия указываются в виде параметров, передаваемых в запрос:

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

ГДЕ НоменклатурнаяГруппа= &НоменклатурнаяГруппа

Условие можно наложить на тип реквизита, если он составного типа:

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

ГДЕ РегистрНакопления.Регистратор В (&СписокДокументовДляОтбора)

Условие может быть и сложное, состоящее из нескольких условий:

ГДЕ ДатаПоступления > ДАТАВРЕМЯ(2012,01,01) И НоменклатурнаяГруппа= &НоменклатурнаяГруппа И НЕ Услуга

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

Конструкция языка запросов 1С 8.2, используемая для группировки результата.

Например:

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

СГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслугTовары.Товар

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

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

ИМЕЮЩИЕ (HAVING)

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

Пример использования ИМЕЮЩИЕ в запросе 1С:

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

СГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслугТовары.товар

СУММА(ПоступлениеТоваровУслугТовары.Количество) > 5

Так мы отберем количество товаров, которых поступило более 5 штук.

ЗНАЧЕНИЕ()

Например:

ГДЕ Банк = Значение(Справочник.Банки.ПустаяСсылка)

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

ГДЕ ТипНоменклатуры= Значение(Перечисление.ТипыНоменклатуры.Услуга)

ТИП в запросе

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

ВЫРАЗИТЬ()

Оператор Выразить в запросах 1С служит для преобразования типов данных.

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

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

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

ВЫБРАТЬ
КонтактнаяИнформация.Объект,
ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(150)) КАК Представление
ИЗ
РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация

СГРУППИРОВАТЬ ПО
ВЫРАЗИТЬ(КонтактнаяИнформация.Представление КАК СТРОКА(150)),
КонтактнаяИнформация.Объект

ЕСТЬNULL (ISNULL)

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

ЕСТЬNULL(НалогиПредМесяца.ПримененнаяЛьготаФСС, 0)

Такая функция языка запросов 1С ЕСТЬNULL при отсутствии значения вернет ноль, что позволит избежать ошибки.

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

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

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

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

Пример левого соединения в запросе 1С:

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

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

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

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

Например:

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

ПО

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

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

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

Например:

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

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

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

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

Заключение

Это лишь небольшая часть синтаксиса из языка запросов 1С 8, в дальнейшем я попробую рассмотреть более подробно некоторые моменты, показать и многое другое!