Объект запрос базы данных

From SunFlurry wiki
Jump to: navigation, search
  Query (Объект запрос базы данных)
Статус разработки: Реализован
Создание объекта: Create,CreateFromTable

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

Структура языка запроса базы данных

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

<Группа запросов>;

[Postprocessing (
<Установка постобработки 1>;
<Установка постобработки 2>;
...)]

Где <Группа запросов> может быть представлена в следующем виде:

([Name <Наименование запроса>]
[<Задание периода работы с остатками накопителя>;]
[<Необязательные опции запроса>;]
<Задание переменной запроса 1>;
<Задание переменной запроса 2>;
...
[Condition <Условия отбора записей 1>;
Condition <Условия отбора записей 2>;
...]
[<Порядок группировки или/и сортировки>;]) 

[<Операция объединения запросов 1>
(<Запрос 2>) On (<Условие объединения запросов>)

[<Операция объединения запросов 2>
  ... ]]

Описание основных свойств, операторов, переменных и полей текста запроса:

  • Каждый запрос имеет определенный источник запроса. Источником называют указание на объект базы данных: справочник, вид документов или накопитель. Внутри запроса могут быть заданы ссылки на другие справочники, виды документов или табличные части, но эти ссылки всегда связаны с источником запроса через его реквизиты. К примеру, запрос осуществляется к справочнику Адреса, который является подчиненным справочника Контрагенты. Чтобы произвести отбор получаемых в запросе адресов с помощью списка контрагентов, достаточно применить фильтр к ссылке на справочник контрагенты, полученной из источника запроса справочника адреса как Ref.Адреса.@Parent.
  • Каждый запрос оперирует переменными запроса. Переменная запроса, это именованное указание на реквизит или объект, либо вычисляемое выражение, включающее другие переменные, функции и арифметические или логические операторы. Все заданные переменные по умолчанию возвращаются в результате выполнения запроса. Программа, получившая результат запроса, имеет доступ ко всем таким переменным. Если переменную не требуется возвращать в результате, для уменьшения таблицы запроса, ускорения получения ее с сервера и обработки локальной системой, можно использовать условие постобработки SkipVariables (см. ниже). Имена переменных должны быть уникальными в теле одного запроса и должны подчиняться обычным правилам задания имен переменным. Если группа запросов содержит более одного запроса, важно понимать, что при объединении этих запросов в один результат, система трактует переменные, имеющие одинаковые имена в разных запросах, как одну переменную в результате запроса, то есть в разных запросах переменные с одинаковыми именами должны указывать на данные одного вида. Задание переменной имеет вид: <Имя переменной>:=<Значение переменной>;. При этом значение переменной, может быть произвольной формулой или указанием на определенный реквизит или объект (полный путь, начинающийся с источника запроса). Используя пример предыдущего пункта, можно создать переменную зКонтрагент: зКонтрагент:=Ref.Адреса.@Parent;.
  • Кроме переменных, в запросе также могут содержаться условия запроса. Условия являются логическими выражениями с использованием заданных ранее переменных запроса, констант, переменных внешней программы, функций, арифметических или логических операторов, и позволяют отобрать записи, попадающие в результат запроса. При отборе записей базы данных, каждое из условий выполняется для каждой из записей и, если все условия вычисляются как правда, проверяемая запись попадает в результат запроса. Задание условия имеет вид: Condition(<Выражение>);. Используя пример предыдущих пунктов, можно задать условие, по которому в результат запроса войдут только адреса, контрагенты которых содержатся в списке спКонтрагенты: Condition(зКонтрагент IN спКонтрагенты);.
  • Запрос может выполняться с использованием агрегации получаемых данных или без оной. При наличии агрегации данные группируются по одной или нескольким группам и числовые переменные находятся в результате суммы отдельных полей записей, полученных из базы данных. Запрос, выполняемый таким образом, должен содержать операторы группировки Group, HorGroup или VerGroup. Операторов группировки может быть более одного, в этом случае, запрос будет последовательно группироваться по каждой из переменной, указанной в операторе группировки. Переменные также можно указывать через запятые. Общий вид оператора группировки выглядит сл. образом: <Оператор группировки> <Переменная группировки 1>[{+,-}][ with folders][,<Переменная группировки 2>...];. После каждой переменной можно указать направление сортировки после выполнения группировки. По умолчанию будет использоваться сортировка по невозрастанию (+). Для переменных, указывающих на объекты справочников, имеющих папки, можно также указать суффикс with folders. Этот суффикс будет обработан в момент постобработки таблицы запроса (см. этапы выполнения запроса базы данных ниже), в таблицу будут добавлены особые группировки по папкам справочника, на который указывала переменная запроса. Строки таблицы будут отсортированы таким образом, что элементы справочников будут следовать за папками справочников, в которые они входят в самом справочнике, тоже самое правило сортировки будет соблюдаться и для самих папок. Внутри же одной папки, элементы будут отсортированы в соответствии с указанным порядком сортировки. При подсчете переменных агрегации, строки с папками справочника будут вычислены на основе строк элементов, входящих в эти папки. Для аналогии с группировкой таблиц значений, см. статью Group.
    • Обычный оператор группировки Group или VerGroup не добавляет записи в таблицу-результат запроса. Оператор горизонтальной группировки HorGroup используется для формирования отчетов с горизонтальными группировками. В процессе постобработки в таблицу запроса добавляются записи таким образом, чтобы для под каждой из верхних группировок, было одинаковое количество записей текущей горизонтальной группировки. Это достигается путем добавления недостающих записей в таблицу результата, таблица, полученная таким образом, может быть выведена в отчет по строкам и столбцам, используя для обхода обычный оператор Next. Все горизонтальные группировки должны следовать после обычных (вертикальных).
    • Кроме операторов группировки может использоваться оператор сортировки Sort <Переменная сортировки 1>[{+,-}][,<Переменная сортировки 2>...];. Оператор осуществляет сортировку сгруппированных и отсортированных строк предыдущих группировок. Если после оператора сортировки следует оператор группировки, он должен использовать такой же путь или являться частью пути, который был использован для сортировки. К примеру, справочник Номенклатура имеет реквизит Тип, являющийся ссылкой на справочник Типы номенклатуры. При выполнении запроса необходимо группировать результат по элементам справочника номенклатура, однако, необходимо также отсортировать полученную номенклатуру по типу. Текст запроса будет выглядеть следующим образом: зН:=Ref.Номенклатура;зТип:=Ref.Номенклатура.Тип;Sort зТип;Group зН;. Так как группировка зН использует путь, являющийся частью пути сортировки зТип, такой запрос будет выполнен и результирующая таблица будет отсортирована сначала по реквизиту Тип элементов справочника Номенклатура, потом уже по самим элементам справочника. Для параллелей сортировки таблиц значений, см. статью Sort.
    • Если запрос не имеет операторов группировки, он называется простым запросом по элементам (документам) источника запроса, переменные такого запроса не должны содержать функций агрегации (см. ниже). Однако, признак агрегации запроса можно форсировать с помощью особого оператора ForceAggregate;, размещенного в теле запроса. В этом случае, запрос возвратит только одну строку, и использованные функции агрегации будут применены ко всем записям запроса.
    • Переменные, использующиеся в запросе агрегации, чаще всего содержат функции агрегации (см. ниже), но даже если переменная не содержит функцию агрегации, она будет возвращена в результате выполнения запроса, однако, содержание такой переменной не будет определено (она может содержать любое из значений, поглощенных при агрегации), поэтому для переменных, которые будут использованы в программе, создавшей запрос, необходимо использовать функции агрегации.
  • Если источником запроса служит накопитель, имеющий таблицу остатков (см. Объект базы данных), кроме обычных функций агрегации, можно использовать особые функции агрегации, для нахождения начального или конечного остатка активов накопителя (к примеру, BegTotals, EndTotals). При запросе к таким накопителям, в теле запроса также необходимо указать период выполнения запроса. Период задается в следующем виде: Period from <Начальная дата> to <Конечная дата>;. Где начальная дата и конечная дата -- константы или выражения для нахождения начальной и конечной даты запроса.
  • Операция объединения запросов и Условие объединения запросов задают метод объединения двух последовательных запросов в один. По аналогии с объединением таблиц значений (см., к примеру, Join). Условие запроса представляет собой произвольное логическое выражение, в котором можно использовать операции, функции локальный переменные программы и переменные обоих запросов. Условие обычно используется в виде <Переменная первого запроса>=<Переменная второго запроса>, при этом переменные указывают на одинаковый тип данных и часто являются ссылками на источник запроса. Пример см. ниже. Таблица результата после объединения включает переменные первого и второго запроса, если переменная имеет одинаковое имя и в первом и во втором запросе, в таблице результата она будет присутствовать как одна переменная, в зависимости от операции объединения, могут быть использованы значения как из первого, так и из второго запроса. Следующие операции доступны при объединении запросов:
    • Inner Join или Join: В таблицу результата будут входить только записи, для которых выполняется условие объединения.
    • Left Join или Left Outer Join: В таблицу результата будут входить все записи первого запроса, из второго запроса будут использованы значения переменных, отсутствовавших в первом запросе, если для записи выполняется условие объединения.
    • Right Join или Right Outer Join: В таблицу результата будут входить все записи второго запроса, из первого запроса будут использованы значения переменных, отсутствовавших во втором запросе, если для записи выполняется условие объединения.
    • Full Join или Full Outer Join: В таблицу результата будут входить все записи обоих запросов, для которых выполняется условие объединения. Внимание: SQL сервера базы данных проверяют выполнение условия для каждой из пары записей двух запросов (т.е., выполнение условия для первой записи первого запроса проверяется на выполнение с каждой записью второй запроса, затем та же самая процедура выполняется для второй записи первого запроса и т.д. Для каждого выполнения условия добавляется новая запись в результат, таким образом записи могут иметь множество дублей, что в подавляющем большинстве случаев нежелательно), сервер будет пытаться добавить определенные выражения в условие объединения запроса, чтобы минимизировать эту проблему, однако, к такому типу объединения нужно подходить с осторожностью (рекомендовано использование операции Union All вместо Full Join).
    • Union All: В таблицу будут входить все записи первого и второго запросов, конструкция условие объединения запросов не нужна, так как никаких проверок при объединении не производится. После выполнения постобработки запроса, результаты подобного вида чаще всего аналогичны выполнению Full Join, так как при постобработке дублирующиеся записи будут помещены в одинаковые блоки нулевого уровня группировки (см. ниже), однако, операции агрегации будут давать суммы обоих записей, поэтому наименования переменных агрегации в обоих запросах должны быть разными. Пример см. ниже.
  • Наименование запроса является необязательных элементом и служит для улучшения читабельности текста запроса, когда группа запросов содержит более одного запроса. Наименование не должно содержать знаков и пробелов. Вне запроса переменные из запроса могут использоваться только в формулах условий объединения запросов. Если переменные условия из обоих объединяемых запросов имеют одинаковые имена, системе необходимо каким-то образом отличать переменную одного запроса от другого, поэтому для переменных вне запроса к имени переменных всегда добавляется префиксы. Допускается использование следующих префиксов:
    • #<Имя запроса>.<Наименование переменной> -- указание на переменную запроса с использованием наименования запроса.
    • ##Q<Порядковый номер запроса>.<Наименование переменной> -- указание на переменную запроса с использованием порядкового номера запроса. Данная конструкция может быть использована, если запросы не имеют наименования.
  • Необязательные опции запроса -- общее название набора дополнительных опций запроса (к примеру, ForceAggregate; или Limit <Количество возвращаемых записей>;), которые могут использоваться в тексте запроса. Для полного списка доступных опций, см. Список операторов и функций языка запроса.

