рубрики: Платформа 8.3 | Дата: 18 сентября, 2017
Скачать обработку с примерами из статьи: professia1c_QuerySchema.epf
Платформа: 8.3; Тип формы: управляемая.
В версии 8.3.5 в платформе 1С появился новый объект — СхемаЗапроса. Он позволяет видоизменять текст исходного запроса без привычного составления динамических запросов, а использует специальные коллекции для манипуляций с текстом запроса. Можно добавлять в запрос новые таблицы, поля, устанавливать соединения таблиц и т.д. В общем можно доработать текст исходного запроса в соответствии с любыми потребностями. Рассмотрим на примере доработку текста запроса с помощью объекта схема запроса.
Пусть у нас есть небольшая таблица с товарами:
КодТовара | Наименование |
---|---|
001 | Яблоки |
002 | Апельсины |
Сформируем эту таблицу с использованием языка запросов 1С и поместим ее во временную:
ВЫБРАТЬ
"001" КАК КодТовара,
"Яблоки" КАК Наименование
ПОМЕСТИТЬ ВТ_Товары
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"002",
"Апельсины"
И еще у нас есть таблица с историей изменения цен
Дата | КодТовара | Цена |
---|---|---|
01.10.2017 0:00:00 | 001 | 75 |
01.11.2017 0:00:00 | 001 | 90 |
Добавим и ее в наш запрос в качестве временной, а в третьем пакете запроса сделаем выборку из временной таблицы с товарами:
ВЫБРАТЬ
"001" КАК КодТовара,
"Яблоки" КАК Наименование
ПОМЕСТИТЬ ВТ_Товары
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"002",
"Апельсины"
;
///////////////////////////////
ВЫБРАТЬ
ДАТАВРЕМЯ(2017, 10, 1) КАК Дата,
"001" КАК КодТовара,
75 КАК Цена
ПОМЕСТИТЬ ВТ_Цена
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2017, 11, 1),
"001",
90
;
///////////////////////////////
ВЫБРАТЬ
ВТ_Товары.КодТовара,
ВТ_Товары.Наименование
ИЗ
ВТ_Товары КАК ВТ_Товары
Это будет наш исходный запрос. А теперь с помощью схемы запроса присоединим к последнему пакету в запросе таблицу в которой найдем среднюю цену для товара с помощью группировки. Используем для этого временную таблицу с ценами. То есть в итоге у нас должен будет получиться вот такой текст:
ВЫБРАТЬ
"001" КАК КодТовара,
"Яблоки" КАК Наименование
ПОМЕСТИТЬ ВТ_Товары
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
"002",
"Апельсины"
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ДАТАВРЕМЯ(2017, 10, 1) КАК Дата,
"001" КАК КодТовара,
75 КАК Цена
ПОМЕСТИТЬ ВТ_Цена
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2017, 11, 1),
"001",
90
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Товары.КодТовара,
ВТ_Товары.Наименование,
СредняяЦена.Цена КАК СредняяЦена
ИЗ
ВТ_Товары КАК ВТ_Товары
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ВТ_Цена.КодТовара КАК КодТовара,
СРЕДНЕЕ(ВТ_Цена.Цена) КАК Цена
ИЗ
ВТ_Цена КАК ВТ_Цена
СГРУППИРОВАТЬ ПО
ВТ_Цена.КодТовара) КАК СредняяЦена
ПО (ВТ_Товары.КодТовара = СредняяЦена.КодТовара)
Красным цветом выделены строки, которые будут добавлены при помощи схемы запроса. То есть надо будет добавить программно: новое поле, вложенный запрос с группировкой и левое соединение.
ЗапросИсходный = Новый Запрос;
ЗапросИсходный.Текст =
"ВЫБРАТЬ
| ""001"" КАК КодТовара,
| ""Яблоки"" КАК Наименование
|ПОМЕСТИТЬ ВТ_Товары
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ""002"",
| ""Апельсины""
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДАТАВРЕМЯ(2017, 10, 1) КАК Дата,
| ""001"" КАК КодТовара,
| 75 КАК Цена
|ПОМЕСТИТЬ ВТ_Цена
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ДАТАВРЕМЯ(2017, 11, 1),
| ""001"",
| 90
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_Товары.КодТовара,
| ВТ_Товары.Наименование
|ИЗ
| ВТ_Товары КАК ВТ_Товары";
//Помещаем исходный текст в схему запроса
//и получаем из нее некоторые исходные данные
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(ЗапросИсходный.Текст);
ПакетЗапросов = СхемаЗапроса.ПакетЗапросов;
ЗапросВыбора = ПакетЗапросов[2];
ОператорВыбора = ЗапросВыбора.Операторы[0];
ИсточникОсновной = ОператорВыбора.Источники[0];
//Формируем текст вложенного запроса
ТекстВложенногоЗапроса = "
|ВЫБРАТЬ
| ВТ_Цена.КодТовара КАК КодТовара,
| СРЕДНЕЕ(ВТ_Цена.Цена) КАК Цена
|ИЗ
| ВТ_Цена КАК ВТ_Цена
|СГРУППИРОВАТЬ ПО
| ВТ_Цена.КодТовара";
ИсточникВложенный = ОператорВыбора.Источники.Добавить(Тип("ВложенныйЗапросСхемыЗапроса"), "СредняяЦена");
ИсточникВложенный.Источник.Запрос.УстановитьТекстЗапроса(ТекстВложенногоЗапроса);
//Делаем левое соединение вложенного запроса с исходной таблицей
СтрокаСоединения = "ВТ_Товары.КодТовара = СредняяЦена.КодТовара";
ИсточникОсновной.Соединения.Добавить(ИсточникВложенный, СтрокаСоединения);
//Добавляем поле с ценой
ТекстПоля = "СредняяЦена.Цена";
ПолеЦена = ОператорВыбора.ВыбираемыеПоля.Добавить(ТекстПоля);
ЗапросВыбора.Колонки[2].Псевдоним = "СредняяЦена";
//Выводим сообщение с новым текстом запроса
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
Сообщение.Сообщить();
Для начала мы используем единственное свойство схемы запроса — ПакетЗапросов, чтобы получить перечень запросов в пакете и добраться до нужного нам третьего пакета. Вторым этапом мы берем текст вложенного запроса и формируем на его основании новый ИсточникСхемыЗапроса. Здесь хочется отметить один момент в строке Источники.Добавить(Тип(«ВложенныйЗапросСхемыЗапроса»), «СредняяЦена»). А именно как указывается тип вложенного запроса с помощью строки Тип(«ВложенныйЗапросСхемыЗапроса»). И как нетрудно догадаться во втором параметре указывается псевдоним присоединяемой таблицы. После того как вложенный запрос создан мы присоединяем его к основной таблице. И наконец, добавляем в основной запрос новое поле со средней ценой. Обратите внимание, что если псевдоним нового поля должен отличаться от принятого по умолчанию, его надо задать отдельно с помощью свойства Колонки.
И как обычно, в шапке статьи вы можете скачать обработку с кодом из статьи и самостоятельно поэкспериментировать.
Либо можно использовать обратный подход откорректировать сам текст запроса, получить для него схему, а потом посмотреть, из каких объектов она состоит. Так будет понятнее, куда именно следует добавлять соединение.
Да, конечно. Чтобы изучить схему запроса именно такой подход и нужен.
Спасибо интересно! Я правильно понимаю что это развитие в том числе идет к тому чтобы использовать запросы на мобильной платформе работая через СхемаЗапроса ?
Нет. Мобильная платформа здесь ни при чем.
При этом воспользоваться конструктором запроса невозможно – такой текст он не распознает, редактировать запрос в таком случае придется вручную, а программный код получается достаточно громоздким.
Все зависит от конкретной ситуации. Никто и не призывает разрабатывать новые запросы с помощью схемы запросов. Но для модификации уже существующих схема запросов может быть весьма полезной. И опять же ключевое слово — схема. При желании можно сделать механизм для представления больших запросов в виде схемы.
Улучшения наглядности не увидел. Пока вижу один способ применения нового механизма создание обычного запроса для одного из случаев его применения. Потом преобразование в схему и модификация в зависимости от входящих параметров.