#Если Клиент Тогда Перем мОбъектЗапроса Экспорт; // запрос Перем мКоманда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"); #КонецЕсли