RDT1C/DataProcessors/ирКонсольЗапросов/Ext/ObjectModule.bsl
2016-12-04 00:14:16 +03:00

410 lines
28 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#Если Клиент Тогда
Перем мОбъектЗапроса Экспорт; // запрос
Перем мКомандаADO Экспорт; // запрос
Перем мСоединениеADO Экспорт; // запрос
Перем мWMIService Экспорт; // запрос
Перем мСтрокаЗапроса;
Перем мРежимРедактора Экспорт;
Перем мСсылка Экспорт;
Перем мРедактируемыйНаборДанных Экспорт;
Перем мРежимОтладки Экспорт;
Функция ПолучитьНовуюТаблицуПараметров()
ТаблицаПараметров = Новый ТаблицаЗначений;
// Порядок должен соответствовать установленному в табличном поле!
ТаблицаПараметров.Колонки.Добавить("ИмяПараметра");
ТаблицаПараметров.Колонки.Добавить("ЭтоВыражение");
ТаблицаПараметров.Колонки.Добавить("ТипЗначения");
ТаблицаПараметров.Колонки.Добавить("НеИспользоватьОграничениеТипа");
ТаблицаПараметров.Колонки.Добавить("Значение"); // Без колонки ТП
Возврат ТаблицаПараметров;
КонецФункции // ПолучитьНовуюТаблицуПараметров()
Процедура ИнициализацияСлужебногоРежима()
ИспользоватьАвтосохранение = Ложь;
мСтрокаЗапроса = ДеревоЗапросов.Строки.Добавить();
мСтрокаЗапроса.ПараметрыЗапроса = ПолучитьНовуюТаблицуПараметров();
КонецПроцедуры // ИнициализацияСлужебногоРежима
Процедура ДобавитьПараметрыИзЗапроса(пЗапросОтладки, пТаблицаПараметров, ОписаниеТиповЭлементаУправленияПараметра)
МаркерНеверныхПараметров = "Неверные параметры";
ЗапросОтладки = Новый Запрос(пЗапросОтладки.Текст);
ЗапросОтладки.МенеджерВременныхТаблиц = пЗапросОтладки.МенеджерВременныхТаблиц;
Попытка
ПараметрыЗапроса = ЗапросОтладки.НайтиПараметры();
Исключение
Сообщить(ОписаниеОшибки());
ПараметрыЗапроса = Новый Массив;
КонецПопытки;
// Получим значения использованных в тексте параметров
Для каждого ПараметрЗапроса Из ПараметрыЗапроса Цикл
Если пТаблицаПараметров.Найти(ПараметрЗапроса.Имя, "ИмяПараметра") <> Неопределено Тогда
Продолжить;
КонецЕсли;
ИмяПараметра = ПараметрЗапроса.Имя;
СтрокаПараметров = пТаблицаПараметров.Добавить();
СтрокаПараметров.ИмяПараметра = ИмяПараметра;
СтрокаПараметров.ЭтоВыражение = Ложь;
СтрокаПараметров.ТипЗначения = ПараметрЗапроса.ТипЗначения;
Если ирКэш.Получить().ВерсияПлатформы >= 801011 Тогда
ЗначениеПараметраЗапроса = 0;
Если пЗапросОтладки.Параметры.Свойство(ИмяПараметра, ЗначениеПараметраЗапроса) Тогда
ТипЗначенияПараметра = ТипЗнч(ЗначениеПараметраЗапроса);
Если ТипЗначенияПараметра = Тип("Массив") Тогда
СписокЗначений = Новый СписокЗначений;
ПреобразованиеУспешно = Истина;
Для Каждого ЭлементМассива Из ЗначениеПараметраЗапроса Цикл
Если ОписаниеТиповЭлементаУправленияПараметра.СодержитТип(ТипЗнч(ЭлементМассива)) Тогда
СписокЗначений.Добавить(ЭлементМассива);
Иначе
ПреобразованиеУспешно = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Если ПреобразованиеУспешно Тогда
ЗначениеПараметраЗапроса = СписокЗначений;
ТипЗначенияПараметра = ТипЗнч(ЗначениеПараметраЗапроса);
Сообщить("Значение параметра """ + ИмяПараметра + """ было преобразовано из массива в список значений", СтатусСообщения.Внимание);
КонецЕсли;
КонецЕсли;
СтрокаПараметров.Значение = ЗначениеПараметраЗапроса;
Если ТипЗначенияПараметра = Тип("СписокЗначений") Тогда
СтрокаПараметров.ЭтоВыражение = 2;
ИначеЕсли ОписаниеТиповЭлементаУправленияПараметра.СодержитТип(ТипЗначенияПараметра) Тогда
Иначе
СтрокаПараметров.НеИспользоватьОграничениеТипа = Истина;
КонецЕсли;
КонецЕсли;
Иначе
Успех = Ложь;
Попытка
пЗапросОтладки.Текст = "Выбрать &" + ИмяПараметра;
РЗ = пЗапросОтладки.Выполнить().Выгрузить();
СтрокаПараметров.Значение = РЗ[0][ИмяПараметра];
Успех = Истина;
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
//Возможно это список параметров ссылок
М = Новый СписокЗначений;
Для каждого ТипаПр Из ПараметрЗапроса.ТипЗначения.Типы() Цикл
МетаОбъект = Метаданные.НайтиПоТипу(ТипаПр);
Если МетаОбъект <> Неопределено Тогда
пЗапросОтладки.Текст = "Выбрать Ссылка Из " + МетаОбъект.ПолноеИмя() + " ГДЕ Ссылка В (&" + ИмяПараметра + ")"
+ " ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЗНАЧЕНИЕ(" + МетаОбъект.ПолноеИмя() + ".ПустаяСсылка)"
+ " ГДЕ ЗНАЧЕНИЕ(" + МетаОбъект.ПолноеИмя() + ".ПустаяСсылка) В (&" + ИмяПараметра + ")";
Попытка
РЗ = пЗапросОтладки.Выполнить().Выгрузить();
Для каждого Пр Из РЗ Цикл
М.Добавить(Пр.Ссылка);
КонецЦикла;
Исключение
КонецПопытки;
КонецЕсли;
КонецЦикла;
Если М.Количество() > 0 Тогда
СтрокаПараметров.Значение = М;
СтрокаПараметров.ЭтоВыражение = 2;
Успех = Истина;
КонецЕсли;
КонецПопытки;
Если Не Успех Тогда
Если Лев(ЛксПолучитьПоследнийФрагмент(ИнформацияОбОшибке.Причина.Описание, "}: "), СтрДлина(МаркерНеверныхПараметров)) = МаркерНеверныхПараметров Тогда
Сообщить("Значение параметра """ + ИмяПараметра + """ невозможно извлечь", СтатусСообщения.Внимание);
СтрокаПараметров.Значение = "<Значение параметра """ + СтрокаПараметров.ИмяПараметра + """ неизвлекаемо>";
СтрокаПараметров.НеИспользоватьОграничениеТипа = Истина;
Иначе
Сообщить("Значение параметра """ + ИмяПараметра + """ не задано", СтатусСообщения.Внимание);
СтрокаПараметров.Значение = "<Значение параметра """ + СтрокаПараметров.ИмяПараметра + """ не задано>";
КонецЕсли;
//СтрокаПараметров.ИмяПараметра = "#" + СтрокаПараметров.ИмяПараметра;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ирКэш.Получить().ВерсияПлатформы >= 801011 Тогда
// Получим значения установленных параметров
ДополнитьТаблицуПараметровЗапросаПоСтруктуре(пЗапросОтладки.Параметры, пТаблицаПараметров);
КонецЕсли;
КонецПроцедуры // ДобавитьПараметрыИзЗапроса()
Функция ДополнитьТаблицуПараметровЗапросаПоСтруктуре(СтруктураПараметров, пТаблицаПараметров)
Для каждого КлючИЗначение Из СтруктураПараметров Цикл
Если пТаблицаПараметров.Найти(КлючИЗначение.Ключ, "ИмяПараметра") <> Неопределено Тогда
Продолжить;
КонецЕсли;
ИмяПараметра = КлючИЗначение.Ключ;
СтрокаПараметров = пТаблицаПараметров.Добавить();
СтрокаПараметров.ИмяПараметра = ИмяПараметра;
СтрокаПараметров.ЭтоВыражение = Ложь;
СтрокаПараметров.Значение = КлючИЗначение.Значение;
Если ТипЗнч(КлючИЗначение.Значение) = Тип("СписокЗначений") Тогда
СтрокаПараметров.ЭтоВыражение = 2;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Функция ОткрытьПоОбъектуМетаданных(ПолноеИмяМД) Экспорт
ИнициализацияСлужебногоРежима();
ТекстЗапроса = "ВЫБРАТЬ
| *
|ИЗ
| " + ПолноеИмяМД + " КАК Т";
мСтрокаЗапроса.ТекстЗапроса = ТекстЗапроса;
мСтрокаЗапроса.Запрос = ПолноеИмяМД;
Форма = ЭтотОбъект.ПолучитьФорму();
Форма.Открыть();
Возврат Форма;
КонецФункции
// ТекстЗапроса - Строка - используется только в случае, если сам объект не содержит свойста с текстом (например WMI)
Функция ОткрытьДляОтладки(Запрос, ТипЗапроса = "Обычный", ИмяЗапроса = "Запрос для отладки", Модально = Истина, ТекстЗапроса = "") Экспорт
ИнициализацияСлужебногоРежима();
Если ТипЗнч(Запрос) = Тип("COMОбъект") Тогда
ТипЗапроса = "WQL";
мWMIService = Запрос;
Попытка
Пустышка = Запрос.CommandText;
ЭтоКомандаADO = Истина;
ТипЗапроса = "ADO";
мКомандаADO = Запрос;
Исключение
ЭтоКомандаADO = Ложь;
Попытка
Пустышка = Запрос.ConnectionString;
ЭтоСоединениеADO = Истина;
ТипЗапроса = "ADO";
мСоединениеADO = Запрос;
Исключение
ЭтоСоединениеADO = Ложь;
КонецПопытки;
КонецПопытки;
Иначе
мОбъектЗапроса = Запрос;
ТекстЗапроса = мОбъектЗапроса.Текст;
КонецЕсли;
мСтрокаЗапроса.ТекстЗапроса = ТекстЗапроса;
мСтрокаЗапроса.Запрос = ИмяЗапроса;
мСтрокаЗапроса.ТипЗапроса = ТипЗапроса;
мРежимОтладки = Истина;
Форма = ЭтотОбъект.ПолучитьФорму();
ТаблицаПараметровЗапроса = Форма.ЭлементыФормы.Параметры.Значение;
Если ТипЗнч(Запрос) = Тип("COMОбъект") Тогда
Если ЭтоКомандаADO Тогда
СтруктураПараметров = Новый Структура();
Для Каждого Parameter Из Запрос.Parameters Цикл
КлючПараметра = Parameter.Name;
Если Не ЛксЛиИмяПеременной(КлючПараметра) Тогда
КлючПараметра = "_" + КлючПараметра;
КонецЕсли;
Если Не ЛксЛиИмяПеременной(КлючПараметра) Тогда
КлючПараметра = КлючПараметра + XMLСтрока(СтруктураПараметров.Количество());
КонецЕсли;
Если СтруктураПараметров.Свойство(КлючПараметра) Тогда
ВызватьИсключение "Не удалось назначить параметру уникальное имя";
КонецЕсли;
СтруктураПараметров.Вставить(КлючПараметра, Parameter.Value);
КонецЦикла;
ДополнитьТаблицуПараметровЗапросаПоСтруктуре(СтруктураПараметров, ТаблицаПараметровЗапроса);
КонецЕсли;
Иначе
ДобавитьПараметрыИзЗапроса(Запрос, ТаблицаПараметровЗапроса, Форма.ЭлементыФормы.Параметры.Колонки.Значение.ЭлементУправления.ТипЗначения);
КонецЕсли;
Если Модально Тогда
Возврат Форма.ОткрытьМодально();
Иначе
Форма.Открыть();
КонецЕсли;
КонецФункции
Функция ОткрытьПоПостроителю(Построитель, ИмяЗапроса = "Исполняемый запрос построителя") Экспорт
ИнициализацияСлужебногоРежима();
мСтрокаЗапроса.Запрос = ИмяЗапроса;
ЗапросОтладки = Построитель.ПолучитьЗапрос();
мСтрокаЗапроса.ТекстЗапроса = ЗапросОтладки.Текст;
мСтрокаЗапроса.ТипЗапроса = "Построитель";
Если ирКэш.Получить().ВерсияПлатформы < 801011 Тогда
Для Каждого ЭлементПараметра Из Построитель.Параметры Цикл
СтрокаПараметров = мСтрокаЗапроса.ПараметрыЗапроса.Добавить();
СтрокаПараметров.ИмяПараметра = ЭлементПараметра.Ключ;
СтрокаПараметров.Значение = ЭлементПараметра.Значение;
Если ТипЗнч(СтрокаПараметров.Значение) = Тип("СписокЗначений") Тогда
СтрокаПараметров.ЭтоВыражение = 2;
СтрокаПараметров.ТипЗначения = СтрокаПараметров.Значение.ТипЗначения;
Иначе
СтрокаПараметров.ЭтоВыражение = Ложь;
СтрокаПараметров.ТипЗначения = Новый ОписаниеТипов(ЛксБыстрыйМассив(ТипЗнч(СтрокаПараметров.Значение)));
КонецЕсли;
КонецЦикла;
КонецЕсли;
Форма = ЭтотОбъект.ПолучитьФорму();
ДобавитьПараметрыИзЗапроса(ЗапросОтладки, Форма.ЭлементыФормы.Параметры.Значение,
Форма.ЭлементыФормы.Параметры.Колонки.Значение.ЭлементУправления.ТипЗначения);
мРежимОтладки = Истина;
Форма.Открыть();
КонецФункции
Процедура ДобавитьНаборыДанных(Родитель, Шаблон, НаборыДанных)
Для каждого НаборДанных Из НаборыДанных Цикл
лСтрокаЗапроса = Неопределено;
Если ТипЗнч(НаборДанных) = Тип("НаборДанныхЗапросМакетаКомпоновкиДанных") Тогда
лСтрокаЗапроса = Родитель.Строки.Добавить();
лСтрокаЗапроса.Запрос = НаборДанных.Имя;
лСтрокаЗапроса.ТекстЗапроса = НаборДанных.Запрос;
лСтрокаЗапроса.ПараметрыЗапроса = Шаблон.ПараметрыЗапроса.Скопировать();
лСтрокаЗапроса.ТипЗапроса = "Компоновка";
ИначеЕсли ТипЗнч(НаборДанных) = Тип("НаборДанныхОбъединениеМакетаКомпоновкиДанных") Тогда
лСтрокаЗапроса = Родитель.Строки.Добавить();
лСтрокаЗапроса.Запрос = "Объединение - " + НаборДанных.Имя;
лСтрокаЗапроса.ТипЗапроса = "Папка";
ДобавитьНаборыДанных(лСтрокаЗапроса, Шаблон, НаборДанных.Элементы);
КонецЕсли;
Если НаборДанных.ВложенныеНаборыДанных.Количество() > 0 Тогда
Если лСтрокаЗапроса = Неопределено Тогда
лСтрокаЗапроса = Родитель.Строки.Добавить();
лСтрокаЗапроса.Запрос = НаборДанных.Имя;
лСтрокаЗапроса.ТипЗапроса = "Папка";
КонецЕсли;
ДобавитьНаборыДанных(лСтрокаЗапроса, Шаблон, НаборДанных.ВложенныеНаборыДанных);
КонецЕсли;
КонецЦикла;
КонецПроцедуры // ДобавитьНаборыДанных()
Функция ОткрытьПоМакетуКомпоновки(МакетКомпоновки, Модально = Истина, СхемаКомпоновки = Неопределено) Экспорт
ИнициализацияСлужебногоРежима();
мСтрокаЗапроса.ТипЗапроса = "Компоновка";
Для Каждого Значение Из МакетКомпоновки.ЗначенияПараметров Цикл
СтрокаПараметров = мСтрокаЗапроса.ПараметрыЗапроса.Добавить();
СтрокаПараметров.ИмяПараметра = Значение.Имя;
СтрокаПараметров.Значение = Значение.Значение;
//ПараметрСхемы = Неопределено;
//Если СхемаКомпоновки <> Неопределено Тогда
// ПараметрСхемы = СхемаКомпоновки.Параметры.Найти(Значение.Имя);
//КонецЕсли;
Если ТипЗнч(СтрокаПараметров.Значение) = Тип("СписокЗначений") Тогда
СтрокаПараметров.ЭтоВыражение = 2;
СтрокаПараметров.ТипЗначения = СтрокаПараметров.Значение.ТипЗначения;
//ИначеЕсли Истина
// И ПараметрСхемы <> Неопределено
// И ПараметрСхемы.Выражение <> ""
//Тогда
// СтрокаПараметров.ЭтоВыражение = Истина;
Иначе
СтрокаПараметров.ЭтоВыражение = Ложь;
СтрокаПараметров.ТипЗначения = Новый ОписаниеТипов(ЛксБыстрыйМассив(ТипЗнч(СтрокаПараметров.Значение)));
КонецЕсли;
КонецЦикла;
ДобавитьНаборыДанных(ДеревоЗапросов, мСтрокаЗапроса, МакетКомпоновки.НаборыДанных);
Для Каждого ЭлементТела Из МакетКомпоновки.Тело Цикл
Если ТипЗнч(ЭлементТела) = Тип("ВложенныйОбъектМакетаКомпоновкиДанных") Тогда
Если ЭлементТела.КомпоновкаДанных.НаборыДанных.Количество() > 0 Тогда
лСтрокаЗапроса = ДеревоЗапросов.Строки.Добавить();
лСтрокаЗапроса.Запрос = ЭлементТела.Имя;
лСтрокаЗапроса.ТипЗапроса = "Папка";
ДобавитьНаборыДанных(лСтрокаЗапроса, мСтрокаЗапроса, ЭлементТела.КомпоновкаДанных.НаборыДанных);
КонецЕсли;
КонецЕсли;
КонецЦикла;
ДеревоЗапросов.Строки.Удалить(мСтрокаЗапроса);
мРежимОтладки = Истина;
Форма = ЭтотОбъект.ПолучитьФорму();
Если Модально Тогда
Возврат Форма.ОткрытьМодально();
Иначе
Форма.Открыть();
КонецЕсли;
КонецФункции
Функция РедактироватьНаборДанныхСхемыКомпоновкиДанных(ВладелецФормы, НаборДанных, Схема) Экспорт
мРежимРедактора = Истина;
мРедактируемыйНаборДанных = НаборДанных;
ИнициализацияСлужебногоРежима();
мСтрокаЗапроса.Запрос = НаборДанных.Имя;
ПараметыСхемы = Схема.Параметры;
Для Каждого ПараметрСхемы Из ПараметыСхемы Цикл
СтрокаПараметров = мСтрокаЗапроса.ПараметрыЗапроса.Добавить();
СтрокаПараметров.ИмяПараметра = ПараметрСхемы.Имя;
СтрокаПараметров.Значение = ПараметрСхемы.Значение;
СтрокаПараметров.ТипЗначения = ПараметрСхемы.ТипЗначения;
Если ПараметрСхемы.Выражение <> "" Тогда
СтрокаПараметров.ЭтоВыражение = Истина;
СтрокаПараметров.Значение = ПараметрСхемы.Выражение;
ИначеЕсли ТипЗнч(ПараметрСхемы.Значение) = Тип("СписокЗначений") Тогда
СтрокаПараметров.ЭтоВыражение = 2;
Иначе
СтрокаПараметров.ЭтоВыражение = Ложь;
КонецЕсли;
КонецЦикла;
мСтрокаЗапроса.ТекстЗапроса = НаборДанных.Запрос;
мСтрокаЗапроса.ТипЗапроса = "Компоновка";
Форма = ЭтотОбъект.ПолучитьФорму(, ВладелецФормы);
Форма.Открыть();
КонецФункции // РедактироватьНаборДанныхСхемыКомпоновкиДанных()
Функция РедактироватьСтруктуруЗапроса(ВладелецФормы, СтруктураЗапроса) Экспорт
мРежимРедактора = Истина;
ИнициализацияСлужебногоРежима();
Если СтруктураЗапроса.Свойство("Имя") Тогда
мСтрокаЗапроса.Запрос = СтруктураЗапроса.Имя;
КонецЕсли;
Если СтруктураЗапроса.Свойство("Ссылка") Тогда
мСсылка = СтруктураЗапроса.Ссылка;
КонецЕсли;
Если СтруктураЗапроса.Свойство("Параметры") Тогда
мСтрокаЗапроса.ПараметрыЗапроса = СтруктураЗапроса.Параметры.Скопировать();
КонецЕсли;
мСтрокаЗапроса.ТекстЗапроса = СтруктураЗапроса.ТекстЗапроса;
Если СтруктураЗапроса.Свойство("ТипЗапроса") Тогда
мСтрокаЗапроса.ТипЗапроса = СтруктураЗапроса.ТипЗапроса;
Иначе
мСтрокаЗапроса.ТипЗапроса = "Построитель";
КонецЕсли;
Форма = ЭтотОбъект.ПолучитьФорму(, ВладелецФормы);
Форма.Открыть();
КонецФункции // РедактироватьСтруктуруЗапроса()
мОбъектЗапроса = Новый Запрос;
мРежимРедактора = Ложь;
мРежимОтладки = Ложь;
// Создадим структуру дерева запросов
ДеревоЗапросов.Колонки.Добавить("Запрос");
ДеревоЗапросов.Колонки.Добавить("ТекстЗапроса");
ДеревоЗапросов.Колонки.Добавить("ПараметрыЗапроса");
ДеревоЗапросов.Колонки.Добавить("СпособВыгрузки"); //Оставил для совместимости с оригинальной консолью запросов
ДеревоЗапросов.Колонки.Добавить("НовыйМенеджерВремменныхТаблиц", Новый ОписаниеТипов("Булево"));
ДеревоЗапросов.Колонки.Добавить("КодОбработкиСтрокиРезультата");
ДеревоЗапросов.Колонки.Добавить("КодПередВыполнениемЗапроса");
ДеревоЗапросов.Колонки.Добавить("КодОбработкиРезультата");
ДеревоЗапросов.Колонки.Добавить("Настройка");
ДеревоЗапросов.Колонки.Добавить("ВыбратьВсеПоля", Новый ОписаниеТипов("Булево"));
ДеревоЗапросов.Колонки.Добавить("ТипЗапроса", Новый ОписаниеТипов("Строка"));
ДеревоЗапросов.Колонки.Добавить("Длительность", Новый ОписаниеТипов("Число, Строка"));
ДеревоЗапросов.Колонки.Добавить("РазмерРезультата", Новый ОписаниеТипов("Число, Строка"));
ДеревоЗапросов.Колонки.Добавить("ПараметрыWMI");
ДеревоЗапросов.Колонки.Добавить("ПараметрыADO");
#КонецЕсли