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

Публикация № 307066

Программирование - Практика программирования

СхемаЗапроса

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

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

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

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

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

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

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

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

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


57

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

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

См. также

Специальные предложения

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

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


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

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


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

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


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

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

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