Основная страница

 

Глава 34-2
Язык Запросов


 

Операторы языка запросов

Объявление внутренней переменной

Синтаксис:

<ИмяПеременной> = <ОписаниеПеременной> [, <ОписаниеПеременной>]+;

Параметры:

<ИмяПеременной>

Имя объявляемой внутренней переменной описания запроса.

<ОписаниеПеременной>

Указывает на доступный в языке запросов атрибут документа, справочника, регистра или журнала расчетов (см. «Атрибуты, доступные при описании внутренних переменных»).

Описание:

Внутренние переменные используются в тексте запроса для образования ссылок на объекты конфигурации, чтобы использовать их при построении таких операторов запроса, как Группировка, Функция, Условие.

В объявлении внутренней переменной можно указывать несколько вариантов <ОписанияПеременной>. Все описания должны указывать на один и тот же тип данных (число, строку, справочник или документ). Переменной, указывающей на разные справочники или документы присваивается тип данных «Справочник неопределенного вида» или «Документ неопределенного вида» соответственно.

* Например, можно определить внутреннюю переменную:

Товар = Документ.Перемещение.Товар, Документ.Расходная.Товар;

и использовать ее для создания Группировки. Такой состав внутренней переменной как бы дает Группировке задание — просмотреть все документы видов "Перемещение" и "Расходная" и выбрать все товары, встречающиеся либо в документах вида "Перемещение", либо в документах "Расходная".

* Еще пример. Допустим, у нас есть регистр "Взаиморасчеты" и регистр "Кредиты", и в том и в другом есть измерение "Клиент". Определяем внутреннюю переменную:

Должник = Регистр.Взаиморасчеты.Клиент, Регистр.Кредиты.Клиент;

Если использовать такую внутреннюю переменную для образования Группировки, то она будет означать следующее: пройти по регистру "Взаиморасчеты" и по регистру "Кредиты", вычислить заданные в запросе Функции и выбрать значения "Клиентов", для которых значения хотя бы одной функции будет ненулевой. Здесь мы видим, что формирование запроса по регистрам имеет некоторые особенности (обязательно наличие Функций, причем их вычисленные значения должны быть отличны от нуля, только в этом случае найденные объекты включаются во временный набор данных формируемый запросом).

Если описания внутренней переменной указывают на разные типы данных, например, на «Справочник» и на «Документ», то это просто вызовет сообщение об ошибке. Например, следующее определение внутренней переменной будет ошибочным:

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

// ЭТО ОШИБКА !!!

Однако, допускается в описании внутренней переменной указание на разные справочники либо на разные документы. Переменной, указывающей на разные справочники или документы присваивается тип данных «Справочник неопределенного вида» или «Документ неопределенного вида» соответственно.

* Например, правомерно задать такую внутреннюю переменную:

Парам = Документ.Счет.Клиент, Документ.Счет.Фирма;

(Здесь предполагается, что в контексте конфигурации, реквизиты "Клиент" и "Фирма" — это элементы справочников). Если использовать такую внутреннюю переменную для построения Группировки, то она будет означать следующее: пройти по документам "Счет" и выбрать значения клиентов и фирм, встречающихся в них (и, например, упорядочить эти элементы по наименованию). Как интерпретировать результаты полученной выборки при таком запросе — будет зависеть от контекста поставленной задачи.

В языке запросов описание внутренних переменных для агрегатных типов данных типа «Операция» и «Проводка» начинается со слова «Операция» вне зависимости от того, будет ли обращение к бухгалтерским операциям или к проводкам. <ОписаниеПеременной> определяется следующим образом:

Операция.(

   <Реквизиты0перации>

   |  <ПредРеквОпераций>

   |  <РеквизитыПроводок>

   |  <ПредРеквПроводок>

   |  Дебет.(

         Счет

         | <Субконто>

      )

   |  Кредит.(

         Счет

         | <Су6конто>

      )

   |  Субконто.

      <ВидСубконто>

   |  КорСубконто.

      <ВидСубконто>

)

<РеквизитыОперации>

Реквизиты операции объявленные в метаданных.

<ПредРеквОпераций>

Предопределенные реквизиты Операций.

<РеквизитыПроводок>

Реквизиты проводок, объявленные в метаданных.

<ПредРеквПроводок>

Предопределенные реквизиты Проводок.

<ВидСубконто>

Идентификатор вида субконто.

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

Применение слов "Субконто" и "КорСубконто" в описании переменных позволяют оперировать как субконто, так и корреспондирующим субконто.

*

Сум = Операция.Сумма;

Сч = Операция.Дебет.Счет, Операция.Кредит.Счет;

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

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

Для справочников использование конструкции ТекущийЭлемент в описании внутренней переменной означает выборку элемента справочника как такового (целиком всей записи справочника).

Аналогично при работе с документами, использование конструкции ТекущийДокумент в описании внутренней переменной, означает выборку документа как такового (целиком всего документа как объекта конфигурации). Сравните два примера:

Пример 1.

* Здесь нас интересуют товары, встречающиеся в документах.

ТОВАР = Документ.РасходнаяБН.Товар,

   Документ.РасходнаяКредит.Товар,

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

   Документ.РасходнаяРеализ.Товар,

   Документ.Счет.Товар;

Пример 2.

* Здесь нас интересуют сами документы указанных видов как таковые.

ДОКУМ = Документ.РасходнаяБН.ТекущийДокумент,

   Документ.РасходнаяКредит.ТекущийДокумент,

   Документ.РасходнаяНал.ТекущийДокумент,

   Документ.РасходнаяРеализ.ТекущийДокумент,

   Документ.Счет.ТекущийДокумект;

Использование для документов конструкции НомерСтроки в описании внутренней переменной, означает выборку номеров строк документов (не самих строк, а чисел, обозначающих номера строк в документе).

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

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

Использование для регистра конструкции НомерСтроки в описании внутренней переменной, означает выборку связанных номеров строк тех документов, которые произвели движение по регистру (в случае, когда в Модулях документов в конфигурации перед движением регистра использовали метод ПривязыватьСтроку).

Пример:

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

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

"//{{ЗАПРОС(Сформировать)

|Период с НачДата по КонДата;

|ВидТоплива = Регистр.ПокупателиКолво.ВидыТоплива;

|Покуп = Регистр.ПокупателиКопво.Покупатели;

|Док = Регистр.ПокупателиКолво.ТекущийДокумент;

|Ном = Регистр.ПокупателиКолво.НомерСтроки;

|Вес = Регистр.ПокупателиКолво.Кг;

|Группировка ВидТоплива; // по измерению Регистра

|Группировка Док; //по документам, двигавшим Регистр

|Группировка Ном; // по номерам строк документов

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

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

|Условие(Покуп = Покупат);

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

;

// Если ошибка в запросе, то выход из процедуры

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

   Возврат;

КонецЕсли;

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

Период С

Установить временной интервал дат формирования запроса.

Синтаксис:

[[Период] С <Дата>|<ВнешняяПерем> [ПО <Дата>|<ВнешПеременная>];]

Англоязычный синоним:

[[Period] From <Дата>|<ВнешПеременная> [Till <Дата> | <ВнешПеременная>];]

Параметры:

<Дата>

Константа типа «Дата», «Документ» или . позиция документа.

<ВнешПеременная>

Внешняя переменная типа «Дата», «Документ» или позиция документа. Если указан документ, то за момент времени принимается дата и время документа.

По

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

Описание:

Оператор Период С устанавливает интервал дат формирования запроса. Если в описании запроса оператор Период С опущен, то интервал дат формирования запроса устанавливается в точку актуальности итогов (ТА) (или на РабочуюДату, если не установлена компонента «Оперативный учет»), запрос формируется только на этот момент времени.

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