Выражения и задание переменной в виде пути к реквизиту

Переменные в запросе задаются в виде <Имя переменной>:=<Значение переменной>;. Каждое наименование переменной должно быть уникальным внутри одного запроса. Дублирование наименований не допускается. Наименование не должно содержать пробелов и знаков пунктуации, но может содержать любые международные символы. Переменная может быть задана как полный путь к требуемому реквизиту, либо как выражение. Условия запроса всегда содержат только выражения. Для дополнительной информации по созданию выражений, см. статью Стандартные фильтры. Рассмотрим задание переменных в виде пути и использование выражений для переменных или условий:

  • При задании переменной, как пути к требуемому реквизиту, необходимо придерживаться правила, что путь всегда должен начинаться с указания на источник запроса, все переменные должны быть адресуемыми посредством источника (см. описание выше). В случае задания переменной, как пути, синтаксис выглядит следующим образом: <Имя переменной>:=<Тип данных>.<Вид данных>[[.<Наименование строчной части>].<Наименование реквизита или особого реквизита>[(<Дата значения периодического реквизита>)][[..<Тип данных приведения типа>.<Вид данных приведения типа>].<Наименование реквизита или особого реквизита>...]]. Рассмотрим некоторые части такого пути:
    • Дата значения периодического реквизита -- выражение или константа, задающая дату реквизита. Данное выражение должно следовать за наименованием периодического реквизита. Пример: зЦена:=Ref.Номенклатура.Цена(CurDate());.
    • Наименование строчной части -- используется для доступа к реквизитам строчной части объекта источника запроса. Пример: зСумма:=Doc.Реализация.НоменклатураИЦены.Сумма;.
    • Доступ к реквизитам других объектов -- путь к данным может иметь неограниченную длину, если, к примеру, адресуемый в пути реквизит имеет тип объекта базы данных, можно продолжить путь, указав наименование реквизита этого объекта, для которого, в свою очередь путь может быть продолжен. При выполнении запроса, если адресуемый реквизит в объекте не определен (выбран), переменная получит пустой тип базы данных (NULL), который после окончания выполнения запроса будет преобразован в пустое значение.
    • Выражения преобразования типа -- иногда при адресации различных реквизитов объектов встречается ситуация, когда реквизит может иметь несколько типов данных БД или вообще иметь произвольный тип базы данных. Получение дальнейших ссылок к реквизитам таких объектов невозможно без прямого указания типа и вида требуемого объекта (приведения или преобразования типа). Преобразование типа может также применяться к особым реквизитам (к примеру, @Parent, когда объект может быть подчинен более чем одному справочнику-родителю). Как и с обычными реквизитами, в случаях, если реквизит объекта содержит ссылку на объект с типом, не совпадающим с указанным при преобразовании, значение переменной этого объекта будет пустым. Преобразование типов может быть записано в виде ... <Реквизит>..<Тип данных приведения типа>.<Вид данных приведения типа> ..., либо ... <Реквизит> AS <Тип данных приведения типа>.<Вид данных приведения типа> ....
    • Особые реквизиты объектов, которые можно использовать при создании пути переменной:
      • @ELEMENT или @HEADER -- реквизит, дающий ссылку на сам элемент или документ из реквизита строчной части документов или справочников.
      • @LINK -- реквизит, дающий ссылку на объект, поместивший запись в журнал, при запросе к объекту журналу (см. LinkedObject), либо объект, создавший запись в накопителе, при запросе к последнему.
      • @ISFOLDER -- Задает числовое значение, является ли текущий объект справочника папкой (1) или обычным элементом (0), также может использоваться для записей строчных частей справочников.
      • @FOLDER -- Задает ссылку на объект папки, в которой находится текущий объект справочника, также может использоваться для записей строчных частей справочников.
      • @PARENT -- Задает ссылку на объект родителя, которому подчинен текущий объект справочника.
      • @STATUS -- Задает числовое значение статуса текущего объекта. Для справочников и элементов журналов справочников это значение может быть 0 -- для обычного элемента, 1 -- для удаленного элемента. Для документов и элементов журналов документов это значение может быть 0 -- для обычного объекта, 1 -- для удаленного объекта, 2..200 -- для обработанного объекта с указанным индексом обработки (см. PublishedMark).
      • @LINE, @LINEID -- Задает номер строки строчной части или номер записи в накопителе.
      • @EXPENSE -- Задает флаг расхода для накопителей, имеющих такой флаг.
      • @PARENTDOC -- Задает ссылку на таблицу документов, которым подчинен текущий документ.
      • @CHILDDOC -- Задает ссылку на таблицу документов, которые подчинены текущему документу.
      • @TRIGGER -- Задает значение триггера изменения для элементов справочников или документов, для которых такой триггер задан.
      • @DATE -- Задает дату записи для накопителей, записи которых датированы.
      • @SECOND -- Задает дату записи для накопителей, записи которых датированы. Время даты корректируется на начало секунды. Позволяет производить группировку движений накопителя в разрезе секунд. Внимание: большой период формирования может сильно замедлить формирование и вернуть очень большую таблицу результата.
      • @MINUTE -- Задает дату записи для накопителей, записи которых датированы. Время даты корректируется на начало минуты. Позволяет производить группировку движений накопителя в разрезе минут. Внимание: большой период формирования может сильно замедлить формирование и вернуть очень большую таблицу результата.
      • @HOUR -- Задает дату записи для накопителей, записи которых датированы. Время даты корректируется на начало часа. Позволяет производить группировку движений накопителя в разрезе часов. Внимание: большой период формирования может сильно замедлить формирование и вернуть очень большую таблицу результата.
      • @DAY -- Задает дату записи для накопителей, записи которых датированы. Время даты корректируется на начало дней. Позволяет производить группировку движений накопителя в разрезе дней.
      • @WEEK -- Задает дату записи для накопителей, записи которых датированы. Время даты корректируется на начало недель. Позволяет производить группировку движений накопителя в разрезе недель.
      • @MONTH -- Задает дату записи для накопителей, записи которых датированы. Время даты корректируется на начало месяцев. Позволяет производить группировку движений накопителя в разрезе месяцев.
      • @QUARTER -- Задает дату записи для накопителей, записи которых датированы. Время даты корректируется на начало кварталов. Позволяет производить группировку движений накопителя в разрезе кварталов.
      • @YEAR -- Задает дату записи для накопителей, записи которых датированы. Время даты корректируется на начало года. Позволяет производить группировку движений накопителя в разрезе лет.
  • При задании переменной или условия запроса, как выражения, можно использовать следующие части выражения (порядок их описания здесь соответствует порядку их поиска при компиляции выражений, поэтому, к примеру, функция Date означает внутреннюю функцию языка запросов, а не начало внешнего выражения языка):
    • Скобки (, );
    • Особый оператор конкатенации строк ||. Обычно для конкатенации строк используется оператор +, однако, некоторые серверы базы данных (к примеру, SQLite) не поддерживают конкатенацию строк с помощью этого оператора, и при переводе выражений на язык используемого сервера баз данных, системе очень трудно определить тип операции -- математическое сложение или конкатенация строк. Поэтому, для того, чтобы запросы были совместимы со всеми серверами баз данных, рекомендуется использование оператора конкатенации || вместо оператора сложения +.
    • Математические операторы: +, -, /, \ (DIV) -- целочисленное деление, *, % (MOD) -- остаток от деления, & -- математическое и, | -- математическое или, ^ -- математическая операция исключающее или, ~ -- математическое обращение. К сожалению, использование And и Or как для логических выражений, так и для математических, которое практикуется внутри языка системы, не поддерживается многими серверами баз данных, и, при переводе выражений на язык сервера, система не сможет определить, какого рода оператор используется, поэтому для математических операций были введены дополнительные операторы &, | (не используйте в начале строки!) и ~. Нужно также заметить, что, в отличие от операций с датами и временем в выражениях, используемых в языке системы, язык запросов не позволяет прибавлять числа к датам. Чтобы изменить дату на требуемое число дней, необходимо использовать функцию AddDay.
    • Логические операторы: <, >, =, <=, =>, <>, ! (NOT) -- логическое обращение, AND, OR
    • Особые логические операторы:
      • IN -- операция проверяет присутствие значения в списке, другом запросе или папке справочника. Операция записывается в виде <Имя переменной> IN <Таблица проверки>, где Таблица проверки может принимать значения:
        • переменная внешней программы со списком объектов, объектом папки или элементом справочника, для проверки вхождения проверяемого элемента в структуру объекта или структуру объектов списка;
        • переменная внешней программы, содержащая ссылку на временную таблицу БД в виде <Переменная временной таблицы>.<Наименование столбца временной таблицы>, для проверки наличия записи во внешней таблице, значение указанного столбца которой совпадает с проверяемым объектом;
        • переменная подзапроса в виде <Наименование переменной подзапроса> From (<Подзапрос>), для проверки вхождения текущего объекта в результат выполнения подзапроса, подзапрос является обычным запросов языка запросов, который может использовать все его возможности, однако, в подзапросах не разрешено использование группировок.
      • NOT IN -- операция обратная операции IN. См. выше.
    • Внутренние функции языка запросов, транслируемые для исполнения на сервере (см. ниже в параграфе Список операторов и функций языка запроса). Каждая из функций имеет свой синтаксис, в аргументах функции также могут использоваться выражения.
    • Внутренние переменные запроса, в том числе переменные другого запроса группы запросов с указанием на номер запроса (см. выше), если выражение принадлежит условию объединения запросов.
    • Свободное указание на путь к реквизиту, не описывавшийся ранее в какой-либо переменной.
    • Внешние константы (к примеру, _NEWLINE) или переменные языка. Значение внешних переменных передается на сервер и используется как константа в запросе.
    • Числовые, строковое или временные константы, записанные в тексте запроса. Запись констант осуществляется в соответствии с их записью в теле обычных программ языка (см. Общее описание языка):
      • Числа записываются без ограничителей. Разделителем дробной части является десятичная точка. В математической записи чисел можно использовать признак экспоненты (E). Кроме десятичной нотации, можно использовать шестнадцатеричную ($FFFF0000 или 0xFF00), восьмеричную (0o177400) или двоичную (0b1111111100000000).
      • Строки отделяется кавычками: ".
      • Дата и время отделяется апострофами: '.
    • Свободные выражения в формате внешней программы языка, которые будут исполнены, и результат их исполнения будет преобразован в константу при выполнении запроса. Выражения заканчиваются знаками ), ; или ,, могут содержать функции, их аргументы, математические выражения и пр..

