Объявление внутренней переменной
Синтаксис:
<ИмяПеременной> = <ОписаниеПеременной> [, <ОписаниеПеременной>]+;
Параметры:
<ИмяПеременной>
|
| Имя объявляемой внутренней переменной описания запроса.
|
|
<ОписаниеПеременной>
|
| Указывает на доступный в языке запросов атрибут документа, справочника, регистра или журнала расчетов (см. «Атрибуты, доступные при описании внутренних переменных»).
|
|
Описание:
Внутренние переменные используются в тексте запроса для образования ссылок на объекты конфигурации, чтобы использовать их при построении таких операторов запроса, как Группировка, Функция, Условие.
В объявлении внутренней переменной можно указывать несколько вариантов <ОписанияПеременной>. Все описания должны указывать на один и тот же тип данных (число, строку, справочник или документ). Переменной, указывающей на разные справочники или документы присваивается тип данных «Справочник неопределенного вида» или «Документ неопределенного вида» соответственно.
* Например, можно определить внутреннюю переменную:
Товар = Документ.Перемещение.Товар, Документ.Расходная.Товар;
и использовать ее для создания Группировки. Такой состав внутренней переменной как бы дает Группировке задание — просмотреть все документы видов "Перемещение" и "Расходная" и выбрать все товары, встречающиеся либо в документах вида "Перемещение", либо в документах "Расходная".
* Еще пример. Допустим, у нас есть регистр "Взаиморасчеты" и регистр "Кредиты", и в том и в другом есть измерение "Клиент". Определяем внутреннюю переменную:
Должник = Регистр.Взаиморасчеты.Клиент, Регистр.Кредиты.Клиент;
Если использовать такую внутреннюю переменную для образования Группировки, то она будет означать следующее: пройти по регистру "Взаиморасчеты" и по регистру "Кредиты", вычислить заданные в запросе Функции и выбрать значения "Клиентов", для которых значения хотя бы одной функции будет ненулевой. Здесь мы видим, что формирование запроса по регистрам имеет некоторые особенности (обязательно наличие Функций, причем их вычисленные значения должны быть отличны от нуля, только в этом случае найденные объекты включаются во временный набор данных формируемый запросом).
Если описания внутренней переменной указывают на разные типы данных, например, на «Справочник» и на «Документ», то это просто вызовет сообщение об ошибке. Например, следующее определение внутренней переменной будет ошибочным:
ААА = Справочник.Товары.ТекущийЭлемент, Документ.Счет.ТекущийДокумент;
// ЭТО ОШИБКА !!!
Однако, допускается в описании внутренней переменной указание на разные справочники либо на разные документы. Переменной, указывающей на разные справочники или документы присваивается тип данных «Справочник неопределенного вида» или «Документ неопределенного вида» соответственно.
* Например, правомерно задать такую внутреннюю переменную:
Парам = Документ.Счет.Клиент, Документ.Счет.Фирма;
(Здесь предполагается, что в контексте конфигурации, реквизиты "Клиент" и "Фирма" — это элементы справочников). Если использовать такую внутреннюю переменную для построения Группировки, то она будет означать следующее: пройти по документам "Счет" и выбрать значения клиентов и фирм, встречающихся в них (и, например, упорядочить эти элементы по наименованию). Как интерпретировать результаты полученной выборки при таком запросе — будет зависеть от контекста поставленной задачи.
В языке запросов описание внутренних переменных для агрегатных типов данных типа «Операция» и «Проводка» начинается со слова «Операция» вне зависимости от того, будет ли обращение к бухгалтерским операциям или к проводкам. <ОписаниеПеременной> определяется следующим образом:
Операция.(
<Реквизиты0перации>
| <ПредРеквОпераций>
| <РеквизитыПроводок>
| <ПредРеквПроводок>
| Дебет.(
Счет
| <Субконто>
)
| Кредит.(
Счет
| <Су6конто>
)
| Субконто.
<ВидСубконто>
| КорСубконто.
<ВидСубконто>
)
<РеквизитыОперации>
|
Реквизиты операции объявленные в метаданных.
|
<ПредРеквОпераций>
|
Предопределенные реквизиты Операций.
|
<РеквизитыПроводок>
|
Реквизиты проводок, объявленные в метаданных.
|
<ПредРеквПроводок>
|
Предопределенные реквизиты Проводок.
|
<ВидСубконто>
|
Идентификатор вида субконто.
|
<
Применение слов "Дебет", "Кредит" в описании переменных позволяют оперировать дебетовой и кредитовой частями проводки, такими как счет и вид субконто.
Применение слов "Субконто" и "КорСубконто" в описании переменных позволяют оперировать как субконто, так и корреспондирующим субконто.
*
Сум = Операция.Сумма;
Сч = Операция.Дебет.Счет, Операция.Кредит.Счет;
Кратко суть этого раздела можно выразить так: при определении внутренних переменных запроса разработчик конфигурации должен ясно себе представлять суть и смысл взаимосвязи объектов конфигурации, которые объединяются в описании единой внутренней переменной, поскольку интерпретация полученных результатов выполнения запроса полностью зависит от контекста решаемой задачи.
Несколько слов о дополнительных именах доступа к стандартной информации, которые определены в языке запросов. Речь идет о конструкции ТекущийЭлемент для справочников и ТекущийДокумент для документов и регистров (не надо путать эти конструкции языка запросов с одноименными методами встроенного языка, хотя их смысл во многом совпадает).
Для справочников использование конструкции ТекущийЭлемент в описании внутренней переменной означает выборку элемента справочника как такового (целиком всей записи справочника).
Аналогично при работе с документами, использование конструкции ТекущийДокумент в описании внутренней переменной, означает выборку документа как такового (целиком всего документа как объекта конфигурации). Сравните два примера:
Пример 1.
* Здесь нас интересуют товары, встречающиеся в документах.
ТОВАР = Документ.РасходнаяБН.Товар,
Документ.РасходнаяКредит.Товар,
Документ.РасходнаяНал.Товар,
Документ.РасходнаяРеализ.Товар,
Документ.Счет.Товар;
Пример 2.
* Здесь нас интересуют сами документы указанных видов как таковые.
ДОКУМ = Документ.РасходнаяБН.ТекущийДокумент,
Документ.РасходнаяКредит.ТекущийДокумент,
Документ.РасходнаяНал.ТекущийДокумент,
Документ.РасходнаяРеализ.ТекущийДокумент,
Документ.Счет.ТекущийДокумект;
Использование для документов конструкции НомерСтроки в описании внутренней переменной, означает выборку номеров строк документов (не самих строк, а чисел, обозначающих номера строк в документе).
СТРОКА = Документ.РасходнаяБН.НомерСтроки;
Для регистров использование конструкции ТекущийДокумент в описании внутренней переменной означает выборку документов (целиком всего документа как объекта конфигурации), которые произвели движение по данному регистру.
Использование для регистра конструкции НомерСтроки в описании внутренней переменной, означает выборку связанных номеров строк тех документов, которые произвели движение по регистру (в случае, когда в Модулях документов в конфигурации перед движением регистра использовали метод ПривязыватьСтроку).
Пример:
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с НачДата по КонДата;
|ВидТоплива = Регистр.ПокупателиКолво.ВидыТоплива;
|Покуп = Регистр.ПокупателиКопво.Покупатели;
|Док = Регистр.ПокупателиКолво.ТекущийДокумент;
|Ном = Регистр.ПокупателиКолво.НомерСтроки;
|Вес = Регистр.ПокупателиКолво.Кг;
|Группировка ВидТоплива; // по измерению Регистра
|Группировка Док; //по документам, двигавшим Регистр
|Группировка Ном; // по номерам строк документов
|Функция ВсегоКолво = КонОст(Вес);
|Функция ПриходКолво = Приход(Вес);
|Условие(Покуп = Покупат);
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
В программном модуле конфигурации (т. е. вне текста запроса) существует доступ (там, где это имеет смысл) к значениям всех объявленных в тексте запроса внутренних переменных, даже тех, которые не участвуют ни в группировках, ни в функциях. Другими словами, если объявленная в тексте запроса внутренняя переменная не задействована в запросе ни в группировке, ни в функции ни в условии, данная внутренняя переменная все же присутствует в запросе.
Содержание раздела