gifts2017

Консоль запросов + ТЗ как параметры

Опубликовал Игорь Макаренко (Kashemir) в раздел Программирование - Инструментарий

Стандартная консоль запросов, с добавленной возможностью использования описания/заполнения/использования таблиц значений как параметров. Совместима с настройками базовой консоли. Упрощает отладку запросов, использующих временные таблицы.

Ничего сверхестественного - стандартная консоль запросов, с добавленной возможностью использования описания/заполнения/использования таблиц значений как параметров, включающая в себя возможность получения данных временных таблиц под отладчиком в качестве парамеров.

Совместима с настройками базовой консоли (в обе стороны).

___________

03.09.2015

В функции получения запроса в режиме отладки добавлена возможность автоматического определения используемых временных таблиц (переданных через менеджер запросов) и помещения их значений в соответствующий параметр.

Для определения состава временных таблиц осуществляются попытки выполнить запрос, с последующим анализом ошибки (в случае системных сообщений платформы на отличном от русского языка - требуется внести соответствующую правку в текст функции).

Также стоит учитывать, что в процессе автоматического анализа будет запрос будет единожды выполнен. Если само по себе выполнение запроса вызывает проблемы (зависает / либо слишком долго), используйте явное указание списка необходимых временных таблиц.

 

Получение запроса со временными таблицыми под отладчиком

 

    Функция EWG_Сохранить(ТЗ, ИмяФайла = "", Опция = Неопределено) Экспорт

    // ТЗ - таблица значений, запрос или макет компоновки данных

    // Опция - (новое) для запроса, параметр равный ИСТИНА позволяет автоматически определить используемые временные таблицы и перенести в параметры. С данной опцией в процессе формирования списка таблиц запрос будет выполнен. Если выполнение не желательно (в случае долго формирования или зависания запроса), следует вручную определить список временных таблиц (см. ниже).

    // Опция  - для запроса может содержать перечень временных таблиц, которые требуется параметризировать ( к примеру "ТЗЕд1, ТЗВрем2, Бюдж3")

     

    // Опция - для макета компоновки данных может содержать ссылку на конкретный набор данных.


        ЗаписьXML = Новый ЗаписьXML;
        Если ПустаяСтрока(ИмяФайла) Тогда
            ИмяФайла = КаталогВременныхФайлов() + ?(ТипЗнч(ТЗ) = Тип("ТаблицаЗначений"), "copytz.xml", "copyreq.xml") ;
        КонецЕсли;
        Если ТипЗнч(ТЗ) = Тип("Запрос") Тогда
            
            Зн = Новый Структура("Текст, Параметры", ТЗ.Текст, ТЗ.Параметры);
            
            
            // если Опция = ИСТИНА - считаем что запрос требует автомического извлечения временных таблиц
            // Опция по умолчанию выключена, поскольку при определении будет выполнен запрос - выполнение которого может быть нежелательно (к примеру слишком долго выполняется)
            Если Опция = Истина Тогда
                ИменаТаблиц = "";
                ИсточникТаблиц = Новый Запрос;
                ИсточникТаблиц.МенеджерВременныхТаблиц  = ТЗ.МенеджерВременныхТаблиц;
                ОтладочныйЗапрос = Новый Запрос;
                ОтладочныйЗапрос.Текст = ТЗ.Текст;
                ТекстОшибки = "";
                
                Пока Истина Цикл
                    
                    ОбработкаПрерыванияПользователя();
                    Если Не ПустаяСтрока(ТекстОшибки) Тогда
                        Позиция = Найти(ТекстОшибки, "Таблица не найдена """);
                        Если Позиция = 0  Тогда
                            
                            Сообщить(ТекстОшибки);
                            // какая то неизвестная ошибка
                            Прервать;
                        КонецЕсли;

                        
                        // здесь нужно определить строку разбора
                        
                        // 1. выделяем название таблицы
                        Тб = Прав(ТекстОшибки, СтрДлина(ТекстОшибки) - Позиция - СтрДлина("Таблица не найдена """)+1);
                        Тб = Лев(Тб, Найти(Тб, """")-1);
                        
                        Если СтрДлина(Тб) = 0 Тогда
                            Сообщить(ТекстОшибки);
                            // какая то неизвестная ошибка
                            Прервать;
                        КонецЕсли;
                        
                        // Собираем запрос вытаскивания таблицы в та
                        
                        ИсточникТаблиц.Текст = "ВЫБРАТЬ * ИЗ " + Тб + " как " + Тб;
                        Попытка
                            Зн.Параметры.Вставить(Тб, ИсточникТаблиц.Выполнить().Выгрузить());
                            ОтладочныйЗапрос.Параметры.Вставить(Тб, Зн.Параметры[Тб]);
                            
                            Т = "// '" + Тб  + "' таблица вытащена из менеджера временных таблиц и помещена как параметр"  + Символы.ПС;;
                            Т = Т + "ВЫБРАТЬ " ;
                            Для каждого Кол из Зн.Параметры[Тб].Колонки Цикл
                                Т = Т + Символы.ПС + Символы.Таб + Тб + "." + Кол.Имя + " КАК " + Кол.Имя + "," ;
                            КОнецЦикла;
                            Т  = Лев(Т, СтрДлина(Т) - 1);
                            Т = Т + Символы.ПС + "ПОМЕСТИТЬ " + Тб ;
                            Т = Т + Символы.ПС + "ИЗ" + Символы.ПС + Символы.Таб + "&" + Тб + " КАК " + Тб + Символы.ПС + ";" + Символы.ПС + "//////////////////////////////////////////////////////////" + Символы.ПС+ Символы.ПС;
                            
                            Зн.Текст = Т + Зн.Текст;
                            ОтладочныйЗапрос.Текст = Т + ОтладочныйЗапрос.Текст;
                            ИменаТаблиц = ?(ПустаяСтрока(ИменаТаблиц), "", ИменаТаблиц + ", ") + Тб;
                            
                            
                        Исключение
                        КонецПопытки;
                    КонецЕсли;
                    
                    
                    Попытка
                        ОтладочныйЗапрос.Выполнить();    
                    Исключение
                        ТекстОшибки = ОписаниеОшибки();
                        Продолжить;
                    КонецПопытки;
                    
                    Прервать;
                КонецЦикла;
                
                Если Не ПустаяСтрока(ИменаТаблиц) Тогда
                    Сообщить("" + ТекущаяДата() + " Врем. таблица (ы): """ + ИменаТаблиц + """");
                КонецЕсли;
                
            // возможно в запросе используются таблицы из менеджера временных файлов - достанем их переменные            
            // если опция - строка - значит считаем что передается точный перечень таблиц    
            ИначеЕсли ТипЗнч(Опция) = Тип("Строка") Тогда
                Вр = СокрЛП(Опция);
                МассивТаблиц = Новый Массив;
                Пока Найти(Вр, ",") > 0 Цикл
                    Имя = СокрЛП(Лев(Вр,Найти(Вр, ",") - 1));
                    Если СтрДлина(Имя) > 0 Тогда
                        МассивТаблиц.Добавить(Имя);
                    КонецЕсли;
                    Вр = СокрЛП(Сред(Вр, Найти(Вр, ",") + 1));
                КонецЦикла;
                Если СтрДлина(Вр) > 0 Тогда
                    МассивТаблиц.Добавить(Вр);
                КонецЕсли;
                НовЗпр = Новый Запрос;
                НовЗпр.МенеджерВременныхТаблиц  = ТЗ.МенеджерВременныхТаблиц;
                
                // пробуем вытащить значения в параметры
                Для каждого Тб из  МассивТаблиц Цикл
                    НовЗпр.Текст = "ВЫБРАТЬ * ИЗ " + Тб + " как " + Тб;
                    Попытка
                        Зн.Параметры.Вставить(Тб, НовЗпр.Выполнить().Выгрузить());
                        
                        Т = "// '" + Тб  + "' таблица вытащена из менеджера временных таблиц и помещена как параметр"  + Символы.ПС;;
                        Т = Т + "ВЫБРАТЬ " ;
                        Для каждого Кол из Зн.Параметры[Тб].Колонки Цикл
                            Т = Т + Символы.ПС + Символы.Таб + Тб + "." + Кол.Имя + " КАК " + Кол.Имя + "," ;
                        КОнецЦикла;
                        Т  = Лев(Т, СтрДлина(Т) - 1);
                        Т = Т + Символы.ПС + "ПОМЕСТИТЬ " + Тб ;
                        Т = Т + Символы.ПС + "ИЗ" + Символы.ПС + Символы.Таб + "&" + Тб + " КАК " + Тб + Символы.ПС + ";" + Символы.ПС + "//////////////////////////////////////////////////////////" + Символы.ПС+ Символы.ПС;
                        
                        Зн.Текст = Т + Зн.Текст;
                    Исключение
                    КонецПопытки;
                КонецЦикла;
            КонецЕсли;

            
            
        ИначеЕсли ТипЗнч(ТЗ) = Тип("МакетКомпоновкиДанных") Тогда
            Запрос = Новый Запрос;
            Для каждого Параметр из ТЗ.ЗначенияПараметров Цикл
                ЗначПарам = Неопределено;
                Если ТипЗнч(Параметр.Значение) = Тип("СписокЗначений") Тогда
                    ЗначПарам = Новый СписокЗначений;
                    ЗначПарам.ЗагрузитьЗначения(Параметр.Значение.ВыгрузитьЗначения());
                Иначе
                    ЗначПарам = Параметр.Значение;
                КонецЕсли;
                Запрос.УстановитьПараметр(Параметр.Имя,ЗначПарам);
            КонецЦикла;
            
            // определимся с набором
            Если ТипЗнч(Опция) <> Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
                // набор явно не указан - пробуем подобрать первый попавшийся набор запрос
                Для каждого Нб из ТЗ.НаборыДанных Цикл
                    Если ТипЗнч(Нб) = Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
                        Опция = Нб;
                        Прервать;
                    КонецЕсли;
                КонецЦикла;
             КонецЕсли;

            Если ТипЗнч(Опция) = Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
                Запрос.Текст = Опция.Запрос;
                Для каждого Параметр из Опция.ЗначенияПараметров Цикл
                    ЗначПарам = Неопределено;
                    Если ТипЗнч(Параметр.Значение) = Тип("СписокЗначений") Тогда
                        ЗначПарам = Новый СписокЗначений;
                        ЗначПарам.ЗагрузитьЗначения(Параметр.Значение.ВыгрузитьЗначения());
                    Иначе
                        ЗначПарам = Параметр.Значение;
                    КонецЕсли;
                    Запрос.УстановитьПараметр(Параметр.Имя,ЗначПарам);
                КонецЦикла;
            КонецЕсли;
            Зн = Новый Структура("Текст, Параметры", Запрос.Текст, Запрос.Параметры);
        Иначе
            Зн = ТЗ;    
        КонецЕсли;
        ЗаписьXML.ОткрытьФайл(ИмяФайла, "UTF-8");
        СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Новый ХранилищеЗначения(Зн ,Новый СжатиеДанных(9)));
        ЗаписьXML.Закрыть();
        Возврат Истина;
    КонецФункции

 

 

 

 

15.11.2013

Данная редакция функции сохранения под отладчиком расширяет возможность отладки сложных запросов, использующих таблицы из менеджеры временных таблиц - в качестве третьего параметра позволяет указывать имена временных таблиц (через запятую), используемых в запросе. Содержимое временных таблиц которых при этом  будет вычитано из менеджера и использовано как параметр-таблица значений.

В качестве экзотического дополнения,  можно указывать МакетКомпоновкиДанных как источник запроса. В этом случае будет запрос будет извлечен из первого набора данных макета, либо можно указать конкретный набор в качестве третьего параметра.

15.11.10/2 Можно использовать результаты выполнения запроса как основание для создания структуры ТЗ и заполнения данными.


23.11.11/1 Добавлена возможность выгружать таблицы в файл / из файла.

10.04.12/1 Добавлена возможность выгружать запросы с параметрами (в т.ч. таблицы значений) в файл / из файла


Для выгрузки таблиц/запросов из конфигуратора в режиме отладки добавьте и используйте функцию

Функция EWG_Сохранить(ТЗ, ИмяФайла = "") Экспорт
    ЗаписьXML = Новый ЗаписьXML;
    Если ПустаяСтрока(ИмяФайла) Тогда
        ИмяФайла = КаталогВременныхФайлов() + ?(ТипЗнч(ТЗ) = Тип("Запрос"), "copyreq.xml", "copytz.xml") ;
    КонецЕсли;
    Зн = ?(ТипЗнч(ТЗ) = Тип("Запрос"), Новый Структура("Текст, Параметры", ТЗ.Текст, ТЗ.Параметры), ТЗ);
    ЗаписьXML.ОткрытьФайл(ИмяФайла, "UTF-8");
    СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Новый ХранилищеЗначения(Зн ,Новый СжатиеДанных(9)));
    ЗаписьXML.Закрыть();
    Возврат Истина;
КонецФункции


 

Примеры обращения под отладчиком  :

EWG_Сохранить(НекийЗапрос.Выполнить().Выгрузить()); // будет выгружена таблица результатов запроса

EWG_Сохранить(НекийЗапрос); // будет выгружен текст запроса с параметрами

EWG_Сохранить(НекийЗапрос,, ИСТИНА); // будет выгружен текст запроса с параметрами и всеми используемыми временными таблицами

EWG_Сохранить(НекийЗапрос,, "ВТКонтрагенты, ВТДокументы"); // будет выгружен текст запроса с параметрами плюс времененные таблицы, соответствующие указанным.


 

Таблицы в консоль подгружаются через выбор пункта меню консоли "Импорт из файла по-умолчанию" на закладке ТЗ-параметры.

Запросы подгружаются через выбор пункта меню консоли "Импорт из файла по-умолчанию" на основной панели формы, либо через контекстное меню дерева запросов.

 

28.08.12 Мелкие косметические изменения в т.ч. вывод количество строк результата выполнения запроса.

 

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

Наименование Файл Версия Размер Кол. Скачив.
Консоль для 8.2
.epf 65,45Kb
03.09.15
398
.epf 070213 65,45Kb 398 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. qwer11 (fierylions) 05.02.11 09:30
а как её запустить если в самом конфигураторе то просто код показывает если в предприятии то пустое окошечко
2. Владимир Чаклин (vec435) 11.04.12 10:15
при отладке из конфигуратора тз выгружается как отдельный файл или добавляется в параметры?
3. Игорь Макаренко (Kashemir) 11.04.12 11:54
Выгружается в отдельный файл, который можно загрузить в консоли как значение параметра
4. Петр Лунегов (pvlunegov) 20.04.12 11:28
Спасибо автору за замечательную возможность работы с Таблицами Значений в качестве параметра запроса.
Единственная обработка (консоль запросов) на данном сайте, в которой ПОЛНОСТЬЮ реализована данная функция.

Есть даже сохранение ТЗ в файл запросов. Это просто замечательно!

Смотрел аналогичные консоли, там этой функции или нет, или урезанная, или атрофированная, или без сохранения таблицы в файл запросов.

Всем, кому надо работать с ТЗ и сохранять запросы в файл - рекомендую!
5. Максим Кузнецов (MakcTLT63) 15.11.13 08:51
Глянул скрины. У меня эта обработка хранится под именем EWG_Консользапросов.
Автор позаимствовал идею?
6. Игорь Макаренко (Kashemir) 15.11.13 12:21
(5) MakcTLT63, EWG это аббревиатура мой текущей фирмы. Идея и реализация собственная.
7. Максим Кузнецов (MakcTLT63) 15.11.13 14:20
(6)
Упс.. Прошу прощения за необоснованные подозрения.
Обработка лучшая.
Когда надо поработать с ТЗ она просто незаменима.
8. Елена Пименова (Bukaska) 15.11.13 14:24
(3) Kashemir, Это консоль для обычного приложения?(ТолстыйКлиент) или для управляемого приложения?(Тонкий клиент)
А то для обычного приложения я как то скачивала консоль: только загрузил запрос - консоль уже создала параметры, остается только ввести значения.
Вот бы для тонкого клиента что-нить такое.. А то другой раз запросы как простыня, чекнешься параметры искать)
9. Игорь Макаренко (Kashemir) 15.11.13 14:34
(8) Bukaska, для толстого клиента.
10. Игорь Макаренко (Kashemir) 15.11.13 14:41
(7) MakcTLT63, Приятно, что кому-то пригодилась :)
11. Максим Сараев (desarz) 05.12.13 15:33
12. Виталий Быков (sick_russian) 05.02.14 06:25
на скрине видно что колонке присваивается тип "СправочникСсылка.Номенклатура", а я такой тип выбрать не могу( почему?
13. Игорь Макаренко (Kashemir) 10.02.14 19:37
Подозреваю что в используемой конфигурации нет справочника "Номенклатура" :)
14. Игорь Матюшин (Nebiros777) 25.02.14 13:31
Удобная штука, постоянно подобной пользуюсь.
15. Пабло (CaptainMorgan) 14.03.14 12:58
А вариант с управляемой формой возможен?
16. andrei kuzmin (oyeah) 14.01.15 02:35
(15) CaptainMorgan, Вариант для УФ на диске ИТС RequestConsoleManaged\ИнструментыРазработчикаКонсольЗапросов­83.epf
17. Максим *** (premier) 08.04.15 14:25
Не работает с параметром типа "Список значений", выдаёт ошибку "{(1,1)}: Переменная не определена (Прочее)
<<?>>Прочее", где "Прочее" - элемент справочника, заданного в параметре типа "Список значений". Да и сам подбор в список очень уж неудобно организован: тип выбирается из длинного выпадающего меню. Пока до самого низа его прокрутишь, чтобы необходимый тип выбрать, уже и желание пропадает этой консолью пользоваться.
18. Роман Уничкин (unichkin) 03.09.15 21:33
19. Игорь Макаренко (Kashemir) 04.09.15 10:53
(18) unichkin, Безусловно - но не всегда космический корабль удобнее автомобиля.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа