Смекни!
smekni.com

Запросы. Терминология и обозначения (стр. 1 из 3)

Запросы. Терминология и обозначения

- "Запрос" - объект метаданных типа "Запрос";

- Текст запроса - текстовое описание запроса к ИБ на специализированном языке запросов;

- Выборка - набор данных, полученных в результате выполнения запроса;

- Группировка данных - накопление различных значений одного и того же типа данных.

- Отчёт - совокупность текста запроса, процедуры его выполнения и интерпретации выбранных данных.

Введение

С чего начать

Начнем с начала

Для начала, прежде чем проектировать запрос, необходимо задаться вопросом: "Что же я хочу в результате получить?". Да, да, именно так все и начинается, с тривиальной "постановки задачи".

Постановка задачи

Предположим, я хочу получить "Данные об оборотах и остатках товаров на складах за какой-то период времени" в виде вот такой таблицы:

Формирование текста запроса

Уже изначально, в постановке задачи прозвучали все необходимые данные для построения запроса, такие как: обороты, остатки, товары, склады и период времени . Начнем по порядку:

1. "... за какой-то период времени". Значит, мы можем описать период времени, за который запрос будет извлекать информацию. Отразим это:

Период с '98' по '98'

Правды ради, следует отметить, что задание конкретных дат интервала запроса не слишком удобно в большинстве случаев, поэтому создадим в модуле отчета две внешние переменные, определяющие дату начала и конца запроса - ДатаС и ДатаПо :

Период с ДатаС по ДатаПо;

2. "Данные об оборотах и остатках товаров ...". Значит, мы хотим видеть перечень товаров. Ну что ж, давайте так и сделаем - объявим переменную запроса - Товар

Товар =

3. "Данные об оборотах и остатках товаров на складах ...". Для каждого товара хотим отобразить склад, на котором он хранится. Для этого объявляем переменную Склад :

Склад =

4. "Данные об оборотах ". Во-первых, необходимо определиться, какие конкретные обороты мы хотим отразить: денежные, количественные. Давайте определим

Количество =

Поскольку нам нужны данные об оборотах, то следует объявить и сами функции накопления:

Приход = Функция Приход(Количество);

Расход = Функция Расход(Количество);

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

5. "Данные об остатках ". Объявим функции остатков:

НачОст = Функция НачОст(Количество);

КонОст = Функция КонОст(Количество);

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

Товар = Регистр.ТовЗап.Товар;

Склад = Регистр.ТовЗап.Склад;

Количество = Регистр.ОстаткиТоваров.ОстатокТовара;

6. Если мы хотим получить перечень товаров, то нам необходимо эти товары группировать, то есть отображать различные виды товаров. Для чего мы заводим группировку по переменной Товар :

Группировка Товар;

7. Те же самые резоны приводят нас к созданию группировки по переменной Склад :

Группировка Склад;

8. Теперь соберем полный текст запроса, который можно присвоить какой-нибудь переменной модуля отчёта, скажем, ТекстЗапроса:

ТекстЗапроса =

"Период с ДатаС по ДатаПо

|Товар = Регистр.ТовЗап.Товар;

|Количество = Регистр.ТовЗап.ОстатокТовара;

|Приход = Функция Приход(Количество);

|Расход = Функция Расход(Количество);

|НачОст = Функция НачОст(Количество);

|КонОст = Функция КонОст(Количество);

|Группировка Товар;

|Группировка Склад;

|"//}}ЗАПРОС

;

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

Что происходит внутри

Как текст запроса превращается в выборку?

После того, как создан агрегатный объект типа "Запрос":

Запрос = СоздатьОбъект("Запрос");

сформулирован текст запроса и присвоен переменной ТекстЗапроса , запрос запускается на выполнение:

Запрос.Выполнить(ТекстЗапроса);

Что же происходит внутри этого метода? Как же там всё устроено?

Попадая в метод Выполнить , текст запроса превращается в выборку путём следующих метаморфоз:

- проверка синтаксиса;

- создание таблицы выборки;

- накопление данных.

Проверка синтаксиса

Правильность написания текста

Сначала проверяется правильность написания самого текста запросов - синтаксическая проверка запроса. Может быть пропущен символ ";", может быть неверно указан путь переменной запроса, в любом случае ошибки должны быть обнаружены и исправлены.

