gifts2017

Преобразование обычного запроса в схему запроса и наоборот

Опубликовал sas (sassas) в раздел Программирование - Практика программирования

Хотите понять, что такое Схема запроса? Научиться формировать запросы по-новому? Редактировать их? Использовать все удобства нового функционала 1с в работе?

Новая версия 1.3  

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

В Версии 1.2 устранены ошибки 

1. Если поле запроса текст

2. Если поле запроса это табличная часть

3. Если источник запроса Виртуальная таблица с параметрами

Добалена возможность формировать код схемы запроса с минумум коментариев и без установки данных равных данным по умолчанию.

В Версии 1.3 устранены ошибки 


Скачать файлы

Наименование Файл Версия Размер
Преобразователь Запрос в СхемуЗапроса 1.6 .epf 109
.epf 33,64Kb
23.10.14
109
.epf 1.2 33,64Kb Скачать

См. также

Вознаграждение за ответ
Сумма: 0 $m
Добавили:
Захар Орехов (jafariuse) (0.50 $m)
Подписаться Добавить вознаграждение

Комментарии

1. Яков Коган (Yashazz) 13.10.14 11:29
Что, и всякие криво-косо написанные запросы тоже берёт?
А то конструктор запроса, бывает, сам такое состряпает, что сам же прочитать не в силах, ошибается и жалуется.
2. sas (sassas) 13.10.14 12:04
(1) Yashazz, Проблемы с конструктором только бывают если одни и теже псевдонимы используешь в разных местах.. Если конструртор запроса схавает твой запрос то и здесь он пройдет.
3. Сергей Галюк (dj_serega) 13.10.14 16:23
Занимательно. Надеюсь пригодится в быту :)
4. Яков Коган (Yashazz) 13.10.14 16:50
(2) Да ну? Мало вы работали с конструктором запроса, значит. Попробуйте сделать простейшее условие на пустую строку и посмотрите, как он себя поведёт. При разных значениях флажка произвольности.
5. Евгения Карук (ekaruk) 14.10.14 02:25
Вцелом идея красивая.
Не всегда работает.
Попробовала на запросе из этого поста http://infostart.ru/public/307045/
Сначала ругнулся на синтаксическую ошибку в сформированном тексте.
Покопавшись, нашла в тексте строку
НовыйПорядок=НовыйПакет.Порядок.Добавить(НовыйПакет.Колонки[1));
Исправила.
При запуске выдает ошибку "Переменная не определена (СхемаПриемник)"
Попыталась сформировать конструктором несколько запросов.
Простые преобразует. Более сложные нет.
6. Андрей Акулов (DrAku1a) 15.10.14 07:09
(4) Работаю с запросами плотно и много. Глюки в конструкторе - вещь очень редкая. В большинстве случаев, он перед сохранением запросов - выдает предупреждение (например, пытаемся проиндексировать выборку или наоборот получить итоги / отсортировать создаваемую внутреннюю таблицу).
Проигнорируете предупреждение - и он сформирует текст запроса с ошибкой.
Попробуйте сделать простейшее условие на пустую строку и посмотрите, как он себя поведёт. При разных значениях флажка произвольности.
Это не ошибка. Просто поле условий так создано, что справа указывается имя переменной, а не значение. Как раз для того, чтобы можно было извратиться и указать значение - и придуман флажок произвольности.
8. John Smith (PiccaHut001) 15.10.14 13:14
Схемы запросов - реинкарнация построителя отчётов. Сейчас, когда есть СКД, построитель бесполезен.
9. Сергей Иванов (xten) 16.10.14 00:23
Я правильно понял, что ниже версии платформы 8.3.5 работать не будет ?
10. sas (sassas) 17.10.14 15:05
Воровать нехорошо. Это моя обработка. В обработке две ошибки 1. Если таблица запроса это табличная часть 2. если поле запроса это строка. Я бы выложил исправленную но .......
11. tixis1c tixis1c (qwed557) 19.10.14 19:46
(10) sassas, давай выкладывай, с удовольствием скачаю, хотя пока нигде на практике не применял схему запроса
12. sas (sassas) 19.10.14 20:12
(11) qwed557, На практике я вижу одно применение. Это если неохото менять типовой запрос, запихиваешь его в схему , изменяешь и достаешь обратно. Есть шанс что даже при изменении типового запроса нечего не придется корректировать..
Хорошо работает если хочешь программно изменить динамический список с произволным запросом. а на форме менят нечего не охота.
13. John Smith (PiccaHut001) 20.10.14 12:13
(12) sassas, чёт не понял, чем в вашем случае схема лучше стрзаменить? Если любимые разработчики типовых уберут из типового запроса таблицу, то стрзаменить и схемы запросов перестанут добавлять поля в выборку/условия. Выгоды не заметил
14. Семён Щербаков (userGJ) 20.10.14 13:42
Не работает для объединения таблиц.
Например:

