Профессия — 1С

Рукопашный бой Карташ

Категории

Схема запросов

рубрики: Платформа 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].Псевдоним = "СредняяЦена";

//Выводим сообщение с новым текстом запроса
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
Сообщение.Сообщить();

Для начала мы используем единственное свойство схемы запроса — ПакетЗапросов, чтобы получить перечень запросов в пакете и добраться до нужного нам третьего пакета. Вторым этапом мы берем текст вложенного запроса и формируем на его основании новый ИсточникСхемыЗапроса. Здесь хочется отметить один момент в строке Источники.Добавить(Тип(«ВложенныйЗапросСхемыЗапроса»), «СредняяЦена»). А именно как указывается тип вложенного запроса с помощью строки Тип(«ВложенныйЗапросСхемыЗапроса»). И как нетрудно догадаться во втором параметре указывается псевдоним присоединяемой таблицы. После того как вложенный запрос создан мы присоединяем его к основной таблице. И наконец, добавляем в основной запрос новое поле со средней ценой. Обратите внимание, что если псевдоним нового поля должен отличаться от принятого по умолчанию, его надо задать отдельно с помощью свойства Колонки.

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

7 комментариев на «“Схема запросов”»

  1. Юджени:

    Либо можно использовать обратный подход откорректировать сам текст запроса, получить для него схему, а потом посмотреть, из каких объектов она состоит. Так будет понятнее, куда именно следует добавлять соединение.

  2. Дария:

    Спасибо интересно! Я правильно понимаю что это развитие в том числе идет к тому чтобы использовать запросы на мобильной платформе работая через СхемаЗапроса ?

  3. Алмаз:

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

    • Owner:

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

  4. Ида:

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

   

2017г. Профессия — 1С. Обмен опытом по программированию в 1С