Примеры запросов и групп запросов

Пример группы запросов, состоящей из двух запросов, позволяющих объединить все элементы справочника Номенклатура, отобранные по полю Тип, с запросом по остаткам к накопителю Остатки на требуемую дату:

(Name зНоменклатура;
зН:=Ref.Номенклатура;
зТип:=Ref.Номенклатура.Тип;
Condition(зТип=Enum.ТипыНоменклатуры.Товар);
Group зН;)
  Left Join
(Name зОстатки;
Period From '01.01.2024' to '01.01.2024';
зН:=Stor.Остатки.Номенклатура;
зТип:=Stor.Остатки.Номенклатура.Тип;
зОстаток:=EndTotals(Количество);
Condition(зТип=Enum.ТипыНоменклатуры.Товар);
Group зН;) On (#зНоменклатура.зН=#зОстатки.зН)

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

(Period From '01.01.2024' to '01.01.2024';
зН:=Stor.Остатки.Номенклатура;
зОстаток:=EndTotals(Количество);
Group зН;)
  Union All
(Period From '01.01.2024' to '01.01.2024';
зН:=Stor.Резервы.Номенклатура;
зРезерв:=EndTotals(Количество);
Group зН;)

Пример выполнения и обхода простого запроса, этапы выполнения которого не разделяются:

//Находим сальдо по накопителю РезервыТМЦ на момент текущего документа, при этом
//aEl -- текущий документ
//aTab -- визуальная таблица, в которую будет выведен результат
КонДата:=aEl.DocDate;
ТЗ:="PeriodT From КонДата to КонДата;
|зД:=Storage.РезервыТМЦ.Договор;
|зН:=Storage.РезервыТМЦ.Номенклатура;
|зСк:=Storage.РезервыТМЦ.Склад;
|зКл:=EndTotals(Количество);
|зСм:=EndTotals(Сумма);
|Condition(зСк=aEl.Склад);
|Group зСк,зД,зН;";
  
З:=Query.Create();
З.Execute(ТЗ);

//Запрос выполнен, произведем обход результата по всем трем вложенным группировкам, используемым здесь для сортировки таблицы
aTab.ClearLines();
While З.Next(1) Do
  While З.Next(2) Do
    While З.Next(3) Do
      If (З.зКл<>0)or(З.зСм<>0) Then
        //Добавим в таблицу одну строку З.зКл и З.зСм -- переменные агрегации, остальные переменные являются переменными группировок
        aTab.AddLine("Номенклатура,Договор,Склад,Количество,Сумма",З.зН,З.зД,З.зСк,З.зКл,З.зСм);
      EndIf;
    EndDo;
  EndDo;
EndDo;    

Прошлый пример с добавлением нескольких условий и блока постобработки:

КонДата:=aEl.DocDate;
ТЗ:="(PeriodT From КонДата to КонДата;
|зД:=Storage.РезервыТМЦ.Договор;
|зН:=Storage.РезервыТМЦ.Номенклатура;
|зТип:=Storage.РезервыТМЦ.Номенклатура.ТипНоменклатуры;
|Condition(зТип=0);
|зСк:=Storage.РезервыТМЦ.Склад;
|зАктив:=Storage.РезервыТМЦ.Склад.Активность;
|Condition(зАктив=0);
|зКл:=EndTotals(Количество);
|зСм:=EndTotals(Сумма);
|Condition(зСк=aEl.Склад);
|Group зСк,зД,зН;)
|Postprocessing (
|RemoveLev0Lines 1;
|SkipVariables зТип,зАктив;)";
  
З:=Query.Create();
З.Execute(ТЗ);

Пример выполнения и обхода сложного запроса, этапы выполнения которого разделены и таблица изменяется перед постобработкой (см. ниже Этапы выполнения запроса базы данных):

//Пример заполняет визуальную таблицу MainTab документами списания и оприходования, строки которых пересчитаны по требуемым ценам.
//Пример может использоваться для вывода таблицы в табличный процессор с универсальными группировками, однако, здесь он используется 
//       с тремя группировками для упрощения понимания.
//Документ РегистрацияТМЦ может быть как списанием, так и оприходованием в зависимости от его реквизита КодОперации.
//       Документ имеет срочную часть с именем Номенклатура к которой происходит обращение.
//При выводе в таблицу склады группируются по папкам справочника складов
//Группировка по номенклатуре используется для нахождения внутренних цен номенклатуры, но в таблицу не выводится
//зСм:=SUM(0) -- используется для простого указания на то, что зСм должна находиться методом агрегации, однако, начальное заполнение этой переменной не требуется
//               Альтернативно можно было бы использовать опции постобработки.
//зКл будет положительным или отрицательным в зависимости от типа документа
//    Doc.РегистрацияТМЦ.КодОперации не превращен в переменную и используется в формуле "на лету".
ТЗ:="зДата:=BegOfDay(Doc.РегистрацияТМЦ.DocDate);Condition((зДата>=НачДата)And(зДата<=КонДата));
|зСтатус:=Doc.РегистрацияТМЦ.@Status;Condition(зСтатус>1);
|зСк:=Doc.РегистрацияТМЦ.Склад;
|зДок:=Doc.РегистрацияТМЦ;
|зН:=Doc.РегистрацияТМЦ.Номенклатура.Номенклатура;
|зКл0:=Doc.РегистрацияТМЦ.Номенклатура.Количество;
|зСм:=SUM(0);
|зКл:=SUM(?(Doc.РегистрацияТМЦ.КодОперации=Enum.коРегистрацияТМЦ.СписаниеТМЦ,-зКл0,зКл0));
|Group зСк with folders,зДок,зН;";
З:=Query.Create();
//Выполнение останавливается после первого этапа
З.Execute(ТЗ,0);
//Заполним столбец зСм таблицы запроса расчетными значениями, зависящими от Номенклатуры, Склада и даты документа.
aTab:=З.ResultTable;
aTab.Select();
While aTab.Next() Do
  //На данном этапе можно не только заполнять таблицу, но и удалять и добавлять в нее нужные строки
  aTab.зСм:=ПолучитьНужнуюЦену(aTab.зН,aTab.зСк,aTab.зДата)*aTab.зКл;
EndDo;
//Выполним постобработку, которая автоматически создаст группировки, добавит папки складов и подсчитает переменные зСм и зКл.
З.Postprocess();

//Заполним таблицу MainTab 
MainTab.ClearLines();
While З.Next(1) Do
  While З.Next(2) Do
    If not З.зСк.IsFolder() Then
      aTab.AddLine("Документ,Склад,Сумма",З.зДок,З.зСк,З.зСм);
    Else
      //Для папок складов нет смысла выводить документ, а только общую сумму документов по папке
      aTab.AddLine("Склад,Сумма",З.зСк,З.зСм);
    EndIf;
  EndDo;
EndDo;    