ВЫБРАТЬ
  Банки.Наименование КАК Наименование
ИЗ  Справочник.Банки КАК Банки
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
  Валюты.Код
ИЗ  Справочник.Валюты КАК Валюты
...Показать Скрыть


генерит такой код:

Схема=Новый СхемаЗапроса();
	НовыйПакет= Схема.ПакетЗапросов[0];
	НовыйПакет.Операторы[0].Источники.Добавить("Справочник.Банки","Банки");  
	НовыйПакет.Операторы[0].ВыбираемыеПоля.Добавить("Банки.Наименование");  
	НовыйПакет.Операторы.Добавить();  //Тип: ОператорВыбратьСхемыЗапроса.  
	НовыйПакет.Операторы[1].Источники.Добавить("Справочник.Валюты","Валюты");
	НовыйПакет.Операторы[1].ВыбираемыеПоля.Добавить("Валюты.Код");
...Показать Скрыть


что выдаст такой запрос:

ВЫБРАТЬ
	Банки.Наименование,
	NULL КАК Код
ИЗ  Справочник.Банки КАК Банки
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
	NULL,
	Валюты.Код
ИЗ  Справочник.Валюты КАК Валюты
...Показать Скрыть


чтобы исправить, надо строку:
НовыйПакет.Операторы[1].ВыбираемыеПоля.Добавить("Валюты.Код");
заменить на:
  НовыйПакет.Колонки[0].Поля.Установить(1, НовыйПакет.Операторы[1].ВыбираемыеПоля.Добавить("Валюты.Код"));
15. sas (sassas) 21.10.14 11:30
(14) userGJ, иногда и ваш вариант не проходит. Приходится создавать поля источника а потом их все устанавливать . В версии 1.3 ошибка исправлена
16. Сергей Ермохин (serg_khv) 22.10.14 13:11
При попытке конвертации Индекса Временной таблицы вылетела ошибка:
{Форма.Форма.Форма(1152)}: Значение не является значением объектного типа (Колонки)
Приемник.Индекс.Добавить(НовыйПакет.Колонки[ИндексКолонки]);
Конвертировалась Временная таблица, получаемая объединением двух запросов из разных регистров. Индекс по полю Номенклатура, одинаковому в обоих регистрах.
При просмотре по точке останова НовыйПакет - это строка "НовыйПакет" и Колонок у нее быть не может. (
17. sas (sassas) 22.10.14 13:19
(16) serg_khv, Укажите версию обработки и сам запрос
18. Сергей Ермохин (serg_khv) 24.10.14 07:46
Версия 1.6 разобрала мой запрос без ошибок. Спасибо! ))
19. Сергей Ермохин (serg_khv) 24.10.14 08:47
Еще нашел... )При удалении ВТ надо сделать чтоб вместо:
НовыйПакет=Схема.ПакетЗапросов.Добавить(Новый ОписаниеТипов("ЗапросУничтоженияТаблицыСхемыЗапрос"));
было:
НовыйПакет=Схема.ПакетЗапросов.Добавить(Тип("ЗапросУничтоженияТаблицыСхемыЗапроса"));
Тогда не выдает ошибку.
20. Александр Кузин (sashocq) 30.10.14 18:24
Еще не пробовал, но "+" однозначно. Как-то возникла необходимость модификации запроса программно через схему и голову сломал, пока нашел, как это делается. Очень мало примеров в синтакс-помощнике.
21. Захар Орехов (jafariuse) 30.06.16 14:05
В версии 1.6 ошибка.
в запросе вида
ВЫБРАТЬ
	Таб.К КАК К
ПОМЕСТИТЬ Вт_Данные
ИЗ
	&Таб КАК Таб 
...Показать Скрыть

формирует строку
Таб=НовыйПакет.Операторы[0].Источники.Добавить(Тип("ОписаниеВременнойТаблицыСхемыЗапроса"),"Таб"); 

а следует
Таб=НовыйПакет.Операторы[0].Источники.Добавить(Тип("ОписаниеВременнойТаблицыСхемыЗапроса"),"&Таб","Таб"); 
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа