Общая схема выполнения запросов

Запросы в системе "1С:Предприятие 8" предназначены для выборки информации из базы данных. По сути, запрос — это обращение к системе с просьбой выбрать определенную информацию из базы данных, а часто не только выбрать, но и произвести некоторую обработку: сгруппировать, отсортировать, вычислить. Например, с помощью запроса можно легко узнать объем продаж каждого товара в течение года с детализацией до месяца или выбрать элементы справочников по определенному условию. Заметьте, что изменять данные с помощью запросов в 1С:Предприятии не разрешается.

Язык запросов 1С:Предприятия 8 основан на стандартном SQL, но при этом содержит значительное количество расширений, ориентированных на финансово-экономические задачи, и значительно облегчает разработку бизнес-приложений.


Для работы с запросами в системе "1С:Предприятие 8" предусмотрено несколько специальных объектов, а именно:

Общая схема выполнения запроса такова:

  1. Создание объекта "Запрос" с нужным текстом запроса на специальном языке запросов.
  2. Установка параметров запроса с помощью метода УстановитьПараметр.
  3. Выполнение запроса, получение результата.
  4. Получение выборки из результата запроса или выгрузка результата в таблицу значений / дерево значений. Также есть возможность использовать результат запроса для формирования сводной таблицы.
  5. Обработка выборки или таблицы значений (например, перебор строк) и выполнение действий, для которых был нужен запрос, например, вывод области при формировании отчета

Графически это можно представить следующим образом:

Цифрами на схеме обозначены следующие действия:

1. Установка текста запроса

Объект "Запрос" имеет свойство "Текст", которое содержит строку с текстом запроса на языке запросов. Этому свойству, во-первых, можно явно присвоить значение или, во-вторых, воспользоваться конструктором объекта "Запрос". В последнем случае текст запроса передается в качестве параметра в конструктор объекта "Запрос" при его создании.

1-й вариант:

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

2-й вариант (с другим текстом запроса):

Копировать в буфер обмена
НашЗапрос = Новый Запрос ("ВЫБРАТЬ * ИЗ Справочник.Номенклатура"); 

2. Установка параметров запроса

Объект "Запрос" имеет метод "УстановитьПараметр", с помощью которого в запрос передаются значения параметров. Параметры запроса обычно используются в условиях отбора (конструкции ГДЕ, ИМЕЮЩИЕ) или в качестве параметров вызова виртуальных таблиц. В тексте запроса параметры обозначаются знаком "&" (например, параметр "ВыбГруппа" в первом запросе).

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

Копировать в буфер обмена
//здесь: "ВыбГруппа" - параметр запроса, 
// а "ВыбраннаяГруппаТоваров" - переменная, содержащая ссылку на группу справочника "Номенклатура".
НашЗапрос.УстановитьПараметр("ВыбГруппа", ВыбраннаяГруппаТоваров);

3. Выполнение запроса

После присвоения текста и установки параметров, запрос запускается на выполнение с помощью метода "Выполнить()" объекта "Запрос". Этот метод возвращает другой объект "РезультатЗапроса", содержащий выбранные данные из базы данных.

Копировать в буфер обмена
РезультатЗапроса = НашЗапрос.Выполнить(); 

Далее возможны три варианта:

4. Получение выборки из результата запроса

Объект "РезультатЗапроса" имеет метод "Выбрать()", который возвращает новый объект "ВыборкаИзРезультатаЗапроса". В зависимости от параметра <ТипОбхода> метода "Выбрать()" выборка будет линейной (по умолчанию), иерархической или по группировкам. Далее выборка обходится с помощью цикла "Пока Выборка.Следующий() Цикл", а в теле цикла производятся какие-то действия, например, вывод областей в табличный документ.

Копировать в буфер обмена
Выборка = РезультатЗапроса.Выбрать(); //по умолчанию применяется прямой тип обхода
//обход записей в выборке
Пока Выборка.Следующий() Цикл
	//обращение к полям
	Сообщить(Выборка.Наименование);
КонецЦикла;

5. Выгрузка результата запроса в таблицу или дерево значений

Объект "РезультатЗапроса" имеет метод "Выгрузить()", который возвращает таблицу значений или дерево значений, в зависимости от переданного параметра <Тип обхода>. Если устанавливается прямой тип обхода (по умолчанию), то будет создана таблица значений, иначе — дерево значений. Далее таблица значений (дерево значений) может быть обработана средствами встроенного языка или показана пользователю в табличном поле.

Копировать в буфер обмена
ТабЗнач = РезультатЗапроса.Выгрузить(); //по умолчанию прямой тип обхода
ДеревоЗнач = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); 

6. Формирование сводной таблицы

Результат запроса может быть использован как источник данных для сводной таблицы. При этом итоги (см. предложение ИТОГИ в тексте запроса) становятся ресурсами (отображаются в области данных), а группировочные поля, по которым они подсчитываются, становятся измерениями сводной таблицы. В качестве источника данных для сводной таблицы может быть также использован объект "ПостроительОтчета", но ему на вход тоже подается запрос, поэтому можно сказать, что основа любой сводной таблицы — это запрос к базе данных.

Копировать в буфер обмена
ТД = ЭлементыФормы.ПолеТабличногоДокумента1;
СводнаяТаблица = ТД.ВстроенныеТаблицы.СводнаяТаблица1;
СводнаяТаблица.ИсточникДанных = РезультатЗапроса;  //<= вот здесь самое важное!
СводнаяТаблица.ОтображатьПоля = Истина;

Резюме


См. также
Сводные таблицы