Оглавление
Подсистема Работа со схемой запроса
Построение структуры запроса. API
Шаблон «Выборка из временной таблицы»
Шаблон «Построение текста запроса по параметрам отбора»
Шаблон «Последовательность преобразований источника»
Шаблон «Расширение данных источника»
Шаблон "Работа с характеристиками"
Обработка «Конструктор схемы запроса»
Введение
До версии платформы 8.3.5 не существовало такого объекта как "Схема запроса". В задачах, где требовалось построить текст запроса динамическим образом, текст запроса собирался из фрагментов текстовых блоков. Встречались и такие варианты, когда динамический текст запроса мог моделироваться с помощью параметров. Последний вариант, пожалуй, наихудший способ получения текста запроса, так как в этом случае вероятнее всего страдала производительность при его выполнении.
Код построения запроса из текстовых фрагментов мог быть весьма запутанным. Такой код в большей степени не содержал собственно логики построения запроса, а отражал логику работы с текстом. В целом это отрицательно сказывалось на отладке, сопровождении и развитии такого кода.
Объектная модель запроса, реализованная в платформе начиная с версии 8.3.5, позволила при решении задачи получения динамического текста запроса использовать код, который уже отражал бы не манипуляции с текстом, а логику структурного построения запроса. Кроме того, в объектной модели нет смысла в манипуляции с параметрами запроса для динамического изменения логики работы запроса. Таким образом программное формирование текста запроса с использованием объектной модели позволяет получить код, подчиненный логике запроса и делает ненужным манипуляции с параметрами. Первое способствует упрощению отладки, уменьшению затрат на сопровождение и развитие программного кода, а второе - лучшей производительности выполнения запроса.
Объектная модель запроса
Описание объектной модели схемы запроса можно найти во встроенной справке конфигуратора. Основные принципы, заложенные в модель и базовые алгоритмы работы с ней, а также подводные камни - я попытаюсь описать ниже.
Рисунок 1. Объектная структура запроса
Объект верхнего уровня модели - это пакет запросов. Создание модели начинается с добавления запроса в пакет.
Запрос может быть:
- на выборку данных
- на создание временной таблицы из параметра
- на уничтожение временной таблицы
В свойствах запроса можно указать: Разрешенные, Автоупорядочивание, Имя таблицы для помещения. Также на уровне запроса можно задать порядок выборки данных, а также настроить итоги.
Запрос состоит из операторов Выбрать. Основные составляющие оператора: источники, связи источников и поля данных. В качестве источника можно указать физическую, виртуальную, временную таблицу, параметр или вложенный запрос. В операторе Выбрать можно настроить ограничение на количество строк результата выборки и дополнительно указать признак "Выбрать различные". Результат выборки определяется условиями связей и отборов. Несколько операторов Выбрать могут быть объединены в рамках одного запроса по условию, допускающему дублирования данных (действует по-умолчанию) - "Объединить" или по условию исключающему дублирование - "Объединить Все".
Рисунок 2. Источники оператора Выбрать
Данные выборки определяются Источниками. Самой простой тип Источника - это физическая таблица, для него не требуется указывать параметры.
Для виртуальной таблицы доступны параметры, по которым будет построена таблица при выполнении запроса. Список параметров для каждого вида виртуальной таблицы можно уточнить во встроенной справке (Работа с запросом -> Таблицы). В модели доступ к параметрам осуществляется по индексу.
В случае, когда необходимо описать в качестве Источника временную таблицу, которая будет создана из прикладного объекта или получена из менеджера временных таблиц, нужно указать имя параметра запроса или имя временной таблицы из менеджера временных таблиц.
Для получения связанных отношениями данных мало указать только Источники, необходимо также указать их связи или в терминах объектной модели - Соединения. По сути Соединения содержат информацию о связях двух Источников по некоторому условию.
Данные Источников оператора Выбрать определяют доступные для выбора поля. На уровне запроса поля операторов Выбрать группируются в колонках (см. описание Колонки).
Завершается описание оператора Выбрать указанием условий отбора.
При использовании агрегатных функций в выражениях полей выборки все поля, не содержащие агрегатную функцию, попадают в поля группировки.
Сортировка или в терминах модели - Порядок, определяется перечнем полей и направлений сортировки. Определяется порядок на уровне колонок запроса.
Колонки запроса определят поля выборки. При объединении нескольких операторов Выбрать одной колонке будет соответствовать несколько полей (по одному от каждого оператора Выбрать).
В отличии от полей оператора в колонках запроса можно задать тип и порядок.
Таблица 1. Соотнесение колонок запроса и полей операторов Выбрать
Индекс |
Колонка запроса |
Поле оператора 1 |
... |
Поле оператора N |
0 |
Псевдоним 1 |
Путь к данным 1 |
... |
Путь к данным 1 |
1 |
Псевдоним 2 |
Путь к данным 2 |
... |
Путь к данным 2 |
... |
... |
... |
... |
... |
N |
Псевдоним N |
Путь к данным N |
... |
Путь к данным N |
На уровне Запроса, помимо группировки в операторах Выбрать, можно также описать получение итогов. Итоги описываются перечнем полей группировки и выражений итогов. Поля группировки в терминологии модели - Контрольные точки итогов помимо названия поля содержат также дополнительные параметры: Начало периода дополнения, Конец периода дополнения, Тип дополнения периодами, Тип контрольной точки. Также в Запросе можно указать признак Общие итоги.
Текст запроса можно получить как для всего пакета запросов, так и для отдельного запроса из пакета.
Работая с объектом "Схема запроса" необходимо понимать одну важную особенность поведения этого объекта. Дело в том, что "Схема запроса" работает на программном уровне также, как и в конструкторе запроса в интерактивном режиме. Так, Вы можете заметить, что добавляя таблицы, конструктор также может добавлять и связи, если находит подходящие для этого поля совпадающего типа в обоих источниках. Такое же поведение на программном уровне вызывает недоумение (по крайней мере у меня), так я, как программист, не ожидаю, что при добавлении источника у меня вдруг появятся еще и связи к нему. Хотя с другой стороны, при удалении временной таблицы или поля, вполне логично, что все ссылки на эту таблицу как на источник или на удаленные поля будут очищены, а связи по ним удалены. При использовании агрегатных функций в полях выборки автоматически добавляются и поля группировки.
Это же интерактивное поведение накладывает ограничение на порядок построения схемы запроса:
- Запрос пакета 0
- Оператор Выбрать
- Источники
- Соединения, Поля
- Отбор
- Оператор Выбрать ...
- Колонки, порядок, итоги
- Оператор Выбрать
- Запрос пакета 1 ...
Подсистема Работа со схемой запроса
Работа напрямую с объектом "Схема запроса" обладает рядом недостатков:
- на простые действия требуется много кода. Для описания поля требуется три строки кода: добавить выбираемые поля, установить поле колонки, установить псевдоним колонки.
- элементы интерактивного поведения приводят к неоднозначности кода. При добавлении источника могут возникать одно или несколько соединений, причем как с добавленным источником, так и с существовавшим ранее.
- некоторые объекты возникают и существуют по умолчанию, что приводит к необходимости писать разный код в зависимости от того первый это элемент или последующий. Первый запрос пакета существует по умолчанию, аналогично и для оператора - их нельзя никак удалить.
- поддерживаются только простые операции по построению модели, что не позволяет писать более компактный код с использованием повторяющихся структур (см. сервисные функции подсистемы)
Предлагаемая подсистема позволяет нивелировать недостатки работы объекта схемы запроса. Функции подсистемы позволяют за один вызов добавить и настроить объект подсистемы. Для достижения однозначности работы результат «интерактивных» действий объекта очищается. Объекты, которые нельзя удалить, переиспользуются при последующем вызове функции добавления. Также в подсистему добавлены сервисные функции поддержки построения запроса.
Построение структуры запроса. API
Более подробное описание API подсистемы находится в самом модуле. К функциям модуля есть комментарии в формате стандартов 1С (Описание процедур и функций), дающие полное представление об их работе: общее описание, описание параметров, примеры. Это описание доступно в контекстной подсказке при наборе кода.
Таблица 2. API
Функции |
Краткое описание |
Работа с запросом |
|
ДобавитьЗапросПакета |
Добавляет запрос выбора, создания временной таблицы, на уничтожение временной таблицы |
ДобавитьЗапросПакетаИзТаблицы |
Добавляет запрос пакета с источником из временной таблицы. В качестве источника можно указать другой запрос создания временной таблицы или имя временной таблицы. |
УстановитьИндексЗапросаПакета |
Позволяет изменить индекс добавленного запроса |
ДобавитьПорядок |
Установка порядка по колонке запроса |
Работа с оператором |
|
ДобавитьОператор |
Добавляет оператор Выбрать |
ДобавитьКопиюОператора |
Добавляет в запрос копию оператора выбрать. Функция может быть использована для добавления однотипных операторов, объединенных в одном запросе. После добавления оператора его можно индивидуально настроить (см. пример в описании функции, шаблон "Ханойская башня") |
ДобавитьИсточник |
Добавление в оператор Выбрать источника: физическая, виртуальная таблица, временная таблица (можно передать образец в виде таблицы значений), вложенный запрос |
ЗаменитьИсточник | Заменяет источник оператора выбрать с сохранением соединений и псевдонима (см. шаблон "Ханойская башня") |
ДобавитьПоле |
Добавляет поле источника в оператор выбрать и в колонку запроса пакета |
УдалитьПоле |
|
УстановитьВыражениеПоля |
Позволяет переустановить выражение поля. Например, добавить использование агрегатной функции. |
ДобавитьСоединение |
|
ДобавитьУсловиеСоединения |
Добавляет условие к существующим условиям соединения источников |
ДобавитьУсловиеХарактеристики |
Добавляет условий ограничений по значениям характеристик (свойств или категорий). Используется в шаблоне «Построение текста запроса по параметрам) |
Сервисные |
|
СоздатьЗапрос |
Теперь нет необходимости создавать запрос отдельно. Функция вызывается на основании схемы запроса и возвращает запрос. |
УстановитьПараметрыВиртуальнойТаблицы | Позволяет установить у источника параметры в поименованном виде |
СконвертироватьПараметрыОтбора |
Конвертация параметров отбора схемы запроса СКД в целевую схему |
Начать работать с подсистемой можно с перевода существующих алгоритмов, где используется получение или описание текстов запросов, или же при написании новых. В обоих случаях я рекомендую к использованию сервисную обработку конвертации текста запроса в код: «Конструктор схемы запроса».
Общий порядок работы может быть следующим:
- выделить/получить целевой текст запроса
- сконвертировать часть текста или весь текст запроса в код при помощи обработки «Конструктор схемы запроса»
- выполнить алгоритмическую оптимизацию полученного кода, добавить комментарии
- добавить установку текста запроса из результата построения схемы запроса (получить текст запроса можно из объекта схемы или из объекта запрос пакета) или использовать сервисную функцию создать запрос
В результате проделанной работы у вас будет код конструирования структуры с использованием объекта «Схема запроса». Такой код уже можно оптимизировать и комментировать, без опасения, что комментарий не сохранится при последующем редактировании.
Работать с текстом запроса можно как в виде текста, так и через объект «Схема запроса». Использование объектной модели запроса позволяет полностью сосредоточится на работе с запросом, а не с текстом. В простых случаях использование текстового запроса может быть более наглядным, однако для сложных запросов объектная модель более предпочтительна.
Работая непосредственно с объектом «Схема запроса» нужно учитывать его интерактивные свойства. Также, как и в интерактивном виде, конструктор запроса автоматически добавляет связи по полям одинакового типа данных, так и на программном уровне схема запроса автоматически добавляет в модель связи, а также содержит неудаляемые объекты: первый запрос и первый оператор выбора.
Интерактивные свойства объекта схема запроса на программном уровне приводят к неоднозначности работы алгоритмов. Наличие обязательных объектов коллекций, таких как запрос и оператор выбора делают невозможным использование одинаковых алгоритмов работы с их элементами.
Предложенное решение на базе использования подсистемы "Работа со схемой запроса" с одной стороны устраняет недостатки работы со встроенным объектом схема запроса, с другой - повышает наглядность текста алгоритма в коде.
Далее будут рассмотрены шаблоны решения типовых задач, а также примеры построения текста запроса из схемы.
В данном шаблоне решается задача получения данных таблицы значений. В тексте запроса нельзя напрямую работать с данными прикладных объектов, однако можно передавать значения параметров и работать уже с ними.
Значения параметров простых и ссылочных типов можно использовать сразу в запросе. Для работы с параметрами табличного типа необходимо вначале на их основании создать временную таблицу и в дальнейшем в качестве источника данных использовать её.
Таким образом, чтобы работать с данными табличного объекта при выполнении запроса необходимо сначала прочитать данные объекта во временную таблицу в первом запросе пакета, а в последующих запросах использовать эту таблицу в качестве источника данных.
При использовании подсистемы есть два решения:
- Создать запрос на создание временной таблицы
- Использовать описание временной таблицы из менеджера временных таблиц
Во 2-ом случае временная таблица уже должна быть описана ранее. Если имеет место разрыв в описании, то можно сослаться на описание временной таблицы из Менеджера временных таблиц. Для 1-го случая вместо менеджера указывается имя параметра со знаком &.
Текст модуля с источником из временной таблицы менеджера временных таблиц
// Пусть есть некий запрос
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = "ВЫБРАТЬ
| 0 КАК Сумма
|ПОМЕСТИТЬ ВТ_ОБОРОТЫ";
Запрос.Выполнить();
// Нужно создать схему запроса, где в качестве источника будет указана временная таблица из менеджера запроса
СхемаЗапроса = Новый СхемаЗапроса;
ЗапросПакета = РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса);
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
// Источник из временной таблицы менеджера временных таблиц
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, РаботаСоСхемойЗапроса.ПолучитьОписаниеВременнойТаблицы("ВТ_ОБОРОТЫ", Запрос.МенеджерВременныхТаблиц), "ВТ_ОБОРОТЫ");
Рисунок 3. Наложение ограничений на выбор данных основного источника через условия связей
Рассмотрим применение шаблона на примере создания текста запроса динамического списка. При открытии формы списка по переданным параметрам отбора платформа устанавливает фиксированные настройки. В параметрах можно передать только критерии отбора на равенство по полям запроса первого уровня (точки использовать нельзя). У этого способа настройки есть ограничение - нельзя передать сложные критерии отбора, когда требуется использовать не только условие равенства значений полей переданным значениям отбора, но и В списке, Не и т.д., или когда требуется использовать данные подзапросов и дополнительных таблиц, данные виртуальных таблиц с параметрами.
Обойти обозначенные ограничения можно, если при открытии формы списка проанализировать переданные параметры и по результату модифицировать текст запроса. После изменения необходимо также установить параметры динамического списка.
Теперь собственно о шаблоне. Согласно шаблону все параметры должны передаваться в структуре Отбор или Характеристики. Эти структуры содержат названия параметров и их значения. Алгоритм формирования текста запроса должен проанализировать параметры из структуры Отбор, выполнить модификацию запроса, удалить найденные параметры из структуры Отбор и добавить в структуру ПараметрыЗапроса. Далее значения структуры Отбор будут установлены платформой в фиксированных настройках отбора, а параметры из структуры ПараметрыЗапроса необходимо будет установить в параметрах динамического списка.
Алгоритм модификации запроса:
- Проверить наличие параметра или группы параметров в структуре Отбор
- При наличии выполнить модификацию запроса
- Удалить использованные параметры из Отбора и добавить в ПараметрыЗапроса
Текст модуля настройки динамического списка на основе переданных параметров
СхемаЗапроса.УстановитьТекстЗапроса(Список.ТекстЗапроса);
Если Параметры.Свойство("Отбор") Тогда
// Переместить все параметры, которые не относятся к прямому отбору, в структуру ПараметрыЗапроса
ОбщийКлиентСервер.ПереместитьЗначенияСвойств(Параметры.Отбор, ПараметрыЗапроса, "Организация,Контрагент,ДоговорКонтрагента");
// Проверить наличие одиночного параметра
Если ПараметрыЗапроса.Свойство("ИмяПараметра") Тогда
...
КонецЕсли;
// Проверить существование группы связанных параметров
Если ОбщийКлиентСервер.СтруктураСодежитСвойства(ПараметрыЗапроса, "Организация,Контрагент,ДоговорКонтрагента") Тогда
ДобавитьИсточник(...);
ДобавитьСоединение(...);
КонецЕсли;
// Проверить наличие структуры Характеристики
Если Параметры.Свойство("Характеристики") Тогда
// Установить характеристики, используя сервисную функцию ДобавитьУсловиеХарактеристики
Для ЭлементХарактеристики Из Параметры.Характеристики Цикл
ИмяСвойства = ЭлементХарактеристики.Ключ;
РаботаСоСхемойЗапроса.ДобавитьУсловиеХарактеристики(ОператорВыбрать, Источник, "РегистрСведений.ДополнительныеСвойства»" "", "", …);
ПараметрыЗапроса.Вставить(ИмяСвойства, ПланВидовХарактеристик.Свойства["ИмяСвойства"]);
КонецЕсли;
КонецЕсли;
// Установка модифицированного текста запроса и установка параметров динамического списка
Список.ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
Для каждого ЭлементПараметраЗапроса Из ПараметрыЗапроса Цикл
Список.Параметры.УстановитьЗначениеПараметра();
КонецЦикла;
Шаблон «Последовательность преобразований источника»
Рисунок 4. Последовательность запросов преобразования источника
Если в качестве источника в тексте запроса необходимо использовать временную таблицу или вложенный запрос, то для этого случая можно использовать шаблон. В данном контексте использование временной таблицы или вложенного запроса – эквивалентно. В качестве примера рассмотрим как более предпочтительный вариант - вариант с использованием временной таблицы.
Случаи когда требуется цепочка преобразований:
- Источник запроса содержит объединение данных, которые необходимо предварительно сгруппировать
- Несколько запросов ссылаются на один источник – временную таблицу
- Запрос изначально очень сложный разбивается на несколько относительно простых последовательных запросов с помещением результата в промежуточную временную таблицу
В 1-ом случае шаблон будет такой (см. пример из шаблона "Выборка из временной таблицы"):
- Добавить запрос с помещением результата во временную таблицу
- Добавить запрос из временной таблицы
2-случай – это 1-ый + добавить несколько запросов из одной временной таблицы
3-ий (см. рисунок 4):
- Добавить запрос с помещением результата во временную таблицу с суффиксом _0
- Добавить запрос из временной таблицы с помещением результата во временную таблицу с суффиксом _1 и уничтожением текущей временной таблицы и т.д.
Текст модуля
СхемаЗапроса = Новый СхемаЗапроса;
////////////////////////////////////////////////////////////////////////////////
// ЗАПРОС ПАКЕТА 0 Поместить во временную таблицу ВТ_ОБОРОТЫ_0 объединение 2-х операторов Выбрать
ЗапросПакета = РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса, "ВТ_ОБОРОТЫ_0");
// 1-ый оператор Выбрать
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать,
"РегистрНакопления._ДемоОборотыПоСчетамНаОплату.Обороты", "_ДемоОборотыПоСчетамНаОплатуОбороты",
Новый Структура("Периодичность,Условие", "Регистратор", "Номенклатура = &Товар"));
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Документ._ДемоЗаказПокупателя", "_ДемоЗаказПокупателя");
РаботаСоСхемойЗапроса.ДобавитьСоединение(ОператорВыбрать, "_ДемоОборотыПоСчетамНаОплатуОбороты", "_ДемоЗаказПокупателя", "_ДемоОборотыПоСчетамНаОплатуОбороты.Регистратор = _ДемоЗаказПокупателя.Ссылка");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоОборотыПоСчетамНаОплатуОбороты.Период", "Период");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоОборотыПоСчетамНаОплатуОбороты.Регистратор");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоОборотыПоСчетамНаОплатуОбороты.Номенклатура");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоЗаказПокупателя.Ссылка", "Ссылка");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоОборотыПоСчетамНаОплатуОбороты.СуммаОборот");
// 2-ой оператор Выбрать (добавлен копированием 1-го)
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьКопиюОператора(ЗапросПакета, ОператорВыбрать);
// Заменить условие виртуальной таблицы _ДемоОборотыПоСчетамНаОплатуОбороты 2-го оператора
Источник = ОператорВыбрать.Источники.НайтиПоПсевдониму("_ДемоОборотыПоСчетамНаОплатуОбороты");
РаботаСоСхемойЗапроса.УстановитьПараметрыВиртуальнойТаблицы(Источник, Новый Структура("Условие", "Номенклатура = &Услуга"));
////////////////////////////////////////////////////////////////////////////////
// ЗАПРОС ПАКЕТА 1 Добавить запрос на основании виртуальной таблицы ВТ_ОБОРОТЫ_0 с её последующим уничтожением
ЗапросПакета = РаботаСоСхемойЗапроса.ДобавитьЗапросПакетаИзТаблицы(СхемаЗапроса, "ВТ_ОБОРОТЫ_0",,,, Истина);
// Модификация запроса путем добавления агрегатной функции к полю СуммаОборот из 1-го оператора Выбрать (запрос состоит из одного оператора Выбрать)
ОператорВыбрать = ЗапросПакета.Операторы[0];
РаботаСоСхемойЗапроса.УстановитьВыражениеПоля(ОператорВыбрать, "СУММА", "СуммаОборот");
Текст запроса
ВЫБРАТЬ
_ДемоОборотыПоСчетамНаОплатуОбороты.Период КАК Период,
_ДемоОборотыПоСчетамНаОплатуОбороты.Регистратор КАК Регистратор,
_ДемоОборотыПоСчетамНаОплатуОбороты.Номенклатура КАК Номенклатура,
_ДемоЗаказПокупателя.Ссылка КАК Ссылка,
_ДемоОборотыПоСчетамНаОплатуОбороты.СуммаОборот КАК СуммаОборот
ПОМЕСТИТЬ ВТ_ОБОРОТЫ_0
ИЗ
РегистрНакопления._ДемоОборотыПоСчетамНаОплату.Обороты(, , Регистратор, Номенклатура = &Товар) КАК _ДемоОборотыПоСчетамНаОплатуОбороты
ЛЕВОЕ СОЕДИНЕНИЕ Документ._ДемоЗаказПокупателя КАК _ДемоЗаказПокупателя
ПО (_ДемоОборотыПоСчетамНаОплатуОбороты.Регистратор = _ДемоЗаказПокупателя.Ссылка)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
_ДемоОборотыПоСчетамНаОплатуОбороты.Период,
_ДемоОборотыПоСчетамНаОплатуОбороты.Регистратор,
_ДемоОборотыПоСчетамНаОплатуОбороты.Номенклатура,
_ДемоЗаказПокупателя.Ссылка,
_ДемоОборотыПоСчетамНаОплатуОбороты.СуммаОборот
ИЗ
РегистрНакопления._ДемоОборотыПоСчетамНаОплату.Обороты(, , Регистратор, Номенклатура = &Услуга) КАК _ДемоОборотыПоСчетамНаОплатуОбороты
ЛЕВОЕ СОЕДИНЕНИЕ Документ._ДемоЗаказПокупателя КАК _ДемоЗаказПокупателя
ПО (_ДемоОборотыПоСчетамНаОплатуОбороты.Регистратор = _ДемоЗаказПокупателя.Ссылка)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_ОБОРОТЫ_0.Период КАК Период,
ВТ_ОБОРОТЫ_0.Регистратор КАК Регистратор,
ВТ_ОБОРОТЫ_0.Номенклатура КАК Номенклатура,
ВТ_ОБОРОТЫ_0.Ссылка КАК Ссылка,
СУММА(ВТ_ОБОРОТЫ_0.СуммаОборот) КАК СуммаОборот
ИЗ
ВТ_ОБОРОТЫ_0 КАК ВТ_ОБОРОТЫ_0
СГРУППИРОВАТЬ ПО
ВТ_ОБОРОТЫ_0.Период,
ВТ_ОБОРОТЫ_0.Регистратор,
ВТ_ОБОРОТЫ_0.Номенклатура,
ВТ_ОБОРОТЫ_0.Ссылка
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ВТ_ОБОРОТЫ_0
Шаблон «Ханойская башня»
В ситуации использования нескольких объединений в запросе, когда структура операторов выбрать отличается незначительно: используются различные параметры виртуальных таблиц или отборы, различаются источники. Если при этом совпадают названия полей и структура соединений, то в таком запросе можно использовать базовый оператор выбрать для описания всех последующих операторов объединения.
Согласно шаблону нужно описать первый оператор выбрать, затем 2-й и последующие операторы нужно добавить путем копирования первого. В копии оператора нужно при необходимости: заменить источники, поменять параметры виртуальных таблиц и настроить отбор.
Следуя шаблону можно получить очень компактный код запроса с однотипными объединениями.
Текст модуля
СхемаЗапроса = Новый СхемаЗапроса;
////////////////////////////////////////////////////////////////////////////////
// ЗАПРОС ПАКЕТА 0
ЗапросПакета = РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса);
// Добавить образец оператора Выбрать
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Документ._ДемоПоступлениеТоваров", "Документы");
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "РегистрСведений.КурсыВалют.СрезПоследних", "КурсыВалютСрезПоследних");
РаботаСоСхемойЗапроса.ДобавитьСоединение(ОператорВыбрать, "Документы", "КурсыВалютСрезПоследних", "Документы.Валюта = КурсыВалютСрезПоследних.Валюта");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "Документы.Ссылка", "Ссылка");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "Документы.Валюта", "Валюта");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "КурсыВалютСрезПоследних.Курс", "Курс");
// Добавить копию 1 оператора Выбрать и заменить источник
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьКопиюОператора(ЗапросПакета, ОператорВыбрать);
РаботаСоСхемойЗапроса.ЗаменитьИсточник(ЗапросПакета, ОператорВыбрать, "Документы", "Документ._ДемоРеализацияТоваров");
// Добавить копию 2 оператора Выбрать и заменить источник
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьКопиюОператора(ЗапросПакета, ОператорВыбрать);
РаботаСоСхемойЗапроса.ЗаменитьИсточник(ЗапросПакета, ОператорВыбрать, "Документы", "Документ._ДемоЗаказПокупателя");
Текст запроса
ВЫБРАТЬ
Документы.Ссылка КАК Ссылка,
Документы.Валюта КАК Валюта,
КурсыВалютСрезПоследних.Курс КАК Курс
ИЗ
Документ._ДемоПоступлениеТоваров КАК Документы
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
ПО (Документы.Валюта = КурсыВалютСрезПоследних.Валюта)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Документы.Ссылка,
Документы.Валюта,
КурсыВалютСрезПоследних.Курс
ИЗ
Документ._ДемоРеализацияТоваров КАК Документы
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
ПО (Документы.Валюта = КурсыВалютСрезПоследних.Валюта)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Документы.Ссылка,
Документы.Валюта,
КурсыВалютСрезПоследних.Курс
ИЗ
Документ._ДемоЗаказПокупателя КАК Документы
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
ПО (Документы.Валюта = КурсыВалютСрезПоследних.Валюта)
Шаблон «Расширение данных источника»
Рисунок 5. Расширение источника
Обычно в задачу запроса входит уменьшение выборки данных за счет установки дополнительных условий отбора и соединений. Рассматриваемый шаблон решает противоположную задачу – расширение данных выборки.
Для решения указанной задачи необходимо все внутренние соединения заменить на левые с дополнительным условием отбора на существование и расширить условия отбора. Реализация такого решения состоит из шагов:
- «Расшить внутренние соединения» - заменить внутренние соединения на левые с добавлением условия существования (ГДЕ Не ПолеИсточникаСправа Есть Null)
- Все условия отбора объединить в группу И и поместить в группу ИЛИ
- Добавить в группу ИЛИ расширяющее условие
Текст модуля
// Пусть есть схема, состоящая из одного оператора Выбрать:
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса("ВЫБРАТЬ
| _ДемоНоменклатура.Ссылка КАК Ссылка,
| _ДемоНоменклатура.Код КАК Код,
| _ДемоНоменклатура.Наименование КАК Наименование
|ИЗ
| Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник._ДемоВидыНоменклатуры КАК _ДемоВидыНоменклатуры
| ПО _ДемоНоменклатура.ВидНоменклатуры = _ДемоВидыНоменклатуры.Ссылка");
// Тогда для её модификации нужно извлечь оператор:
ОператорВыбрать = СхемаЗапроса.ПакетЗапросов[0].Операторы[0];
// Обойти все внутренние соединения и заменить на левые с добавлением условия на существование
Для Каждого Источник Из ОператорВыбрать.Источники Цикл
Для Каждого Соединение Из Источник.Соединения Цикл
Если Соединение.ТипСоединения = ТипСоединенияСхемыЗапроса.Внутреннее Тогда
ИсточникСправа = Соединение.Источник.Источник;
Соединение.ТипСоединения = ТипСоединенияСхемыЗапроса.ЛевоеВнешнее;
ОператорВыбрать.Отбор.Добавить("НЕ "+ИсточникСправа.Псевдоним+"."+ИсточникСправа.ДоступныеПоля[0].Имя+" Есть Null");
КонецЕсли;
КонецЦикла;
КонецЦикла;
// Выделить условия отбора в группу И и поместить в группу ИЛИ с добавлением расширяющего условия ЭтоГруппа
Если ОператорВыбрать.Отбор.Количество()>0 Тогда
МассивУсловияОтбора = Новый Массив;
Для Каждого Отбор Из ОператорВыбрать.Отбор Цикл
МассивУсловияОтбора.Добавить(Строка(Отбор));
КонецЦикла;
ОператорВыбрать.Отбор.Очистить();
ОператорВыбрать.Отбор.Добавить("("+СтрСоединить(МассивУсловияОтбора, ") И (")+") ИЛИ _ДемоНоменклатура.ЭтоГруппа");
КонецЕсли;
Результирующий текст запроса
ВЫБРАТЬ
_ДемоНоменклатура.Ссылка КАК Ссылка,
_ДемоНоменклатура.Код КАК Код,
_ДемоНоменклатура.Наименование КАК Наименование
ИЗ
Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ Справочник._ДемоВидыНоменклатуры КАК _ДемоВидыНоменклатуры
ПО _ДемоНоменклатура.ВидНоменклатуры = _ДемоВидыНоменклатуры.Ссылка
ГДЕ
(НЕ _ДемоВидыНоменклатуры.Ссылка ЕСТЬ NULL
ИЛИ _ДемоНоменклатура.ЭтоГруппа)
Примеры
Далее будут приведены примеры текстов запроса и модуль создания эквивалентной схемы запроса. Примеры приведены без оптимизации, полученные с помощью сервисной обработки "Конструктор схемы запроса".
Текст запроса
ВЫБРАТЬ
_ДемоКонтрагенты.Ссылка КАК Ссылка
ИЗ
Справочник._ДемоКонтрагенты КАК _ДемоКонтрагенты
ОБЪЕДИНИТЬ
ВЫБРАТЬ
_ДемоПартнеры.Ссылка
ИЗ
Справочник._ДемоПартнеры КАК _ДемоПартнеры
Текст модуля
СхемаЗапроса = Новый СхемаЗапроса;
////////////////////////////////////////////////////////////////////////////////
// ЗАПРОС ПАКЕТА 0
ЗапросПакета = РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса);
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Справочник._ДемоКонтрагенты");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоКонтрагенты.Ссылка", "Ссылка");
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета, Новый Структура("ТипОбъединения", ТипОбъединенияСхемыЗапроса.Объединить));
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Справочник._ДемоПартнеры");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоПартнеры.Ссылка", "Ссылка");
Текст запроса
ВЫБРАТЬ
КОЛИЧЕСТВО(_ДемоБанковскиеСчета.Ссылка) КАК Ссылка,
_ДемоБанковскиеСчета.Владелец КАК Владелец
ИЗ
Справочник._ДемоБанковскиеСчета КАК _ДемоБанковскиеСчета
СГРУППИРОВАТЬ ПО
_ДемоБанковскиеСчета.Владелец
Текст модуля
СхемаЗапроса = Новый СхемаЗапроса;
////////////////////////////////////////////////////////////////////////////////
// ЗАПРОС ПАКЕТА 0
ЗапросПакета = РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса);
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Справочник._ДемоБанковскиеСчета");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "КОЛИЧЕСТВО(_ДемоБанковскиеСчета.Ссылка)", "Ссылка");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоБанковскиеСчета.Владелец");
Текст запроса
ВЫБРАТЬ
ВложенныйЗапрос.Ссылка КАК Ссылка
ИЗ
(ВЫБРАТЬ
_ДемоКонтрагенты.Ссылка КАК Ссылка
ИЗ
Справочник._ДемоКонтрагенты КАК _ДемоКонтрагенты
ОБЪЕДИНИТЬ
ВЫБРАТЬ
_ДемоПартнеры.Ссылка
ИЗ
Справочник._ДемоПартнеры КАК _ДемоПартнеры) КАК ВложенныйЗапрос
Текст модуля
СхемаЗапроса = Новый СхемаЗапроса;
////////////////////////////////////////////////////////////////////////////////
// ЗАПРОС ПАКЕТА 0
ЗапросПакета = РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса);
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
ВложенныйЗапросЗапросПакета = РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, РаботаСоСхемойЗапроса.ПолучитьОписаниеВложенногоЗапроса()).Источник.Запрос;
ВложенныйЗапросОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ВложенныйЗапросЗапросПакета);
РаботаСоСхемойЗапроса.ДобавитьИсточник(ВложенныйЗапросОператорВыбрать, "Справочник._ДемоКонтрагенты");
РаботаСоСхемойЗапроса.ДобавитьПоле(ВложенныйЗапросЗапросПакета, ВложенныйЗапросОператорВыбрать,, "_ДемоКонтрагенты.Ссылка", "Ссылка");
ВложенныйЗапросОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ВложенныйЗапросЗапросПакета, Новый Структура("ТипОбъединения", ТипОбъединенияСхемыЗапроса.Объединить));
РаботаСоСхемойЗапроса.ДобавитьИсточник(ВложенныйЗапросОператорВыбрать, "Справочник._ДемоПартнеры");
РаботаСоСхемойЗапроса.ДобавитьПоле(ВложенныйЗапросЗапросПакета, ВложенныйЗапросОператорВыбрать,, "_ДемоПартнеры.Ссылка", "Ссылка");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "ВложенныйЗапрос.Ссылка");
Шаблон "Работа с характеристиками"
Характеристики объекта представляют собой обычные соединения с таблицей, которая хранит значения характеристик объекта. В задачах, где требуется получить значения характеристик в одном соединении необходимо добавить столько соединений, сколько характеристик требуется получить.
Для примера возьмем значение характеристики номенклатуры из регистра сведений "Дополнительные характеристики" (демо-база БСП, см. также пример в Работа с данными выбора).
Объектная модель:
Текст модуля
СхемаЗапроса = Новый СхемаЗапроса;
ЗапросПакета = РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса);
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
Источник = РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Справочник._ДемоНоменклатура");
ИсточникСведения = РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "РегистрСведений.ДополнительныеСведения", "Сведение");
// Далее используется функция добавить соединение с дополнительными сведениями
РаботаСоСхемойЗапроса.ДобавитьСоединение(ОператорВыбрать, Источник, ИсточникСведения,
"_ДемоНоменклатура.Ссылка = Сведение.Объект И Сведение.Свойство = &Вид",
ТипСоединенияСхемыЗапроса.Внутреннее);
ОператорВыбрать.Отбор.Добавить("Сведение.Значение = &Значение");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоНоменклатура.Ссылка");
Соответствующий запрос будет такой:
Текст запроса
ВЫБРАТЬ
_ДемоНоменклатура.Ссылка КАК Ссылка
ИЗ
Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК Сведение
ПО (_ДемоНоменклатура.Ссылка = Сведение.Объект И Сведение.Свойство = &Вид)
ГДЕ
Сведение.Значение = &Значение
При построении объектной модели условие соединения имеет определенную структуру: наложение условия на ссылку объекта и вид свойства. В более наглядной форме это соединение можно представить при использовании функции ДобавитьСоединениеХарактеристики:
Текст модуля
СхемаЗапроса = Новый СхемаЗапроса;
ЗапросПакета = РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса);
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
Источник = РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Справочник._ДемоНоменклатура");
ИсточникСведения = РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "РегистрСведений.ДополнительныеСведения", "Сведение");
// Далее используется функция добавить соединение с характеристикой
РаботаСоСхемойЗапроса.ДобавитьСоединениеХарактеристики(ОператорВыбрать, Источник, ИсточникСведения, "Ссылка",
"Объект", "Свойство", "&Вид", ТипСоединенияСхемыЗапроса.Внутреннее);
РаботаСоСхемойЗапроса.ДобавитьОтбор(ОператорВыбрать, "Сведение.Значение = &Значение");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоНоменклатура.Ссылка");
Приложения
Рисунок 6. Конструктор схемы запроса
В задачу перевода программного кода от использования текста к использованию схемы запроса можно существенно упростить, если воспользоваться автоматизированной генерацией программного кода на основе текста запроса.
Текст запроса взаимно-однозначно описывается схемой запроса. Таким образом задача преобразования исходного текста в программный код с использованием схемы становится простой.
Представленная обработка позволяет сделать такое преобразование. Кроме того, при создании текста запроса можно также воспользоваться встроенным в обработку конструктором и затем полученный результат сконвертировать в текст модуля схемы запроса.
После получения текста модуля его можно оптимизировать. Для оптимизации можно задействовать сервисные функции. Рекомендую объединять условия соединений и отборов - так код будет выглядеть более компактно, а на результат это не влияет.
Поставка
Решение поставляется в виде конфигурации. Подсистема использует общие процедуры БСП. Перед объединением сбросьте признак объединять свойства конфигурации.
Таблица 3. Состав поставки
Метаданные |
Наименование |
Назначение |
Ограничения |
ОбщийМодуль |
ОбщийКлиентСервер |
Вспомогательные процедуры и функции |
|
|
РаботаСоСхемойЗапроса |
Основные функции подсистемы |
|
Обработка |
Конструктор схемы запроса |
Конвертация текста запроса в программный код |
Использует библиотеку Regex.dll
|
- Встроенная справка - работа с запросом - схема запроса, таблицы
- Управляемый конструктор запроса и объектная модель схемы запроса
- Конструктор запросов в управляемом приложении в «1С:Предприятие 8.3.5»
Обновления в версии 1.02:
- Уточнены параметры функции ДобавитьОператор
- Изменена функция ДобавитьКопиюОператора: добавлено копирование отбора и возможность установки параметров оператора
- Добавлена процедура ЗаменитьИсточник (см. описание в API)
- Добавлена глава Шаблон "Ханойская башня"
Обновления в версии 1.03:
- Исправлено копирование полей для функции ДобавитьКопиюОператора. Ранее могла возникнуть ситуация, когда при копировании поля привязывались к другому порядку колонок запроса
- Дополнен комментарий к УстановитьВыражениеПоля
- Конструктор схемы запроса: добавлена обработка свойства порядка АВТОУПОРЯДОЧИВАНИЕ
Обновления в версии 1.04:
- ДобавитьСоединение - добавлен параметр Заменить
- ДобавитьУсловиеСоединения - функция стала внутреннего использования
- УстановитьИндексЗапросаПакета - исправлено наименование параметра
- ДобавитьУсловиеОграниченияПоВидуДоступа - добавлен новый метод
- ЗаменитьИсточник - добавлен необязательный параметр ПараметрыВиртуальнойТаблицы
- ДобавитьПоле - параметр Оператор можно не передавать, будет использован последний
- ДобавитьИсточник - убрано добавление полей по описанию временной таблицы
- ДобавитьЗапросПакетаИзТаблицы - добавлена обработка параметра ТаблицаИсточника на основании описания временной таблицы
- ДобавитьОтбор - новая процедура, позволяет добавлять отбор через использование запроса пакета
- ПолучитьОписаниеВременнойТаблицы - тип доступного поля временной таблицы из менеджера временных таблиц устанавливатся в неопределено для типа Строка. Это связано с неправильной обработкой этого поля, когда по нему делаются соединения: возникает ошибка сравнения полей несовместимых типов. Установка типа поля в неопределено никаких ограничений за собой не несет, т.к. эта информация используется только на этапе построений схемы запроса и не учитывается при непосредсвенном выполнении запроса.
Обновления в версии 1.05:
Исправления и обновления:
- ДобавитьПоле - добавлено примечание: можно использовать для замены существующего поля, если использовать тот же псевдоним
- ДобавитьУсловиеХарактеристики - исправлена ошибка
- ДобавитьУсловиеОграниченияПоВидуДоступа - добавлено описание
Новые функции:
- УстановитьВыражениеПолей
- ИзменитьПсевдонимКолонки
- УдалитьКолонку
- ДобавитьУсловиеХарактеристики
Удаление:
- ДобавитьУсловиеХарактеристики - признана устаревшей и удалена. Нужно использовать ДобавитьУсловиеХарактеристики
Обновления в версии 1.06:
Добавлена поддержка индексов временной таблицы и итогов. Теперь конструктор схемы запроса поддерживает полную объектную модель запроса.
Новые функции:
- ДобавитьИтог
Обновления в версии 1.07 (2018.07.27):
Исправления:
- УстановитьИндексЗапросаПакета - реализация приведена в соответствие с версией платформой 8.3.11
- ДобавитьОператор - уточнен алгоритм для случая оператора выбрать без источников
Обновления в версии 1.08 (2018.08.02):
Исправления:
- ДобавитьОператор - в функции уточнено получение нового оператора: если по нулевому индексу оператор имеет хоть одно поле или хоть один источник, то добавляется новый, иначе - переиспользуется с нулевым индексом
Обновления в версии 2.0.0.1 (2019.02.06):
Рефакторинг. Изменены наименования функций, старые помечены как устаревшие:
- ДобавитьЗапросПакета->ЗапросПакета
- ДобавитьЗапросПакетаИзТаблицы->ЗапросПакетаИзТаблицы
- ДобавитьОператор->Оператор
- ДобавитьКопиюОператора->КопияОператора
- ДобавитьИсточник->Источник
- ДобавитьПоле->Поле
- УстановитьВыражениеПоля->ВыражениеПоля
- ДобавитьПорядок->Порядок
- ПолучитьОписаниеВременнойТаблицы->ОписаниеВременнойТаблицы
- ПолучитьОписаниеВложенногоЗапроса->ОписаниеВложенногоЗапроса
- ДобавитьСоединение->Соединение
- СоздатьЗапрос->Запрос
- ДобавитьОтбор->Оператор.Отбор.Добавить()
- ДобавитьИтог->Итог
Изменения в функциях:
- Поле - добавлена возможность добавить доступные поля через указание "*" или через запятую
- ЗапросПакета - добавлен параметр ОператорВыбрать, теперь нет нужды отдельно получать оператор, достаточно сразу при получении пакета
- ЗапросПакетаИзТаблицы - добавлен параметр ОператорВыбрать
- УдалитьКолонку, УдалитьПоле - добавлено безопасное удаление: если колонки/поля по имени нет, то ничего не происходит
- ОписаниеВременнойТаблицы - добавлен параметр Колонки, расширен список источников: таблица значений, временная таблица
Новые функции:
- УдалитьИсточник
- Добавлены процедуры работы с компоновкой данных:
- СкопироватьЭлементыСхемыЗапроса
- СхемаЗапросаКомпоновкиДанных - Конструирует схему запроса по описанию из схемы компоновки данных
- СкопироватьОтборКомпоновкиДанных - Копирует условия отбора из элементов СКД в отбор оператора схемы запроса
Улучшения:
- Структурирование модуля по областям, добавление комментариев в формате 1С
- Обновлена обработка "Конструктор схемы запроса": изменена компоновка генерируемого кода, код приведен в соответствие к новым функциям
Обновления в версии 2.0.0.2 (2019.03.03):
Изменения в функциях:
- ОписаниеВременнойТаблицы - При конструировании типов полей временной таблицы для строкового типа определяется тип Неопределено. Это сделано для того, чтобы тип не определялся как строка неограниченной длины
Обновлена обработка "Конструктор схемы запроса":
- Добавлены параметры первого оператора выбрать, которые были "потеряны" при переходе на новый стиль генерируемого кода
- Добавлено имя временной таблицы в комментарий запроса пакета