Параметрами оператора Период С являются значения момента времени («Дата», «Документ» или позиция документа) начала и конца временного интервала. Следует особо обратить внимание, что если интервал задается с точностью до даты, то интервал времени считается от начала даты нижней границы интервала до конца даты верхней границы интервала. Если вторая часть оператора после ключевого слова По пропущена или значение второго параметра команды равно нулю, то интервал времени применяется от начального момента времени до ТА (или по РабочуюДату, если не установлена компонента «Оперативный учет»). Это особенно важно при формировании запросов по регистрам, т. к. запрос по регистрам может строиться от любой даты в прошлом до ТА. Поэтому, если вы укажете в запросе верхнюю границу интервала большей или равной дате ТА, то программа скорее всего сообщит «Не могу рассчитать регистры за ТА» (поскольку время ТА лежит где то в пределах даты, а запрос пытается учесть всю дату в целом). Поэтому при формировании текста запроса следует вставлять дополнительную проверку типа той, что приведена в следу ющем примере:

Пример:

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

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

"Счет = Регистр.Cash.Счет;

|Статья = Регистр.Cash.Статья;

|СуммаЭквивалента2 = Регистр.Cash.СуммаЭквивалента2;

|СуммаЭквивалента1 = Регистр.Cash.СуммаЭквивалента1;

......

Если ДатаКонца >= ПолучитьДатуТА() Тогда

   ТекстЗапроса = ТекстЗапроса + "Период с ДатаНачала;";

Иначе

   ТекстЗапроса = ТекстЗапроса + "Период с ДатаНачала по ДатаКонца;";

КонецЕсли;

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

   Возврат;

КонецЕсли;

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

Применение конструкции "С ... По ..." приводит к тому, что выборка записей из журнала расчетов проводится по времени действия записей журнала расчетов, определяемых реквизитами журнала расчетов "ДатаНачала" и "ДатаОкончания", а не временем их ввода в журнал. Более подробно о двойственности временного представления журналов расчетов см. выше, в главе «Работа с Журналами расчетов».

Замечание. Работа запроса с журналами расчетов, с использованием конструкции "Период С ... По ...", аналогична выборке записей в журнале расчетов, организуемой при помощи метода журнала расчетов ВыбратьПериод. С другой стороны, запрос, использующий конструкцию "С ... По ...", аналогичен выборке, организуемой при помощи метода журнала расчетов ВыбратьЗаписи.

Пример:

*

Процедура РасчЛистки()

   Перем Запрос, Флаг;

   Перем ДатаНач, ДатаКон;

   ЖР = СоздатьОбъект{"ЖурналРасчетов.Зарплата");

   Нач = ЖР.НачалоТекущегоПериода();

   Кон = ЖР.КонецТекущегоПериода();

   //Создание объекта типа Запрос

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

   Флаг = Запрос.Выполнить(

   "//{{ЗАПРОС(РасчЛистки)

   |Период С ДатаНач По ДатаКон; // выборка по расчетным периодам!

   |Рез = ЖурналРасчетов.Зарплата.Результат;

   |Расч = ЖурналРасчетов.Зарплата.ВидРасч;

   |Дни = ЖурналРасчетов.Зарплата.Дни;

   |Сотр = ЖурналРасчетов.Зарплата.Объект;

   |Группировка Сотр без групп;

   |Группировка Расч;

   |функция Сум = Сумма(Рез);

   |функция Дней = Сумма(Дни);

   |Условие(Рез о 0);

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

   );

   // ...

КонецПроцедуры;

*

//Создание объекта типа Запрос

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

// ниже формируется текст запроса с выборкой по времени

// действия записей журнала расчетов, а не по расчетным периодам!

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

"//{{ЗАПРОС(Сформировать)

|С ДатаНач По ДатаКон;

|Рез = ЖурналРасчетов.Зарплата.Результат;

|Сотр = ЖурналРасчетов.Зарплата.Объект;

|ПЖ = ЖурналРасчетов.Зарплата.ПериодРегистрации;

|Группировка Сотр без групп;

|Группировка ПЖ;

|Функция Сум = Сумма(Рез);

"//}}ЗАПРОС

;

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

// ...

ОбрабатыватьДокументы

Назначить условие обработки документов в запросе.

Синтаксис:

ОбрабатыватьДокументы[Непроведенные|Проведенные|Все];

Англоязычный синоним:

