Глава 34-1 Язык Запросов
Язык запросов предназначен для описания запросов к документам, справочникам,
регистрам, журналам расчетов, планам счетов, бухгалтерским операциям и проводкам.
Текст описания запроса передается методу Выполнить
(см. Главу «Работа с Запросами») в качестве параметра. В результате выполнения
этого метода генерируется временный выходной набор данных, который в дальнейшем
используется для заполнения формы отчета.
Формат текста описания запроса
Текст описания запроса на языке запросов состоит из последовательности операторов.
Концом оператора является символ ;. Операторы могут записываться
в любом порядке, однако, следует помнить, что интерпретатор языка запросов однопроходный,
следовательно, сначала следует описать переменную, и только потом ее использовать
в операторах Группировка,
Функция
или Условие.
Пример:
ТекстЗапроса =
//({ЗАПРОС(РасчЛистки)
| // Задаем интервал запроса
|Период с ДатаНач по ДатаКон;
| // Определяем внутренние переменные
|Рез = ЖурналРасчетов.Зарплата.Результат;
|Расч = ЖурналРасчетов.Зарплата.ВидРасч;
|Дни = ЖурналРасчетов.Зарплата.Дни;
|Сотр = ЖурналРасчетов.Зарплата.Объект;
| // Назначаем группировки
|Группировка Сотр без групп;
|Группировка Расч;
| // Назначаем функции
|Функция Сум = Сумма(Рез);
|Функция Дней = Сумма(Дни);
| // Назначаем условие
|Условие(Рез 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 |
Счет, для обработки корреспонденции. Корреспондирующим счетом, для которого
является КорСчет. |
Пример:
*
Запрос = СоздатьОбъект(Запрос);
ТекстЗапроса = //{{ЗАПРОС(Сформировать)
|Период с НачДата по КонДата;
|ДОКУМ = Документ.РасходнаяБН.ТекущийДокумент,
| Документ.РасходнаяКредит.ТекущийДокумент,
| Документ.РасходнаяНал.ТекущийДокумент,
| Документ.РасходнаяРеализ.ТекущийДокумент,
| Документ.Счет.ТекущийДокумент;
|Группировка ДОКУМ; //по документам
|//}}ЗАПРОС
;
*
//Создание объекта типа Запрос
Запрос = СоздатьОбъект(Запрос);
ТекстЗапроса =
//{{ЗАПРОС(Печать)
|Товар = Справочник.Товары.ТекущийЭлемент;
|Группировка Товар Упорядочить по Товар.МинЗапас;
|//}}ЗАПРОС
*
Запрос = СоздатьОбъект(Запрос);
ТекстЗапроса =
//{{ЗАПРОС(Сформировать)
|Период с НачДата по КонДата;
|ВидТоплива = Регистр.ПокупателиКолво.ВидыТоплива;
|Вес = Регистр.ПокупателиКолво.Кг;
|Покуп = Регистр.ПокупателиКолво.Покупатели;
|Док = Регистр.ПокупателиКолво.ТекущийДокумент;
|Ном = Регистр.ПокупателиКолво.НомерСтроки;
|Группировка ВидТоплива; //по измерению Регистра
|Группировка Док; // по документам, двигавшим Регистр
|Группировка Ном; // по номерам строк документов
|Функция ВсегоКолво = КонОст(Вес);
|Функция ПриходКолво = Приход(Вес);
|Условие(Покуп = ВыбПокупатель);
|//}}ЗАПРОС
;