Этапы выполнения запроса базы данных, постобработка запроса

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

  • Этап компиляции и выполнения запроса.
    • Производится компиляция запроса на локальной машине, если при компиляции были выявлены ошибки, выполнение запроса будет остановлено. В процессе компиляции выполняются локальные функции и выражения, функции и выражения запроса переносятся в бинарный файл компиляции.
    • Скомпилированный запрос передается на сервер
    • Скомпилированный запрос превращается на сервере в запрос к базе данных и исполняется, если в процессе исполнения произошли ошибки, сервер возвращает ошибку клиенту, который создает соответствующее исключение.
    • Результат запроса передается с сервера на клиент, где система создает локальную таблицу значения, содержащую результат запроса. Таблица на этом этапе не содержит группировок и называется необработанной таблицей запроса (см. ниже "Формат таблицы значений результата запроса"), программа имеет доступ к такой таблице и может изменять ее до начала второго этапа запроса.
  • Этап постобработки запроса.
    • Система производит загрузку объектов таблицы запроса с помощью функции MassLoadObjects по правилам, заданным в свойствах запроса и при вызове функции выполнения запроса.
    • Производится сортировка таблицы запроса. Таблица, полученная с сервера, чаще всего уже отсортирована, однако, установки сортировки сервера могут отличаться от установок сортировки системы, кроме того, таблица могла быть изменена программой до начала этого этапа. Если запрос выполняется в линейном режиме (см. Execute), этап постобработки будет завершен в этот момент.
    • В таблице запроса создается столбец @LEVEL, после чего в таблицу добавляются строки группировки, для которых заполняется новый столбец уровня группировки, в строки также будут скопированы значения соответствующих столбцов группировки и заполнены столбцы, не вычисляемые с помощью функций агрегации.
    • Если определенные группировки по элементам справочников имеют суффикс with folders, в таблицу запроса будет добавлен еще один столбец @FLEVEL, для каждой из группировок будет произведен запрос на сервер для получения структуры папок этих справочников, после чего, в таблицу будут добавлены строки с папками справочника с учетом предыдущих группировок и типа этих группировок (горизонтальных или вертикальных).
    • Система производит подсчет столбцов агрегации для добавленных строк с учетом столбцов уровня группировки (@LEVEL) и столбцов уровня вложения папок (@FLEVEL), столбцы с простыми функциями агрегации находятся путем сложения столбцов нижних группировок, для столбцов со сложными функциями агрегации система создает, компилирует и выполняет выражения, для нахождения результатов агрегации.
    • Если установки запроса позволяют, система удаляет оригинальные строки запроса (с уровнем @LEVEL равным 0), для экономии памяти, так как новые строки содержат все необходимые данные.
  • Программа может использовать результат запроса в режиме выборки (Next) и получать значения переменных запроса на каждом из его уровней. Программа также может использовать обработанную таблицу запроса напрямую.

Замечания по оптимизации выполнения запроса

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

  • Для запросов, не использующих данные оригинальных строк запроса, -- самой нижней группировки запроса, можно использовать функцию постобработки RemoveLev0Lines для удаления этих строк после окончания выполнения запроса, что освобождает некоторое количество памяти после выполнения запроса.
  • Если запрос оперирует большим числом объектов, можно производить загрузку объектов в режиме только заголовков (см. Execute). В запросе с полной постобработкой невозможно оставить объекты в столбцах группировки полностью незагруженными, так как в момент сортировки таблицы запроса для таких объектов необходимо присутствие реквизитов по которым происходит сортировка. Нужно также иметь в виду при обходе таблицы запроса с помощью функции Next, что объекты из таблицы необходимо получать копированием (<Запрос>.<Имя переменной>.Copy()), либо использовать Сборщик объектов, иначе эти объекты будут полностью загружены из базы данных в процессе выполнения обработки и останутся в памяти до удаления запроса (так как они будут присутствовать в таблице запроса), что нивелирует попытку оптимизации.
  • После выполнения первого этапа запроса, можно осуществить загрузку только тех объектов, которые участвуют в группировке и требуются при обработке запроса, остальные столбцы можно удалить, либо использовать функцию постобработки SkipVariables для того, чтобы пропустить создание определенных столбцов в таблице результата. Если же какие-то столбцы по-прежнему требуются в таблице запроса, однако, их загрузка не имеет смысла, можно использовать функцию постобработки DoNotMassLoadBeforeAggregation, чтобы в момент выполнения второго этапа исключить загрузку объектов (нужно помнить, однако, что объекты в столбцах сортировки должны быть уже загружены в полном или частичном режимах, иначе в момент сортировки каждый из объектов будет загружаться при его добавлении в сортированную таблицу, что замедлит выполнение сортировки).
  • Если нет необходимости в использовании горизонтальных группировок или группировок по папкам справочником, а также, если столбцы агрегации не содержат сложных функций агрегации, можно выполнить запрос в линейном режиме. Это позволит остановить второй этап выполнения запроса на моменте сортировки таблицы, после чего результат запроса можно обходить с помощью функции Next и получить значения переменных, в том числе переменных агрегации (для последних применяются особые функции запроса Compute, BegTotals и EndTotals). Так как в таблицу запроса не будут добавлены дополнительные строки группировки, ее размер может существенно уменьшиться (особенно для запросов с большим количеством группировок), однако, системе придется вычислять значения агрегации "на лету", что может замедлить вывод результата запроса на экран, кроме того функция Next будет работать медленнее.
  • Если при выводе результата запроса на экран будут применяться дополнительные условия, отбирающие отдельные записи запроса, эти условия можно выполнить после окончания первого этапа выполнения запроса, до начала выполнения второго этапа, при этом ненужные строки можно удалять непосредственно из необработанной таблицы запроса. Уменьшение размера таблицы запроса уменьшит количество загружаемых объектов, что уменьшит потребность в памяти.
  • Если результат запроса выгружается во внешний источник в виде линейной таблицы, нет необходимости в выполнении второго этапа запроса вообще. Программа может использовать необработанную таблицу запроса, получая из нее данные по своему усмотрению, однако, не нужно забывать, что для экономии памяти, объекты из таблицы нужно получать с помощью копирования (см. выше) или с использованием сборщика объектов.
  • Если, даже после всех оптимизаций, запрос получается настолько большим, что не вмещается в память, можно рассмотреть либо вариант работы с запросом в среде 64-битного клиента на машине с увеличенным объемом памяти, либо использование временных таблиц базы данных, которые перекладывают бремя хранения данных запроса на сервер базы данных.

Формат таблицы значений результата запроса

Доступ к таблице результата запроса можно получить с помощью атрибута объекта запроса ResultTable. Таблица запроса будет содержать следующие столбцы:

  • <Наименование переменной> -- столбец, наименование которого совпадает с наименованием переменных запроса, в таких столбцах хранятся значения (в т.ч. значения агрегации) соответствующих переменных запроса.
  • @LEVEL -- столбец, добавляемый на втором этапе выполнения запроса (который, однако, программа может добавить сама в конце первого этапа выполнения). Столбец содержит значение уровня группировки строки таблицы запроса. При этом, для оригинальных строк запроса, значение это столбца равно нулю, для строк запроса, являющихся записями первой, самой нижней группировки запроса, значение равно 1, последующие значения столбца для верхних группировок будут увеличиваться. Строки с верхними группировками запроса следуют до строк с низкими (вложенными) группировками. В обработанной таблице запроса первой строкой следует первая запись самой верхней n-ной группировки запроса (где n -- количество группировок запроса), за ней следует запись более низкой n-1-ой группировки запроса, и т.д. до оригинальной записи запроса с уровнем 0 (таких записей может быть более одной). Далее вся структура записей повторяется начиная с определенных уровней в зависимости от данных таблицы запроса. Строки, для которых значение в столбце @LEVEL равно -1, будут пропущены при обработке запроса на втором этапе, таким образом можно исключить строки из запроса, не удаляя их. Внимание: индексы группировки в этом столбце противоположны индексам, использующимся в функциях First, Last, Next и Prev!
  • @FLEVEL -- столбец, добавляемый на втором этапе выполнения запроса, для запросов имеющих столбцы с группировкой по папкам справочников. Столбец содержит уровни вложения папок для строки с текущей группировкой (столбец @LEVEL). Для оригинальных элементов группировки значение этого столбца будет равным нулю или пустым значением, для папок самого верхнего уровня значение этого столбца будет равным 1, для вложенных папок второго уровня, значение этого столбца будет равным 2 и т.д. Нужно понимать, что значения столбца уровня группировки папок имеют значение только для строк таблицу с соответствующей группировкой, вне этих строк значение столбца не определено или соответствует значениям уровня папок других группировок, если они тоже группируются по своей структуре папок.

Список операторов и функций языка запроса