ProcessDocuments[NonTransacted|Transacted|All];

Описание:

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

Пример:

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

ТекстЗапроса = "//{{ЗАПРОС(ОбработкаДок)

|Период с '01.10.96' по '05.10.96';

|ОбрабатыватьДокументы Все;

|Тов = Справочник.Товары.ТекущийЭлемент, Документ.РасхНакл.Товар;

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

|Группировка Документ;

|Группировка СтрокаДокумента;

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

;

// Если ошибка в запросе, то выход из процедуры

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

   Возврат;

КонецЕсли;

ОбрабатыватьОперации

Назначить условие обработки бухгалтерских операций в запросе.

Синтаксис:

ОбрабатыватьОперации[Включенные|Выключенные|Все];

Англоязычный синоним:

ProcessOperations[On|Off|All];

Описание:

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

Пример:

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

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

"//{{ЗАПРОС(ОбработкаОпер)

|Период с '01.10.96' по '05.10.96';

|ОбрабатыватьОперации Все;

|Опер = Операция.ТекущийДокумент;

|Группировка Опер;

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

;

// Если ошибка в запросе, то выход из процедуры

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

   Возврат;

КонецЕсли;

Обрабатывать

Назначить условие обработки помеченных на удаление объектов в запросе.

Синтаксис:

Обрабатывать[ПомеченныеНаУдаление|НеПомеченныеНаУдаление|Все];

Англоязычный синоним:

Process[MarkedOnRemoving|NonMarkedOnRemoving|All];

Описание:

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

Пример:

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

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

"//{{ЗАПРОС(Обработка)

|Период с '01.10.96' по '05.10.96';

|Обрабатывать НеПомеченныеНаУлаление;

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

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

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

;

// Если ошибка в запросе, то выход из процедуры

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

   Возврат;

КонецЕсли;

Функция

Вычисляет функцию и включает ее результат в запрос.

Синтаксис:

Функция <ИмяФункции> = <ТипФункции> (<Параметр>|<УточненныйПараметр>)

                 [Когда (<Условие>)];

Англоязычный синоним:

Function <ИмяФункции>= <ТипФункции> (<Параметр>|<УточненныйПараметр>)

                 [When (<Условие>)];

Параметры:

<ИмяФункции>

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

<TипФyнкции>

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

<Параметр>

Имя объявленной ранее внутренней переменной, значение которой используется как параметр встроенной функции <ТипФункции>. В функциях: Сумма, Среднее, Максимум, Минимум в качестве данного параметра возможно использование арифметического выражения в терминах встроенного языка 1С:Предприятие.

<УточненныйПараметр>

Конкретизация объявленной ранее внутренней переменной, значение которой используется как аргумент встроенной функции < ТипФункции>.

Когда

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

<Условие>

Логическое выражение встроенного языка 1С:Предприятие. В логическом выражении могут участвовать как внутренние, так и внешние переменные запроса (см. описание метода Условие). Используется только после ключевого слова Когда.

Описание:

Оператор Функция вычисляет функцию <ТипФункции> и присваивает ее значение внутренней переменной <ИмяФункции>.

Типы применяемых функций предопределены и могут быть следующими:

Тип
Функции

Англояз. Синоним

Выполняемое действие

Сумма

Sum

Вычисляет сумму выбранных по запросу значений параметра.1

Среднее

Avg

Вычисляет среднее из выбранных по запросу значений параметра.

Минимум

Min

Вычисляет минимум из выбранных по запросу значений параметра.

Максимум

Мах

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

Счётчик

Count

Подсчитывает количество записей, вошедших в выборку.

НачОст

BegRest

Вычисляет начальный остаток для выбранных по запросу значений параметра.2

КонОст

EndRest

Вычисляет конечный остаток для выбранных по запросу значений параметра.2

Приход

Debit

Вычисляет приход для выбранных но запросу значений параметра.2

Расход

Credit

Вычисляет расход для выбранных по запросу значений параметра.2

СНД

IDB

Вычисляет сальдо начальное дебетовое для выбранных по запросу значений параметра.3

СКД

FDB