Для выявления синтаксических ошибок на стадии разработки (ещё при работе в конфигураторе) воспользуйтесь пунктом меню " Действия – Синтаксический контроль запросов... " , выберите запросы для проверки и нажмите кнопку OK.

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

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

достаточно подробно описано в книге "Описание встроенного языка. Часть 2". Но хотелось бы ещё раз обратить внимание на то, что описание переменной обуславливает характер обхода ИБ для формирования выборки. Мы можем описать переменную Товар различными способами:

Товар = Справочник.Товар.ТекущийЭлемент;

или

Товар = Документ.РасходнаяНал.Товар;

или

Товар = Регистр.ОстаткиТоваров.Товар;

и во всех трех случаях запрос будет вести себя по-разному. В первом случае запрос пройдет по всем элементам справочника Товар и выдаст полный его перечень. Во втором случае запрос пройдет по документам типа РасходнаяНал и выберет только те товары, которые были проданы по этим документам. А в третьем случае запрос пройдет по движениям или по остаткам регистра (в зависимости от того, какие функции были применены в запросе) и соберет те товары, которые участвовали в этих движениях или присутствовали в остатках.

Если переменную описывают путем с более чем одной ссылкой на объект типа справочник, документ, план счетов и т.д., то говорят, что переменная описана ДЛИННЫМ ПУТЕМ, например

Валюта = Регистр.ОстаткиТоваров.Товар.ВалютаРаботы;

Адрес = Документ.РасходнаяНал.Клиент.Адрес;

Так же хотелось обратить внимание на следующие особенности синтаксиса. При работе с регистрами имеется возможность обращения не только к документу, вызвавшему движение регистра:

Док = Регистр.ИмяРегистра.ТекущийДокумент;

но и к общим реквизитам документов:

Реквизит = Регистр.ИмяРегистра.ТекущийДокумент. ИмяРеквизита;

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

Поле = Регистр.ИмяРегистра.ТекущийДокумент. ИмяДокумента.ИмяПоля;

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

Поле = Регистр.ИмяРегистра.ТекущийДокумент.

ИмяДокумента1.ИмяПоля,

Регистр.ИмяРегистра.ТекущийДокумент. ИмяДокументаN.ИмяПоля;

Для ИБ в формате .DBF не следует злоупотреблять длинными путями, так как это увеличивает время формирования выборки, ведь запросу приходится считывать не только реквизит указанного документа или регистра, но и по ссылке на объект считывать сам этот объект для извлечения данных. Что нельзя сказать о ИБ в формате SQL. Объект Запрос формирует запрос к SQL серверу, и чем больше работы будет переложено на плечи SQL сервера, тем быстрее будет формироваться выборка.

Оператор Период С

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

- Дата - в формате встроенного языка '64', '1995'.

Внешняя переменная - глобальная переменная модуля отчёта или идентификатор элемента управления формы отчёта типа Дата или Документ . Если переменная - типа Документ , то интервал запроса устанавливается на дату и время указанного документа.

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

Период с (ДатаС + 1) по (ПолучитьДокументТА());.

Оператор Условие

Задаёт условие включения данных в выборку. Для оптимизации времени выполнения запроса следует знать, что в 1С:Предприятии версии 7.7 запрос сам выполняет, а не вызывает для этого исполнительную среду встроенного языка, условия вида:

ЛеваяЧастьУсловия знакСравнения ПраваяЧастьУсловия

где,

ЛеваяЧастьУсловия и ПраваяЧастьУсловия могут быть константой, переменной запроса или внешней переменной;

знакСравнения - логический оператор (">", "<", "=", "<>", ">=", "<=", "в", "in").

Ниже приведен пример запроса с элементарными условиями:

"//{{Запрос(ЭлементарноеУсловие)

|Период с ДатаС по ДатаПо;

|Товар = Документ.ПриходнаяНал.Товар;

|Дата = Документ.ПриходнаяНал.ДатаДок;

|КолВо = Документ.ПриходнаяНал.Количество;

|Группировка Товар упорядочить по Товар.Наименование;

|Условие(Дата <> ИсключитьДату);

|Условие(Товар = ВыбранныйТовар);

|Условие(КолВо >= 43);

|Условие((Дата <> ИсключитьДату) ИЛИ (КолВо >= 43))

"//}}

;

Следует обратить внимание на то, что отдельные условия в