Тип оператора или функции Идентификатор Применимость Вид Описание
Опции запроса Name Тело запроса Name <Имя запроса>; Задает наименование запроса
Опции запроса Period Тело запроса Period From <Начальная дата> to <Конечная дата>; Задает период нахождения остатков накопителей с точностью до дня (период находится в диапазоне >= BegOfDay(Начальная дата),< BegOfDay(Конечная дата)+1)
Опции запроса PeriodT Тело запроса PeriodT From <Начальная дата> to <Конечная дата>; Задает период нахождения остатков накопителей с точностью до миллисекунды (период находится в диапазоне >= Начальная дата,< Конечная дата)
Опции запроса Limit, Top Тело запроса Limit <Количество записей>; Ограничивает результат запроса указанным количеством записей. По умолчанию ограничение отсутствует.
Опции запроса ForceAggregate Тело запроса ForceAggregate; Форсирует использование режима агрегации для запроса без группировок. В этом режиме такой запрос вернет не более одной записи.
Директивы запроса <Назначение переменной> Тело запроса <Имя переменной>:=<Путь или выражение>; Создает именованную переменную, которую можно использовать в условиях и назначении других переменных запроса. Переменная будет возвращена, как столбец в таблице результата запроса.
Директивы запроса Condition, Where Тело запроса Condition <Условие>; Задает условие для отбора записей запроса.
Директивы запроса Sort Тело запроса Sort <Переменная>[{+,-}][,<Переменная 2>[{+,-}]...]; Задает директиву сортировки записей запроса. Может использоваться совместно и вперемешку с директивами Group, HorGroup, VerGroup.
Директивы запроса Group, VerGroup Тело запроса Group <Переменная>[{+,-}][ With Folders][,<Переменная 2>[{+,-}][ With Folders]...]; Задает директиву вертикальной группировки записей запроса. Может использоваться совместно и вперемешку с директивами Sort, HorGroup.
Директивы запроса HorGroup Тело запроса HorGroup <Переменная>[{+,-}][ With Folders][,<Переменная 2>[{+,-}][ With Folders]...]; Задает директиву горизонтальной группировки записей запроса. Может использоваться совместно и вперемешку с директивой Sort, и следовать за директивами Group, VerGroup.
Операции объединения запросов Union All Между запросами в группе запросов (<Запрос 1>) Union All (<Запрос 2>) Задает операцию объединения записей двух запросов без дополнительных условий
Операции объединения запросов Inner Join, Join Между запросами в группе запросов (<Запрос 1>) Join (<Запрос 2>) On (<Условие объединения запросов>) Задает операцию объединения записей двух запросов с помощью конъюнкции по условию
Операции объединения запросов Full Join, Full Outer Join Между запросами в группе запросов (<Запрос 1>) Full Join (<Запрос 2>) On (<Условие объединения запросов>) Задает операцию объединения записей двух запросов с помощью дизъюнкции по условию
Операции объединения запросов Left Join, Left Outer Join Между запросами в группе запросов (<Запрос 1>) Left Join (<Запрос 2>) On (<Условие объединения запросов>) Задает операцию дополнения записей первого запроса переменными из второго запроса, идентификация записей происходит по условию
Операции объединения запросов Right Join, Right Outer Join Между запросами в группе запросов (<Запрос 1>) Right Join (<Запрос 2>) On (<Условие объединения запросов>) Задает операцию дополнения записей второго запроса переменными из первого запроса, идентификация записей происходит по условию
Директивы группы запросов Postprocessing Между запросами в группе запросов Postprocessing (<Тело текста постобработки>) Задает директиву начала текста постобработки
Опции постобработки Sort В теле текста постобработки Sort <Переменная>[{+,-}][,<Переменная 2>[{+,-}]...]; Задает директиву сортировки записей результата запроса во время выполнения постобработки. Может использоваться совместно и вперемешку с директивами Group, HorGroup, VerGroup. Использование по крайней мере одной из директив сортировки или группировки в теле текста постобработки полностью игнорирует директивы сортировки или группировки из текстов запросов в момент выполнения постобработки и использует директивы из этого текста.
Опции постобработки Group, VerGroup В теле текста постобработки Group <Переменная>[{+,-}][ With Folders][,<Переменная 2>[{+,-}][ With Folders]...]; Задает директиву вертикальной группировки записей запроса во время выполнения постобработки. Может использоваться совместно и вперемешку с директивами Sort, HorGroup. Использование по крайней мере одной из директив сортировки или группировки в теле текста постобработки полностью игнорирует директивы сортировки или группировки из текстов запросов в момент выполнения постобработки и использует директивы из этого текста.
Опции постобработки HorGroup В теле текста постобработки HorGroup <Переменная>[{+,-}][ With Folders][,<Переменная 2>[{+,-}][ With Folders]...]; Задает директиву горизонтальной группировки записей запроса во время выполнения постобработки. Может использоваться совместно и вперемешку с директивой Sort, и следовать за директивами Group, VerGroup. Использование по крайней мере одной из директив сортировки или группировки в теле текста постобработки полностью игнорирует директивы сортировки или группировки из текстов запросов в момент выполнения постобработки и использует директивы из этого текста.
Опции постобработки No Grouping В теле текста постобработки No Grouping; Задает директиву запрета выполнения группировки на этапе постобработки. Таблица запроса, после ее получения с сервера, будет представлена как результат выполнения линейного запроса по элементам без агрегации
Опции постобработки Aggregate В теле текста постобработки Aggregate <Имя переменной> As <Выражение>; Задает способ агрегации переменной на этапе выполнения постобработки. По умолчанию формула агрегации переменных берутся из тела запроса, однако, это поведение можно изменить. Заданные формулы будут использоваться для агрегации переменных для любых уровней группировки запроса. Выражение имеют некоторые ограничения по сравнения с выражениями запросов, а именно:
  • Невозможно использование свободного пути к реквизиту (на этапе постобработки система работает только с данными таблицы результата)
  • Функции агрегации BegTotals, EndTotals, Income, Expense эмулируют поведение соответствующих функций на сервере, но в отличие от серверных функций могут использовать обычные выражения, как свои аргументы, и не могут использовать наименование актива. В этом режиме функции отличаются от функции суммы только при наличии группировок по времени (день, неделя, месяц, год).
  • Некоторые функции могут выполняться несколько иначе (функции сервера базы данных могут немного отличаться по действию от функций локальной системы)
  • Возможно использование внешних функций программы не только для нахождения констант, но и как элементов выражений.