Вычисляет сальдо конечное дебетовое для выбранных по запросу значений параметра.3

СНК

ICD

Вычисляет сальдо начальное кредитовое для выбранных по запросу значений параметра.3

СКК

FCD

Вычисляет сальдо конечное кредитовое для выбранных по запросу значений параметра.3

ДО

TD

Вычисляет дебетовые обороты для выбранных по запросу значений параметра.

КО

TC

Вычисляет кредитовые обороты для выбранных по запросу значений параметра.3

КорДО

CorTD

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

КорКО

CorTC

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

1Замечание: Для ресурсов оборотных регистров допускается вызывать только тип функции "Сумма".

2Замечание: Типы функций НачОст, КонОст, Приход, Расход можно использовать только с параметрами, указывающими на ресурсы регистров остатков. Для ресурсов регистров остатков другие типы функций вызывать нельзя.

3Замечание: Функции СНД, СНК, СКД, СКК, ДО, КО, КорДО, КорКО можно использовать только с реквизитами проводки: Сумма, Количество или ВалСумма.

4Замечание: Функции КорДО и КорКО накапливают значения только тогда когда в запросе есть обращение к реквизитам проводок Счет, КорСчет Субконто или КорСубконто.

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

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

Пример:

...

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

|Цена = Документ.ВидДокумента.Цена;

|Функция Сум = Сумма(КолВо * Цена);

|Функция Макс = Максимум(Окр(КолВо) * Окр(Цена));

|Функция Средн = Среднее(ФункцияОпределеннаяВМодуле(КолВо, Цена));

...

Пример:

// Создание объекта типа Запрос

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

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

"//{{ЗАПРОС(Функции)

|Период с ДатаНач по ДатаКон;

|Оклад = Справочник.Сотрудники.Оклад;

|Подр = Справочник.Сотрудники.Подразделение;

|Ктг = Справочник.Сотрудники.Категория;

|Группировка Подр без групп;

|Группировка Ктг без групп;

|Функция Всего = Сумма(Оклад);

|Условие((Ктг.Выбран() = 1) И (Подр.Выбран() = 1));

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

;

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

   Возврат;

КонецЕсли;

// ...

Итог = Запрос.Всего;

// ...

Оператор Функция предназначен для вычисления и накопления некоторых численных значений в процессе формирования выборки по запросу.

Кроме того, при формировании временного набора данных запрос специально формирует итоговые записи, в которые заносит накопленные значения вычисленных функций для каждой вложенной Группировки (подробнее об этом см. главу данной книги «Структура запросов и методика их использования»).

Операторы функций в запросе можно опускать, тогда запрос просто не будет ничего вычислять, а просто во временный набор данных заносятся записи со значениями Группировок. Однако это справедливо только для работы запросов по справочникам и по документам. При работе запроса по регистрам следует помнить, что в этом случае обязательно наличие Функций, причем только в том случае, когда их вычисленные значения отличны от нуля (хотя бы одной из заданных Функций), найденные объекты включаются во временный набор данных, формируемый запросом. Если при работе запроса по регистрам в тексте запроса операторы функций опущены, то программа не выдаст никакого сообщения об ошибке, добросовестно пройдет по всем Группировкам, не вычислит никаких значений Функций и, значит, ничего не запишет во временном файле.

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

В тексте запроса, при описании оператора Функция можно использовать необязательное ключевое слово Когда, использование которого в операторе означает, что вычисление функции следует производить только при условии, что значение логического выражения, заданного в параметре ключевого слова является ИСТИНА. Синтаксис применяемого логического выражения полностью аналогичен синтаксису разрешенному к применению в операторах Условие.

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

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

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

имеют четкий смысл — приращения, сделанные документом при движении регистра. С другой стороны, в той же группировке следующие функции:

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

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

явно не имеют смысла (в запросах по регистрам, обычно задают период запроса при помощи оператора Период C. Функция НачКол в данном примере должна по смыслу показывать остаток ресурса "Количество" на начальную дату запроса. Внутри группировки по документу вопрос: «Какой начальный остаток ресурса на дату 10.01.97?» по документу, проведенному, например, 13.01.97, не имеет смысла). Поэтому в таких ситуациях функция будет иметь нулевое значение.

