Язык запросов предназначен для описания запросов к документам, справочникам, регистрам, журналам расчетов, планам счетов, бухгалтерским операциям и проводкам. Текст описания запроса передается методу Выполнить (см. Главу «Работа с Запросами») в качестве параметра. В результате выполнения этого метода генерируется временный выходной набор данных, который в дальнейшем используется для заполнения формы отчета.
Текст описания запроса на языке запросов состоит из последовательности операторов. Концом оператора является символ ";". Операторы могут записываться в любом порядке, однако, следует помнить, что интерпретатор языка запросов однопроходный, следовательно, сначала следует описать переменную, и только потом ее использовать в операторах Группировка, Функция или Условие.
Пример:
ТекстЗапроса =
"//({ЗАПРОС(РасчЛистки)
| // Задаем интервал запроса
|Период с ДатаНач по ДатаКон;
| // Определяем внутренние переменные
|Рез = ЖурналРасчетов.Зарплата.Результат;
|Расч = ЖурналРасчетов.Зарплата.ВидРасч;
|Дни = ЖурналРасчетов.Зарплата.Дни;
|Сотр = ЖурналРасчетов.Зарплата.Объект;
| // Назначаем группировки
|Группировка Сотр без групп;
|Группировка Расч;
| // Назначаем функции
|Функция Сум = Сумма(Рез);
|Функция Дней = Сумма(Дни);
| // Назначаем условие
|Условие(Рез <> 0);
|"//}}ЗАПРОС
;
// ...
В синтаксических диаграммах языка запросов используются следующие символы:
Символ |
Значение |
[ ] |
В квадратных скобках заключаются необязательные синтаксические элементы. |
[ ]+ |
В квадратных скобках со знаком "+" заключаются обязательные синтаксические элементы, которые могут использоваться один или более раз. |
[ ]* |
В квадратных скобках со знаком "*" заключаются необязательные синтаксические элементы, которые могут использоваться один или более раз. |
( ) |
Круглые скобки заключают в себе список параметров. |
| |
Вертикальной линией разделяются синтаксические элементы, среди которых нужно выбирать один и только один. |
Ключевые слова — это слова, которые используются языком запросов для обозначения встроенных операторов.
Приведенные далее ключевые слова являются зарезервированными и не могут использоваться в качестве имен внутренних переменных описания запросов. Каждое ключевое слово имеет как минимум два представления — русское и английское. Английское представление является традиционным для языков программирования. Ключевые слова в русском и английском представлении могут свободно смешиваться в одном исходном тексте. Регистр букв ключевых слов не имеет значения. Ниже приведен полный список зарезервированных слов языка запросов в обоих представлениях.
Русский яз. |
Английский яз. |
Без |
Without |
Год |
Year |
Групп |
Groups |
Группировка |
Group |
День |
Day |
Документ |
Document |
И |
And |
Или |
Or |
Квартал |
Quarter |
Когда |
When |
Месяц |
Month |
Неделя |
Week |
НомерСтроки |
LineNum |
Обрабатывать |
Process |
ОбрабатыватьДокументы |
ProcessDocuments |
ОбрабатыватьОперации |
PrосessOperations |
Период |
Period |
ПериодЖурнала |
Journal Period |
По |
By |
По |
Till |
С |
From |
СтрокаДокумента |
Document Line |
Упорядочить |
Order |
Условие |
Condition |
Функция |
Function |
Все ключевые слова могут быть набраны в любом регистре (верхний и нижний), например: Функция, ФУНКЦИЯ, фУНКЦИЯ .
Комментарий в тексте описания запроса начинается парой символов //и заканчивается концом строки.
Пример:
// Это — комментарий
Группировка Кат; // Это тоже комментарий
Язык содержит следующие типы констант:
Числовая константа описывается следующей синтаксической диаграммой:
[+|-][0-9]+ | [0-9]*.[0-9]+
Пример:
-17
43.712
.43842
Строковая константа — это строка, заключенная в двойные кавычки.
Пример:
"Это текстовая константа" // ОК
"Это ошибочная константа
и должна находиться на одной строке" // Ошибка
Константа типа "дата" задается в виде строки, заключенной в одинарные кавычки, в формате 'ДД.ММ.ГГ' или 'ДД.ММ.ГГГГ'.
Пример:
'21.05.96'
'25.09.1964'
Внутренняя переменная — это переменная, объявленная в тексте описания запроса. Именем переменной может быть любая последовательность букв, цифр и знаков подчеркивания "_", начинающаяся с буквы или знака подчеркивания "_". Имена внутренних переменных не должны совпадать с зарезервированными словами языка запросов. Распознавание имен переменных, названий операторов, процедур и функций ведется без учета регистра букв.
Пример:
*
// имена внутренних переменных в описании запроса
_43842 // ОК
НачалоПериода // ОК
712piece // Ошибка: начинается с цифры
Week // Ошибка: ключевое слово зарезервировано
*
// применение имен внутренних переменных описания запроса
// в программном модуле после позиционирования строки
// выборки функцией Группировка
Сотр = НовЗапрос.Сотр;
Кат = НовЗапрос.Кат;
ИТОГ = НовЗапрос.Итого;
Конкретизация переменной — это уточнение описания внутренней переменной, если это возможно в текущем контексте. Конкретизации переменной могут использоваться в языке запросов в операторах Группировка ... Упорядочить По и в качестве аргумента оператора Функция (см. далее).
Синтаксис:
<ВнутренняяПеременная>[.<Путь>]+;
Параметры:
<ВнутренняяПеременная> |
Идентификатор объявленной ранее внутренней переменной. |
<Путь> |
Доступный атрибут внутренней переменной или конкретизации переменной (см. «Атрибуты, доступные при описании внутренних переменных»). |
Пример:
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
" //{{ЗАПРОС(ОбработкаДок)
|Период с '01.10.96' по '05.10.96';
|ОбрабатыватьДокументы Все;
|Тов = Справочник.Товары.ТекущийЭлемент, Документ.РасхНакл.Товар;
| // используем конкретизацию внутренней переменной Тов
|Группировка Тов Упорядочить По Тов.Наименование;
|Группировка Документ;
|Группировка СтрокаДокумента;
|"//}}ЗАПРОС
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Внимание! Запрос не манипулирует величинами типа «Строка неограниченной длины».
Внешние переменные — это переменные из области видимости процедуры или функции программного модуля, в теле которого используется данный запрос. Внешние переменные в тексте описания запроса могут использоваться в операторах Период С и Условие.
Пример:
Перем ДатаНач, ДатаКон;
Процедура Сформировать()
Если (Число(ДатаНач) = 0) ИЛИ (Число(ДатаКон) = 0) Тогда
Предупреждение("Не задан период!");
Возврат;
КонецЕсли;
// Создание объекта типа "Запрос"
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
| // используем внешние переменные ДатаНач и ДатаКон
|с ДатаНач по ДатаКон;
|Рез = ЖурналРасчетов.Зарплата.Результат;
|Сотр = ЖурналРасчетов.Зарплата.Объект;
|Группировка Сотр без групп;
|Группировка ПериодЖурнала;
|Функция Сум = Сумма(Рез);
|"//}}ЗАПРОС
;
// используем внешнюю переменную ВыбСотр
Если ВыбСотр.Выбран() = 1 Тогда
// используем в запросе внешнюю переменную ВыбСотр
ТекстЗапроса = ТекстЗапроса + "Условие(Сотр = ВыбСотр);";
КонецЕсли;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапр) = 0 Тогда
Возврат;
КонецЕсли;
...
КонецПроцедуры // ВыбСотр — это реквизит диалога
В языке запросов можно обращаться к атрибутам следующих видов данных:
Русское назв. |
Англ. Назв. |
Описание |
Документ |
Document |
Данные документов. |
Справочник |
Reference |
Данные справочников. |
Регистр |
Register |
Данные регистров. |
ЖурналРасчетов |
CalcJournal |
Данные журналов расчета. |
Счет |
Account |
Данные счетов. |
Операция |
Operation |
Данные бухгалтерских операций и проводок. |
Эти названия являются первыми в пути описания переменных. В качестве атрибутов допускается использовать любые реквизиты, которые заданы для них в конфигураторе в дереве метаданных (реквизиты для справочников, документов и журналов расчетов; измерения и ресурсы для регистров). Кроме этих атрибутов, разрешен так же доступ к следующим предопределенным атрибутам:
Доступные атрибуты объектов типа «Документ»:
Русское назв. |
Англ. Назв. |
Описание |
ВремяДок |
DocTime |
Время документа. |
ДатаДок |
DocDate |
Дата документа. |
НомерДок |
DocNum |
Номер документа. |
НомерСтроки |
LineNum |
Номер строки документа. |
ТекущийДокумент |
CurDocument |
Значение текущего документа. |
Доступные атрибуты объектов типа «Справочник»:
Русское назв. |
Англ.назв. |
Описание |
родитель |
Parent |
Родитель элемента многоуровневого справочника. |
Владелец |
Owner |
Владелец подчиненного справочника. |
Код |
Code |
Код элемента справочника. |
Наименование |
Description |
Наименование элемента справочника. |
ТекущийЭлемент |
CurItem |
Значение текущего элемента справочника. |
Доступные атрибуты объектов типа «Регистр»:
Русское назв. |
Англ.назв. |
Описание |
НомерСтроки |
LineNum |
Номер строки документа, выполнившего движение регистра (в случае, когда в Модулях документов в конфигурации перед движением регистра использовали метод ПривязыватьСтроку). |
ТекущийДокумент |
CurDocument |
Значение документа, выполнившего движение регистра. |
Доступные атрибуты объектов типа «ПланСчетов»:
Русское назв. |
Англ. назв. |
Описание |
БезКорреспонденций |
IsSingle |
Флаг того, что элемент плана счетов — забалансовый. |
Валютный |
IsCurrency |
Флаг валютного учета элемента плана счетов. |
КОД |
Code |
Код элемента плана счетов. |
Количественный |
Is Amount |
Флаг количественного учета элемента плана счетов. |
Наименование |
Description |
Наименование элемента плана счетов. |
ТекущийСчет |
CurAccount |
Значение текущего счета плана счетов. |
Доступные атрибуты объектов типа «Операция»:
Русское назв. |
Англ. Назв. |
Описание |
ВремяОперации |
OperTime |
Время операции. |
ДатаОперации |
OperDate |
Дата операции. |
Содержание |
Description |
Содержание операции. |
СуммаОперации |
OperSum |
Сумма операции. |
ТекущийДокумент |
CurDocument |
Значение документа создавшего операцию. |
Доступные атрибуты объектов типа «Проводка»:
Русское назв. |
Англ. назв. |
Описание |
ВалСумма |
CurSum |
Валютная сумма проводки (для счетов с валютным учетом). |
Валюта |
Currency |
Валюта проводки. |
Количество |
Amount |
Количество проводки (для счетов с количественным учетом). |
КорСчет |
CorAccount |
Корреспондирующий счет. Корреспондирующим счетом, для которого является Счет. |
Сумма |
Sum |
Сумма проводки. |
Счет |
Account |
Счет, для обработки корреспонденции. Корреспондирующим счетом, для которого является КорСчет. |
Пример:
*
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "//{{ЗАПРОС(Сформировать)
|Период с НачДата по КонДата;
|ДОКУМ = Документ.РасходнаяБН.ТекущийДокумент,
| Документ.РасходнаяКредит.ТекущийДокумент,
| Документ.РасходнаяНал.ТекущийДокумент,
| Документ.РасходнаяРеализ.ТекущийДокумент,
| Документ.Счет.ТекущийДокумент;
|Группировка ДОКУМ; //по документам
|"//}}ЗАПРОС
;
*
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Печать)
|Товар = Справочник.Товары.ТекущийЭлемент;
|Группировка Товар Упорядочить по Товар.МинЗапас;
|"//}}ЗАПРОС
*
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с НачДата по КонДата;
|ВидТоплива = Регистр.ПокупателиКолво.ВидыТоплива;
|Вес = Регистр.ПокупателиКолво.Кг;
|Покуп = Регистр.ПокупателиКолво.Покупатели;
|Док = Регистр.ПокупателиКолво.ТекущийДокумент;
|Ном = Регистр.ПокупателиКолво.НомерСтроки;
|Группировка ВидТоплива; //по измерению Регистра
|Группировка Док; // по документам, двигавшим Регистр
|Группировка Ном; // по номерам строк документов
|Функция ВсегоКолво = КонОст(Вес);
|Функция ПриходКолво = Приход(Вес);
|Условие(Покуп = ВыбПокупатель);
|"//}}ЗАПРОС
;