Опции постобработки Aggregate1 В теле текста постобработки Aggregate1 <Имя переменной> As <Выражение>; Задает способ агрегации переменной на этапе выполнения постобработки. По умолчанию формула агрегации переменных берутся из тела запроса, однако, это поведение можно изменить. Заданные формулы будут использоваться для агрегации переменных только для нижнего (первого) уровня группировки запроса, для уровней выше первого будут использованы формулы из тела запроса или указанные в директиве постобработки Aggregate. См. также директиву Aggregate для описания ограничений выражения.
Опции постобработки No Aggregation В теле текста постобработки No Aggregation For <Имя переменной>; Запрещает выполнение агрегации для указанной переменной. Переменные будут трактоваться, как переменные без агрегации, и их значение будет копироваться на все уровни группировки запроса без выполнения формул агрегации.
Опции постобработки ForceAggregateSingleLineLev1 В теле текста постобработки ForceAggregateSingleLineLev1 <1 или 0>; (по умолчанию 0) Форсирует выполнения формул агрегации для нахождения значения переменной для первого уровня группировки. По умолчанию система будет осуществлять более быструю операцию копирования значений без выполнения формулы агрегации в случае, когда агрегация выполняется простой функцией сложения и когда на нулевом уровне группировки содержится всего одна строка, соответствующая текущему первому уровню группировки.
Опции постобработки ForceAggregateSingleLine В теле текста постобработки ForceAggregateSingleLine <1 или 0>; (по умолчанию 0) Форсирует выполнения формул агрегации для нахождения значения переменной для любого уровня группировки. По умолчанию система будет осуществлять более быструю операцию копирования значений без выполнения формулы агрегации в случае, когда агрегация выполняется простой функцией сложения и когда на предыдущем уровне группировки содержится всего одна строка, соответствующая текущему уровню группировки.
Опции постобработки DoNotAggregate В теле текста постобработки DoNotAggregate <1 или 0>; (по умолчанию 0) Опция запрещает выполнение агрегации для всех переменных запроса. Все переменные будут трактоваться, как переменные без агрегации, и их значения будут копироваться на все уровни группировки запроса без выполнения формул агрегации.
Опции постобработки DoNotMassLoadBeforeAggregation В теле текста постобработки DoNotMassLoadBeforeAggregation <1 или 0>; (по умолчанию 0) Опция запрещает выполнение функции MassLoadObjects до начала сортировки в момент выполнения этапа постобработки. Программа должна самостоятельно выполнить функцию MassLoadObjects для требуемых столбцов таблицы в требуемом режиме до вызова второго этапа запроса, иначе сортировка таблицы запроса будет выполняться медленнее.
Опции постобработки RemoveLev0Lines В теле текста постобработки RemoveLev0Lines <1 или 0>; (по умолчанию 0) Опция удаляет оригинальные записи запроса после выполнения постобработки. Данные записи уже не имеют значения, если обработка результата запроса осуществляется стандартными средствами запроса (Next и пр.). Опция не работает для линейных запросов. Опция может освободить некоторое количество памяти для запросов с большими таблицами результатов, также она полезна для групп запросов, состоящих из более чем одного запроса.
Опции постобработки AllowIncompatibleSortPaths Тело запроса, тело текста постобработки AllowIncompatibleSortPaths <1 или 0>; (по умолчанию 0) Опция отключает проверку совместимости путей сортировки и группировки в процессе постобработки. Функция может использоваться, если переменные заполняются программно до этапа постобработки, и они совместимы с последующими переменными группировки, но программа не может знать об этом. Опция должна следовать до директив сортировки или группировки. Для примера, см. статью AllowIncompatibleSortPaths.
Опции постобработки SkipVariables В теле текста постобработки SkipVariables <Переменная 1>[, <Переменная 2>...]; Опция позволяет исключить ненужные переменные из таблицы результата запроса, что экономит память.
Опции постобработки Copy, CopyTo В теле текста постобработки Copy <Переменная с временной таблицей базы данных>[:<Переменная 1>, <Переменная 2> ...]; Опция позволяет не возвращать результат запроса в виде таблицы результата, а копировать его записи в указанную временную таблицу базы данных. Так как временные таблицы базы данных хранятся в базе данных, такой подход позволит выполнять запросы, не помещающиеся в память в обычном режиме. Копируемые переменные запроса должны иметь имена, совпадающие с именами временной таблицы. Если не указывать список переменных, будут скопированы все переменные, для которых в таблице присутствуют соответствующие имена.
Опции постобработки ExactSumVariables (планируется к реализации) В теле текста постобработки ExactSumVariables <Имя переменной>:<Количество знаков>[,<Имя переменной 2>:<Количество знаков>...]; Опция позволяет использовать точное сложение для функции сложения при агрегации указанных переменных. См. статью Sum для дополнительного описания.
Функции языка запросов ?, _If В выражениях ?(<Выражение-условие>,<Выражение-результат функции, если условие выполняется>,<Выражение-результат функции, если условие не выполняется>) Функция возвращает результат выражения, заданного во втором аргументе, если логическое выражение, заданное в первом аргументе возвращает правду, иначе функция возвращает результат выражения, заданного во третьем аргументе
Функции языка запросов _Case В выражениях _Case(<Выражение>,<Значение 1>,<Выражение-результат 1>[,<Значение 2>,<Выражение-результат 2>...]) Функция возвращает результат выражения, заданного третьим аргументом, если результат вычисления первого выражения равен результату вычисления выражения, заданного вторым аргументом, иначе проверка соответствия результата первого вычисления выражения происходит последовательно для четвертого, шестого и т.п. аргументов, если они заданы и функция возврати соответствующее значение выражения-результата. Если ни одно из условий не выполняется, функция возвращает NULL (пустое значение сервера базы данных).
Функции языка запросов CASE В выражениях CASE <Выражение> WHEN <Значение 1> THEN <Выражение-результат 1> [WHEN <Значение 2> THEN <Выражение-результат 2>][ELSE <Выражение-результат по умолчанию>] END Функция является альтернативной записью функции _Case, включающей также выражение по умолчанию, возвращаемое вместо NULL, когда ни одного из условий функции не выполнено.
Функции агрегации языка запросов Sum В выражениях Sum(<Выражение>) Функция агрегации, находящая сумму выражений каждой из записей базы данных, поглощенных в результат агрегации
Функции агрегации языка запросов Min В выражениях Min(<Выражение>) Функция агрегации, находящая минимальное из всех значений выражения для каждой из записей базы данных, поглощенных в результат агрегации. Результатом выражения могут быть не только числовые значения.
Функции агрегации языка запросов Max В выражениях Max(<Выражение>) Функция агрегации, находящая максимальное из всех значений выражения для каждой из записей базы данных, поглощенных в результат агрегации. Результатом выражения могут быть не только числовые значения.
Функции агрегации языка запросов Avg В выражениях Avg(<Выражение>) Функция агрегации, находящая среднее из всех значений выражения для каждой из записей базы данных, поглощенных в результат агрегации
Функции агрегации языка запросов Count В выражениях Count() Функция агрегации, количество записей базы данных, поглощенных в результат агрегации
Функции агрегации языка запросов BegTotals В выражениях BegTotals(<Наименование актива накопителя>[,<Дата нахождения сальдо>]) Функция агрегации, позволяющая найти начальное сальдо актива накопителя на начальную дату запроса, либо дату, указанную вторым аргументом. Сальдо находит с точностью до дня даты.
Функции агрегации языка запросов BegTotalsT В выражениях BegTotalsT(<Наименование актива накопителя>[,<Дата нахождения сальдо>]) Функция агрегации, позволяющая найти начальное сальдо актива накопителя на начальную дату запроса, либо дату, указанную вторым аргументом. Сальдо находит с точностью до секунды даты.
Функции агрегации языка запросов EndTotals В выражениях EndTotals(<Наименование актива накопителя>[,<Дата нахождения сальдо>]) Функция агрегации, позволяющая найти конечное сальдо актива накопителя на конечную дату запроса, либо дату, указанную вторым аргументом. Сальдо находит с точностью до дня даты (включает весь день даты).
Функции агрегации языка запросов EndTotalsT В выражениях EndTotalsT(<Наименование актива накопителя>[,<Дата нахождения сальдо>]) Функция агрегации, позволяющая найти конечное сальдо актива накопителя на конечную дату запроса, либо дату, указанную вторым аргументом. Сальдо находит с точностью до секунды даты (включает все записи до и включая указанную секунду даты).
Функции агрегации языка запросов Debit, Expense В выражениях Expense(<Наименование актива накопителя>) Функция агрегации, позволяющая найти расход актива накопителя за период запроса с точностью до дня периода (конец период включает весь день конечной даты). Для накопителей, имеющих признак записей "приход" или "расход", данная функция будет находить только сумму записей с признаком "расход", для остальных накопителей, функция будет находить сумму записей со значением актива меньше нуля.
Функции агрегации языка запросов Credit, Income В выражениях Income(<Наименование актива накопителя>) Функция агрегации, позволяющая найти приход актива накопителя за период запроса с точностью до дня периода (конец период включает весь день конечной даты). Для накопителей, имеющих признак записей "приход" или "расход", данная функция будет находить только сумму записей с признаком "приход", для остальных накопителей, функция будет находить сумму записей со значением актива больше нуля.
Функции языка запросов FilterProperty В выражениях FilterProperty(<Выражение>,<Тип базы данных для проверки>) Функция возвращает значение выражения, указанного в первом аргументе, если это значение является объектом с типом, заданным вторым аргументом, иначе функция возвращает NULL (пустое значение). Пример: FilterProperty(Ref.Номенклатура.СкладИлиАвтомашина,Ref.Склады).
Функции языка запросов CaseGetProperty В выражениях CaseGetProperty(<Выражение>,<Тип базы данных для проверки>,<Путь к реквизиту>[,<Тип базы данных для проверки 2>,<Путь к реквизиту 2>...]) Функция возвращает значение реквизита, указанного с помощью пути в третьем аргументе, это значение выражения первого аргумента является объектом с типом, заданным вторым аргументом, иначе функция сравнивает тип выражения первого аргумента с типом 4-го аргумента, и возвращает значение реквизита, заданного пятым аргументом и т.д. Если ни одно из условий не выполняется, функция возвращает NULL (пустое значение).
Функции языка запросов Coalesce В выражениях Coalesce(<Выражение 1>[,<Выражение 2>...]) Функция первое из непустых (NULL) аргументов. Может применяться, к примеру, после объединений запросов (особенно для объединений типа Full Join)
Функции языка запросов IsNULL В выражениях IsNULL(<Выражение>) Функция возвращает правду, если выражение является пустым значением (NULL), иначе функция возвращает ложь. Может применяться, к примеру, после объединений запросов (особенно для объединений типа Full Join)
Функции языка запросов IsEmpty В выражениях IsEmpty(<Выражение>) Функция возвращает правду, если выражение является пустым объектом базы данных, иначе функция возвращает ложь. Внимание: функция работает только с объектами, она будет неверно работать со строками, числами или датами (в отличии от функции системы IsEmpty)
Функции языка запросов IsType В выражениях IsType(<Выражение>,<Тип БД 1>[,<Тип БД 2>...]) Функция возвращает правду, если выражение является объектом с типом, заданным любым из последующих аргументов, иначе функция возвращает ложь. Пример: IsType(зПеременная,Ref.Номенклатура,Ref.ОсновныеСредства). Кроме полного типа и вида данных, разрешается также задавать только тип данных. Пример: IsType(зПеременная,Ref).
Функции языка запросов Str В выражениях Str(<Выражение>) Функция превращает значение выражения в строку
Функции языка запросов Length В выражениях Length(<Выражение>) Функция возвращает длину строки выражения
Функции языка запросов Left В выражениях Left(<Выражение>,<Выражение, число символов>) Функция возвращает левую подстроку с указанным числом символов из исходной строки
Функции языка запросов Right В выражениях Right(<Выражение>,<Выражение, число символов>) Функция возвращает правую подстроку с указанным числом символов из исходной строки
Функции языка запросов Mid В выражениях Mid(<Выражение>,<Выражение, начальный символ>[,<Выражение, число символов>]) Функция возвращает подстроку с указанным начальным символом и длиной, если длина не указана, функция возвращает подстроку с начальным символом и до конца строки
Функции языка запросов Pos В выражениях Pos(<Выражение, подстрока>,<Выражение, строка поиска>[,<Выражение, начинать поиск с символа>]) Функция возвращает позицию найденной подстроки в указанной строке (если требуется, поиск будет происходить начиная с указанного символа), либо 0, если подстрока не найдена. Даже при наличии третьего аргумента, будет возвращена позиция в оригинальной строке поиска (с учетом числа пропущенных с начала строки символов).
Функции языка запросов UpperCase В выражениях UpperCase(<Выражение>) Функция возвращает строковое выражение, переведенное в верхний регистр
Функции языка запросов LowerCase В выражениях LowerCase(<Выражение>) Функция возвращает строковое выражение, переведенное в нижний регистр
Функции языка запросов Asc В выражениях Asc(<Выражение>) Функция возвращает код первого символа строкового выражения
Функции языка запросов Chr В выражениях Chr(<Выражение>) Функция возвращает символ с кодом, заданным аргументом
Функции языка запросов Replace В выражениях Replace(<Выражение, строка поиска>,<Выражение, подстрока>,<Выражение, строка замены>) Функция возвращает строку, заданную первым аргументом, в которой все вхождения подстроки, заданной вторым аргументом, заменены на подстроку, заданную третьим аргументом
Функции языка запросов RepeatStr В выражениях RepeatStr(<Выражение, подстрока>,<Выражение, количество повторов>) Функция возвращает строку созданную из подстроки, заданной первым аргументом, повторенной количество раз, заданное вторым аргументом
Функции языка запросов Reverse В выражениях Reverse(<Выражение>) Функция возвращает строку, обращенную посимвольно из строки, заданной в первом аргументе
Функции языка запросов TrimL В выражениях TrimL(<Выражение>) Функция возвращает строку, полученную из первого аргумента путем удаления пробелов с начала строки (в отличие от функции языка TrimL, функция запроса удаляет только пробелы)
Функции языка запросов TrimR В выражениях TrimR(<Выражение>) Функция возвращает строку, полученную из первого аргумента путем удаления пробелов с конца строки (в отличие от функции языка TrimR, функция запроса удаляет только пробелы)
Функции языка запросов Trim В выражениях Trim(<Выражение>) Функция возвращает строку, полученную из первого аргумента путем удаления пробелов с начала и с конца строки (в отличие от функции языка Trim, функция запроса удаляет только пробелы)
Функции языка запросов Abs В выражениях Abs(<Выражение>) Функция абсолютное (не отрицательное) значение числа, заданного первым аргументом
Функции языка запросов Degrees В выражениях Degrees(<Выражение>) Функция переводит число, заданное первым аргументом, из радианов в градусы
Функции языка запросов Radians В выражениях Radians(<Выражение>) Функция переводит число, заданное первым аргументом, из градусов в радианы
Функции языка запросов Round В выражениях Round(<Выражение>,[<Выражение для количества знаков>]) Функция находит округленное значение первого аргумента до количества знаков после точки, определяемое вторым аргументом.
Функции языка запросов _PI В выражениях _PI() Функция возвращает число π (пи)
Функции языка запросов _E В выражениях _E() Функция возвращает число e (основание натурального логарифма)
Функции языка запросов Log В выражениях Log(<Выражение>,<Выражение для основания>) Функция возвращает логарифм числа, заданного первым аргументом по основанию, заданному вторым аргументом
Функции языка запросов Log10 В выражениях Log10(<Выражение>) Функция возвращает десятичный логарифм числа, заданного первым аргументом
Функции языка запросов Ln В выражениях Ln(<Выражение>) Функция возвращает натуральный логарифм числа, заданного первым аргументом
Функции языка запросов Arccos В выражениях Arccos(<Выражение>) Функция находит арккосинус числа, заданного первым аргументом
Функции языка запросов Arcsin В выражениях Arcsin(<Выражение>) Функция находит арксинус числа, заданного первым аргументом
Функции языка запросов Arctg В выражениях Arctg(<Выражение>) Функция находит арктангенс числа, заданного первым аргументом
Функции языка запросов Arcctg В выражениях Arcctg(<Выражение>) Функция находит арккотангенс числа, заданного первым аргументом
Функции языка запросов Cos В выражениях Cos(<Выражение>) Функция находит косинус числа, заданного в радианах первым аргументом
Функции языка запросов Sin В выражениях Sin(<Выражение>) Функция находит синус числа, заданного в радианах первым аргументом
Функции языка запросов Tg В выражениях Tg(<Выражение>) Функция находит тангенс числа, заданного первым аргументом
Функции языка запросов Ctg В выражениях Ctg(<Выражение>) Функция находит котангенс числа, заданного первым аргументом
Функции языка запросов Sqrt В выражениях Sqrt(<Выражение>) Функция находит квадратный корень числа, заданного первым аргументом
Функции языка запросов Exp В выражениях Exp(<Выражение>) Функция находит экспоненту числа, заданного первым аргументом (т.е. результат возведения основания натурального логарифма в степень, заданную аргументом)
Функции языка запросов Pow В выражениях Pow(<Выражение>,<Выражение, показатель степени>) Функция находит результат возведения первого аргумента в степень, определяемую вторым аргументом
Функции языка запросов Sqr В выражениях Sqr(<Выражение>) Функция находит квадрат числа, заданного первым аргументом
Функции языка запросов Sign В выражениях Sign(<Выражение>) Функция возвращает знак числа, заданного первым аргументом. Для положительных значений функция возвратит 1, для отрицательных -1, для нулевых, ноль
Функции языка запросов Floor В выражениях Floor(<Выражение>) Функция возвращает аргумент, округленный до целого в меньшую сторону
Функции языка запросов Ceiling В выражениях Ceiling(<Выражение>) Функция возвращает аргумент, округленный до целого в большую сторону
Функции языка запросов Trunc, Int В выражениях Trunc(<Выражение>) Функция возвращает целую часть аргумента а также может использоваться для превращения строки в целое число
Функции языка запросов Frac В выражениях Frac(<Выражение>) Функция возвращает вещественную (дробную) часть аргумента
Функции языка запросов Number В выражениях Number(<Выражение>) Функция превращает строковой аргумент в число
Функции языка запросов Date В выражениях Date(<Выражение>) Функция конвертирует строковой аргумент в дату. Строка должна быть задана в виде YYYY-MM-DD[ HH:MM:SS[.sss]]
Функции языка запросов AddMonth В выражениях AddMonth(<Выражение>[,<Выражение для количества месяцев>]) Функция добавляет к аргументу-дате заданное вторым аргументом количество месяцев. Добавляемое количество может быть отрицательным
Функции языка запросов AddDay В выражениях AddDay(<Выражение>[,<Выражение для количества дней>]) Функция добавляет к аргументу-дате заданное вторым аргументом количество дней. Добавляемое количество может быть отрицательным
Функции языка запросов BegOfDay В выражениях BegOfDay(<Выражение>) Функция возвращает дату, заданную первым аргументом, измененную на начало дня
Функции языка запросов EndOfDay В выражениях EndOfDay(<Выражение>) Функция возвращает дату, заданную первым аргументом, время которой изменено на 23:59:59.999
Функции языка запросов BegOfMonth В выражениях BegOfMonth(<Выражение>) Функция возвращает дату, заданную первым аргументом, измененную на начало месяца
Функции языка запросов EndOfMonth В выражениях EndOfMonth(<Выражение>) Функция возвращает дату, заданную первым аргументом, измененную на начало последнего дня месяца
Функции языка запросов EndOfMonthT В выражениях EndOfMonthT(<Выражение>) Функция возвращает дату, заданную первым аргументом, измененную на последний день месяца, при этом время изменено на 23:59:59.999
Функции языка запросов BegOfQuarter В выражениях BegOfQuarter(<Выражение>) Функция возвращает дату, заданную первым аргументом, измененную на начало квартала
Функции языка запросов EndOfQuarter В выражениях EndOfQuarter(<Выражение>) Функция возвращает дату, заданную первым аргументом, измененную на начало последнего дня квартала
Функции языка запросов EndOfQuarterT В выражениях EndOfQuarterT(<Выражение>) Функция возвращает дату, заданную первым аргументом, измененную на последний день квартала, при этом время изменено на 23:59:59.999
Функции языка запросов BegOfYear В выражениях BegOfYear(<Выражение>) Функция возвращает дату, заданную первым аргументом, измененную на начало года
Функции языка запросов EndOfYear В выражениях EndOfYear(<Выражение>) Функция возвращает дату, заданную первым аргументом, измененную на начало последнего дня года
Функции языка запросов EndOfYearT В выражениях EndOfYearT(<Выражение>) Функция возвращает дату, заданную первым аргументом, измененную на последний день года, при этом время изменено на 23:59:59.999
Функции языка запросов BegOfWeek В выражениях BegOfWeek(<Выражение>) Функция возвращает дату, заданную первым аргументом, измененную на начало недели
Функции языка запросов EndOfWeek В выражениях EndOfWeek(<Выражение>) Функция возвращает дату, заданную первым аргументом, измененную на начало последнего дня недели
Функции языка запросов EndOfWeekT В выражениях EndOfWeekT(<Выражение>) Функция возвращает дату, заданную первым аргументом, измененную на последний день недели, при этом время изменено на 23:59:59.999
Функции языка запросов GetYear В выражениях GetYear(<Выражение>) Функция возвращает номер года даты-аргумента. Год возвращается в полном формате (YYYY)
Функции языка запросов GetMonth В выражениях GetMonth(<Выражение>) Функция возвращает номер месяца года даты-аргумента
Функции языка запросов GetDay В выражениях GetDay(<Выражение>) Функция возвращает номер дня месяца даты-аргумента
Функции языка запросов GetHour В выражениях GetHour(<Выражение>) Функция возвращает номер часа времени даты-аргумента
Функции языка запросов GetMinute В выражениях GetMinute(<Выражение>) Функция возвращает номер минуты времени даты-аргумента
Функции языка запросов GetSecond В выражениях GetSecond(<Выражение>) Функция возвращает номер секунды времени даты-аргумента
Функции языка запросов GetMSecond В выражениях GetMSecond(<Выражение>) Функция возвращает номер миллисекунды времени даты-аргумента
Функции языка запросов WeekOfYear В выражениях WeekOfYear(<Выражение>) Функция возвращает номер недели года даты-аргумента
Функции языка запросов DayOfYear В выражениях DayOfYear(<Выражение>) Функция возвращает номер дня года даты-аргумента
Функции языка запросов DayOfWeek В выражениях DayOfWeek(<Выражение>) Функция возвращает номер дня недели даты-аргумента