Пример:

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

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

'//{{ЗАПРОС(Функции)

|Период с ДатаОтчета;

|Товар = Регистр.КвотыТоваров.Товар;

|Отдел = Регистр.КвотыТоваров.Отдел;

|Сотрудник = Регистр.КвотыТоваров.Сотрудник;

|Партнер = Регистр.КвотыТоваров.Партнер;

|Док = Регистр.КвотыТоваров.ТекущийДокумент;

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

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

|Группировка Отдел;

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

|Группировка Партнер;

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

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

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

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

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

|// Следующие Функции вычисляем только при определенных

|// условиях, чтобы получить отфильтрованные итоги

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

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

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

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

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

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

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

;

// Если ошибка в запросе, то выход из процедуры

Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

   Возврат;

КонецЕсли;

Группировка

Устанавливает порядок выборки информации.

Синтаксис:

Группировка <ИмяГруппировки>|<ПредопредГруппировка>

           [Упорядочить по <Порядок>[, <Порядок>]*]

           [Без Упорядочивания][Без Групп][Все [ВошедшиеВЗапрос]];

Англоязычный синоним:

Group <ИмяГруппировки>|<ПредопредГруппировка>

           [Order By <Порядок>[, <Порядок>]*]

           [Without Order][Without Groups][All [IncludedInQuery]];

Параметры:

<ИмяГруппировки>

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

<ПредопредГруппировка>

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

упорядочить по

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

<Порядок>

Используется только после ключевого слова Упорядочить по. Конкретизация внутренней переменной <ИмяГруппировки>, значение которой является параметром упорядочивания строк в группировке. Кроме того, в данном параметре можно использовать имя функции, объявленной в этом же запросе в операторе Функция.

Без Упорядочивания

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

Без Групп

Необязательное добавочное ключевое слово, использование которого назначает вывод в запрос только простых элементов справочников (исключая группы). Используется только для группировок, построенных на основе внутренней переменной типа «справочник».

Все

Необязательное добавочное ключевое слово, действие которого зависит от типа внутренней переменной, на основе которой построена группировка. Используется только для группировок, построенных на основе внутренней переменной типа «справочник» или для предопределенных группировок, задающих временной интервал (Год, Месяц, Квартал, Неделя, День). Для предопределенных временных группировок подразумевается, что в запрос будут включены любые значения данных (в том числе нулевые) в каждый заданный момент времени с даты начала запроса по дату конца запроса (интервал задается оператором Период С...) Для группировок по справочникам подразумевается, что в запрос будут включены любые значения данных (в том числе нулевые) для каждого допустимого элемента справочника.

ВошедшиеВЗапрос

Необязательное добавочное ключевое слово действие которого уточняет предыдущее ключевое слово «Все». Использование данного слова подразумевает, что в каждую строку запроса будут включены значения данных (в том числе нулевые), для которых есть ненулевое значение хотя бы в одной строке запроса.

Описание:

Оператор Группировка задает способ группировки информации и порядок ее упорядочивания в запросе.

Предопределенные группировки могут быть следующими:

Предопределенн. Группировка

Англояз.
Синоним

Выполняемое действие

Документ

Document

Позволяет детализацию до каждого документа.

СтрокаДокумента

DocumentLine

Позволяет детализацию до каждой строки табличной части каждого документа.

День
Неделя
Месяц
Квартал
Год

Day
Week
Month
Quarter
Year

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

Замечание: В программном модуле, где используется запрос, имя <ИмяГруппировки> (или <ПредопредГруппировка>) будет являться атрибутом запроса. Кроме того, это имя используется в качестве параметра метода запросов Группировка (см. главу «Работа с Запросами»).

Объекты, по которым запрос будет обрабатывать информацию и те значения которые он будет выбирать, упорядочивать и группировать во временном наборе данных, полностью определяются той внутренней переменной, на базе которой объявлена группировка (подробнее см. выше в разделе «Объявление внутренней переменной»).

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

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

По умолчанию, документы упорядочиваются в группировке по дате и времени документов, элементы справочников — в зависимости от основного представления, заданного при описании справочника в конфигураторе (код или наименование). Однако критерий упорядочивания в группировке можно установить при помощи необязательного ключевого слова "Упорядочить по". Параметры, следующие за данным ключевым словом, определяют упорядочивание строк в группировке.

С параметром упорядочивания связан специальный метод для доступа к значениям объекта «Запрос». Речь идет об использовании метода ЗначениеУпорядочивания. В программном модуле, после того как запрос уже сформирован, мы можем при помощи этого метода получить значение поля упорядочивания из временного набора данных, не обращаясь к базе данных. Например, если у нас в запросе была группировка "Товар", а нам для формирования некоторого отчета нужны значения наименований товаров, то эти наименования товаров можно получить двумя способами:

Наим = Запрос.Товар.Наименование;

или

Наим = 3апрос.ЗначениеУпорядочивания("Товар", 1);

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

Пример:

Процедура Группировки()

   Перем Запрос, ТекстЗапроса;

   Перем ДатаНач, ДатаКон;

   ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");

   Нач = ЖР.НачалоТекущегоПериода();

   Кон = ЖР.КонецТекущегоПериода();

   //Создание объекта типа Запрос

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

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

   "//{{ЗАПРОС(Группировки)

   |Период с ДатаНач по ДатаКон;

   |Рез = ЖурналРасчетов.Зарплата.Результат;

   |Расч = ЖурналРасчетов.Зарплата.ВидРасч;

   |Дни = ЖурналРасчетов.Зарплата.Дни;

   |Сотр = ЖурналРасчетов.Зарплата.Объект;

   |Группировка Сотр без групп;

   |Группировка Расч;

   |Функция Сум = Сумма(Рез);

   |Функция Дней = Сумма(Дни);

   |Условие(Рез о 0);

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

   ;

   // Если ошибка в запросе, то выход из процедуры

   Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда

      Возврат;

   КонецЕсли;

   // Подготовка к заполнению выходных форм данными запроса

   Таб = СоздатьОбъект("Таблица");

   Пока Запрос.Группировка("Сотр") = 1 Цикл

      // Заполнение полей Сотр

      Таб.ВывестиСекцию("Сотр ");

      Пока Запрос.Группировка("Расч") = 1 Цикл

         // Заполнение полей

         Расч Таб.ВывестиСекцию("Расч");

      КонецЦикла;

   КонецЦикла;

   Таб.Опции(0, 0, 0, 0);

   Таб.ТолькоПросмотр(1);

   Таб.Показать("Результат", );

   // Вывод заполненной формы

КонецПроцедуры

Без итогов

Не накапливать итоги по группировкам.

Синтаксис:

Без итогов;

Англоязычный синоним:

Without Totals;

Описание:

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

В случае применения данного оператора в тексте запроса, при обходе результатов запроса применяется только один цикл обхода, используя метод объекта «Запрос» Группировка() без параметра.

Пример:

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

Текст3апроса = "

...

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

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

|Без Итогов; ";

Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда

   Возврат;

КонецЕсли;

Пока Запрос.Группировка() = 1 Цикл

   ...

КонецЦикла;

Замечание. Если в тексте запроса используется группировка по многоуровневому справочнику и не указано "Без Групп", то итоги по группам справочника будут накапливаться. Другими словами, если в запросе не нужны итоги по группам справочника, то в тексте запроса кроме использования оператора "Без Итогов" дополнительно следует в операторах "Группировка ..." использовать ключевое слово "Без Групп".

Условие

Назначить условие включения информации в запрос.

Синтаксис:

Условие(<ЛогическоеВыражение>);

Англоязычный синоним:

Condition

Параметры:

<ЛогическоеВыражение>

Логическое выражение встроенного языка 1С:Предприятие.

Описание:

Оператор Условие назначает условие включения информации в запрос. Если значение <ЛогическоеВыражение> верно, то информация включается в запрос, иначе нет.

Пример:

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

"//{{ЗАПРОС(Одинарный)