Функции и атрибуты объекта запроса

Идентификатор Статус Тип Визуальная Параметры Описание
ResultTable Реализована Атрибут Query.ResultTable:<Таблица результата запроса (TAB)> Получить таблицу результата запроса. Запрос должен быть выполненным.
ForceAggregateSingleLineLev1 Реализована Атрибут Query.ForceAggregateSingleLineLev1:<Значение режима форсирования суммирования срок первого уровня группировки (INT)> Получить или установить значение режима форсирования суммирования строк первого уровня группировки при постобработке запроса. Атрибут соответствует опции постобработки ForceAggregateSingleLineLev1. Атрибут имеет смысл изменять после первого этапа выполнения запроса до начала второго.
ForceAggregateSingleLine Реализована Атрибут Query.ForceAggregateSingleLine:<Значение режима форсирования суммирования срок любого уровня группировки (INT)> Получить или установить значение режима форсирования суммирования строк любого уровня группировки при постобработке запроса. Атрибут соответствует опции постобработки ForceAggregateSingleLine. Атрибут имеет смысл изменять после первого этапа выполнения запроса до начала второго.
DoNotAggregate Реализована Атрибут Query.DoNotAggregate:<Значение запрета режима агрегации (INT)> Получить или установить значение запрета режима агрегации при постобработке запроса. Атрибут соответствует опции постобработки DoNotAggregate. Атрибут имеет смысл изменять после первого этапа выполнения запроса до начала второго.
DoNotMassLoadBeforeAggregation Реализована Атрибут Query.DoNotMassLoadBeforeAggregation:<Значение запрета режима загрузки (INT)> Получить или установить значение запрета режима загрузки при постобработке запроса. Атрибут соответствует опции постобработки DoNotMassLoadBeforeAggregation. Атрибут имеет смысл изменять после первого этапа выполнения запроса до начала второго.
RemoveLev0Lines Реализована Атрибут Query.RemoveLev0Lines:<Значение режима удаления оригинальных строк таблицы запроса (INT)> Получить или установить значение режима удаления оригинальных строк таблицы запроса. Атрибут соответствует опции постобработки RemoveLev0Lines. Атрибут имеет смысл изменять после первого этапа выполнения запроса до начала второго.
AllowIncompatibleSortPaths Реализована Атрибут Query.AllowIncompatibleSortPaths:<Значение режима отключения в постобработке проверки несовместимых директив сортировки (INT)> Получить или установить значение режима отключения в постобработке проверки несовместимых директив сортировки. Атрибут соответствует опции постобработки AllowIncompatibleSortPaths. Атрибут имеет смысл изменять после первого этапа выполнения запроса до начала второго.
<Имя столбца> Реализована Атрибут Query.<Имя столбца>:<Значение ячейки> Получить или установить значение столбца текущей строки таблицы результата запроса, для линейных запросов вычислений значений столбцов агрегации не производится. Запрос должен быть выполненным.
Get Реализована Функция Query.Get:(<Наименование или индекс столбца (INT,STRING)>):<Значение ячейки столбца (TAB)> Получить значение столбца текущей строки таблицы результата запроса по наименованию или индексу столбца, для линейных запросов вычислений значений столбцов агрегации не производится. Запрос должен быть выполненным. Выполнение этой функции соответствует выражению <Запрос>.ResultTable.Get(,<Наименование или индекс столбца>)
LinearLevelPos Реализована Атрибут Query.LinearLevelPos:<Текущий уровень группировки линейного запроса (INT)> Атрибут получает или устанавливает текущий уровень группировки при прохождении строк таблицы запроса в режиме линейного запроса. Нижний уровень группировки соответствует значению 1, верхний -- общему количеству группировок в запросе. Запрос должен быть выполненным.
GroupCount Реализована Функция Query.GroupCount():<Общее количество группировок в запросе (INT)> Функция возвращает общее количество группировок в запросе. Запрос должен быть выполненным.
Groups Реализована Функция Query.Groups(<Индекс группировки (INT)>):<Наименование группировки (STRING)> Функция возвращает наименование группировки запроса по ее индексу. Запрос должен быть выполненным.
Create Реализована Функция Query.Create():<Новый объект запроса (QUERY)> Функция создает новый объект запроса. Функция может быть вызвана с интерфейсом запроса.
Check Реализована Функция Query.Check(<Текст запроса (STRING)>,<Проверить постобработку (INT)>=1):<Результат (STRING)> Функция проверяет текст запроса и постобработки на наличие ошибок при компиляции, однако, выполнения запроса не производится. В результате отдается пустая строка, если ошибок не найдено, иначе отдается строка с сообщением об ошибке в виде (<Номер ошибки> at <Номер строки>:<Позиция>) <Описание ошибки>.
Execute Реализована Функция Query.Execute(<Текст запроса (STRING)>,<Режим запроса (INT)>=1,<Выполнять агрегацию столбцов (INT)>=1,<Столбцы с объектами, загружаемыми в режиме заголовка (STRING)>=""):<Таблица результата запроса (TAB)> Функция выполняет запрос, заданный текстом в нужном режиме с необходимыми свойствами. Функция отдает таблицу результата запроса, если это необходимо. Если в процессе запроса будет найдена ошибка, функция вызовет исключение.
CreateFromTable Частичная реализация Функция Query.CreateFromTable(<Таблица для создания результата запроса (TAB)>,<Столбцы группировки с настройками (STRING)>,<Столбцы агрегации с операциями (STRING)>,<Режим запроса (INT)>=1):<Новый объект запроса (QUERY)> Функция создает объект запроса из существующей линейной таблицы значений. Таким образом полностью будет пропущен первый этап выполнения запроса. Запрос создается с заданными группировками и столбцами агрегации.
Postprocess Реализована Функция Query.Postprocess(<Выполнять агрегацию столбцов (INT)>=1,<Столбцы с объектами, загружаемыми в режиме заголовка (STRING)>=""):<Таблица результата запроса (TAB)> Функция запускает второй этап выполнения запроса, и должна выполняться после функции Execute с параметром Режим запроса равным нулю. Функция отдает таблицу результата запроса, если это необходимо. Если в процессе выполнения будет найдена ошибка, функция вызовет исключение.
PostprocessLinear Реализована Функция Query.PostprocessLinear(<Столбцы с объектами, загружаемыми в режиме заголовка (STRING)>=""):<Таблица результата запроса (TAB)> Функция запускает второй этап выполнения запроса в линейном режиме, и должна выполняться после функции Execute с параметром Режим запроса равным нулю. Функция отдает таблицу результата запроса, если это необходимо. Если в процессе выполнения будет найдена ошибка, функция вызовет исключение.
RemovePostprocessing Реализована Функция Query.RemovePostprocessing() Функция удаляет из таблицы запроса строки с уровнем больше 0, а также удаляет столбцы @LEVEL и @FLEVEL, возвращая таблицу результата в состояние, в котором она находилась после выполнения первого этапа запроса.
First Реализована Функция Query.First(<Индекс или наименование группировки запроса (INT,STRING)>=0):<Результат запроса имеет хотя бы одну запись на этом уровне (INT)> Функция устанавливает текущую строку таблицы запроса на начало указанного уровня группировки, после чего можно начинать обход записей запроса с начала уровня.
Next Реализована Функция Query.Next(<Индекс или наименование группировки запроса (INT,STRING)>):<Найдена следующая запись на указанном уровне группировки (INT)> Функция выполняет шаг внутри указанной группировки запроса при обходе таблицы запроса в прямом направлении. Если следующая запись найдена, функция возвращает 1, иначе 0.
Prev Реализована Функция Query.Prev(<Индекс или наименование группировки запроса (INT,STRING)>):<Найдена следующая запись на указанном уровне группировки (INT)> Функция выполняет шаг внутри указанной группировки запроса при обходе таблицы запроса в обратном направлении. Если предыдущая запись найдена, функция возвращает 1, иначе 0.
Last Реализована Функция Query.Last(<Индекс или наименование группировки запроса (INT,STRING)>=0):<Результат запроса имеет хотя бы одну запись на этом уровне (INT)> Функция устанавливает текущую строку таблицы запроса на конец указанного уровня группировки, после чего можно начинать обход записей запроса с помощью функции Prev.
Level Реализована Функция Query.Level():<Текущий уровень группировки (INT)> Функция возвращает индекс уровня группировки, текущей строки таблицы запроса.
FolderLevel Реализована Функция Query.FolderLevel():<Текущий уровень папок (INT)> Функция возвращает индекс уровня папок, текущей строки таблицы запроса для текущей группировки. Если текущая строка не указывает на папку, функция возвращает ноль, иначе возвращает 1 для самого высокого уровня вложения (корневых папок), 2 для папок, вложенных в корневые папки и т.д. Функция может выполняться только не для линейных запросов.
Compute Реализована Функция Query.Compute(<Наименование переменной запроса (STRING)>,<Операция агрегации (STRING)>="SUM",<Строки превращать в числа (INT)>=0,<Вычислять для уровня (INT)>=<Текущий линейный уровень обхода>):<Результат вычисления (NUMBER)> Функция позволяет получить значение столбца агрегации для запроса в линейном режиме (однако, функция может выполняться и для запроса в обычном режиме, но для ее корректной работы в режимах, отличных от суммы, необходимо наличие оригинальных строк с уровнем группировки ноль). По умолчанию, для агрегации используется суммирование значений. Для обычных запросов функция используется только для нахождения итогов по всей таблице значений.
BegTotals Реализована Функция Query.BegTotals(<Наименование переменной запроса (STRING)>):<Результат вычисления (NUMBER)> Функция позволяет получить значение столбца агрегации для запроса в линейном режиме (однако, функция может выполняться и для запроса в обычном режиме, к примеру, для нахождения итого по всей таблице запроса). Агрегация выполняется в режиме начальных остатков для текущего уровня группировки таблицы, т.е. находится сумма всех записей уровня ноль, связанных с первой записью текущего уровня группировки в текущей строке таблицы.
EndTotals Реализована Функция Query.EndTotals(<Наименование переменной запроса (STRING)>):<Результат вычисления (NUMBER)> Функция позволяет получить значение столбца агрегации для запроса в линейном режиме (однако, функция может выполняться и для запроса в обычном режиме, к примеру, для нахождения итого по всей таблице запроса). Агрегация выполняется в режиме конечных остатков для текущего уровня группировки таблицы, т.е. находится сумма всех записей уровня ноль, связанных с последней записью текущего уровня группировки в текущей строке таблицы.