|Период с ДатаНачала по ДатаКонец;

|Оклад = Справочник.Сотрудники.Оклад;

|Ктг = Справочник.Сотрудники.Категория;

|Группировка Ктг без групп;

|Функция Всего = Сумма(Оклад);

|Условие(Ктг.Выбран() = 1);   // только для тех сотрудников

| //у кого заполнен реквизит Категория

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

;

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

Пример:

* Здесь показан отрывок текста процедуры, в которой формируется некоторый отчет, причем переменные:

ВыбТовар, ВыбОтдел, ВыбСотрудник

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

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

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

"//{{ЗАПРОС(Квоты)

|Товар = Регистр.КвотыТоваров.Товар;

|Отдел = Регистр.КвотыТоваров.Отдел;

|Сотрудник = Регистр.КвотыТоваров.Сотрудник;

|Партнер = Регистр.КвотыТоваров.Партнер;

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

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

|Группировка Отдел;

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

|Группировка Партнер;

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

|Условие(Товар.ПринадлежитГруппе(ВыбТовар) = 1);

|Условие(Отдел = ВыбОтдел);

|Условие(Сотрудник = ВыбСотрудник.Сотрудник);

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

;

// Если ошибка в запросе, то выход из процедуры

Если Запрос.Выполнить(ТекстЗапроса)= 0 Тогда

   Возврат;

КонецЕсли;

В параметре оператора Условие, в принципе, можно записывать логические выражения любой сложности (по правилам встроенного языка 1С:Предприятие), используя любые логические операторы (>, <, =, >=, <>, И, ИЛИ, НЕ и другие), при этом в качестве операндов могут участвовать как внутренние, так и внешние переменные запроса (если существуют внутренняя и внешняя переменные с одинаковым именем, то использоваться по данному имени будет внутренняя переменная).

Пример:

Условие(Цена > 23.5);

Условие((Товар.ПринадлежитГруппе(ВыбТовар) = 1) И (Товар.Розн_Цена = 100));

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

Пример:

* Использование двух операторов:

Условие(Товар.Наименование <> "Стол");

Условие(Товар.Наименование <> "Шкаф");

* аналогично записи одного оператора:

Условие((Товар.Наименование <> "Стол") И (Товар.Наименование<> "Шкаф"));

Логический оператор принадлежности

Кроме обычных логических операторов (>, <, =, >=, <=, <>, И, ИЛИ, НЕ) в операторе "Условие ..." языка запросов можно использовать дополнительный оператор — логический оператор принадлежности.

Синтаксис:

В

Англоязычный синоним:

In

Описание:

Оператор языка запросов "Условие (А в Б);" говорит о том, что условие истинно, когда значение А является подмножеством значения Б.

Следует особо отметить, что если значение Б пустое (объект не выбран), то условие является истинным, в отличии от оператора «=» (равно).

Если на принадлежность проверяется значение типа элемент справочника, то проверка выполняется с учетом его возможного вхождения в группу справочника. Аналогично, проверка на принадлежность субсчета осуществляется с учетом его возможного вхождения в счет-группу.

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

Скорость выполнения запросов оптимизирована под использование оператора принадлежности, как в клиент-серверной, так и в файл-серверной версии системы 1С:Предприятие.

Внимание. Логический оператор принадлежности не поддерживается встроенным языком системы 1С:Предприятие, а применяется только в языке запросов.

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

Пример:

* без использования логического оператора принадлежности

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

...

| Товар = Документ.ВидДокумента.Товар;";

...

Если ВыбТовар.Выбран() = 1 Тогда

   Если ВыбТовар.ЭтоГруппа() = 1 Тогда

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

               "Условие(Товар.ПринадлежитГруппе(ВыбТовар) = 1);";

   Иначе

      ТекстЗапроса = ТекстЗапроса + "Условие(Товар = ВыбТовар);";

   КонецЕсли

КонецЕсли;

* с использованием логического оператора принадлежности

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

...

|Товар = Документ.ВидДокумента.Товар;";

...

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

...






Перейти  к оглавлению: Описание встроенного языка