commit 976cb371bbadd029d52b893969c31992a16d2dd9 Author: Dmitry Date: Thu Feb 21 16:29:02 2019 +0300 Импорт из БСП diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7e310e7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/*.e[rp]f diff --git a/src/ИнструментыРазработчикаКонсольЗапросов.xml b/src/ИнструментыРазработчикаКонсольЗапросов.xml new file mode 100644 index 0000000..0578cb7 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов.xml @@ -0,0 +1,1007 @@ + + + + + + c3831ec8-d8d5-4f93-8a22-f9bfae07327f + e84fb149-1243-46d4-9753-da41c3645896 + + + 37cbfd0e-2ac2-4a13-b5bd-d2c34a09f819 + 246bcb39-2dd0-4a30-83ff-1788fcc1d028 + + + + ИнструментыРазработчикаКонсольЗапросов + + + ru + Инструменты разработчика: Консоль запросов + + + + ExternalDataProcessor.ИнструментыРазработчикаКонсольЗапросов.Form.Форма + + + + + + ИспользоватьАвтосохранение + + + ru + Использовать автосохранение + + + + + xs:boolean + + false + + + + + ru + Включает автосохранение + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ПериодАвтосохранения + + + ru + Период автосохранения + + + + + xs:decimal + + 10 + 0 + Nonnegative + + + false + + + + + ru + Устанавливает период автосохранения + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ПутьКФормам + + + ru + Путь к формам + + + + + xs:string + + 700 + Variable + + + false + + + + + ru + Указывает путь к формам + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ДоступныеТипыДанных + + + ru + Доступные типы данных + + + + + v8:TypeDescription + cfg:AnyRef + + false + + + + + ru + Определяет доступные типы данных + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ИмяФайла + + + ru + Имя файла + + + Имя файла XML, где хранятся запросы и параметры. + + xs:string + + 0 + Variable + + + false + + + + + ru + Имя файла XML, где хранятся запросы и его параметры + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ВыводитьВРезультатахЗапросаЗначенияСсылок + + + ru + Выводить в результатах запроса значения ссылок + + + + + xs:boolean + + false + + + + + ru + Указывает необходимо ли выводить в результатах запроса значения ссылок + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ТипОбхода + + + ru + Тип обхода результата запроса + + + + + xs:string + + 10 + Variable + + + false + + + + + ru + Варианты обхода результата запроса + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ЧередованиеЦветовВРезультатеЗапроса + + + ru + Чередование цветов в результате запроса + + + + + xs:boolean + + false + + + + + ru + Использовать чередование цветов при выводе результатов запроса + + + false + + false + false + + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + + 959ec53b-c077-46a2-9f06-adcf07ff03e4 + c74d2daa-7913-4c05-9d2e-809c0e675925 + + + 94d3e271-9502-4595-84f0-17ede94e31dd + 8da63daa-5a04-49f0-989b-0fab073ac5bb + + + + Запросы + + + ru + Запросы + + + + + DontCheck + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + + + + Идентификатор + + + ru + Идентификатор + + + + + v8:UUID + + false + + + + + ru + Уникальный идентификатор запроса + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Имя + + + ru + Имя + + + Имя запроса + + xs:string + + 50 + Variable + + + false + + + + + ru + Имя запроса + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Текст + + + ru + Текст + + + Текст запроса + + xs:string + + 0 + Variable + + + false + + + + + ru + Текст запроса + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ВремяВыполнения + + + ru + Время выполнения + + + Время выполнения в секундах + + xs:decimal + + 10 + 3 + Nonnegative + + + false + + + + + ru + Время выполнения в секундах + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + КоличествоСтрок + + + ru + Количество строк + + + Количество возвращаемых строк в результате запроса + + xs:decimal + + 10 + 0 + Nonnegative + + + false + + + + + ru + Количество возвращаемых строк в результате запроса + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + АдресРезультата + + + ru + Адрес результата + + + Адрес временного хранилища, где хранится результат + + xs:string + + 100 + Variable + + + false + + + + + ru + Адрес временного хранилища, где хранится результат + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + АдресРезультатовЗапроса + + + ru + Адрес результатов запроса + + + Адрес массива результатов запроса во временном хранилище + + xs:string + + 100 + Variable + + + false + + + + + ru + Адрес массива результатов запроса во временном хранилище + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + + + + 2f579c49-8a26-48c2-a0e0-2f5c4a02c0d0 + 6f4ade39-2df2-49fa-a3f0-088f5e62f3fa + + + f102f34b-3bf6-4412-ae09-1a96d4a0a894 + ebd753b3-ddf9-4ad1-9abc-1015184bfbc6 + + + + Параметры + + + ru + Параметры + + + + + DontCheck + + + + DontCheck + false + false + Auto + + + false + + + Auto + Auto + + false + Use + false + + + + Use + + + + + + + + + + + Идентификатор + + + ru + Идентификатор + + + Идентификатор + + v8:UUID + + false + + + + + ru + Идентификатор параметра + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + ИдентификаторЗапроса + + + ru + Идентификатор запроса + + + Идентификатор запроса + + v8:UUID + + false + + + + + ru + Уникальный идентификатор запроса + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Имя + + + ru + Имя + + + Имя параметра + + xs:string + + 50 + Variable + + + false + + + + + ru + Имя параметра + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Тип + + + ru + Тип + + + Тип + + xs:string + + 0 + Variable + + + false + + + + + ru + Тип параметра + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + + Значение + + + ru + Значение + + + Значение параметра + + xs:string + + 0 + Variable + + + false + + + + + ru + Значение параметра + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + + + + +
Форма
+
Настройки
+
ВыборЗапроса
+
ТаблицаЗначений
+
ТекстЗапросаДляКонфигуратора
+
МоментВремени
+
Граница
+
РезультатЗапроса
+
ПланВыполненияЗапроса
+ +
+
+
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Ext/Help.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Ext/Help.xml new file mode 100644 index 0000000..a617fa1 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Ext/Help.xml @@ -0,0 +1,4 @@ + + + ru + \ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Ext/Help/ru.html b/src/ИнструментыРазработчикаКонсольЗапросов/Ext/Help/ru.html new file mode 100644 index 0000000..3cf9f13 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Ext/Help/ru.html @@ -0,0 +1,11 @@ + +

Консоль запросов для управляемого приложения

+

Инструмент "Консоль запросов" предназначена для отладки и просмотра результатов выполнения запросов в режиме 1С:Предприятие. Данная обработка предназначена, в основном, для разработчиков конфигураций и специалистов по внедрению.

+

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

+

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

+

Если в запросе при выводе результатов требуется использовать точку с запятой, то ее следует экранировать символом обратного слеша - "\".
Пример: ВЫБРАТЬ Номенклатура.Наименование + " \; " + Номенклатура.Наименование ИЗ Справочник.Номенклатура

\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Ext/ObjectModule.bsl b/src/ИнструментыРазработчикаКонсольЗапросов/Ext/ObjectModule.bsl new file mode 100644 index 0000000..4d113d8 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Ext/ObjectModule.bsl @@ -0,0 +1,1993 @@ +#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда + +#Область СлужебныеПроцедурыИФункции + +/////////////////////////////////////////////////////////////////////////// +// ФУНКЦИИ РАБОТЫ С ВРЕМЕННЫМ ХРАНИЛИЩЕМ + +// Помещает во внутреннее хранилище Запросы, Параметры, Имя файла. +// +// Параметры: +// Объект - передаваемый объект обработки. +// ИдентификаторТекущегоЗапроса - GUID текущего запроса. +// ИдентификаторТекущегоПараметра - GUID текущего параметра. +// +Функция ПоместитьЗапросыВоВременноеХранилище(Объект, ИдентификаторТекущегоЗапроса, ИдентификаторТекущегоПараметра) Экспорт + ПараметрыПередачи = Новый Структура; + ПараметрыПередачи.Вставить("Запросы", Объект.Запросы.Выгрузить()); + ПараметрыПередачи.Вставить("Параметры", Объект.Параметры.Выгрузить()); + ПараметрыПередачи.Вставить("ИмяФайла", Объект.ИмяФайла); + ПараметрыПередачи.Вставить("ИдентификаторТекущегоЗапроса", ИдентификаторТекущегоЗапроса); + ПараметрыПередачи.Вставить("ИдентификаторТекущегоПараметра", ИдентификаторТекущегоПараметра); + + АдресХранилища = ПоместитьВоВременноеХранилище(ПараметрыПередачи); + Возврат АдресХранилища; +КонецФункции + +// Помещает во внутренне хранилище настройки обработки. +// +// Параметры: +// Объект - передаваемый Объект обработки. +// +Функция ПоместитьНастройкиВоВременноеХранилище(Объект) Экспорт + ПараметрыПередачи = Новый Структура; + ПараметрыПередачи.Вставить("ИспользоватьАвтосохранение", Объект.ИспользоватьАвтосохранение); + ПараметрыПередачи.Вставить("ПериодАвтосохранения", Объект.ПериодАвтосохранения); + ПараметрыПередачи.Вставить("ВыводитьВРезультатахЗапросаЗначенияСсылок", Объект.ВыводитьВРезультатахЗапросаЗначенияСсылок); + ПараметрыПередачи.Вставить("ЧередованиеЦветовВРезультатеЗапроса", Объект.ЧередованиеЦветовВРезультатеЗапроса); + ПараметрыПередачи.Вставить("ТипОбхода", Объект.ТипОбхода); + + АдресХранилища = ПоместитьВоВременноеХранилище(ПараметрыПередачи); + Возврат АдресХранилища; +КонецФункции + +/////////////////////////////////////////////////////////////////////////// +// ФУНКЦИИ РАБОТЫ С XML-ФАЙЛАМИ + +// Записывает Запросы(текст и параметры запроса) в файл XML. +// +// Параметры: +// ИмяФайла - имя файла XML. +// Объект - передаваемый объект обработки. +// +Функция ЗаписатьЗапросыВФайлXML(знач Объект) Экспорт + + ФайлXML = Новый ЗаписьXML; + ИмяФайла = ПолучитьИмяВременногоФайла("q1c"); + ФайлXML.ОткрытьФайл(ИмяФайла); + ФайлXML.ЗаписатьОбъявлениеXML(); + ФайлXML.ЗаписатьНачалоЭлемента("querylist"); + // Цикл запросов. + Для каждого ТекЗапрос Из Объект.Запросы Цикл + ФайлXML.ЗаписатьНачалоЭлемента("query"); + ФайлXML.ЗаписатьАтрибут("name", ТекЗапрос.Имя); + ФайлXML.ЗаписатьНачалоЭлемента("text"); + ТекстЗапроса = ТекЗапрос.Текст; + Для Счетчик = 1 По СтрЧислоСтрок(ТекстЗапроса) Цикл + ПереносСтр = Символы.ВК + Символы.ПС; + ТекСтрока = СтрПолучитьСтроку(ТекстЗапроса, Счетчик); + ФайлXML.ЗаписатьТекст(ТекСтрока); + ФайлXML.ЗаписатьБезОбработки(ПереносСтр); + КонецЦикла; + ФайлXML.ЗаписатьКонецЭлемента(); + ИдентификаторЗапроса = ТекЗапрос.Идентификатор; + // Запись параметров в XML-файл. + Если Объект.Параметры.Количество() > 0 Тогда + ФайлXML.ЗаписатьНачалоЭлемента("parameters"); + Для каждого ТекПараметр Из Объект.Параметры Цикл + Если ТекПараметр.ИдентификаторЗапроса = ИдентификаторЗапроса Тогда + ИмяПараметра = ТекПараметр.Имя; + ТипПараметра = ТекПараметр.Тип; + Значение = ТекПараметр.Значение; + Если ПустаяСтрока(Значение) Тогда + ЗначениеПараметра = ""; + Иначе + ЗначениеПараметра = ЗначениеИзСтрокиВнутр(ТекПараметр.Значение); + КонецЕсли; + + ФайлXML.ЗаписатьНачалоЭлемента("parameter"); + ФайлXML.ЗаписатьАтрибут("name", ИмяПараметра); + Если ТипПараметра = "СписокЗначений" Тогда + ФайлXML.ЗаписатьАтрибут("type", ТипПараметра); + ЗаписатьСписокЗначенийВXML(ФайлXML, ЗначениеПараметра); + ИначеЕсли ТипПараметра = "ТаблицаЗначений" Тогда + ФайлXML.ЗаписатьАтрибут("type", ТипПараметра); + + Колонки = ЗначениеПараметра.Колонки.Количество(); + Строки = ЗначениеПараметра.Количество(); + + ФайлXML.ЗаписатьАтрибут("colcount", XMLСтрока(Колонки)); + ФайлXML.ЗаписатьАтрибут("rowcount", XMLСтрока(Строки)); + + ЗаписатьТаблицуЗначенийВXML(ФайлXML, ЗначениеПараметра); + ИначеЕсли ТипПараметра = "МоментВремени" Тогда + ФайлXML.ЗаписатьАтрибут("type", ТипПараметра); + ЗаписатьМоментВремениВXML(ФайлXML, ЗначениеПараметра); + ИначеЕсли ТипПараметра = "Граница" Тогда + ФайлXML.ЗаписатьАтрибут("type", ТипПараметра); + ЗаписатьГраницуВXML(ФайлXML, ЗначениеПараметра); + Иначе + ИмяТипа = ИмяТипаИзЗначения(ЗначениеПараметра); + ФайлXML.ЗаписатьАтрибут("type", ИмяТипа); + ФайлXML.ЗаписатьАтрибут("value", XMLСтрока(ЗначениеПараметра)); + КонецЕсли; + ФайлXML.ЗаписатьКонецЭлемента(); + КонецЕсли; + КонецЦикла; + ФайлXML.ЗаписатьКонецЭлемента(); + КонецЕсли; + ФайлXML.ЗаписатьКонецЭлемента(); + КонецЦикла; + ФайлXML.ЗаписатьКонецЭлемента(); + ФайлXML.Закрыть(); + + ВозвращаемоеЗначение = Новый ДвоичныеДанные(ИмяФайла); + + УдалитьФайлы(ИмяФайла); + + Возврат ВозвращаемоеЗначение; + +КонецФункции + +// Записывает строки списка значений в Файл XML. +// +// Параметры: +// ФайлXML - записьXML. +// Значение - список значений. +// +Процедура ЗаписатьСписокЗначенийВXML(ФайлXML, Значение) + Если ТипЗнч(Значение) <> Тип("СписокЗначений") Тогда + Возврат; + КонецЕсли; + + Для каждого СтрСписка Из Значение Цикл + ЗначениеЭлементаСписка = СтрСписка.Значение; + // Определение имени типа. + ИмяТипа = ИмяТипаИзЗначения(ЗначениеЭлементаСписка); + + ФайлXML.ЗаписатьНачалоЭлемента("item"); + ФайлXML.ЗаписатьАтрибут("type", ИмяТипа); + ФайлXML.ЗаписатьАтрибут("value", XMLСтрока(ЗначениеЭлементаСписка)); + ФайлXML.ЗаписатьКонецЭлемента(); + КонецЦикла; +КонецПроцедуры + +// Записывает ячейки таблицы значений в Файл XML. +// +// Параметры: +// ФайлXML - записьXML. +// Значение - таблица значений. +// +Процедура ЗаписатьТаблицуЗначенийВXML(ФайлXML, Значение) + Если ТипЗнч(Значение) <> Тип("ТаблицаЗначений") Тогда + Возврат; + КонецЕсли; + + КолКолонок = Значение.Колонки.Количество(); + КолСтрок = Значение.Количество(); + + Для СтрокаИндекс = 0 По КолСтрок - 1 Цикл + Для КолонкаИндекс = 0 По КолКолонок - 1 Цикл + ЗначениеЭлементаСписка = Значение.Получить(СтрокаИндекс).Получить(КолонкаИндекс); + ИмяКолонки = Значение.Колонки.Получить(КолонкаИндекс).Имя; + // Определение имени типа. + ИмяТипа = ИмяТипаИзЗначения(ЗначениеЭлементаСписка); + Если ИмяТипа = "Строка" Тогда + Длина = Значение.Колонки.Получить(КолонкаИндекс).ТипЗначения.КвалификаторыСтроки.Длина; + Иначе + Длина = 0; + КонецЕсли; + + ФайлXML.ЗаписатьНачалоЭлемента("item"); + ФайлXML.ЗаписатьАтрибут("nameCol", ИмяКолонки); + ФайлXML.ЗаписатьАтрибут("row", XMLСтрока(СтрокаИндекс)); + ФайлXML.ЗаписатьАтрибут("col", XMLСтрока(КолонкаИндекс)); + ФайлXML.ЗаписатьАтрибут("type", ИмяТипа); + ФайлXML.ЗаписатьАтрибут("length", XMLСтрока(Длина)); + ФайлXML.ЗаписатьАтрибут("value", XMLСтрока(ЗначениеЭлементаСписка)); + ФайлXML.ЗаписатьКонецЭлемента(); + КонецЦикла; + КонецЦикла; +КонецПроцедуры + +// Записывает момент времени в Файл XML. +// +// Параметры: +// ФайлXML - записьXML. +// Значение - момент времени. +// +Процедура ЗаписатьМоментВремениВXML(ФайлXML, Значение) + Если ТипЗнч(Значение) <> Тип("МоментВремени") Тогда + Возврат; + КонецЕсли; + + // Определение имени типа. + ИмяТипа = ИмяТипаИзЗначения(Значение.Ссылка); + + ФайлXML.ЗаписатьНачалоЭлемента("item"); + Если Значение.Ссылка <> Неопределено Тогда + ФайлXML.ЗаписатьАтрибут("type", ИмяТипа); + ФайлXML.ЗаписатьАтрибут("valueRef", XMLСтрока(Значение.Ссылка)); + КонецЕсли; + ФайлXML.ЗаписатьАтрибут("valueDate", XMLСтрока(Значение.Дата)); + ФайлXML.ЗаписатьКонецЭлемента(); +КонецПроцедуры + +// Записывает границу. +// +Процедура ЗаписатьГраницуВXML(ФайлXML, Граница) + Если ТипЗнч(Граница) <> Тип("Граница") Тогда + Возврат; + КонецЕсли; + + ФайлXML.ЗаписатьНачалоЭлемента("divide"); + // Определение имени типа. + ИмяТипа = ИмяТипаИзЗначения(Граница.Значение); + ТипЗначенияГраницы = ТипЗнч(Граница.Значение); + + // Запись в строку вида границы. + ИмяВидаГраницы = Строка(Граница.ВидГраницы); + + ФайлXML.ЗаписатьАтрибут("type", ИмяТипа); + ФайлXML.ЗаписатьАтрибут("valueDiv", ИмяВидаГраницы); + + Если ТипЗначенияГраницы <> Тип("МоментВремени") Тогда + ФайлXML.ЗаписатьАтрибут("value", XMLСтрока(Граница.Значение)); + Иначе + ЗаписатьМоментВремениВXML(ФайлXML, Граница.Значение); + КонецЕсли; + ФайлXML.ЗаписатьКонецЭлемента(); +КонецПроцедуры + +// Читает Запросы(текст и параметры) из XML-файла. +// +Функция ПрочитатьЗапросыИзФайлаXML(ДвоичныеДанные) Экспорт + Объект = ЭтотОбъект; + ИмяФайла = ПолучитьИмяВременногоФайла("q1c"); + ДвоичныеДанные.Записать(ИмяФайла); + ФайлXML = Новый ЧтениеXML; + ФайлXML.ОткрытьФайл(ИмяФайла); + ФайлXML.Прочитать(); + // Чтение всех запросов. + Если ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ФайлXML.Имя = "querylist" Тогда + Пока ФайлXML.Прочитать() Цикл + // Чтение запроса. + Если ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ФайлXML.Имя = "query" Тогда + Пока ФайлXML.ПрочитатьАтрибут() Цикл + Если ФайлXML.Имя = "name" Тогда + // Добавление запроса в таблицу. + текЭлементЗапроса = Запросы.Добавить(); + текЭлементЗапроса.Идентификатор = Новый УникальныйИдентификатор; + текЭлементЗапроса.Имя = ФайлXML.Значение; + КонецЕсли; + КонецЦикла; + Пока ФайлXML.Прочитать() Цикл + Если ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ФайлXML.Имя = "text" Тогда + ФайлXML.Прочитать(); + текЭлементЗапроса.Текст = ФайлXML.Значение; + // Чтение параметров. + КонецЕсли; + Если ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ФайлXML.Имя = "parameters" Тогда + Пока ФайлXML.Прочитать() Цикл + // Чтение отдельного параметра. + Если ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента И ФайлXML.Имя = "parameter" Тогда + Пока ФайлXML.ПрочитатьАтрибут() Цикл + // Чтение имени атрибута. + Если ФайлXML.Имя = "name" Тогда + текПараметрЗапроса = Параметры.Добавить(); + текПараметрЗапроса.Идентификатор = Новый УникальныйИдентификатор; + текПараметрЗапроса.Имя = ФайлXML.Значение; + текПараметрЗапроса.ИдентификаторЗапроса = текЭлементЗапроса.Идентификатор; + КонецЕсли; + + // Чтение типа параметра. + Если ФайлXML.Имя = "type" Тогда + ТипЭлемента = Тип(ФайлXML.Значение); + текПараметрЗапроса.Тип = Строка(ФайлXML.Значение); + КонецЕсли; + + // Чтение значения параметра. + Если ФайлXML.Имя = "value" Тогда + Значение = XMLЗначение(ТипЭлемента, ФайлXML.Значение); + текПараметрЗапроса.Значение = ЗначениеВСтрокуВнутр(Значение); + КонецЕсли; + + // Чтение количества колонок Таблицы Значений. + Если ФайлXML.Имя = "colcount" Тогда + КоличествоКолонок = Число(ФайлXML.Значение); + КонецЕсли; + + // Чтение количества строк Таблицы Значений. + Если ФайлXML.Имя = "rowcount" Тогда + КоличествоСтрок = Число(ФайлXML.Значение); + КонецЕсли; + КонецЦикла; + + // Чтение отдельных типов. + // Для отдельных типов предусмотрено индивидуальное чтение параметров. + // Под отдельными типами понимаются: Список значений, Таблица значений, + // Момент Времени, Граница. + // + // Список отдельных типов может увеличиваться. + Если текПараметрЗапроса.Тип = "СписокЗначений" Тогда + ПрочитатьСписокЗначенийИзXML(ФайлXML, текПараметрЗапроса); + КонецЕсли; + Если текПараметрЗапроса.Тип = "ТаблицаЗначений" Тогда + Если КоличествоКолонок > 0 Тогда + ПрочитатьТаблицуЗначенийИзXML(ФайлXML, текПараметрЗапроса, КоличествоСтрок, КоличествоКолонок); + КонецЕсли; + КонецЕсли; + Если текПараметрЗапроса.Тип = "МоментВремени" Тогда + ПрочитатьМоментВремениИзXML(ФайлXML, текПараметрЗапроса); + КонецЕсли; + Если текПараметрЗапроса.Тип = "Граница" Тогда + ПрочитатьГраницуИзXML(ФайлXML, текПараметрЗапроса); + КонецЕсли; + КонецЕсли; + Если ПроверкаКонцаТэгов(ФайлXML) Тогда + Прервать; + КонецЕсли; + КонецЦикла; + КонецЕсли; + Если ПроверкаКонцаТэгов(ФайлXML) Тогда + Прервать; + КонецЕсли; + КонецЦикла; // Обход по тэгам "query". + КонецЕсли; // Если "query". + КонецЦикла; // Обход по запросам. + КонецЕсли; // Если "querylist". + ФайлXML.Закрыть(); + Возврат ЭтотОбъект; +КонецФункции + +// Читает Список значений. +// +// Параметры: +// ФайлXML - Чтение XML. +// ПараметрЗапроса - текущий параметр. +// +Процедура ПрочитатьСписокЗначенийИзXML(ФайлXML, ПараметрЗапроса) + СписокЗН = Новый СписокЗначений; + Пока ФайлXML.Прочитать() Цикл + Если ФайлXML.Имя = "item" И ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + Пока ФайлXML.ПрочитатьАтрибут() Цикл + Если ФайлXML.Имя = "type" Тогда + ТипЭлемента = Тип(ФайлXML.Значение); + КонецЕсли; + Если ФайлXML.Имя = "value" Тогда + // Чтение значения. + Значение = XMLЗначение(ТипЭлемента, ФайлXML.Значение); + ЗначениеЭлементаСписка = Значение; + КонецЕсли; + КонецЦикла; + СписокЗН.Добавить(ЗначениеЭлементаСписка); + ИначеЕсли ФайлXML.Имя <> "item" Тогда + Прервать; + КонецЕсли; + КонецЦикла; + ПараметрЗапроса.Значение = ЗначениеВСтрокуВнутр(СписокЗН); +КонецПроцедуры + +// Читает Таблицу значений. +// +// Параметры: +// ФайлXML - Чтение XML. +// ПараметрЗапроса - текущий параметр. +// КоличествоСтрок - количество строк. +// КоличествоКолонок - количество колонок. +// +Процедура ПрочитатьТаблицуЗначенийИзXML(ФайлXML, ПараметрЗапроса, КоличествоСтрок, КоличествоКолонок) + ТаблицаЗначений = Новый ТаблицаЗначений; + МассивКолонок = Новый Массив; + + Пока ФайлXML.Прочитать() Цикл + Если ФайлXML.Имя = "item" И ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + Пока ФайлXML.ПрочитатьАтрибут() Цикл + Если ФайлXML.Имя = "col" Тогда + ИндексКолонки = Число(ФайлXML.Значение); + КонецЕсли; + Если ФайлXML.Имя = "row" Тогда + ИндексСтроки = Число(ФайлXML.Значение); + КонецЕсли; + Если ФайлXML.Имя = "type" Тогда + ТипЭлемента = Тип(ФайлXML.Значение); + МассивТипов = Новый Массив; + МассивТипов.Добавить(ТипЭлемента); + КонецЕсли; + Если ФайлXML.Имя = "nameCol" Тогда + ИмяКолонки = ФайлXML.Значение; + КонецЕсли; + Если ФайлXML.Имя = "length" Тогда + Длина = ФайлXML.Значение; + КонецЕсли; + Если ФайлXML.Имя = "value" Тогда + Значение = XMLЗначение(ТипЭлемента, ФайлXML.Значение); + ЗначениеЯчейки = Значение; + КонецЕсли; + КонецЦикла; + + ПараметрыСтроки = Новый КвалификаторыСтроки(Длина); + //ag( + Если ИндексСтроки = неопределено Тогда + //добавим пустую ТЗ + ОписаниеТипов = Новый ОписаниеТипов(); + ОписаниеТипов = Новый ОписаниеТипов(ОписаниеТипов, МассивТипов); + + + СтруктураКолонки = Новый Структура; + СтруктураКолонки.Вставить("Имя", ИмяКолонки); + СтруктураКолонки.Вставить("ОписаниеТипов", ОписаниеТипов); + СтруктураКолонки.Вставить("СписокЗначенийЯчеекКолонки", Новый СписокЗначений); + + МассивКолонок.Вставить(ИндексКолонки,СтруктураКолонки); + Иначе + //ag) + + Если МассивКолонок.Количество() - 1 < ИндексКолонки Тогда + ОписаниеТипов = Новый ОписаниеТипов(); + ОписаниеТипов = Новый ОписаниеТипов(ОписаниеТипов, МассивТипов,,, ПараметрыСтроки); + + СписокЗначенийЯчеекКолонки = Новый СписокЗначений; + СписокЗначенийЯчеекКолонки.Вставить(ИндексСтроки,ЗначениеЯчейки); + + СтруктураКолонки = Новый Структура; + СтруктураКолонки.Вставить("Имя", ИмяКолонки); + СтруктураКолонки.Вставить("ОписаниеТипов", ОписаниеТипов); + СтруктураКолонки.Вставить("СписокЗначенийЯчеекКолонки", СписокЗначенийЯчеекКолонки); + + МассивКолонок.Вставить(ИндексКолонки, СтруктураКолонки); + Иначе + Имя = МассивКолонок.Получить(ИндексКолонки).Имя; + ОписаниеТипов = МассивКолонок.Получить(ИндексКолонки).ОписаниеТипов; + ОписаниеТипов = Новый ОписаниеТипов(ОписаниеТипов, МассивТипов,,, ПараметрыСтроки); + СписокЗначенийЯчеекКолонки = МассивКолонок.Получить(ИндексКолонки).СписокЗначенийЯчеекКолонки; + СписокЗначенийЯчеекКолонки.Вставить(ИндексСтроки,ЗначениеЯчейки); + + МассивКолонок.Удалить(ИндексКолонки); + СтруктураКолонки = Новый Структура; + СтруктураКолонки.Вставить("Имя", ИмяКолонки); + СтруктураКолонки.Вставить("ОписаниеТипов", ОписаниеТипов); + СтруктураКолонки.Вставить("СписокЗначенийЯчеекКолонки", СписокЗначенийЯчеекКолонки); + МассивКолонок.Вставить(ИндексКолонки, СтруктураКолонки); + КонецЕсли; + КонецЕсли; + ИначеЕсли ФайлXML.Имя <> "item" Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + КолКолонок = МассивКолонок.Количество(); + Для ИндексКолонок = 0 По КолКолонок - 1 Цикл + ИмяКолонки = МассивКолонок.Получить(ИндексКолонок).Имя; + ТипКолонки = МассивКолонок.Получить(ИндексКолонок).ОписаниеТипов; + ТаблицаЗначений.Колонки.Вставить(ИндексКолонок, ИмяКолонки, ТипКолонки, ИмяКолонки); + + СписокЗначений = МассивКолонок.Получить(ИндексКолонок).СписокЗначенийЯчеекКолонки; + КолСтрок = СписокЗначений.Количество(); + Для ИндексСтрок = 0 По КолСтрок - 1 Цикл + ЗначениеЯчейки = СписокЗначений.Получить(ИндексСтрок).Значение; + Если ИндексСтрок <= ТаблицаЗначений.Количество() - 1 Тогда + ТаблицаЗначений.Получить(ИндексСтрок).Установить(ИндексКолонок, ЗначениеЯчейки); + Иначе + ТаблицаЗначений.Вставить(ИндексСтрок).Установить(ИндексКолонок, ЗначениеЯчейки); + КонецЕсли; + КонецЦикла; + КонецЦикла; + + ПараметрЗапроса.Значение = ЗначениеВСтрокуВнутр(ТаблицаЗначений); +КонецПроцедуры + +// Читает Момент времени. +// +// Параметры: +// ФайлXML - Чтение XML. +// ПараметрЗапроса - текущий параметр. +// +Процедура ПрочитатьМоментВремениИзXML(ФайлXML, ПараметрЗапроса) + Пока ФайлXML.Прочитать() Цикл + Если ФайлXML.Имя = "item" И ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + Пока ФайлXML.ПрочитатьАтрибут() Цикл + Если ФайлXML.Имя = "type" Тогда + ТипЭлемента = Тип(ФайлXML.Значение); + КонецЕсли; + Если ФайлXML.Имя = "valueRef" Тогда + ЗначениеСсылки = XMLЗначение(ТипЭлемента, ФайлXML.Значение); + КонецЕсли; + Если ФайлXML.Имя = "valueDate" Тогда + ЗначениеДаты = XMLЗначение(Тип("Дата"), ФайлXML.Значение); + КонецЕсли; + КонецЦикла; + МВ = Новый МоментВремени(ЗначениеДаты, ЗначениеСсылки); + ИначеЕсли ФайлXML.Имя <> "item" Тогда + Прервать; + КонецЕсли; + КонецЦикла; + ПараметрЗапроса.Значение = ЗначениеВСтрокуВнутр(МВ); +КонецПроцедуры + +// Читает Границу. +// +// Параметры: +// ФайлXML - Чтение XML. +// ПараметрЗапроса - текущий параметр. +// +Процедура ПрочитатьГраницуИзXML(ФайлXML, ПараметрЗапроса) + Пока ФайлXML.Прочитать() Цикл + Если ФайлXML.Имя = "divide" И ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда + Пока ФайлXML.ПрочитатьАтрибут() Цикл + Если ФайлXML.Имя = "type" Тогда + ТипЭлемента = Тип(ФайлXML.Значение); + КонецЕсли; + Если ФайлXML.Имя = "value" Тогда + Значение = XMLЗначение(ТипЭлемента, ФайлXML.Значение); + КонецЕсли; + Если ФайлXML.Имя = "valueDiv" Тогда + Вид = XMLЗначение(Тип("Строка"), ФайлXML.Значение); + Вид = ОпределениеВидаГраницы(Вид); + КонецЕсли; + КонецЦикла; + Если ТипЭлемента = Тип("МоментВремени") Тогда + ПрочитатьМоментВремениИзXML(ФайлXML, ПараметрЗапроса); + Значение = ЗначениеИзСтрокиВнутр(ПараметрЗапроса.Значение); + КонецЕсли; + + Граница = Новый Граница(Значение, Вид); + ИначеЕсли ФайлXML.Имя <> "divide" Тогда + Прервать; + КонецЕсли; + КонецЦикла; + ПараметрЗапроса.Значение = ЗначениеВСтрокуВнутр(Граница); +КонецПроцедуры + +// Определяет условие конца тэга "query" или "parameters". +// +// Параметры: +// ФайлXML - чтениеXML. +// +Функция ПроверкаКонцаТэгов(ФайлXML) + Если (ФайлXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ФайлXML.Имя = "query") + Или (ФайлXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ФайлXML.Имя = "parameters") Тогда + Возврат Истина; + Иначе + Возврат Ложь; + КонецЕсли; +КонецФункции + +/////////////////////////////////////////////////////////////////////////// +// ФУНКЦИИ РАБОТЫ С ЗАПРОСОМ + +// Считывает параметры из текста запроса. +// +// Параметры: +// ТекстЗапроса - текст запроса. +// ИдентификаторЗапроса - уникальный идентификатор запроса. +// +Функция СчитатьПараметрыЗапроса(ТекстЗапроса, ИдентификаторЗапроса) Экспорт + МассивСтруктуры = Новый Массив; + + Запрос = Новый Запрос; + Запрос.Текст = ТекстЗапроса; + + // Заполняем параметрами таблицу параметров. + ПарЗап = Запрос.НайтиПараметры(); + Для каждого СтрПараметры Из ПарЗап Цикл + РезультатСтруктура = ДобавлениеНовогоПараметра(СтрПараметры, ИдентификаторЗапроса); + МассивСтруктуры.Добавить(РезультатСтруктура); + КонецЦикла; + + Возврат МассивСтруктуры; +КонецФункции + +// Добавляет новый параметр в структуру параметров. +// +// Параметры: +// ТекущийПрочитанныйПараметр - текущий параметр, прочитанный из текста запроса. +// ИдентификаторЗапроса - GUID запроса. +// +// Возвращает: структуру параметров. +// +Функция ДобавлениеНовогоПараметра(ТекущийПрочитанныйПараметр, ИдентификаторЗапроса) + + ЭлементПараметр = Новый Структура("ИдентификаторЗапроса, Имя, Тип, Значение", + ИдентификаторЗапроса, ТекущийПрочитанныйПараметр.Имя + ); + + // Смотрим на первый тип из списка, если есть. + ДоступныеТипы = ТекущийПрочитанныйПараметр.ТипЗначения.Типы(); + + + Если ДоступныеТипы.Количество()=0 Тогда + // Считаем строкой + ЭлементПараметр.Тип = "Строка"; + ЭлементПараметр.Значение = ЗначениеВСтрокуВнутр(""); + Возврат ЭлементПараметр; + КонецЕсли; + + // Формируем описание типа из первого доступного типа. + Массив = Новый Массив; + Массив.Добавить( ДоступныеТипы.Получить(0) ); + НовоеОписаниеТипов = Новый ОписаниеТипов(Массив); + + Значение = НовоеОписаниеТипов.ПривестиЗначение(Неопределено); + + СписокДобавленныхТипов = Новый СписокЗначений; + СформироватьСписокТипов(СписокДобавленныхТипов); + + Флаг = Ложь; + СтроковоеПредставлениеТипа = Строка(ТипЗнч(Значение)); + Для каждого ЭлементСписка Из СписокДобавленныхТипов Цикл + Если ЭлементСписка.Представление = СтроковоеПредставлениеТипа Тогда + Флаг = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + ЭлементПараметр.Тип = ?(Флаг, СтроковоеПредставлениеТипа, XMLТип(ТипЗнч(Значение)).ИмяТипа); + ЭлементПараметр.Значение = ЗначениеВСтрокуВнутр(Значение); + + Возврат ЭлементПараметр; +КонецФункции + +// Загружает параметры в запрос. +// Если строковое представление значения - пустая строка, тогда значение параметра является Неопределено. +// +// Параметры: +// Запрос - передаваемый запрос. +// ПараметрыЗапроса - передаваемые параметры для запроса. +// +Процедура ЗагрузкаПараметровВЗапрос(Запрос, ПараметрыЗапроса) + Для каждого ЭлементПараметр Из ПараметрыЗапроса Цикл + СтрокаЗначение = ЭлементПараметр.Значение; + Если ПустаяСтрока(СтрокаЗначение) Тогда + Значение = Неопределено; + Иначе + Значение = ЗначениеИзСтрокиВнутр(СтрокаЗначение); + КонецЕсли; + Запрос.УстановитьПараметр(ЭлементПараметр.Имя, Значение); + КонецЦикла; +КонецПроцедуры + +// Выполняется запрос +// +// Параметры: +// ТекстЗапроса - текст запроса. +// ПараметрыЗапроса - массив параметров запроса. +// ТДРезультатаЗапроса - табличный документ результата запроса. +// ПараметрыВыводаЗапроса - Структура - Параметры вывода запроса. +// * ВыводитьВременныеТаблицы - выводить временные таблицы или нет. +// * ВыводитьИдентификатор - выводить GUID для ссылок или нет. +// * ПорядокОбхода - порядок обхода результата запроса. +// * ИспользованиеЧередования - использовать чередование или нет в результирующем табличном документе. +// ОтчетПоВыполнениюЗапроса - Структура - Статистика о выполнение запроса. +// * ВремяВыполнения - время выполнения запроса. +// * КоличествоСтрок - Количество строк в результате запроса. +// * ТекстСообщения - текст сообщения об ошибке. +// Метка запроса - Строка - Метка запроса для поиска его в технологическом журнале. +// +Функция ВыполнитьЗапрос(ТекстЗапроса, ПараметрыЗапроса, ТДРезультатаЗапроса, ПараметрыВыводаЗапроса, ОтчетПоВыполнениюЗапроса, МеткаЗапроса) Экспорт + + Если ЗначениеЗаполнено(МеткаЗапроса) Тогда + ЗаписатьМеткуЗапроса(ТекстЗапроса, МеткаЗапроса, "begin"); + КонецЕсли; + + Если ЗначениеЗаполнено(МеткаЗапроса) Тогда + ЗаписатьМеткуЗапроса(ТекстЗапроса, МеткаЗапроса, "end"); + КонецЕсли; + + // Массив текстов запросов. + МассивТекстов = ПостроитьМассивТекстовЗапросов(ТекстЗапроса); + + ТекстЗапроса = СтрЗаменить(ТекстЗапроса ,"\;", ";"); // Экранирование точки с запятой. + Запрос = Новый Запрос(ТекстЗапроса); + Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц(); + + // Загрузка параметров. + ЗагрузкаПараметровВЗапрос(Запрос, ПараметрыЗапроса); + + // Проверка на правильность запросов. + Попытка + Начало = ТекущаяУниверсальнаяДатаВМиллисекундах(); + МассивЗапросов = Запрос.ВыполнитьПакет(); + Конец = ТекущаяУниверсальнаяДатаВМиллисекундах() ; + ОтчетПоВыполнениюЗапроса.ВремяВыполнения = (Конец - Начало) / 1000; + Исключение + ТекстСообщения = ОписаниеОшибки(); + Возврат Неопределено; + КонецПопытки; + + МассивДанныхПоЗапросу = Новый Структура; + МассивДанныхПоЗапросу.Вставить("Запрос", Запрос); + МассивДанныхПоЗапросу.Вставить("МассивТекстов", МассивТекстов); + МассивДанныхПоЗапросу.Вставить("МассивЗапросов", МассивЗапросов); + МассивДанныхПоЗапросу.Вставить("МеткаЗапроса", МеткаЗапроса); + + Успешно = ВывестиРезультатЗапросов(ТДРезультатаЗапроса, МассивДанныхПоЗапросу, ПараметрыЗапроса, ПараметрыВыводаЗапроса, ОтчетПоВыполнениюЗапроса); + Если Не Успешно Тогда + Если ВозможноОшибкаИзЗаТочкиСЗапятой(ТекстЗапроса) Тогда + ОтчетПоВыполнениюЗапроса.ТекстСообщения = НСтр("ru = 'Результат запроса не был выведен. Возможно не экранирована точка с запятой. Для экранирования точки с запятой используется обратный слеш -""\;""(см. справку)'"); + Иначе + ОтчетПоВыполнениюЗапроса.ТекстСообщения = НСтр("ru = 'Запрос не был выполнен, т.к. текст запроса некорректный'"); + КонецЕсли; + КонецЕсли; + + Возврат МассивЗапросов; +КонецФункции + +Процедура ЗаписатьМеткуЗапроса(ТекстЗапроса, Метка, Статус) + Если Статус = "begin" Тогда + ТекстЗапроса = "ВЫБРАТЬ ""Marker_" + Метка+ "_"+ Статус + """ КАК МЕТКА ПОМЕСТИТЬ Marker_begin " + Символы.ПС + ";" + Символы.ПС + ТекстЗапроса + Символы.ПС + ";" + Символы.ПС; + Иначе + ТекстЗапроса = Символы.ПС + ТекстЗапроса + "ВЫБРАТЬ ""Marker_" + Метка+ "_"+ Статус + """ Как МЕТКА ПОМЕСТИТЬ Marker_end " + Символы.ПС + ";" + Символы.ПС; + КонецЕсли; +КонецПроцедуры + +// Возвращает массив текстов запросов. +// +// Параметры: +// ТекстЗапроса - Текст передаваемого запроса. +// +Функция ПостроитьМассивТекстовЗапросов(знач ТекстЗапроса) + + МассивТекстов = Новый Массив; + Пока Не ПустаяСтрока(ТекстЗапроса) Цикл + ТочкаСЗапятой = ";"; + ПозицияТочкиСЗапятой = Найти(ТекстЗапроса, ТочкаСЗапятой); + Если Сред(ТекстЗапроса, ПозицияТочкиСЗапятой - 1, 1) = "\" Тогда + ПозицияТочкиСЗапятой = 0; + КонецЕсли; + Если ПозицияТочкиСЗапятой = 0 Тогда + ТекстОчередногоЗапроса = ТекстЗапроса; + ПозицияТочкиСЗапятой = СтрДлина(ТекстЗапроса); + Иначе + ТекстОчередногоЗапроса = Лев(ТекстЗапроса, ПозицияТочкиСЗапятой - 1); + КонецЕсли; + Если Не ПустаяСтрока(ТекстОчередногоЗапроса) Тогда + МассивТекстов.Добавить(СокрЛП(ТекстОчередногоЗапроса)); + КонецЕсли; + ТекстЗапроса = Сред(ТекстЗапроса, ПозицияТочкиСЗапятой + 1); + КонецЦикла; + + Возврат МассивТекстов; + +КонецФункции + +// Возвращает есть ли в запросе иерархия. +// +// Параметры: +// ТекстЗапроса - текст запроса. +// +Функция НаличиеИерархииВЗапросе(ТекстЗапроса) + Итоги = "ИТОГИ"; + Позиция = Найти(ВРег(ТекстЗапроса), Итоги); + + Возврат ?(Позиция = 0, Ложь, Истина); +КонецФункции + +// Возвращает имя временной таблицы. +// +// Параметры: +// ТекстЗапроса - текст запроса. +// Буфер - переменная хранения строки вида 'ПОМЕСТИТЬ %ИмяВременнойТаблицы%'. +// Позиция - позиция после слова 'ПОМЕСТИТЬ' в тексте запроса. +// +Функция ПолучитьИмяВременнойТаблицы(ТекстЗапроса, Буфер, Позиция) + ИмяТаблицы = ""; + ДлиннаТекста = СтрДлина(ТекстЗапроса); + + // Добавление пустых символов к буферу. + Для Индекс = Позиция По ДлиннаТекста Цикл + Символ = Сред(ТекстЗапроса, Индекс, 1); + Если ПустаяСтрока(Символ) Тогда + Буфер = Буфер + Символ; + Иначе + Прервать; + КонецЕсли; + КонецЦикла; + + // Добавление имени временной таблицы. + Для ИндексВременнойТаблицы = Индекс По ДлиннаТекста Цикл + Символ = Сред(ТекстЗапроса, ИндексВременнойТаблицы, 1); + Если Не ПустаяСтрока(Символ) Тогда + Буфер = Буфер + Символ; + ИмяТаблицы = ИмяТаблицы + Символ; + Иначе + Прервать; + КонецЕсли; + КонецЦикла; + + Возврат ИмяТаблицы; +КонецФункции + +// Возвращает имя запроса из текста запроса. +// +// Параметры: +// ТекстЗапроса - текст запроса. +// +Функция ПолучитьИмяЗапроса(знач ТекстЗапроса) + РезультатЗначение = НСтр("ru = 'Запрос:'") + " "; + ДлинаТекста = СтрДлина(ТекстЗапроса); + ФлагПредлогаИЗ = Истина; + + + Пока ФлагПредлогаИЗ Цикл + СловоИЗ = "ИЗ"; + ДлинаИЗ = СтрДлина(СловоИЗ); + ПозицияИЗ = Найти(ВРег(ТекстЗапроса), СловоИЗ); + Если ПозицияИЗ = 0 Тогда + Возврат РезультатЗначение; + КонецЕсли; + + СимволДоИЗ = Сред(ТекстЗапроса, ПозицияИЗ - 1, 1); + СимволПослеИЗ = Сред(ТекстЗапроса, ПозицияИЗ + ДлинаИЗ, 1); + Если ПустаяСтрока(СимволДоИЗ) И ПустаяСтрока(СимволПослеИЗ) Тогда + ФлагПредлогаИЗ = Ложь; + Иначе + ТекстЗапроса = Сред(ТекстЗапроса, ПозицияИЗ + ДлинаИЗ); + КонецЕсли; + КонецЦикла; + + НачальнаяПозиция = ПозицияИЗ + ДлинаИЗ; + + Для Индекс = НачальнаяПозиция По ДлинаТекста Цикл + Символ = Сред(ТекстЗапроса, Индекс, 1); + Если Не ПустаяСтрока(Символ) Тогда + Прервать; + КонецЕсли; + КонецЦикла; + + // Формирование имени таблицы. + Для ИндексЗапроса = Индекс По ДлинаТекста Цикл + Символ = Сред(ТекстЗапроса, ИндексЗапроса, 1); + Если Не ПустаяСтрока(Символ) Тогда + РезультатЗначение = РезультатЗначение + Символ; + Иначе + Прервать; + КонецЕсли; + КонецЦикла; + + Возврат РезультатЗначение; +КонецФункции + + +/////////////////////////////////////////////////////////////////////////// +// ФУНКЦИИ РАБОТЫ С РЕЗУЛЬТАТОМ ЗАПРОСА + +Функция ВозможноОшибкаИзЗаТочкиСЗапятой(ТекстЗапроса) + Позиция = 1; + Пока Позиция >0 Цикл + Позиция = Найти(ТекстЗапроса, ";"); + Если Позиция > 0 Тогда + ТекстДляПоиска = Лев(ТекстЗапроса, Позиция); + Если Найти(ТекстДляПоиска, """") >0 Тогда + Возврат Истина; + КонецЕсли; + КонецЕсли; + ТекстЗапроса = Сред(ТекстЗапроса, Позиция + 1); + КонецЦикла; + + Возврат Ложь; +КонецФункции + +// Вывод результата всех запросов с временными таблицами. +// +// Если временная таблица, то выполняется запрос из массива текстов и формируется результат. +// Если не временная таблица, то результат берется из МассиваРезультатов. +// +// Параметры: +// ТДРезультатаЗапроса - табличный документ результата запроса. +// МассивДанныхПоЗапросу - Структура - Содержит данные по запроса. +// * Запрос - Запрос - передаваемый запрос. +// * МассивТекстов - Массив - массив текстов запросов. +// * МассивЗапросов - Массив - массив результатов запросов. +// ПараметрыЗапроса - массив параметров запросов. +// ПараметрыВыводаЗапроса - Структура - Параметры вывода запроса. +// * ВыводитьВременныеТаблицы - выводить временные таблицы или нет. +// * ВыводитьИдентификатор - выводить GUID для ссылок или нет. +// * ПорядокОбхода - порядок обхода результата запроса. +// * ИспользованиеЧередования - использовать чередование или нет в результирующем табличном документе. +// ОтчетПоВыполнениюЗапроса - Структура - Статистика о выполнение запроса. +// * ВремяВыполнения - время выполнения запроса. +// * КоличествоСтрок - Количество строк в результате запроса. +// * ТекстСообщения - текст сообщения об ошибке. +// +Функция ВывестиРезультатЗапросов(ТДРезультатаЗапроса, МассивДанныхПоЗапросу, ПараметрыЗапроса, ПараметрыВыводаЗапроса, ОтчетПоВыполнениюЗапроса) + + МассивТекстов = МассивДанныхПоЗапросу.МассивТекстов; + МассивЗапросов = МассивДанныхПоЗапросу.МассивЗапросов; + МеткаЗапроса = МассивДанныхПоЗапросу.МеткаЗапроса; + + КоличествоТекстовЗапросов = МассивТекстов.Количество(); + КоличествоРезультатовЗапросов = МассивЗапросов.Количество(); + + Если КоличествоРезультатовЗапросов <> КоличествоТекстовЗапросов Тогда + Возврат Ложь; + КонецЕсли; + + // Накапливаемый запрос необходим для вывода временных таблиц, в том числе и удаляемых. + НакапливаемыйЗапрос = Новый Запрос; + ЗагрузкаПараметровВЗапрос(НакапливаемыйЗапрос, ПараметрыЗапроса); + + Для Индекс = 0 По КоличествоТекстовЗапросов - 1 Цикл + ТекстЗапросаМассива = МассивТекстов.Получить(Индекс); + + Если ЗначениеЗаполнено(МеткаЗапроса) И Найти(ТекстЗапросаМассива, МеткаЗапроса) > 0 Тогда + КоличествоРезультатовЗапросов = КоличествоРезультатовЗапросов - 1; + Продолжить; + КонецЕсли; + + КоличествоСтрокОдногоЗапроса = 0; + МассивШириныКолонок = Новый Массив; + Свертка = ОпределитьСвертку(Индекс, КоличествоРезультатовЗапросов); + + Поместить = "ПОМЕСТИТЬ"; + ДлинаПоместить = СтрДлина(Поместить); + ПозицияПоместить = Найти(ВРег(ТекстЗапросаМассива), Поместить); + + Если Индекс = 0 Тогда + СимволРазделенияЗапросов = ""; + Иначе + СимволРазделенияЗапросов = ";"; + КонецЕсли; + НакапливаемыйЗапрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц; + НакопленныйТекст = НакапливаемыйЗапрос.Текст + СимволРазделенияЗапросов + МассивТекстов.Получить(Индекс); + НакапливаемыйЗапрос.Текст = НакопленныйТекст; + + // Если временная таблица и выводить временные таблицы. + Если ПозицияПоместить <> 0 И ПараметрыВыводаЗапроса.ВыводитьВременныеТаблицы Тогда + БуферПоместить = Сред(ТекстЗапросаМассива, ПозицияПоместить, ДлинаПоместить); + ПозицияПослеПоместить = ПозицияПоместить + ДлинаПоместить; + ИмяТаблицы = ПолучитьИмяВременнойТаблицы(ТекстЗапросаМассива, БуферПоместить, ПозицияПослеПоместить); + + // Выполнение запроса. + ИмяЗапроса = ""; + Результат = ВыполнитьЗапросСВременнойТаблицей(НакапливаемыйЗапрос, ИмяТаблицы, ИмяЗапроса); + + Если Результат <> Неопределено Тогда + ТД = ВывестиРезультатОдногоЗапроса(ИмяЗапроса, Результат, Свертка, ПараметрыВыводаЗапроса, Ложь, КоличествоСтрокОдногоЗапроса, МассивШириныКолонок); + ТДРезультатаЗапроса.Вывести(ТД); + КонецЕсли; + ИначеЕсли ПозицияПоместить = 0 Тогда // Если таблица не временная, то используется готовый результат. + Результат = МассивЗапросов.Получить(Индекс); + ИмяЗапроса = ПолучитьИмяЗапроса(ТекстЗапросаМассива); + Иерархия = НаличиеИерархииВЗапросе(ТекстЗапросаМассива); + + ТД = ВывестиРезультатОдногоЗапроса(ИмяЗапроса, Результат, Свертка, ПараметрыВыводаЗапроса, Иерархия, КоличествоСтрокОдногоЗапроса, МассивШириныКолонок); + ТДРезультатаЗапроса.Вывести(ТД); + КонецЕсли; + ОтчетПоВыполнениюЗапроса.КоличествоСтрок = ОтчетПоВыполнениюЗапроса.КоличествоСтрок + КоличествоСтрокОдногоЗапроса; + КонецЦикла; + + Возврат Истина; +КонецФункции + +// Вывод результат запроса в табличный документ. +// +// Параметры: +// ИмяЗапроса - Строка - имя запроса. +// РезультатЗапроса - результат запроса. +// Открыта - свернуть результат одного запроса в выводимом табличном документе. +// ПараметрыВыводаЗапроса - Структура - Параметры вывода запроса. +// * ВыводитьВременныеТаблицы - выводить временные таблицы или нет. +// * ВыводитьИдентификатор - выводить GUID для ссылок или нет. +// * ПорядокОбхода - порядок обхода результата запроса. +// * ИспользованиеЧередования - использовать чередование или нет в результирующем табличном документе. +// Иерархия - наличие итогов в запросе. +// КоличествоСтрок - Число - Количество строк в результате данного запроса. +// МассивШириныКолонок - массив максимальной ширины каждой колонки. +// +Функция ВывестиРезультатОдногоЗапроса(ИмяЗапроса, РезультатЗапроса, Открыта, ПараметрыВыводаЗапроса, Иерархия, КоличествоСтрок, МассивШириныКолонок) + + РезультатЗапроса = ВыгрузкаРезультата(РезультатЗапроса, ПараметрыВыводаЗапроса.ПорядокОбхода, Иерархия); + + ВыходнойМакет = Новый ТабличныйДокумент; + МакетОдногоЗапроса = Новый ТабличныйДокумент; + + Если РезультатЗапроса = Неопределено Тогда + Возврат ВыходнойМакет; + КонецЕсли; + + МакетОдногоЗапроса.Очистить(); + ВыходнойМакет.Очистить(); + + УровеньВерхний = 1; + УровеньЗаголовкаИДеталей = 2; + + // Вывод в табличный документ. + ЗаголовкиКолонок = ВывестиЗаголовкиКолонок(РезультатЗапроса, МассивШириныКолонок); + ПараметрыВыводаЗапроса.Вставить("МассивШириныКолонок", МассивШириныКолонок); + ПараметрыВыводаЗапроса.Вставить("КоличествоСтрок", КоличествоСтрок); + Детали = ВывестиДетали(РезультатЗапроса, ПараметрыВыводаЗапроса); + КоличествоСтрок = ПараметрыВыводаЗапроса.КоличествоСтрок; + Заголовок = ВывестиЗаголовокЗапроса(ИмяЗапроса, КоличествоСтрок); + + МакетОдногоЗапроса.НачатьАвтогруппировкуСтрок(); + + МакетОдногоЗапроса.Вывести(Заголовок, УровеньВерхний); + МакетОдногоЗапроса.Вывести(ЗаголовкиКолонок, УровеньЗаголовкаИДеталей,, Открыта); + МакетОдногоЗапроса.Вывести(Детали, УровеньЗаголовкаИДеталей,, Открыта); + + МакетОдногоЗапроса.ЗакончитьАвтогруппировкуСтрок(); + + УстановкаАвтоШирины(ВыходнойМакет, МассивШириныКолонок); + ВыходнойМакет.Вывести(МакетОдногоЗапроса).СоздатьФорматСтрок(); + + Возврат ВыходнойМакет; +КонецФункции + +// Возвращает ТаблицуЗначений или ДеревоЗначений результата. +// +// Параметры: +// РезультатЗапроса - результат запроса. +// Иерархия - есть ли иерархия в запросе. +// +Функция ВыгрузкаРезультата(РезультатЗапроса, ПорядокОбхода, Иерархия) + + Если РезультатЗапроса = Неопределено Тогда + Возврат Неопределено; + КонецЕсли; + + Если ВРег(ПорядокОбхода) = "АВТО" Тогда + Если Иерархия Тогда + ВыгруженноеЗначение = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией); + Иначе + ВыгруженноеЗначение = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.Прямой); + КонецЕсли; + Иначе + ВыгруженноеЗначение = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.Прямой); + КонецЕсли; + + Возврат ВыгруженноеЗначение; + +КонецФункции + +Функция ВывестиЗаголовокЗапроса(ИмяЗапроса,КоличествоСтрок) + Заголовок = Новый ТабличныйДокумент; + + МакетВывода = ПолучитьМакет("РезультатВыполненияЗапроса"); + + ОбластьЗаголовок = МакетВывода.ПолучитьОбласть("ЗапросИмя"); + ОбластьЗаголовок.Параметры.ИмяЗапроса = ИмяЗапроса; + ОбластьЗаголовок.Параметры.КоличествоСтрок = КоличествоСтрок; + Заголовок.Вывести(ОбластьЗаголовок); + + Возврат Заголовок; +КонецФункции + +Функция ВывестиЗаголовкиКолонок(Результат, МассивШириныКолонок) + МакетВывода = ПолучитьМакет("РезультатВыполненияЗапроса"); + + ВерхнийЗаголовокКолонок = Новый ТабличныйДокумент; + + ЗаголовокКолонок = Новый ТабличныйДокумент; + ОбластьЗаголовкиКолонок = МакетВывода.ПолучитьОбласть("ОбластьЯчейки"); + + Область = ОбластьЗаголовкиКолонок.Область(); + Область.Шрифт = Новый Шрифт(,, Ложь); + Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр; + Область.ЦветФона = Новый Цвет(204, 192, 133); + + Индекс = 0; + // Вывод заголовка таблицы. + Для каждого Стр Из Результат.Колонки Цикл + УстановкаМаксимальнойШириныВМассив(Индекс, Стр.Имя, МассивШириныКолонок); + ОбластьЗаголовкиКолонок.Параметры.Значение = Стр.Имя; + Об = ЗаголовокКолонок.Присоединить(ОбластьЗаголовкиКолонок); + Об.ШиринаКолонки = МассивШириныКолонок.Получить(Индекс); + Индекс = Индекс + 1; + КонецЦикла; + ВерхнийЗаголовокКолонок.Вывести(ЗаголовокКолонок); + + Возврат ВерхнийЗаголовокКолонок; +КонецФункции + +Функция ВывестиДетали(Результат, ПараметрыВыводаЗапроса) + Детали = Новый ТабличныйДокумент; + Уровень = 1; + Детали.НачатьАвтогруппировкуСтрок(); + + Если ТипЗнч(Результат) = Тип("ДеревоЗначений") Тогда + ИндексСтроки = 1; + КоличествоКолонок = Результат.Колонки.Количество(); + ВывестиДеталиСИерархией(Детали, Результат, ПараметрыВыводаЗапроса, Уровень, КоличествоКолонок, ИндексСтроки); + КонецЕсли; + Если ТипЗнч(Результат) = Тип("ТаблицаЗначений") Тогда + КоличествоКолонок = Результат.Колонки.Количество(); + ВывестиДеталиБезИерархии(Детали, Результат, ПараметрыВыводаЗапроса, Уровень, КоличествоКолонок); + КонецЕсли; + + Детали.ЗакончитьАвтогруппировкуСтрок(); + Возврат Детали; +КонецФункции + +Функция ВывестиДеталиБезИерархии(ОбщиеДетали, Результат, ПараметрыВыводаЗапроса, Уровень, КоличествоКолонок) + МакетВывода = ПолучитьМакет("РезультатВыполненияЗапроса"); + ПараметрыВыводаЗапроса.КоличествоСтрок = Результат.Количество(); + ИндексСтроки = 1; + Для каждого Строка Из Результат Цикл + Детали = Новый ТабличныйДокумент; + ОбластьДетали = МакетВывода.ПолучитьОбласть("ОбластьЯчейки"); + + Область = ОбластьДетали.ТекущаяОбласть; + Область.Шрифт = Новый Шрифт(,, Ложь); + Область.ЦветФона = ОпределитьЦветФонаПоИндексу(ИндексСтроки, ПараметрыВыводаЗапроса.ИспользованиеЧередования); + + Для Индекс = 0 По КоличествоКолонок - 1 Цикл + Значение = Строка.Получить(Индекс); + + Если ТипЗнч(Значение) = Тип("ТаблицаЗначений") Тогда + Значение = ПреобразоватьТаблицуЗначенийВСтроке(Значение); + КонецЕсли; + + ЗначениеДляПараметра = Значение; + Если ЭтоСсылка(ТипЗнч(Значение)) И ПараметрыВыводаЗапроса.ВыводитьИдентификатор Тогда + Попытка + ЗначениеДляПараметра = Значение.УникальныйИдентификатор(); + Исключение + ЗначениеДляПараметра = Значение; + КонецПопытки; + КонецЕсли; + ОбластьДетали.Параметры.Значение = ЗначениеДляПараметра; + ОбластьДетали.Параметры.Расшифровка = Значение; + УстановкаМаксимальнойШириныВМассив(Индекс, ЗначениеДляПараметра, ПараметрыВыводаЗапроса.МассивШириныКолонок); + Детали.Присоединить(ОбластьДетали); + КонецЦикла; + ИндексСтроки = ИндексСтроки + 1; + ОбщиеДетали.Вывести(Детали, Уровень); + КонецЦикла; +КонецФункции + +Функция ВывестиДеталиСИерархией(ОбщиеДетали, Результат, ПараметрыВыводаЗапроса , Уровень, КоличествоКолонок, ИндексСтроки) + МакетВывода = ПолучитьМакет("РезультатВыполненияЗапроса"); + Открыта = Истина; + Подчиненные = Результат.Строки; + ПараметрыВыводаЗапроса.КоличествоСтрок = ПараметрыВыводаЗапроса.КоличествоСтрок + Подчиненные.Количество(); + Для Каждого Подчиненный Из Подчиненные Цикл + Детали = Новый ТабличныйДокумент; + ОбластьДетали = МакетВывода.ПолучитьОбласть("ОбластьЯчейки"); + + Область = ОбластьДетали.ТекущаяОбласть; + Область.Шрифт = Новый Шрифт(,, Ложь); + Область.ЦветФона = ОпределитьЦветФонаПоИндексу(ИндексСтроки, ПараметрыВыводаЗапроса.ИспользованиеЧередования); + + Для Индекс = 0 По КоличествоКолонок - 1 Цикл + Значение = Подчиненный.Получить(Индекс); + + Если ТипЗнч(Значение) = Тип("ТаблицаЗначений") Тогда + Значение = ПреобразоватьТаблицуЗначенийВСтроке(Значение); + КонецЕсли; + + ЗначениеДляПараметра = Значение; + // Определение количество отступа по уровню. + Пробел = ОпределениеОтступаПоУровню(Уровень, Индекс, Открыта); + + Если ЭтоСсылка(ТипЗнч(Значение)) И ПараметрыВыводаЗапроса.ВыводитьИдентификатор Тогда + Попытка + ЗначениеДляПараметра = Значение.УникальныйИдентификатор(); + Исключение + ЗначениеДляПараметра = Значение; + КонецПопытки; + КонецЕсли; + ЗначениеДляПараметра = "" + Пробел + ЗначениеДляПараметра; + ОбластьДетали.Параметры.Значение = ЗначениеДляПараметра; + ОбластьДетали.Параметры.Расшифровка = Значение; + + УстановкаМаксимальнойШириныВМассив(Индекс, ЗначениеДляПараметра, ПараметрыВыводаЗапроса.МассивШириныКолонок); + + Детали.Присоединить(ОбластьДетали); + КонецЦикла; + + ОбщиеДетали.Вывести(Детали, Уровень,, Открыта); + ИндексСтроки = ИндексСтроки + 1; + ВывестиДеталиСИерархией(ОбщиеДетали, Подчиненный, ПараметрыВыводаЗапроса, Уровень + 1, КоличествоКолонок, ИндексСтроки); + КонецЦикла; +КонецФункции + +// Определяет сворачивать или нет результат одного запроса. +// +// Параметры: +// ПозицияТекущегоЗапроса - порядок запроса в пакете. +// КоличествоВсехЗапросов - количество всех запросов в пакете. +// +Функция ОпределитьСвертку(знач ПозицияТекущегоЗапроса, КоличествоВсехЗапросов) + ПозицияТекущегоЗапроса = ПозицияТекущегоЗапроса + 1; + + Если КоличествоВсехЗапросов = 1 Тогда + РезультатЗначение = Истина; + Иначе + Если ПозицияТекущегоЗапроса = КоличествоВсехЗапросов Тогда + РезультатЗначение = Истина; + Иначе + РезультатЗначение = Ложь; + КонецЕсли; + КонецЕсли; + + Возврат РезультатЗначение; +КонецФункции + +// Выводит строку с автошириной колонок. +// +// Параметры: +// РезультатЗапроса - табличный документ с результатом запроса. +// МассивМаксШирины - массив ширины колонок для отдельного запроса. +// +Процедура УстановкаАвтоШирины(РезультатЗапроса, МассивМаксШирины) + ВерхняяГраница = МассивМаксШирины.ВГраница(); + Если ВерхняяГраница = -1 Тогда + Возврат; + КонецЕсли; + + Для Индекс = 0 По ВерхняяГраница Цикл + ВременныйТабличныйДокумент = Новый ТабличныйДокумент; + Стр = ВременныйТабличныйДокумент.ПолучитьОбласть(1, Индекс + 1, 1, Индекс + 1); + РезультатЗапроса.Присоединить(Стр).ШиринаКолонки = МассивМаксШирины.Получить(Индекс); + КонецЦикла; +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////// +// ПРОЧИЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +// Формирует список возможных типов конфигурации. +// +// Параметры: +// СписокДобавленныхТипов - список типов, добавленных "вручную". +// +Функция СформироватьСписокТипов(СписокДобавленныхТипов = Неопределено) Экспорт + МассивТипов = ДоступныеТипыДанных.Типы(); + + НеПримитивныеТипы = Новый СписокЗначений; + НеПримитивныеТипы.ЗагрузитьЗначения(МассивТипов); + НеПримитивныеТипы.СортироватьПоЗначению(НаправлениеСортировки.Возр); + + СписокТипов = Новый СписокЗначений; + СписокТипов.Добавить("Строка", НСтр("ru = 'Строка'")); + СписокТипов.Добавить("Число", НСтр("ru = 'Число'")); + СписокТипов.Добавить("Дата", НСтр("ru = 'Дата'")); + СписокТипов.Добавить("Булево", НСтр("ru = 'Булево'")); + СписокТипов.Добавить("Граница", НСтр("ru = 'Граница'")); + СписокТипов.Добавить("МоментВремени", НСтр("ru = 'Момент времени'")); + СписокТипов.Добавить("СписокЗначений", НСтр("ru = 'Список значений'")); + СписокТипов.Добавить("ТаблицаЗначений", НСтр("ru = 'Таблица значений'")); + + СписокДобавленныхТипов = Новый СписокЗначений; + СписокДобавленныхТипов = СписокТипов.Скопировать(); + + Для каждого Стр Из НеПримитивныеТипы Цикл + ЗначениеТипа = XMLТип(Стр.Значение).ИмяТипа; + ПредставлениеТипа = Строка(Стр.Значение); + СписокТипов.Добавить(ЗначениеТипа, ПредставлениеТипа); + КонецЦикла; + + Возврат СписокТипов; +КонецФункции + +// Определяет отступ по уровню. +// +// Параметры: +// Уровень - переданный уровень в дереве. +// НомерКолонки - номер колонки, отступ устанавливается только для первой колонки. +// Открыта - открыта группа или нет. +// +Функция ОпределениеОтступаПоУровню(Уровень, НомерКолонки, Открыта) + Пробел = ""; + Если НомерКолонки = 0 Тогда + Если Уровень > 1 Тогда + Для Индекс = 1 По Уровень Цикл + Пробел = Пробел + Символы.Таб; + КонецЦикла; + Открыта = Ложь; + Иначе + Открыта = Истина; + КонецЕсли; + КонецЕсли; + Возврат Пробел; +КонецФункции + +// Возвращает строковое представление типа по значению. +// +// Параметры: +// Значение - передаваемое значение. +// +Функция ИмяТипаИзЗначения(Значение) Экспорт + Если ТипЗнч(Значение) = Тип("Строка") Тогда + ИмяТипа = "Строка"; + ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда + ИмяТипа = "Число"; + ИначеЕсли ТипЗнч(Значение) = Тип("Булево") Тогда + ИмяТипа = "Булево"; + ИначеЕсли ТипЗнч(Значение) = Тип("Дата") Тогда + ИмяТипа = "Дата"; + ИначеЕсли ТипЗнч(Значение) = Тип("МоментВремени") Тогда + ИмяТипа = "МоментВремени"; + ИначеЕсли ТипЗнч(Значение) = Тип("Неопределено") Тогда + ИмяТипа = "Строка"; + Иначе + ИмяТипа = xmlТип(ТипЗнч(Значение)).ИмяТипа; + КонецЕсли; + + Возврат ИмяТипа; +КонецФункции + +// Возвращает вид границы из ее строкового представления. +// +// Параметры: +// Вид - строковое представление вида границы. +// +Функция ОпределениеВидаГраницы(Вид) Экспорт + Если ВРег(Вид) = "ИСКЛЮЧАЯ" Тогда + Результат = ВидГраницы.Исключая; + Иначе + Результат = ВидГраницы.Включая; + КонецЕсли; + + Возврат Результат; +КонецФункции + +// Возвращает представление значения. +// +// Параметры: +// Значение - передаваемое значение. +// +Функция ФормированиеПредставленияЗначения(Значение) Экспорт + Результат = ""; + + Если ТипЗнч(Значение) = Тип("ТаблицаЗначений") Тогда + ИтоговаяСтрока = "Таблица: строк = %КоличествоСтрок%, колонок = %КоличествоКолонок%"; + ИтоговаяСтрока = СтрЗаменить(ИтоговаяСтрока, "%КоличествоСтрок%", Строка(Значение.Количество())); + ИтоговаяСтрока = СтрЗаменить(ИтоговаяСтрока, "%КоличествоКолонок%", Строка(Значение.Колонки.Количество())); + Результат = ИтоговаяСтрока; + ИначеЕсли ТипЗнч(Значение) = Тип("МоментВремени") Тогда + Результат = Строка(Значение.Дата) + "; " + Строка(Значение.Ссылка); + ИначеЕсли ТипЗнч(Значение) = Тип("Граница") Тогда + Результат = Строка(Значение.Значение) + "; " + Строка(Значение.ВидГраницы); + КонецЕсли; + + Возврат Результат; +КонецФункции + +// Фильтрует список типов для данного контекста. +// +// Параметры: +// СписокТипов - список значений передаваемых типов. +// Контекст - передаваемый контекст в виде строки. +// +Процедура ФильтрацияСпискаТипов(СписокТипов, Контекст) Экспорт + Если нРег(Контекст) = "граница" Тогда + Элемент = СписокТипов.НайтиПоЗначению("СписокЗначений"); + СписокТипов.Удалить(Элемент); + Элемент = СписокТипов.НайтиПоЗначению("ТаблицаЗначений"); + СписокТипов.Удалить(Элемент); + Элемент = СписокТипов.НайтиПоЗначению("Граница"); + СписокТипов.Удалить(Элемент); + КонецЕсли; + + Элемент = СписокТипов.НайтиПоЗначению("TypeDescription"); // Тип "Описание типов" удаляется всегда. + СписокТипов.Удалить(Элемент); +КонецПроцедуры + +// Устанавливает максимальную ширину ячейки для каждой колонки. +// +Процедура УстановкаМаксимальнойШириныВМассив(Индекс, знач Элем, МассивШириныКолонок) + МаксимальнаяШиринаЯчейки = 100; + + Элем = СокрП(Элем); + Элем = СтрДлина(Элем); + Если Индекс > МассивШириныКолонок.ВГраница() Тогда + Если Элем < МаксимальнаяШиринаЯчейки Тогда + МассивШириныКолонок.Вставить(Индекс, Элем + 1); + Иначе + МассивШириныКолонок.Вставить(Индекс, МаксимальнаяШиринаЯчейки); + КонецЕсли; + Иначе + Макс = МассивШириныКолонок.Получить(Индекс); + Если Элем > Макс Тогда + Если Элем < МаксимальнаяШиринаЯчейки Тогда + МассивШириныКолонок.Установить(Индекс, Элем + 1); + Иначе + МассивШириныКолонок.Установить(Индекс, МаксимальнаяШиринаЯчейки); + КонецЕсли; + КонецЕсли; + КонецЕсли; +КонецПроцедуры + +// Проверяет является ли тип ссылкой. +// +// Параметры: +// Тип - передаваемый тип. +// +Функция ЭтоСсылка(Тип) Экспорт + + Возврат Справочники.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ Документы.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ Перечисления.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().СодержитТип(Тип) + ИЛИ Задачи.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип); + +КонецФункции + +// Возвращает результат выполнения временной таблицы по имени. +// +// Параметры: +// Запрос - передаваемый запрос. +// ИмяВременнойТаблицы - имя временной таблицы. +// ИмяЗапроса - имя запроса, изменяемое в теле процедуры. +// +Функция ВыполнитьЗапросСВременнойТаблицей(знач ЗапросДляВыполнения, ИмяВременнойТаблицы, ИмяЗапроса) + ЗапросДляВыполнения.Текст = ЗапросДляВыполнения.Текст + " ; " + "ВЫБРАТЬ * ИЗ " + ИмяВременнойТаблицы; + + Попытка + Результат = ЗапросДляВыполнения.Выполнить(); + ИмяЗапроса = НСтр("ru = 'Временная таблица:'") + " " + ИмяВременнойТаблицы; + Исключение + Результат = Неопределено; + КонецПопытки; + + Возврат Результат; +КонецФункции + +// Возвращает цвет фона табличного документа по индексу строки и по использованию. +// +// Параметры: +// Индекс - передаваемый индекс строки. +// Использование - использовать или нет чередование. +// +Функция ОпределитьЦветФонаПоИндексу(Индекс, Использование) + ЦветЧередования = Новый Цвет(245, 242, 221); + + Если Не Использование Тогда + Возврат WebЦвета.Белый; + КонецЕсли; + + Остаток = Индекс % 2; + Если Остаток = 0 Тогда + Цвет = ЦветЧередования; + Иначе + Цвет = WebЦвета.Белый; + КонецЕсли; + + Возврат Цвет; +КонецФункции + +Функция ПреобразоватьТаблицуЗначенийВСтроке(ТаблицаЗначений) + + ПредставлениеТаблицыЗначений = ""; + Для каждого СтрокаТаблицыЗначений Из ТаблицаЗначений Цикл + Разделитель = ""; + Для каждого ЯчейкаТаблицыЗначений Из СтрокаТаблицыЗначений Цикл + ПредставлениеТаблицыЗначений = ПредставлениеТаблицыЗначений + Разделитель + Строка(ЯчейкаТаблицыЗначений); + Разделитель = ";"; + КонецЦикла; + ПредставлениеТаблицыЗначений = ПредставлениеТаблицыЗначений + Символы.ПС; + КонецЦикла; + Значение = ПредставлениеТаблицыЗначений; + + Возврат ПредставлениеТаблицыЗначений +КонецФункции + + +#КонецОбласти + +#Область РаботаСТехнологическимЖурналом + +Функция ФайлКонфигурацииСуществует(ПутьКФайлуКонфигурации) + ФайлКонфигурации = Новый Файл(ПутьКФайлуКонфигурации + ПолучитьРазделительПути() + "logcfg.xml"); + Если ФайлКонфигурации.Существует() Тогда + ФайлТекстаКонфигурации = Новый ЧтениеТекста(ФайлКонфигурации.ПолноеИмя); + СтрокаТекстКонфигурации = ФайлТекстаКонфигурации.ПрочитатьСтроку(); + Пока СтрокаТекстКонфигурации <> Неопределено Цикл + Если Найти(СтрокаТекстКонфигурации, "ConsoleQueries") > 0 Тогда + Возврат Ложь; + КонецЕсли; + СтрокаТекстКонфигурации = ФайлТекстаКонфигурации.ПрочитатьСтроку(); + КонецЦикла; + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +// Включает технологический журнал. +// +Процедура ВключениеТехнологическогоЖурнала(ПараметрыТехнологическогоЖурнала, РезультатВключения) Экспорт + + КаталогКонфигурацииПриложения = ПутьККонфигурационномуФайлу(); + + Если КаталогКонфигурацииПриложения <> Неопределено Тогда + Если ФайлКонфигурацииСуществует(КаталогКонфигурацииПриложения) Тогда + ПереместитьФайл(КаталогКонфигурацииПриложения + ПолучитьРазделительПути() + "logcfg.xml", КаталогКонфигурацииПриложения + ПолучитьРазделительПути() + "logcfg.off"); + КонецЕсли; + + КаталогВременныхФайлов = КаталогВременныхФайлов(); + СоздатьКаталог(КаталогВременныхФайлов + "1c_logs"); + КаталогСЛогФайлами = КаталогВременныхФайлов + "1c_logs"; + + ЛогФайлыДляУдаления = НайтиФайлы(КаталогСЛогФайлами, "*.log", Истина); + Для каждого Файл Из ЛогФайлыДляУдаления Цикл + Попытка + УдалитьФайлы(Файл.ПолноеИмя); + Исключение + // Удаление файла log вызвало ошибку (нет прав, файл уже не существует). + КонецПопытки; + КонецЦикла; + + ТекущийПользователь = ПараметрыСеанса.ТекущийПользователь.Наименование; + МассивСобытие = Новый Массив; + МассивСобытие.Добавить("db2"); + МассивСобытие.Добавить("dbmssql"); + МассивСобытие.Добавить("dbpostgrs"); + МассивСобытие.Добавить("dboracle"); + МассивСобытие.Добавить("SDBL"); + МассивСобытие.Добавить("DBV8DBEng"); + МассивСобытие.Добавить("QERR"); + МассивСобытие.Добавить("EXCP"); + МассивСобытие.Добавить("EXCPCNTX"); + + Текст = "" + Символы.ПС+ "" + Символы.ПС+ "" + + Символы.ПС + "" + Символы.ПС + "" + Символы.ПС; + + Для каждого событие Из МассивСобытие Цикл + Текст = Текст + "" + Символы.ПС+ " " + Символы.ПС + "" + Символы.ПС; + КонецЦикла; + + Текст = Текст + "" + Символы.ПС+ " " + Символы.ПС + " " + Символы.ПС+ "" + Символы.ПС+ "" + Символы.ПС + ""; + + ПолныйПутьКонфигурационногоФайла = КаталогКонфигурацииПриложения + ПолучитьРазделительПути() + "logcfg.xml"; + Попытка + Файл = Новый ЗаписьТекста(ПолныйПутьКонфигурационногоФайла); + Файл.ЗаписатьСтроку(Текст); + Файл.Закрыть(); + Исключение + РезультатВключения.Результат = Ложь; + РезультатВключения.Причина = НСтр("ru = 'Ошибка создания конфигурационного файла в каталоге'") + " " + КаталогКонфигурацииПриложения + Символы.ПС + НСтр("ru = 'Проверьте права доступа.'"); + КонецПопытки; + + ИдентификаторПроцессаОС = ИдентификаторПроцессаОС(); + ПараметрыТехнологическогоЖурнала.КаталогСЛогФайлами = КаталогСЛогФайлами; + ПараметрыТехнологическогоЖурнала.ИдентификаторПроцессаОС = Формат(ИдентификаторПроцессаОС, "ЧРД=; ЧРГ=; ЧГ=0"); + КонецЕсли; + +КонецПроцедуры + +Функция ПутьККонфигурационномуФайлу() + + СистемнаяИнформация = Новый СистемнаяИнформация(); + Если НЕ ((СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86) Или (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64)) Тогда + Возврат Неопределено; + КонецЕсли; + + КаталогаОбщихКонфигурационныхФайлов = КаталогПрограммы() + "conf"; + ФайлУказатель = Новый Файл(КаталогаОбщихКонфигурационныхФайлов + ПолучитьРазделительПутиСервера() + "conf.cfg"); + Если ФайлУказатель.Существует() Тогда + ФайлКонфигурации = Новый ЧтениеТекста(ФайлУказатель.ПолноеИмя); + Строка = ФайлКонфигурации.ПрочитатьСтроку(); + Пока Строка <> Неопределено Цикл + Позиция = Найти(Строка, "ConfLocation="); + Если Позиция > 0 Тогда + КаталогКонфигурацииПриложения = СокрЛП(Сред(Строка, Позиция + 13)); + Прервать; + КонецЕсли; + Строка = ФайлКонфигурации.ПрочитатьСтроку(); + КонецЦикла; + КонецЕсли; + + + Возврат КаталогКонфигурацииПриложения; +КонецФункции + +// Выключает технологический журнал. +// +Процедура ВыключениеТехнологическогоЖурнала() Экспорт + КаталогКонфигурацииПриложения = ПутьККонфигурационномуФайлу(); + Если КаталогКонфигурацииПриложения <> Неопределено Тогда + УдалитьФайлы(КаталогКонфигурацииПриложения + ПолучитьРазделительПути() + "logcfg.xml"); + КонецЕсли; + + СтарыйФайлКонфигурации = Новый Файл(КаталогКонфигурацииПриложения + ПолучитьРазделительПути() + "logcfg.off"); + Если СтарыйФайлКонфигурации.Существует() Тогда + ПереместитьФайл(КаталогКонфигурацииПриложения + ПолучитьРазделительПути() + "logcfg.off", КаталогКонфигурацииПриложения + ПолучитьРазделительПути() + "logcfg.xml"); + КонецЕсли; + +КонецПроцедуры + +// Находит в файле технологического журнала запрос и план выполнения запроса. +// +Процедура ПрочитатьТехнологическийЖурнал(ПутьКФайлу, ИДМетки, ПрочитанныеДанные) Экспорт + + МассивСтрок = Новый Массив; + ДобавлятьВМассив = Ложь; + + ВременныйФайл = ПолучитьИмяВременногоФайла(".log"); + КопироватьФайл(ПутьКФайлу, ВременныйФайл); + + Файл = Новый ЧтениеТекста(); + Файл.Открыть(ВременныйФайл); + Строка = Файл.ПрочитатьСтроку(); + ВременнаяСтрока = ""; + Пока Строка <> Неопределено Цикл + Если ДобавлятьВМассив Тогда + Если ДобавлятьВМассив И Найти(Строка, ИДМетки + "_end") = 0 Тогда + Если Сред(Строка, 3, 1) = ":" И Сред(Строка, 6, 1) = "." Тогда + Если ЗначениеЗаполнено(ВременнаяСтрока) + И Найти(ВременнаяСтрока, "Sql=") > 0 + И Найти(ВременнаяСтрока, "planSQLText=") > 0 + И Найти(ВременнаяСтрока, "Marker_" + ИДМетки) = 0 Тогда + МассивСтрок.Добавить(ВременнаяСтрока); + КонецЕсли; + ВременнаяСтрока = Строка; + Иначе + ВременнаяСтрока = ВременнаяСтрока + Символы.ПС + Строка; + КонецЕсли; + Иначе + Прервать; + КонецЕсли; + КонецЕсли; + + Если Найти(Строка, ИДМетки + "_begin") > 0 Тогда + ДобавлятьВМассив = Истина; + КонецЕсли; + Строка = Файл.ПрочитатьСтроку(); + КонецЦикла; + + СКЛТекстИзТехЖурнала = ""; + ПланВыполненияЗапроса = ""; + + Если МассивСтрок.Количество() > 1 Тогда + Разделитель = Символы.ПС + Символы.ПС; + Иначе + Разделитель = ""; + КонецЕсли; + + Для каждого Строка Из МассивСтрок Цикл + ПозицияНачало = Найти(Строка, ","); + СтрокаСдвиг = Сред(Строка, ПозицияНачало + 1); + ПозицияКонец = Найти(СтрокаСдвиг, ","); + ТипСУБД = ВРег(Лев(СтрокаСдвиг, ПозицияКонец -1)); + Позиция = Найти(СтрокаСдвиг, "Sql="); + Если Сред(СтрокаСдвиг, Позиция + 4, 1) = """" ИЛИ Сред(СтрокаСдвиг, Позиция + 4, 1) = "'" Тогда + СтрокаСдвиг = Сред(СтрокаСдвиг, Позиция + 5); + Иначе + СтрокаСдвиг = Сред(СтрокаСдвиг, Позиция + 4); + КонецЕсли; + + Если ТипСУБД = "DBMSSQL" Тогда + Позиция = Найти(СтрокаСдвиг, ",Rows"); + СКЛТекстТекущийЗапрос = Лев(СтрокаСдвиг, Позиция-2); + Позиция = Найти(СтрокаСдвиг, "planSQLText="); + СтрокаСдвиг = Сред(СтрокаСдвиг, Позиция + 13); + Позиция = Найти(СтрокаСдвиг, "'"); + ПланВыполненияЗапросаТекущийЗапрос = Лев(СтрокаСдвиг, Позиция-1); + ИначеЕсли ТипСУБД = "DBPOSTGRS" Тогда + Позиция = Найти(СтрокаСдвиг, ",planSQLText="); + СКЛТекстТекущийЗапрос = Лев(СтрокаСдвиг, Позиция-1); + СтрокаСдвиг = Сред(СтрокаСдвиг, Позиция + 13); + Позиция = Найти(СтрокаСдвиг, ",Result"); + ПланВыполненияЗапросаТекущийЗапрос = Лев(СтрокаСдвиг, Позиция-1); + Иначе + Позиция = Найти(СтрокаСдвиг, "',"); + СКЛТекстТекущийЗапрос = Лев(СтрокаСдвиг, Позиция-2); + Позиция = Найти(СтрокаСдвиг, "planSQLText="); + СтрокаСдвиг = Сред(СтрокаСдвиг, Позиция + 13); + Позиция = Найти(СтрокаСдвиг, "'"); + ПланВыполненияЗапросаТекущийЗапрос = Лев(СтрокаСдвиг, Позиция-1); + КонецЕсли; + + ПланВыполненияЗапроса = ПланВыполненияЗапроса + ПланВыполненияЗапросаТекущийЗапрос + Разделитель; + СКЛТекстИзТехЖурнала = СКЛТекстИзТехЖурнала + СКЛТекстТекущийЗапрос +Разделитель; + КонецЦикла; + + ПрочитанныеДанные.ТипСУБД = ТипСУБД; + ПрочитанныеДанные.СКЛЗапрос = СокрЛП(СКЛТекстИзТехЖурнала); + ПрочитанныеДанные.ПланВыполненияЗапроса = СокрЛП(ПланВыполненияЗапроса); + +КонецПроцедуры + +// Возвращает идентификатор процесса ОС. +// +Функция ИдентификаторПроцессаОС() Экспорт + + ИДТекущегоПроцесса = Неопределено; + ОбъектСистемы = Новый COMОбъект("WScript.Shell"); + Если ИДТекущегоПроцесса = Неопределено Тогда + Процесс = ОбъектСистемы.Exec("rundll32.exe kernel32,Sleep"); + ИДТекущегоПроцесса = ПолучитьCOMОбъект("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2:Win32_Process.Handle='" + Формат(Процесс.ProcessID,"ЧГ=0") + "'").ParentProcessID; + Процесс.Terminate(); + КонецЕсли; + + Возврат ИДТекущегоПроцесса; + +КонецФункции + +#КонецОбласти + +#Область ОбработкаЗапросаИПланаВыполненияЗапроса + +Функция ИмяСУБД() + СтрокаПодключения = СтрокаСоединенияИнформационнойБазы(); + Позиция = Найти(СтрокаПодключения, "Ref="""); + Если Позиция > 0 Тогда + СтрокаПодключения = Сред(СтрокаПодключения, Позиция + 5); + Позиция = Найти(СтрокаПодключения, """"); + Если Позиция > 0 Тогда + Возврат Лев(СтрокаПодключения, Позиция - 1); + Иначе + Возврат СтрокаПодключения; + КонецЕсли; + КонецЕсли; + + Возврат Неопределено; +КонецФункции + +// Преобразовывает объекты запроса к объектам в виде метаданных ИБ. +// +Функция ПреобразоватьВМетаданные(ТекстЗапроса, ПланВыполненияЗапроса, ТипСУБД) Экспорт + + ТекстЗапросаВМетаданных = ТекстЗапроса; + ПланЗапросаВМетаданных = ПланВыполненияЗапроса; + + ТипСтрока = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150)); + ТипСтрокаЗначение = Новый ОписаниеТипов("Строка", , ); + ТипЧисло = Новый ОписаниеТипов("Число"); + + СтруктураБД = ПолучитьСтруктуруХраненияБазыДанных(, Истина); + СтруктураБД.Сортировать("ИмяТаблицыХранения УБЫВ"); + + СоответствиеБДИндекс = Новый ТаблицаЗначений; + СоответствиеБДИндекс.Колонки.Добавить("Ключ", ТипСтрока); + СоответствиеБДИндекс.Колонки.Добавить("Значение", ТипСтрокаЗначение); + СоответствиеБДИндекс.Колонки.Добавить("КоличествоСимволов", ТипЧисло); + СоответствиеБДИндекс.Индексы.Добавить("Ключ"); + СоответствиеБДИндекс.Индексы.Добавить("КоличествоСимволов"); + + СоответствиеБДПоля = Новый ТаблицаЗначений; + СоответствиеБДПоля.Колонки.Добавить("Ключ", ТипСтрока); + СоответствиеБДПоля.Колонки.Добавить("Значение", ТипСтрокаЗначение); + СоответствиеБДПоля.Колонки.Добавить("КоличествоСимволов", ТипЧисло); + СоответствиеБДПоля.Индексы.Добавить("Ключ"); + СоответствиеБДПоля.Индексы.Добавить("КоличествоСимволов"); + + СоответствиеБД = Новый ТаблицаЗначений; + СоответствиеБД.Колонки.Добавить("Ключ", ТипСтрока); + СоответствиеБД.Колонки.Добавить("Значение", ТипСтрокаЗначение); + СоответствиеБД.Колонки.Добавить("КоличествоСимволов", ТипЧисло); + СоответствиеБД.Индексы.Добавить("Ключ"); + СоответствиеБД.Индексы.Добавить("КоличествоСимволов"); + + Для каждого Строка Из СтруктураБД Цикл + НоваяСтрока = СоответствиеБД.Добавить(); + НоваяСтрока.Ключ = Строка.ИмяТаблицыХранения; + НоваяСтрока.Значение = Строка.ИмяТаблицы; + НоваяСтрока.КоличествоСимволов = СтрДлина(Строка.ИмяТаблицыХранения); + КонецЦикла; + СоответствиеБД.Сортировать("КоличествоСимволов Убыв, Ключ Убыв"); + + Для каждого Строка Из СтруктураБД Цикл + Для каждого Индекс Из Строка.Индексы Цикл + НоваяСтрока = СоответствиеБДИндекс.Добавить(); + НоваяСтрока.Ключ = Индекс.ИмяИндексаХранения; + СписокПоле = ""; + Разделитель = ""; + Для каждого Поле Из Индекс.Поля Цикл + Если ЗначениеЗаполнено(Поле.ИмяПоля) Тогда + СписокПоле = СписокПоле + Разделитель + Поле.ИмяПоля; // + "(" + Поле.Метаданные + ")"; + //Если ЗначениеЗаполнено(Поле.Метаданные) Тогда + КонецЕсли; + Разделитель = ", "; + КонецЦикла; + НоваяСтрока.Значение = СписокПоле; + НоваяСтрока.КоличествоСимволов = СтрДлина(Индекс.ИмяИндексаХранения); + КонецЦикла; + + Для каждого Поле Из Строка.Поля Цикл + Если ЗначениеЗаполнено(Поле.ИмяПоля) Тогда + НоваяСтрока = СоответствиеБДПоля.Добавить(); + НоваяСтрока.Ключ = Поле.ИмяПоляХранения; + НоваяСтрока.Значение = Поле.ИмяПоля; + НоваяСтрока.КоличествоСимволов = СтрДлина(Поле.ИмяПоляХранения); + Иначе + Позиция = Найти(Поле.ИмяПоляХранения, "_IDRRef"); + Если Позиция > 1 Тогда + ИмяОбъекта = Лев(Поле.ИмяПоляХранения, Позиция-1); + ИмяТаблицы = СоответствиеБД.Найти(ИмяОбъекта, "Ключ").Значение; + НоваяСтрока = СоответствиеБДПоля.Добавить(); + НоваяСтрока.Ключ = Поле.ИмяПоляХранения; + НоваяСтрока.Значение = "Ссылка(" + ИмяТаблицы + ")"; + НоваяСтрока.КоличествоСимволов = СтрДлина(Поле.ИмяПоляХранения); + КонецЕсли; + КонецЕсли; + КонецЦикла; + КонецЦикла; + СоответствиеБДПоля.Сортировать("КоличествоСимволов Убыв, Ключ УБЫВ"); + СоответствиеБДИндекс.Сортировать("КоличествоСимволов Убыв, Ключ УБЫВ"); + + Если ТипСУБД = "DBPOSTGRS" Тогда + ПланЗапросаВМетаданных = НРег(ПланЗапросаВМетаданных); + ИначеЕсли ТипСУБД = "DBMSSQL" Тогда + // Очистка запроса + ПланЗапросаВМетаданных = СтрЗаменить(ПланЗапросаВМетаданных, "[" + ИмяСУБД() + "].[dbo].", ""); + ПланЗапросаВМетаданных = СтрЗаменить(ПланЗапросаВМетаданных, "[tempdb].[dbo].", ""); + ПланЗапросаВМетаданных = СтрЗаменить(ПланЗапросаВМетаданных, "#tt", "ВременнаяТаблица"); + ТекстЗапросаВМетаданных = СтрЗаменить(ТекстЗапросаВМетаданных, "dbo.", ""); + ТекстЗапросаВМетаданных = СтрЗаменить(ТекстЗапросаВМетаданных, "#tt", "ВременнаяТаблица"); + + КонецЕсли; + + Для каждого Поле Из СоответствиеБДИндекс Цикл + Если Найти(ПланЗапросаВМетаданных, Поле.Ключ) Тогда + Если ТипСУБД = "DBPOSTGRS" Тогда + Ключ = НРег(Поле.Ключ); + Иначе + Ключ = Поле.Ключ; + КонецЕсли; + ПланЗапросаВМетаданных = СтрЗаменить(ПланЗапросаВМетаданных, Ключ, НСтр("ru = 'Индекс по'") + " " + Поле.Значение + ""); + КонецЕсли; + + КонецЦикла; + + Для каждого Поле Из СоответствиеБДПоля Цикл + Если Найти(ТекстЗапросаВМетаданных, Поле.Ключ) Тогда + ТекстЗапросаВМетаданных = СтрЗаменить(ТекстЗапросаВМетаданных, Поле.Ключ, Поле.Значение); + Если ТипСУБД = "DBPOSTGRS" Тогда + Ключ = НРег(Поле.Ключ); + Иначе + Ключ = Поле.Ключ; + КонецЕсли; + ПланЗапросаВМетаданных = СтрЗаменить(ПланЗапросаВМетаданных, Ключ, Поле.Значение); + КонецЕсли; + КонецЦикла; + + Для каждого Поле Из СоответствиеБД Цикл + Если Найти(ТекстЗапросаВМетаданных, Поле.Ключ) Тогда + ТекстЗапросаВМетаданных = СтрЗаменить(ТекстЗапросаВМетаданных, Поле.Ключ, Поле.Значение); + Если ТипСУБД = "DBPOSTGRS" Тогда + ПланЗапросаВМетаданных = СтрЗаменить(ПланЗапросаВМетаданных, НРег(Поле.Ключ), Поле.Значение); + ИначеЕсли ТипСУБД = "DBMSSQL" Тогда + ПланЗапросаВМетаданных = СтрЗаменить(ПланЗапросаВМетаданных, "[" + Поле.Ключ + "]", Поле.Значение); + Иначе + ПланЗапросаВМетаданных = СтрЗаменить(ПланЗапросаВМетаданных, Поле.Ключ, Поле.Значение); + КонецЕсли; + КонецЕсли; + КонецЦикла; + + ВВидеМетаданных = Новый Структура(); + ВВидеМетаданных.Вставить("ТекстЗапросаВВидеМетаданных", ТекстЗапросаВМетаданных); + ВВидеМетаданных.Вставить("ПланВыполненияЗапросаВМетаданных", ПланЗапросаВМетаданных); + + Возврат ВВидеМетаданных; +КонецФункции + +// Создает дерево плана выполнения запроса по данным из файла технологического журнала. +// +Процедура ПолучитьДеревоПланаВыполненияЗапроса(Знач ПланЗапросаТекст, Знач ПланЗапросаМетаданные, ДеревоПланЗапроса, СуммарнаяСтоимостьОбщая) Экспорт + + СуммарнаяСтоимостьОбщая = 0; + + КореньПланаЗапроса = Неопределено; + СтрокиДерева = Неопределено; + Позиция = 1; + Родитель = Неопределено; + ПредыдущаяПозиция = 0; + СтрокаДерево = ДеревоПланЗапроса; + Пока Позиция > 0 Цикл + МассивЯчеек = Новый Массив; + Для Индекс = 1 По 8 Цикл + Позиция = Найти(ПланЗапросаТекст, ","); + МассивЯчеек.Добавить(СокрЛП(Лев(ПланЗапросаТекст, Позиция-1))); + ПланЗапросаТекст = Сред(ПланЗапросаТекст, Позиция + 1); + КонецЦикла; + Позиция = Найти(ПланЗапросаТекст, Символы.ПС); + Если Позиция = 0 Тогда + Оператор = ПланЗапросаТекст; + Иначе + Оператор = Лев(ПланЗапросаТекст, Позиция - 1); + КонецЕсли; + ПланЗапросаТекст = Сред(ПланЗапросаТекст, Позиция + 1); + + Для Индекс = 1 По 8 Цикл + ПозицияМетаданные = Найти(ПланЗапросаМетаданные, ","); + ПланЗапросаМетаданные = Сред(ПланЗапросаМетаданные, ПозицияМетаданные + 1); + КонецЦикла; + ПозицияМетаданные = Найти(ПланЗапросаМетаданные, Символы.ПС); + Если ПозицияМетаданные > 0 Тогда + ОператорМетаданные = Лев(ПланЗапросаМетаданные, ПозицияМетаданные - 1); + ПланЗапросаМетаданные = Сред(ПланЗапросаМетаданные, ПозицияМетаданные + 1); + Иначе + ОператорМетаданные = ПланЗапросаМетаданные; + КонецЕсли; + + ПозицияМетаданные = Найти(ОператорМетаданные, "|--") - 4; + + Если ПозицияМетаданные = 0 Тогда + СтрокаДерево = ДеревоПланЗапроса.Строки.Добавить(); + КореньПланаЗапроса = СтрокаДерево; + Иначе + Если ПредыдущаяПозиция < ПозицияМетаданные Тогда + СтрокаДерево = СтрокаДерево.Строки.Добавить(); + ИначеЕсли ПредыдущаяПозиция > ПозицияМетаданные Тогда + СтрокаДерево = НайтиПозициюВВетке(СтрокаДерево, ПозицияМетаданные); + Если СтрокаДерево <> Неопределено Тогда + СтрокаДерево = СтрокаДерево.Строки.Добавить(); + Иначе + СтрокаДерево = ДеревоПланЗапроса.Строки.Добавить(); + КонецЕсли; + Иначе + СтрокаДерево = СтрокаДерево.Родитель.Строки.Добавить(); + КонецЕсли; + КонецЕсли; + + Если СтрокаДерево.Родитель = Неопределено Тогда + СуммарнаяСтоимостьОбщая = СуммарнаяСтоимостьОбщая + ПреобразоватьВЧисло(МассивЯчеек[6]); + КонецЕсли; + + ПозицияSQL = Найти(Оператор, "|--"); + СтрокаДерево.Оператор = Сред(Оператор, ПозицияSQL + 3); + СтрокаДерево.ОператорМетаданные = Сред(ОператорМетаданные, ПозицияМетаданные + 7); + СтрокаДерево.Отступ = ПозицияМетаданные; + СтрокаДерево.СтрокиФакт = МассивЯчеек[0]; + СтрокаДерево.ВызовыФакт = МассивЯчеек[1]; + СтрокаДерево.СтрокиПлан = МассивЯчеек[2]; + СтрокаДерево.ЗатратыВводаВывода = МассивЯчеек[3]; + СтрокаДерево.ЗагрузкаЦП = МассивЯчеек[4]; + СтрокаДерево.СреднийРазмерСтрок = МассивЯчеек[5]; + СтрокаДерево.СтоимостьОбщая = ПреобразоватьВЧисло(МассивЯчеек[6]); + СтрокаДерево.ВызовыПлан = МассивЯчеек[7]; + ПредыдущаяПозиция = ПозицияМетаданные; + КонецЦикла; + + РассчитатьСтоимостьОператоров(ДеревоПланЗапроса.Строки); + +КонецПроцедуры + +Функция РассчитатьСтоимостьОператоров(ВеткаДерева) + Сумма = 0; + + Для каждого строка Из ВеткаДерева Цикл + АккумуляторСтоимости = 0; + Если Строка.Строки.Количество() > 0 Тогда + АккумуляторСтоимости = РассчитатьСтоимостьОператоров(строка.Строки); + КонецЕсли; + + СтоимостьОператора = Строка.СтоимостьОбщая - АккумуляторСтоимости; + Строка.Стоимость = ?(СтоимостьОператора < 0, 0, СтоимостьОператора); + Сумма = Сумма + Строка.СтоимостьОбщая; + КонецЦикла; + + Возврат Сумма; +КонецФункции + +Функция НайтиПозициюВВетке(Ветка, НомерПозиции) + Если Ветка.Отступ > НомерПозиции Тогда + Возврат НайтиПозициюВВетке(Ветка.Родитель, НомерПозиции); + ИначеЕсли Ветка.Отступ = НомерПозиции Тогда + Возврат Ветка.Родитель; + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +Функция ПреобразоватьВЧисло(ЧислоСтрокой) + + Результат = 0; + ЧислоСтрокой = СокрЛП(ВРег(ЧислоСтрокой)); + Если СтрДлина(ЧислоСтрокой) > 0 Тогда + ПозицияЕ = Найти(ЧислоСтрокой, "E"); + Если ПозицияЕ = 0 Тогда + Результат = Число(ЧислоСтрокой); + Иначе + ЧислоДоЕ = Число(Лев(ЧислоСтрокой, ПозицияЕ - 1)); + ЧислоПослеЕ = Число(Сред(ЧислоСтрокой, ПозицияЕ + 1)); + Результат = ЧислоДоЕ * Pow(10 ,ЧислоПослеЕ); + КонецЕсли; + + КонецЕсли; + Возврат Результат; +КонецФункции + +#КонецОбласти + +#КонецЕсли diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ВыборЗапроса.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ВыборЗапроса.xml new file mode 100644 index 0000000..8a272fa --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ВыборЗапроса.xml @@ -0,0 +1,22 @@ + + +
+ + ВыборЗапроса + + + ru + Выбор запроса + + + + Managed + false + + PlatformApplication + MobilePlatformApplication + + + +
+
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ВыборЗапроса/Ext/Form.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ВыборЗапроса/Ext/Form.xml new file mode 100644 index 0000000..dfac1d3 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ВыборЗапроса/Ext/Form.xml @@ -0,0 +1,357 @@ + +
+ + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Выбор запроса</v8:content> + </v8:item> + + 80 + LockOwnerWindow + false + useIfNecessary + + + + + Item.Запросы + + + + + + + + + + + + + + + + ПриСозданииНаСервере + + + + List + None + true + Row + true + true + true + true + AsFile + Объект.Запросы + None + None + None + + + + + + + + + + + Запросы + SearchStringRepresentation + + + + + + + Запросы + ViewStatusRepresentation + + + + + + + Запросы + SearchControl + + + + + + ЗапросыВыбор + ЗапросыПередНачаломДобавления + ЗапросыПередУдалением + + + + Объект.Запросы.Имя + EnterOnInput + + + + ЗапросыИмяПриИзменении + + + + Объект.Запросы.Идентификатор + false + EnterOnInput + + + + + true + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа запроса</v8:content> + </v8:item> + + + + ru + Группа запроса + + + Horizontal + + + + Объект.Запросы.ВремяВыполнения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Время выполнения (сек.)</v8:content> + </v8:item> + + EnterOnInput + + + + + Объект.Запросы.КоличествоСтрок + EnterOnInput + + + + + + +
+ + Объект.ИмяФайла + true + + + +
+ + + + cfg:ExternalDataProcessorObject.ИнструментыРазработчикаКонсольЗапросов + + true + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор текущего запроса</v8:content> + </v8:item> + + + v8:UUID + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор текущего параметра</v8:content> + </v8:item> + + + v8:UUID + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Список типов</v8:content> + </v8:item> + + + v8:ValueListType + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Задан вопрос об установке расширения</v8:content> + </v8:item> + + + xs:boolean + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сохранить</v8:content> + </v8:item> + + + + ru + Сохранить запросы в файл + + + Ctrl+S + + StdPicture.SaveFile + true + + СохранитьЗапросыВФайл + Picture + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Открыть</v8:content> + </v8:item> + + + + ru + Восстановить запросы из файла + + + Ctrl+O + + StdPicture.OpenFile + true + + ВосстановитьЗапросыИзФайла + TextPicture + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Выбрать</v8:content> + </v8:item> + + + + ru + Выбрать запрос + + + ВыбратьЗапрос + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сохранить как</v8:content> + </v8:item> + + + + ru + Сохранить запросы в другой файл + + + + StdPicture.EndEdit + true + + СохранитьЗапросыВДругойФайл + Picture + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Добавить запросы</v8:content> + </v8:item> + + + + ru + Добавить запросы из файла + + + + StdPicture.NewWindow + true + + ДобавитьЗапросыИзФайла + Picture + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сравнить результаты запросов</v8:content> + </v8:item> + + + + ru + Сравнить результаты запросов + + + + StdPicture.ReadChanges + true + + СравнитьРезультатыЗапросов + TextPicture + DontUse + + +
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ВыборЗапроса/Ext/Form/Module.bsl b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ВыборЗапроса/Ext/Form/Module.bsl new file mode 100644 index 0000000..bc2e12d --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ВыборЗапроса/Ext/Form/Module.bsl @@ -0,0 +1,456 @@ + +#Область ОбработчикиСобытий + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + // Считывание параметров передачи. + ПараметрыПередачи = ПолучитьИзВременногоХранилища(Параметры.АдресХранилища); + Объект.Запросы.Загрузить(ПараметрыПередачи.Запросы); + Объект.Параметры.Загрузить(ПараметрыПередачи.Параметры); + Объект.ИмяФайла = ПараметрыПередачи.ИмяФайла; + ИдентификаторТекущегоЗапроса = ПараметрыПередачи.ИдентификаторТекущегоЗапроса; + ИдентификаторТекущегоПараметра = ПараметрыПередачи.ИдентификаторТекущегоПараметра; + + ОбработкаОбъект = ОбъектОбработки(); + Объект.ДоступныеТипыДанных = ОбработкаОбъект.Метаданные().Реквизиты.ДоступныеТипыДанных.Тип; + + СписокТипов = ОбъектОбработки().СформироватьСписокТипов(); + ОбработкаОбъект.ФильтрацияСпискаТипов(СписокТипов, ""); + + Фильтр = Новый Структура; + Фильтр.Вставить("Идентификатор", ИдентификаторТекущегоЗапроса); + СтрокиЗапросовСИдентификатор = Объект.Запросы.НайтиСтроки(Фильтр); + Если СтрокиЗапросовСИдентификатор.Количество() > 0 Тогда + Элементы.Запросы.ТекущаяСтрока = СтрокиЗапросовСИдентификатор.Получить(0).ПолучитьИдентификатор(); + КонецЕсли; + Заголовок = НСтр("ru = 'Выбрать запрос'"); +КонецПроцедуры + +&НаКлиенте +Процедура ЗапросыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + Отказ = Истина; + + ЭлементКопирования = Элемент.ТекущиеДанные; + + ИмяЗапросаПоУмолчанию = ЭтотОбъект.ВладелецФормы.ИмяЗапросаПоУмолчанию; + ИдентификаторЗапроса = Новый УникальныйИдентификатор; + + Запрос = Объект.Запросы.Добавить(); + Запрос.Имя = ИмяЗапросаПоУмолчанию; + Запрос.Идентификатор = ИдентификаторЗапроса; + + Если Копирование Тогда + ИмяНовогоЗапроса = СформироватьИмяКопииЗапроса(ЭлементКопирования.Имя); + Запрос.Имя = ИмяНовогоЗапроса; + Запрос.Текст = ЭлементКопирования.Текст; + ИдентификаторТекущегоЗапроса = ЭлементКопирования.Идентификатор; + + // Копирование параметров + Фильтр = Новый Структура; + Фильтр.Вставить("ИдентификаторЗапроса", ИдентификаторТекущегоЗапроса); + МассивПараметров = Объект.Параметры.НайтиСтроки(Фильтр); + Для каждого Стр Из МассивПараметров Цикл + ЭлементПараметр = Объект.Параметры.Добавить(); + ЭлементПараметр.Идентификатор = Новый УникальныйИдентификатор; + ЭлементПараметр.ИдентификаторЗапроса = ИдентификаторЗапроса; + ЭлементПараметр.Имя = Стр.Имя; + ЭлементПараметр.Тип = Стр.Тип; + ЭлементПараметр.Значение = Стр.Значение; + ЭлементПараметр.ТипВФорме = Стр.ТипВФорме; + ЭлементПараметр.ЗначениеВФорме = Стр.ЗначениеВФорме; + КонецЦикла; + КонецЕсли; + + ВладелецФормы.Модифицированность = Истина; +КонецПроцедуры + +// Обработчик перед удалением Запроса. +// Удаляет параметры для данного запроса. +// +&НаКлиенте +Процедура ЗапросыПередУдалением(Элемент, Отказ) + ПараметрыВФорме = Объект.Параметры; + ИдентификаторУдаляемогоЗапроса = Элементы.Запросы.ТекущиеДанные.Идентификатор; + + КоличествоСтрок = ПараметрыВФорме.Количество() - 1; + Пока КоличествоСтрок >= 0 Цикл + ТекущийПараметр = ПараметрыВФорме.Получить(КоличествоСтрок); + Если ТекущийПараметр.ИдентификаторЗапроса = ИдентификаторУдаляемогоЗапроса Тогда + ПараметрыВФорме.Удалить(КоличествоСтрок); + Модифицированность = Истина; + КонецЕсли; + КоличествоСтрок = КоличествоСтрок - 1; + КонецЦикла; + + ВладелецФормы.Модифицированность = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура ЗапросыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) + ОбработкаВыбораЗапроса(); +КонецПроцедуры + +&НаКлиенте +Процедура ЗапросыИмяПриИзменении(Элемент) + ВладелецФормы.Модифицированность = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура СравнитьРезультатыЗапросов(Команда) + #Если Не ВебКлиент И Не ТонкийКлиент Тогда + ВыделенныеЗапросы = Элементы.Запросы.ВыделенныеСтроки; + Если ВыделенныеЗапросы.Количество() <> 2 Тогда + ПоказатьПредупреждение(, НСтр("ru = 'Для сравнения необходимо выбрать только 2 запроса", "Объект'")); + Возврат; + Иначе + ИдентификаторСтрокиПервогоЗапроса = ВыделенныеЗапросы.Получить(0); + ИдентификаторСтрокиВторогоЗапроса = ВыделенныеЗапросы.Получить(1); + КонецЕсли; + + ИдентификаторПервогоЗапроса = Объект.Запросы.НайтиПоИдентификатору(ИдентификаторСтрокиПервогоЗапроса).Идентификатор; + ИдентификаторВторогоЗапроса = Объект.Запросы.НайтиПоИдентификатору(ИдентификаторСтрокиВторогоЗапроса).Идентификатор; + + ТабличныйДокументПервогоЗапроса = Неопределено; + ТабличныйДокументВторогоЗапроса = Неопределено; + + ПолучитьТабличныеДокументыСравниваемыхЗапросов(ИдентификаторПервогоЗапроса, ИдентификаторВторогоЗапроса, ТабличныйДокументПервогоЗапроса, ТабличныйДокументВторогоЗапроса); + + Если ТипЗнч(ТабличныйДокументПервогоЗапроса) <> Неопределено + И ТипЗнч(ТабличныйДокументВторогоЗапроса) <> Неопределено Тогда + // Сравниваются два файла. + Сравнение = Новый СравнениеФайлов; + Сравнение.СпособСравнения = СпособСравненияФайлов.ТабличныйДокумент; + Сравнение.ПервыйФайл = ТабличныйДокументПервогоЗапроса; + Сравнение.ВторойФайл = ТабличныйДокументВторогоЗапроса; + Сравнение.ПоказатьРазличияМодально(); + КонецЕсли; + #Иначе + ПоказатьПредупреждение(, НСтр("ru = 'Сравнивать результаты можно только в режиме толстого клиента.", "Объект'")); + #КонецЕсли +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////// +// ОБЩИЕ КОМАНДЫ + +&НаКлиенте +Процедура СохранитьЗапросыВФайл(Команда) + + ОписаниеОповещения = Новый ОписаниеОповещения("УстановитьИмяФайлаЗапроса", ЭтотОбъект, Объект.ИмяФайла); + СохранитьФайлЗапроса(ОписаниеОповещения); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьЗапросыВДругойФайл(Команда) + ОписаниеОповещения = Новый ОписаниеОповещения("УстановитьИмяФайлаЗапроса", ЭтотОбъект, ""); + СохранитьФайлЗапроса(ОписаниеОповещения); +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьИмяФайлаЗапроса(ИмяФайла, ДополнительныеПараметры) Экспорт + + Объект.ИмяФайла = ИмяФайла; + +КонецПроцедуры + +&НаКлиенте +Процедура ВосстановитьЗапросыИзФайла(Команда) + ОбработкаЧтенияФайла(Истина); + ВладелецФормы.Модифицированность = Ложь; +КонецПроцедуры + +&НаКлиенте +Процедура ВыбратьЗапрос(Команда) + ОбработкаВыбораЗапроса(); +КонецПроцедуры + +&НаКлиенте +Процедура ДобавитьЗапросыИзФайла(Команда) + ОбработкаЧтенияФайла(Ложь); + ВладелецФормы.Модифицированность = Истина; +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Функция ОбъектОбработки() + Возврат РеквизитФормыВЗначение("Объект"); +КонецФункции + +&НаСервере +Функция ПоместитьЗапросыВСтруктуру(ИдентификаторЗапроса, ИдентификаторПараметра) + ПараметрыПередачи = Новый Структура; + ПараметрыПередачи.Вставить("АдресХранилища", ОбъектОбработки().ПоместитьЗапросыВоВременноеХранилище(Объект, ИдентификаторЗапроса, ИдентификаторПараметра)); + Возврат ПараметрыПередачи; +КонецФункции + +// Сохранение запросов. +// +// Параметры: +// ИмяФайла - имя файла XML. +// Объект - объект обработки. +// +&НаСервере +Функция СохранитьЗапросы(знач Объект) + + ДвоичныеДанные = ОбъектОбработки().ЗаписатьЗапросыВФайлXML(Объект); + Возврат ДвоичныеДанные; + +КонецФункции + +&НаКлиенте +Процедура ОбработкаВыбораЗапроса() + ТекущаяСтрока = Элементы.Запросы.ТекущаяСтрока; + Если ТекущаяСтрока <> Неопределено Тогда + ТекущийЗапрос = Элементы.Запросы.ТекущиеДанные; + ИдентификаторТекущегоЗапроса = ТекущийЗапрос.Идентификатор; + ПараметрыПередачи = ПоместитьЗапросыВСтруктуру(ИдентификаторТекущегоЗапроса, ИдентификаторТекущегоПараметра); + + // Передача в открывающую форму. + Закрыть(); + + Оповестить("ВыгрузитьЗапросыВРеквизиты", ПараметрыПередачи); + Оповестить("ОбновитьФормуКлиент"); + Иначе + ПоказатьСообщениеПользователю(НСтр("ru = 'Выберите запрос.'"), "Объект"); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьФайлЗапроса(ОписаниеОповещения) + + Оповещение = Новый ОписаниеОповещения("СохранитьФайлЗапросаЗавершение", ЭтотОбъект, ОписаниеОповещения); + #Если Не ВебКлиент Тогда + // В тонком и толстом клиентах расширение подключено всегда. + СохранитьФайлЗапросаЗавершение(ОписаниеОповещения); + Возврат; + #КонецЕсли + + // Если расширение и так уже подключено, незачем про него спрашивать. + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Если РасширениеПодключено Тогда + СохранитьФайлЗапросаЗавершение(ОписаниеОповещения); + Возврат; + КонецЕсли; + + Если Не ЗаданВопросОбУстановкеРасширения Тогда + + ЗаданВопросОбУстановкеРасширения = Истина; + ОписаниеОповещенияВопрос = Новый ОписаниеОповещения("ЗадатьВопросОбУстановкеРасширения", ЭтотОбъект, Оповещение); + ПоказатьВопрос(ОписаниеОповещенияВопрос, Нстр("ru = 'Установить расширение для работы с файлами?'"), РежимДиалогаВопрос.ДаНет); + + Иначе + + СохранитьФайлЗапросаЗавершение(ОписаниеОповещения); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗадатьВопросОбУстановкеРасширения(Ответ, Оповещение) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + + НачатьУстановкуРасширенияРаботыСФайлами(Оповещение); + + Иначе + + СохранитьФайлЗапросаЗавершение(Оповещение); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьФайлЗапросаЗавершение(Оповещение) Экспорт + + ИмяФайла = Оповещение.ДополнительныеПараметры; + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + Если ПустаяСтрока(ИмяФайла) Тогда + Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); + Диалог.Заголовок = НСтр("ru = 'Выберите файл запросов'"); + Диалог.ПредварительныйПросмотр = Ложь; + Диалог.Фильтр = НСтр("ru = 'Файл запросов (*.q1c)|*.q1c'"); + Диалог.Расширение = "q1c"; + Диалог.ПроверятьСуществованиеФайла = Истина; + Диалог.МножественныйВыбор = Ложь; + + Если Диалог.Выбрать() Тогда + ИмяФайла = Диалог.ПолноеИмяФайла; + КонецЕсли; + КонецЕсли; + + // Записываются текст и параметры запроса в файл. + Если Не ПустаяСтрока(ИмяФайла) Тогда + ДвоичныеДанные = СохранитьЗапросы(Объект); + ДвоичныеДанные.Записать(ИмяФайла); + ВладелецФормы.Модифицированность = Ложь; + + КонецЕсли; + Иначе + ТекстСообщения = НСтр("ru = 'В данном браузере невозможно работать с файлами.'"); + ПоказатьСообщениеПользователю(ТекстСообщения, "Объект"); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаЧтенияФайла(Удалять) + // Выбор файла для загрузки. + Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + Диалог.Заголовок = НСтр("ru = 'Выберите файл запросов'"); + Диалог.ПредварительныйПросмотр = Ложь; + Диалог.Фильтр = НСтр("ru = 'Файл запросов (*.q1c)|*.q1c'"); + Диалог.Расширение = "q1c"; + Диалог.ПроверятьСуществованиеФайла = Истина; + Диалог.МножественныйВыбор = Ложь; + Если Диалог.Выбрать() Тогда + ИмяФайла = Диалог.ПолноеИмяФайла; + КонецЕсли; + + // Чтение данных из файла. + Если Не ПустаяСтрока(ИмяФайла) Тогда + Если Удалять Тогда + Объект.Запросы.Очистить(); + Объект.Параметры.Очистить(); + КонецЕсли; + ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла); + ЗагрузитьЗапросыИзФайла(ДвоичныеДанные) + КонецЕсли; + Объект.ИмяФайла = ИмяФайла; +КонецПроцедуры + +&НаСервере +Процедура ЗагрузитьЗапросыИзФайла(ДвоичныеДанные) + + ОбъектВнешнейОбработки = ОбъектОбработки().ПрочитатьЗапросыИзФайлаXML(ДвоичныеДанные); + ЗаполнитьЗапросыИПараметрыИзОбъектаВнешнейОбработки(ОбъектВнешнейОбработки); + +КонецПроцедуры + +// Заполняет из объекта внешней обработки запросы и параметры. +// +// Параметры: +// ОбъектОбработки - объект внешней обработки. +// +&НаСервере +Процедура ЗаполнитьЗапросыИПараметрыИзОбъектаВнешнейОбработки(ОбъектОбработки) + ЗапросыОбработка = ОбъектОбработки.Запросы; + ПараметрыОбработка = ОбъектОбработки.Параметры; + + Объект.Запросы.Очистить(); + Объект.Параметры.Очистить(); + + // Заполнение запросов и параметров в форме. + Для каждого ТекстЗапрос Из ЗапросыОбработка Цикл + ЭлементЗапроса = Объект.Запросы.Добавить(); + ЭлементЗапроса.Идентификатор = ТекстЗапрос.Идентификатор; + ЭлементЗапроса.Имя = ТекстЗапрос.Имя; + ЭлементЗапроса.Текст = ТекстЗапрос.Текст; + КонецЦикла; + + Для каждого ТекПараметр Из ПараметрыОбработка Цикл + ТипСтрока = ТекПараметр.Тип; + + Значение = ТекПараметр.Значение; + Значение = ЗначениеИЗСтрокиВнутр(Значение); + + Если ТипСтрока = "ТаблицаЗначений" ИЛИ ТипСтрока = "МоментВремени" ИЛИ ТипСтрока = "Граница" Тогда + ЭлементПараметр = Объект.Параметры.Добавить(); + ЭлементПараметр.ИдентификаторЗапроса = ТекПараметр.ИдентификаторЗапроса; + ЭлементПараметр.Идентификатор = ТекПараметр.Идентификатор; + ЭлементПараметр.Имя = ТекПараметр.Имя; + ЭлементПараметр.Тип = СписокТипов.НайтиПоЗначению(ТипСтрока).Значение; + ЭлементПараметр.Значение = ТекПараметр.Значение; + ЭлементПараметр.ТипВФорме = СписокТипов.НайтиПоЗначению(ТипСтрока).Представление; + ЭлементПараметр.ЗначениеВФорме = ОбъектОбработки().ФормированиеПредставленияЗначения(Значение); + Иначе + Массив = Новый Массив; + Массив.Добавить(Тип(ТипСтрока)); + Описание = Новый ОписаниеТипов(Массив); + + ЭлементПараметр = Объект.Параметры.Добавить(); + ЭлементПараметр.ИдентификаторЗапроса = ТекПараметр.ИдентификаторЗапроса; + ЭлементПараметр.Идентификатор = ТекПараметр.Идентификатор; + ЭлементПараметр.Имя = ТекПараметр.Имя; + ЭлементПараметр.Тип = ТипСтрока; + ЭлементПараметр.ТипВФорме = Описание; + ЭлементПараметр.Значение = ЗначениеВСтрокуВнутр(Значение); + ЭлементПараметр.ЗначениеВФорме = Значение; + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьСообщениеПользователю(ТекстСообщения, ПутьКДанным) + ОчиститьСообщения(); + Сообщение = Новый СообщениеПользователю(); + Сообщение.Текст = ТекстСообщения; + Сообщение.ПутьКДанным = ПутьКДанным; + Сообщение.УстановитьДанные(Объект); + Сообщение.Сообщить(); +КонецПроцедуры + +&НаСервере +Процедура ПолучитьТабличныеДокументыСравниваемыхЗапросов(ИДПервогоЗапроса, ИДВторогоЗапроса, ФайлПервогоЗапроса, ФайлВторогоЗапроса) + ФильтрПервого = Новый Структура; + ФильтрПервого.Вставить("Идентификатор",ИДПервогоЗапроса); + АдресПервогоДокумента = Объект.Запросы.НайтиСтроки(ФильтрПервого).Получить(0).АдресРезультата; + + ФильтрВторого = Новый Структура; + ФильтрПервого.Вставить("Идентификатор",ИДВторогоЗапроса); + АдресВторогоДокумента = Объект.Запросы.НайтиСтроки(ФильтрПервого).Получить(0).АдресРезультата; + + Если ПустаяСтрока(АдресПервогоДокумента) ИЛИ ПустаяСтрока(АдресВторогоДокумента) Тогда + Возврат; + КонецЕсли; + + ТДПервогоЗапроса = ПолучитьИзВременногоХранилища(АдресПервогоДокумента); + ТДВторогоЗапроса = ПолучитьИзВременногоХранилища(АдресВторогоДокумента); + + ФайлПервогоЗапроса = ПолучитьИмяВременногоФайла("mxl"); + ТДПервогоЗапроса.Записать(ФайлПервогоЗапроса); + + ФайлВторогоЗапроса = ПолучитьИмяВременногоФайла("mxl"); + ТДВторогоЗапроса.Записать(ФайлВторогоЗапроса); +КонецПроцедуры + +// Формирует имя копии запроса. +// +// Параметры: +// Имя - передаваемое имя запроса. +// +&НаКлиенте +Функция СформироватьИмяКопииЗапроса(Имя) + Флаг = Истина; + Индекс = 1; + + Пока Флаг Цикл + ФормируемоеИмяЗапроса = НСтр("ru = '%ИмяЗапроса% - Копия %НомерКопии%'"); + ФормируемоеИмяЗапроса = СтрЗаменить(ФормируемоеИмяЗапроса, "%ИмяЗапроса%", Имя); + ФормируемоеИмяЗапроса = СтрЗаменить(ФормируемоеИмяЗапроса, "%НомерКопии%", Индекс); + + Фильтр = Новый Структура; + Фильтр.Вставить("Имя", ФормируемоеИмяЗапроса); + + МассивЗапросовПоФильтру = Объект.Запросы.НайтиСтроки(Фильтр); + + Если МассивЗапросовПоФильтру.Количество() = 0 Тогда + Флаг = Ложь; + КонецЕсли; + + Индекс = Индекс + 1; + КонецЦикла; + + Возврат ФормируемоеИмяЗапроса; +КонецФункции + +#КонецОбласти diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Граница.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Граница.xml new file mode 100644 index 0000000..dac2b5b --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Граница.xml @@ -0,0 +1,22 @@ + + +
+ + Граница + + + ru + Граница + + + + Managed + false + + PlatformApplication + MobilePlatformApplication + + + +
+
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Граница/Ext/Form.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Граница/Ext/Form.xml new file mode 100644 index 0000000..789c350 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Граница/Ext/Form.xml @@ -0,0 +1,190 @@ + +
+ + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Граница</v8:content> + </v8:item> + + 50 + LockOwnerWindow + false + useIfNecessary + + + + + + + ОбработкаОповещения + ПриСозданииНаСервере + + + + Horizontal + None + false + + + + Тип + false + true + false + + + + ТипНачалоВыбора + + + + ВидГраницыФормы + false + true + false + + + + + + + ЗначениеВФорме + true + false + + + + ЗначениеВФормеПриИзменении + ЗначениеВФормеНачалоВыбора + + + + + + + cfg:ExternalDataProcessorObject.ИнструментыРазработчикаКонсольЗапросов + + true + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор текущего запроса</v8:content> + </v8:item> + + + v8:UUID + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор текущего параметра</v8:content> + </v8:item> + + + v8:UUID + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Имя файла</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение</v8:content> + </v8:item> + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Вид границы</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Список типов</v8:content> + </v8:item> + + + v8:ValueListType + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение</v8:content> + </v8:item> + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Записать и закрыть</v8:content> + </v8:item> + + + + ru + Записать границу + + + ЗаписатьГраницу + Text + DontUse + + +
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Граница/Ext/Form/Module.bsl b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Граница/Ext/Form/Module.bsl new file mode 100644 index 0000000..e940030 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Граница/Ext/Form/Module.bsl @@ -0,0 +1,217 @@ + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + ОбработкаОбъект = ОбъектОбработки(); + Объект.ДоступныеТипыДанных = ОбработкаОбъект.Метаданные().Реквизиты.ДоступныеТипыДанных.Тип; + Объект.ПутьКФормам = ОбработкаОбъект.Метаданные().ПолноеИмя() + ".Форма"; + + Элементы.ВидГраницы.СписокВыбора.Добавить("Включая"); + Элементы.ВидГраницы.СписокВыбора.Добавить("Исключая"); + ВидГраницыФормы = Элементы.ВидГраницы.СписокВыбора.Получить(0).Значение; + + // Получение списка типов и его фильтрация. + СписокТипов = ОбъектОбработки().СформироватьСписокТипов(); + ОбъектОбработки().ФильтрацияСпискаТипов(СписокТипов, "Граница"); + + // Считывание параметров передачи. + ПараметрыПередачи = ПолучитьИзВременногоХранилища(Параметры.АдресХранилища); + Объект.Запросы.Загрузить(ПараметрыПередачи.Запросы); + Объект.Параметры.Загрузить(ПараметрыПередачи.Параметры); + Объект.ИмяФайла = ПараметрыПередачи.ИмяФайла; + ИдентификаторТекущегоЗапроса = ПараметрыПередачи.ИдентификаторТекущегоЗапроса; + ИдентификаторТекущегоПараметра = ПараметрыПередачи.ИдентификаторТекущегоПараметра; + + ЗаполнитьЗначения(); +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + Если ИмяСобытия = "ПолучениеМоментаВремени" Тогда + ПолучениеМоментаВремени(Параметр); + КонецЕсли; +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ТипНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + ОписаниеОповещения = Новый ОписаниеОповещения("ТипЗавершениеВыбора", ЭтотОбъект); + СписокТипов.ПоказатьВыборЭлемента(ОписаниеОповещения, НСтр("ru = 'Выбрать тип'")); + +КонецПроцедуры + +&НаКлиенте +Процедура ТипЗавершениеВыбора(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт + + Если ВыбранныйЭлемент <> Неопределено Тогда + + ТекущийТип = ВыбранныйЭлемент; + + Если ТекущийТип.Значение = "МоментВремени" Тогда + Тип = ТекущийТип.Представление; + Значение = Тип; + ЗначениеВФорме = Тип; + Иначе + Тип = ТекущийТип.Представление; + + Массив = Новый Массив; + Массив.Добавить(Тип(ТекущийТип.Значение)); + Описание = Новый ОписаниеТипов(Массив); + + ЗначениеВФорме = Описание.ПривестиЗначение(ТекущийТип.Значение); + Значение = Описание.ПривестиЗначение(ТекущийТип.Значение); + КонецЕсли; + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеВФормеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + ПередаваемыеЗапросы = ПередачаЗапросов(); + ПередаваемыеЗапросы.Вставить("Значение",Значение); + + Если Тип = НСтр("ru = 'Момент времени'") Тогда + Путь = Объект.ПутьКФормам + "." + "МоментВремени"; + ОткрытьФорму(Путь, ПередаваемыеЗапросы, ЭтотОбъект); + Иначе + Возврат; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеВФормеПриИзменении(Элемент) + ИзменениеЗначенияВФорме(); +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////// +// КОМАНДЫ + +&НаКлиенте +Процедура ЗаписатьГраницу(Команда) + ВыгрузитьГраницуСервер(); +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Функция ОбъектОбработки() + Возврат РеквизитФормыВЗначение("Объект"); +КонецФункции + +// Передача табличной части "Запросы", "Параметры" в виде структуры. +// +&НаСервере +Функция ПередачаЗапросов() + АдресХранилища = ОбъектОбработки().ПоместитьЗапросыВоВременноеХранилище(Объект, ИдентификаторТекущегоЗапроса,ИдентификаторТекущегоПараметра); + ПараметрАдрес = Новый Структура; + ПараметрАдрес.Вставить("АдресХранилища", АдресХранилища); + Возврат ПараметрАдрес; +КонецФункции + +&НаСервере +Процедура ПолучениеМоментаВремени(СтруктураПередачи) + Значение = СтруктураПередачи.ВнутрМоментВремени; + ЗначениеВФорме = СтруктураПередачи.ПредставлениеМоментаВремени; +КонецПроцедуры + +&НаКлиенте +Процедура ВыгрузитьГраницуСервер() + ПараметрыПередачи = ПоместитьЗапросыВСтруктуру(ИдентификаторТекущегоЗапроса, ИдентификаторТекущегоПараметра); + Закрыть(); + Владелец = ЭтотОбъект.ВладелецФормы; + Владелец.Модифицированность = Истина; + Владелец.ВыгрузитьЗапросыВРеквизиты(ПараметрыПередачи); +КонецПроцедуры + +&НаСервере +Функция ВнутрЗначениеОбъектаГраницы() + ВидГран = ОбъектОбработки().ОпределениеВидаГраницы(ВидГраницыФормы); + ГраницаФормы = Новый Граница(ЗначениеИзСтрокиВнутр(Значение),ВидГран); + + Возврат ЗначениеВСтрокуВнутр(ГраницаФормы); +КонецФункции + +&НаСервере +Функция ПоместитьЗапросыВСтруктуру(ИдентификаторЗапроса, ИдентификаторПараметра) + ПараметрыФормы = Объект.Параметры; + + ПредставлениеГраницы = СформироватьГраницу(); + + Для каждого Стр Из ПараметрыФормы Цикл + Если Стр.Идентификатор = ИдентификаторТекущегоПараметра Тогда + Стр.Тип = "Граница"; + Стр.Значение = ВнутрЗначениеОбъектаГраницы(); + Стр.ТипВФорме = НСтр("ru ='Граница'"); + Стр.ЗначениеВФорме = ПредставлениеГраницы; + КонецЕсли; + КонецЦикла; + + ПараметрыПередачи = Новый Структура; + ПараметрыПередачи.Вставить("АдресХранилища", ОбъектОбработки().ПоместитьЗапросыВоВременноеХранилище(Объект,ИдентификаторЗапроса,ИдентификаторПараметра)); + Возврат ПараметрыПередачи; +КонецФункции + +&НаСервере +Процедура ЗаполнитьЗначения() + ПараметрыФормы = Объект.Параметры; + Для каждого ТекущийПараметр Из ПараметрыФормы Цикл + Если ТекущийПараметр.Идентификатор = ИдентификаторТекущегоПараметра Тогда + Значение = ТекущийПараметр.Значение; + Если ПустаяСтрока(Значение) Тогда + Возврат; + Иначе + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Граница = ЗначениеИзСтрокиВнутр(Значение); + Если ТипЗнч(Граница) <> Тип("Граница") Тогда + Возврат; + КонецЕсли; + + ЗначениеЗагруженное = Граница.Значение; + ТипЗ = ОбъектОбработки().ИмяТипаИзЗначения(ЗначениеЗагруженное); + Тип = СписокТипов.НайтиПоЗначению(ТипЗ).Представление; + Если Тип <> НСтр("ru = 'Момент времени'") Тогда + ЗначениеВФорме = ЗначениеЗагруженное; + Иначе + ЗначениеВФорме = ОбъектОбработки().ФормированиеПредставленияЗначения(ЗначениеЗагруженное); + КонецЕсли; + Значение = ЗначениеВСтрокуВнутр(ЗначениеЗагруженное); + + Если Граница.ВидГраницы = ВидГраницы.Включая Тогда + ВидГраницыФормы = элементы.ВидГраницы.СписокВыбора.Получить(0).Значение; + Иначе + ВидГраницыФормы = элементы.ВидГраницы.СписокВыбора.Получить(1).Значение; + КонецЕсли; +КонецПроцедуры + +&НаСервере +Функция СформироватьГраницу() + ВидГран = ОбъектОбработки().ОпределениеВидаГраницы(ВидГраницыФормы); + ГраницаФормы = Новый Граница(ЗначениеИзСтрокиВнутр(Значение),ВидГран); + + Представление = ОбъектОбработки().ФормированиеПредставленияЗначения(ГраницаФормы); + + Возврат Представление; +КонецФункции + +&НаСервере +Процедура ИзменениеЗначенияВФорме() + Значение = ЗначениеВСтрокуВнутр(ЗначениеВФорме); +КонецПроцедуры + +#КонецОбласти diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/МоментВремени.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/МоментВремени.xml new file mode 100644 index 0000000..ca1e6e6 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/МоментВремени.xml @@ -0,0 +1,22 @@ + + +
+ + МоментВремени + + + ru + Момент времени + + + + Managed + false + + PlatformApplication + MobilePlatformApplication + + + +
+
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/МоментВремени/Ext/Form.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/МоментВремени/Ext/Form.xml new file mode 100644 index 0000000..1b606b9 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/МоментВремени/Ext/Form.xml @@ -0,0 +1,126 @@ + +
+ + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Момент времени</v8:content> + </v8:item> + + LockOwnerWindow + false + useIfNecessary + + + + + + + ПриСозданииНаСервере + + + + Ссылка + + + + + Дата + + + + + + + + cfg:ExternalDataProcessorObject.ИнструментыРазработчикаКонсольЗапросов + + true + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Ссылка</v8:content> + </v8:item> + + + cfg:AnyRef + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Дата</v8:content> + </v8:item> + + + xs:dateTime + + DateTime + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор текущего запроса</v8:content> + </v8:item> + + + v8:UUID + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор текущего параметра</v8:content> + </v8:item> + + + v8:UUID + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Имя файла</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Записать и закрыть</v8:content> + </v8:item> + + + + ru + Записать и закрыть + + + ЗаписатьИЗакрыть + Text + DontUse + + +
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/МоментВремени/Ext/Form/Module.bsl b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/МоментВремени/Ext/Form/Module.bsl new file mode 100644 index 0000000..23a508b --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/МоментВремени/Ext/Form/Module.bsl @@ -0,0 +1,118 @@ + +#Область ОбработчикиСобытий + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + ОбработкаОбъект = ОбъектОбработки(); + Объект.ПутьКФормам = ОбработкаОбъект.Метаданные().ПолноеИмя() + ".Форма"; + + // Считывание параметров передачи. + ПараметрыПередачи = ПолучитьИзВременногоХранилища(Параметры.АдресХранилища); + Объект.Запросы.Загрузить(ПараметрыПередачи.Запросы); + Объект.Параметры.Загрузить(ПараметрыПередачи.Параметры); + Объект.ИмяФайла = ПараметрыПередачи.ИмяФайла; + ИдентификаторТекущегоЗапроса = ПараметрыПередачи.ИдентификаторТекущегоЗапроса; + ИдентификаторТекущегоПараметра = ПараметрыПередачи.ИдентификаторТекущегоПараметра; + + Попытка // Если форма открывается не из главной формы. + МоментВремени = ЗначениеИзСтрокиВнутр(Параметры.Значение); + Дата = МоментВремени.Дата; + Ссылка = МоментВремени.Ссылка; + Исключение + ЗаполнитьЗначения(); + КонецПопытки; +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////// +// КОМАНДЫ + +&НаКлиенте +Процедура ЗаписатьИЗакрыть(Команда) + ВыгрузитьМоментВремениСервер(); +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Функция ОбъектОбработки() + Возврат РеквизитФормыВЗначение("Объект"); +КонецФункции + +&НаКлиенте +Процедура ВыгрузитьМоментВремениСервер() + Владелец = ЭтотОбъект.ВладелецФормы; + ИмяФормыВладельца = Владелец.ИмяФормы; + ИмяОсновнойФормы = Объект.ПутьКФормам + ".Форма"; + + Если ИмяФормыВладельца = ИмяОсновнойФормы Тогда + ПараметрыПередачи = ПоместитьЗапросыВСтруктуру(ИдентификаторТекущегоЗапроса, ИдентификаторТекущегоПараметра); + Закрыть(); + Владелец.Модифицированность = Истина; + Оповестить("ВыгрузитьЗапросыВРеквизиты", ПараметрыПередачи); + Иначе + ПредставлениеМоментаВремени = ""; + ВнутрМоментВремени = ВнутрЗначениеОбъектаМВ(ПредставлениеМоментаВремени); + Закрыть(); + ПараметрыПередачи = Новый Структура("ВнутрМоментВремени, ПредставлениеМоментаВремени", + ВнутрМоментВремени, ПредставлениеМоментаВремени); + Оповестить("ПолучениеМоментаВремени", ПараметрыПередачи); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Функция ПоместитьЗапросыВСтруктуру(ИдентификаторЗапроса, ИдентификаторПараметра) + ПараметрыФормы = Объект.Параметры; + + ПредставлениеМоментаВремени = ""; + Для каждого Стр Из ПараметрыФормы Цикл + Если Стр.Идентификатор = ИдентификаторТекущегоПараметра Тогда + Стр.Тип = "МоментВремени"; + Стр.Значение = ВнутрЗначениеОбъектаМВ(ПредставлениеМоментаВремени); + Стр.ТипВФорме = НСтр("ru = 'Момент времени'"); + Стр.ЗначениеВФорме = ПредставлениеМоментаВремени; + КонецЕсли; + КонецЦикла; + + ПараметрыПередачи = Новый Структура; + ПараметрыПередачи.Вставить("АдресХранилища", ОбъектОбработки().ПоместитьЗапросыВоВременноеХранилище(Объект,ИдентификаторЗапроса,ИдентификаторПараметра)); + Возврат ПараметрыПередачи; +КонецФункции + +&НаСервере +Функция ВнутрЗначениеОбъектаМВ(Представление) + МоментВремени = Новый МоментВремени(Дата, Ссылка); + Представление = ОбъектОбработки().ФормированиеПредставленияЗначения(МоментВремени); + + Возврат ЗначениеВСтрокуВнутр(МоментВремени); +КонецФункции + +&НаСервере +Процедура ЗаполнитьЗначения() + ПараметрыФормы = Объект.Параметры; + Для каждого ТекущийПараметр Из ПараметрыФормы Цикл + Если ТекущийПараметр.Идентификатор = ИдентификаторТекущегоПараметра Тогда + Значение = ТекущийПараметр.Значение; + Если ПустаяСтрока(Значение) Тогда + Возврат; + Иначе + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + МоментВремени = ЗначениеИзСтрокиВнутр(Значение); + Если ТипЗнч(МоментВремени) <> Тип("МоментВремени") Тогда + Возврат; + КонецЕсли; + + Дата = МоментВремени.Дата; + Ссылка = МоментВремени.Ссылка; +КонецПроцедуры + +#КонецОбласти diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Настройки.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Настройки.xml new file mode 100644 index 0000000..089c3b3 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Настройки.xml @@ -0,0 +1,22 @@ + + +
+ + Настройки + + + ru + Настройки + + + + Managed + false + + PlatformApplication + MobilePlatformApplication + + + +
+
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Настройки/Ext/Form.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Настройки/Ext/Form.xml new file mode 100644 index 0000000..e359577 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Настройки/Ext/Form.xml @@ -0,0 +1,132 @@ + +
+ + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Настройки</v8:content> + </v8:item> + + LockOwnerWindow + false + useIfNecessary + + false + + + + + + ПриСозданииНаСервере + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Автосохранение</v8:content> + </v8:item> + + + + ru + Автосохранение + + + Horizontal + None + false + + + + Объект.ИспользоватьАвтосохранение + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Автоматически сохранять каждые (мин.):</v8:content> + </v8:item> + + Right + Auto + + + + + Объект.ПериодАвтосохранения + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Период автосохранения (с)</v8:content> + </v8:item> + + None + 4 + true + + + + + + + Объект.ВыводитьВРезультатахЗапросаЗначенияСсылок + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Выводить в результатах запроса значения ссылок</v8:content> + </v8:item> + + Right + Auto + + + + + Объект.ЧередованиеЦветовВРезультатеЗапроса + Right + Auto + + + + + Объект.ТипОбхода + + + + + + + + cfg:ExternalDataProcessorObject.ИнструментыРазработчикаКонсольЗапросов + + true + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Записать</v8:content> + </v8:item> + + + + ru + Записать + + + Записать + DontUse + + +
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Настройки/Ext/Form/Module.bsl b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Настройки/Ext/Form/Module.bsl new file mode 100644 index 0000000..5fba86a --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Настройки/Ext/Form/Module.bsl @@ -0,0 +1,53 @@ + +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + ПараметрыПередачи = ПолучитьИзВременногоХранилища(Параметры.АдресХранилища); + Объект.ИспользоватьАвтосохранение = ПараметрыПередачи.ИспользоватьАвтосохранение; + Объект.ПериодАвтосохранения = ПараметрыПередачи.ПериодАвтосохранения; + Объект.ВыводитьВРезультатахЗапросаЗначенияСсылок = ПараметрыПередачи.ВыводитьВРезультатахЗапросаЗначенияСсылок; + Объект.ТипОбхода = ПараметрыПередачи.ТипОбхода; + Объект.ЧередованиеЦветовВРезультатеЗапроса = ПараметрыПередачи.ЧередованиеЦветовВРезультатеЗапроса; + + Элементы.ТипОбхода.СписокВыбора.Добавить("Авто"); + Элементы.ТипОбхода.СписокВыбора.Добавить("Прямой"); +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиКомандФормы + +&НаКлиенте +Процедура Записать(Команда) + ПараметрыПередачи = ПоместитьНастройкиВСтруктуру(); + + // Передача в открывающую форму. + Закрыть(); + Владелец = ЭтотОбъект.ВладелецФормы; + + Оповестить("ПередатьПараметрыНастроек" , ПараметрыПередачи); + Оповестить("ПередатьПараметрыНастроекАвтоСохранения"); +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции +&НаСервере +Функция ОбъектОбработки() + Возврат РеквизитФормыВЗначение("Объект"); +КонецФункции + +&НаСервере +Функция ПоместитьНастройкиВСтруктуру() + ПараметрыПередачи = Новый Структура; + ПараметрыПередачи.Вставить("АдресХранилища", ОбъектОбработки().ПоместитьНастройкиВоВременноеХранилище(Объект)); + Возврат ПараметрыПередачи; +КонецФункции + +#КонецОбласти diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ПланВыполненияЗапроса.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ПланВыполненияЗапроса.xml new file mode 100644 index 0000000..a4edd53 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ПланВыполненияЗапроса.xml @@ -0,0 +1,22 @@ + + +
+ + ПланВыполненияЗапроса + + + ru + План выполнения запроса + + + + Managed + false + + PlatformApplication + MobilePlatformApplication + + + +
+
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ПланВыполненияЗапроса/Ext/Form.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ПланВыполненияЗапроса/Ext/Form.xml new file mode 100644 index 0000000..fce6057 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ПланВыполненияЗапроса/Ext/Form.xml @@ -0,0 +1,1050 @@ + +
+ + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>План выполнения запроса</v8:content> + </v8:item> + + false + + false + + + ПриОткрытии + ПриСозданииНаСервере + + + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа информация о стоимости запроса</v8:content> + </v8:item> + + Vertical + None + false + + + + СуммарнаяСтоимостьЗапроса + + + ru + Сумма общих затрат оптимизатора запросов на выполнение всех операций в всех операторах + + + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа план выполнения запроса</v8:content> + </v8:item> + + None + + + + + + + Tree + true + false + false + true + Beginning + ExpandAllLevels + true + true + AsFile + ДеревоПланаВыполненияЗапроса + None + None + None + + + false + + + + + ДеревоПланаВыполненияЗапроса + SearchStringRepresentation + + + + + + + ДеревоПланаВыполненияЗапроса + ViewStatusRepresentation + + + + + + + ДеревоПланаВыполненияЗапроса + SearchControl + + + + + + ДеревоПриАктивизацииСтроки + + + + ДеревоПланаВыполненияЗапроса.Оператор + false + EnterOnInput + 50 + + + + + ДеревоПланаВыполненияЗапроса.ОператорМетаданные + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Оператор</v8:content> + </v8:item> + + EnterOnInput + 50 + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Стоимость</v8:content> + </v8:item> + + Horizontal + true + Center + + + + ДеревоПланаВыполненияЗапроса.Стоимость + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>оператора</v8:content> + </v8:item> + + EnterOnInput + 9 + + + ru + ЧН=0 + + + + + ru + ЧН=0 + + + + + + + ДеревоПланаВыполненияЗапроса.СтоимостьОбщая + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>с подчиненными узлами</v8:content> + </v8:item> + + + + ru + Общие затраты оптимизатора запросов на выполнение этой и всех предшествующих операций в данной ветке. + + + EnterOnInput + 13 + false + + + ru + ЧН=0 + + + + + ru + ЧН=0 + + + false + + + + + + + ДеревоПланаВыполненияЗапроса.ЗатратыВводаВывода + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Затраты В/В</v8:content> + </v8:item> + + + + ru + Приблизительные затраты на выполнение действий ввода-вывода для данной операции. Это значение должно быть минимально возможным. + + + EnterOnInput + 13 + + + + + ДеревоПланаВыполненияЗапроса.ЗагрузкаЦП + + + ru + Приблизительные затраты на произведение ЦП всех вычислений для данной операции. + + + EnterOnInput + 13 + + + + + ДеревоПланаВыполненияЗапроса.СреднийРазмерСтрок + + + ru + Предполагаемый средний размер строк (в байтах), передаваемых через данный оператор. + + + EnterOnInput + 21 + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Вызовы</v8:content> + </v8:item> + + + + ru + Прогнозируемые и фактические вызовы во время выполнения запроса + + + 13 + Horizontal + true + Center + + + + ДеревоПланаВыполненияЗапроса.ВызовыПлан + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>План</v8:content> + </v8:item> + + + + ru + Предполагаемое количество вызовов данного оператора при выполнении текущего запроса. + + + EnterOnInput + 8 + + + + + ДеревоПланаВыполненияЗапроса.ВызовыФакт + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Факт.</v8:content> + </v8:item> + + + + ru + Фактическое количество вызовов данного оператора при выполнении текущего запроса. + + + EnterOnInput + 8 + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Строки</v8:content> + </v8:item> + + + + ru + Прогнозируемые и фактические строки во время выполнения запроса + + + 13 + Horizontal + true + Center + + + + ДеревоПланаВыполненияЗапроса.СтрокиПлан + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>План</v8:content> + </v8:item> + + + + ru + Предполагаемое +количество строк вывода от данного оператора. + + + EnterOnInput + 6 + + + + + ДеревоПланаВыполненияЗапроса.СтрокиФакт + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Факт.</v8:content> + </v8:item> + + + + ru + Фактическое количество +строк, созданных каждым +оператором. + + + EnterOnInput + 10 + + + + + + + ДеревоПланаВыполненияЗапроса.Отступ + false + EnterOnInput + + + + +
+ + ОписаниеОператора + None + Button + 3 + true + false + true + true + false + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Информацию по планам запросов СУБД см. также в документации по платформе +1С:Предприятие 8.3 Приложение 3 "Описание и расположение служебных файлов", раздел 3.17 "logcfg.xml"</v8:content> + </v8:item> + + + +
+
+ + + + + ПланВыполненияЗапросаТекст + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>План выполнения запроса</v8:content> + </v8:item> + + None + + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Получение плана выполнения запроса</v8:content> + </v8:item> + + Horizontal + + + + 6 + 3 + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Анимация длительная операция</v8:content> + </v8:item> + + + CommonPicture.ДлительнаяОперация48 + true + + AsFile + + + + + 3 + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Получение плана выполнения запроса...</v8:content> + </v8:item> + + + + + + +
+
+ + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сформированный SQL-текст запроса</v8:content> + </v8:item> + + Vertical + + + + СформированныйСКЛТекстЗапроса + true + None + + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Режимы выводы информации</v8:content> + </v8:item> + + Horizontal + None + false + + + + ВидОтображенияДанных + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Выводить</v8:content> + </v8:item> + + + + ru + Выводит текст запроса и план выполнения запроса в виде имен объектов метаданных или в виде имен объектов базы данных + + + Button + 30 + true + + + + 0 + + + + ru + Имена реквизитов и объектов метаданных + + + 0 + + + + + 0 + + + + ru + Имена колонок и таблиц базы данных + + + 1 + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Текст запроса с именами колонок и таблиц базы данных можно скопировать в консоль выполнения запросов используемой СУБД для более детального анализа.</v8:content> + </v8:item> + + + + ТипПоказаЗапросаПриИзменении + + + + ПоказыватьПланВыполненияЗапросаВВиде + false + + + ru + Показывать план выполнения запроса в виде дерева или в текстовом виде как возвращает его база данных + + + true + false + + + + 0 + + + + ru + Таблицы + + + 0 + + + + + 0 + + + + ru + Текста + + + 1 + + + + + + + ПоказыватьПланВыполненияЗапросаВВидеПриИзменении + + + + +
+ + + + cfg:ExternalDataProcessorObject.ИнструментыРазработчикаКонсольЗапросов + + true + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>План выполнения запроса текст</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сформированный SQL-текст запроса</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Вид отображения данных</v8:content> + </v8:item> + + + xs:decimal + + 10 + 0 + Any + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Описание оператора</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип СУБД</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Текст запроса ВСКЛ</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Текст запроса в виде метаданных</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>План выполнения запроса в метаданных</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>План выполнения запроса из тех журнала</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Метка запроса</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор процесса ОС</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Дерево плана выполнения запроса</v8:content> + </v8:item> + + + v8:ValueTree + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Оператор</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Отступ</v8:content> + </v8:item> + + + xs:decimal + + 0 + 0 + Any + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Строки факт</v8:content> + </v8:item> + + + xs:decimal + + 0 + 0 + Any + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Вызовы факт</v8:content> + </v8:item> + + + xs:decimal + + 0 + 0 + Any + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Вызовы план</v8:content> + </v8:item> + + + xs:decimal + + 0 + 0 + Any + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Затраты ввода вывода</v8:content> + </v8:item> + + + xs:string + + 12 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Загрузка ЦП</v8:content> + </v8:item> + + + xs:string + + 12 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Средний размер строк</v8:content> + </v8:item> + + + xs:string + + 12 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Стоимость общая</v8:content> + </v8:item> + + + xs:decimal + + 15 + 7 + Any + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Строки план</v8:content> + </v8:item> + + + xs:decimal + + 10 + 0 + Any + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Оператор метаданные</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Стоимость</v8:content> + </v8:item> + + + xs:decimal + + 15 + 7 + Any + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Требуется прочитать журнал имя</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Количество попыток</v8:content> + </v8:item> + + + xs:decimal + + 10 + 0 + Any + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сумма общих затрат оптимизатора запросов на выполнение всех операций включая дочерние операторы</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Показывать план выполнения запроса в виде</v8:content> + </v8:item> + + + xs:decimal + + 10 + 0 + Any + + + + + + + + xs:string + + 100 + Variable + + + + + + xs:string + + 0 + Variable + + + + + \ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ПланВыполненияЗапроса/Ext/Form/Module.bsl b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ПланВыполненияЗапроса/Ext/Form/Module.bsl new file mode 100644 index 0000000..a4e3ee7 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ПланВыполненияЗапроса/Ext/Form/Module.bsl @@ -0,0 +1,246 @@ +#Область ОбработчикиСобытийФормы + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + + Если НЕ ЗначениеЗаполнено(Параметры.МеткаЗапроса) Тогда + Отказ = Истина; + Возврат; + КонецЕсли; + + МеткаЗапроса = Параметры.МеткаЗапроса; + + ЭтотОбъект.Заголовок = НСтр("ru = 'План выполнения запроса ('") + Параметры.ИмяЗапроса + ")"; + + ПолноеИмяФайлаЖурнала = ФайлТехнологическийЖурнал(Параметры.ИдентификаторПроцессаОС, Параметры.КаталогСЛогФайлами); + Если НЕ ДанныеИзТехнологическогоЖурналаПрочитаны(ПолноеИмяФайлаЖурнала) Тогда + Элементы.ГруппаПланВыполненияЗапроса.ТекущаяСтраница = Элементы.ГруппаПолучениеПланаВыполненияЗапроса; + ТребуетсяПрочитатьЖурналИмя = ПолноеИмяФайлаЖурнала; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовФормы + +&НаКлиенте +Процедура ТипПоказаЗапросаПриИзменении(Элемент) + + Если ВидОтображенияДанных = 0 Тогда + Если ТипСУБД = "DBMSSQL" Тогда + Элементы.ДеревоОператорМетаданные.Видимость=Истина; + Элементы.ДеревоОператор.Видимость=Ложь; + Иначе + ПланВыполненияЗапросаТекст = ПланВыполненияЗапросаВМетаданных; + КонецЕсли; + СформированныйСКЛТекстЗапроса = ТекстЗапросаВВидеМетаданных; + Иначе + Если ТипСУБД = "DBMSSQL" Тогда + Элементы.ДеревоОператорМетаданные.Видимость=Ложь; + Элементы.ДеревоОператор.Видимость=Истина; + Иначе + ПланВыполненияЗапросаТекст = ПланВыполненияЗапросаИзТехЖурнала; + КонецЕсли; + + СформированныйСКЛТекстЗапроса = ТекстЗапросаВСКЛ; + КонецЕсли; +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытийЭлементовТаблицыФормыПланВыполненияЗапросаSQLServer + +&НаКлиенте +Процедура ДеревоПриАктивизацииСтроки(Элемент) + Если ТипСУБД = "DBMSSQL" Тогда + Если ВидОтображенияДанных = 0 Тогда + ОписаниеОператора = Элемент.ТекущиеДанные.ОператорМетаданные; + Иначе + ОписаниеОператора = Элемент.ТекущиеДанные.Оператор; + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеФункции + +&НаСервере +Функция ОбъектОбработки() + Возврат РеквизитФормыВЗначение("Объект"); +КонецФункции + +&НаСервере +Функция ФайлТехнологическийЖурнал(ИдентификаторПроцессаОС, КаталогСЛогФайлами) + + ОжидаемоеИмяФайла = ИмяФайлТехнологическийЖурнал(ТекущаяДатаСеанса()); + + ПолноеИмяФайлаЖурнала = НайтиФайлТехнологическийЖурнал(ОжидаемоеИмяФайла, ИдентификаторПроцессаОС, КаталогСЛогФайлами); + Если ЗначениеЗаполнено(ПолноеИмяФайлаЖурнала) Тогда + Возврат ПолноеИмяФайлаЖурнала; + Иначе + ОжидаемоеИмяФайла = ИмяФайлТехнологическийЖурнал(ТекущаяДатаСеанса() - 3600); + ПолноеИмяФайлаЖурнала = НайтиФайлТехнологическийЖурнал(ОжидаемоеИмяФайла, ИдентификаторПроцессаОС, КаталогСЛогФайлами); + Если ЗначениеЗаполнено(ПолноеИмяФайлаЖурнала) Тогда + Возврат ПолноеИмяФайлаЖурнала; + КонецЕсли; + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +&НаСервере +Функция ИмяФайлТехнологическийЖурнал(ДатаФайла) + ОжидаемоеИмяФайла = Формат(ДатаФайла, "ДФ=yyMMddHH")+ ".log"; + Возврат ОжидаемоеИмяФайла; +КонецФункции + +&НаСервере +Функция НайтиФайлТехнологическийЖурнал(ИмяФайла, ИдентификаторПроцессаОС, КаталогСЛогФайлами) + + СписокФайлов = НайтиФайлы(КаталогСЛогФайлами, "*.log", Истина); + Для каждого Файл Из СписокФайлов Цикл + Если Найти(Файл.Путь, "_" + ИдентификаторПроцессаОС) > 0 Тогда + Если Файл.Имя = ИмяФайла Тогда + Возврат Файл.ПолноеИмя; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Возврат Неопределено; + +КонецФункции + +&НаСервере +Функция ДанныеИзТехнологическогоЖурналаПрочитаны(ПолноеИмяФайлаЖурнала) + + ПрочитанныеДанные = Новый Структура("ТипСУБД, СКЛЗапрос, ПланВыполненияЗапроса"); + ОбъектОбработки().ПрочитатьТехнологическийЖурнал(ПолноеИмяФайлаЖурнала, МеткаЗапроса, ПрочитанныеДанные); + + ТипСУБД = ПрочитанныеДанные.ТипСУБД; + ТекстЗапросаВСКЛ = ПрочитанныеДанные.СКЛЗапрос; + ПланВыполненияЗапросаИзТехЖурнала = ПрочитанныеДанные.ПланВыполненияЗапроса; + + Если НЕ ЗначениеЗаполнено(ТипСУБД) Тогда + Возврат Ложь; + КонецЕсли; + + ВВидеМетаданных = ОбъектОбработки().ПреобразоватьВМетаданные(ТекстЗапросаВСКЛ, ПланВыполненияЗапросаИзТехЖурнала, ТипСУБД); + + ТекстЗапросаВВидеМетаданных = ВВидеМетаданных.ТекстЗапросаВВидеМетаданных; + ПланВыполненияЗапросаВМетаданных = ВВидеМетаданных.ПланВыполненияЗапросаВМетаданных; + + СформированныйСКЛТекстЗапроса = ВВидеМетаданных.ТекстЗапросаВВидеМетаданных; + ПланВыполненияЗапросаТекст = ВВидеМетаданных.ПланВыполненияЗапросаВМетаданных; + + Если ТипСУБД = "DBMSSQL" Тогда + СуммарнаяСтоимостьОбщая = 0; + Элементы.ГруппаПланВыполненияЗапроса.ТекущаяСтраница = Элементы.ГруппаПланВыполненияЗапросаSQLСервер; + ДеревоПланаЗапроса = РеквизитФормыВЗначение("ДеревоПланаВыполненияЗапроса"); + ОбъектОбработки().ПолучитьДеревоПланаВыполненияЗапроса(ПланВыполненияЗапросаИзТехЖурнала, ПланВыполненияЗапросаВМетаданных, ДеревоПланаЗапроса, СуммарнаяСтоимостьОбщая); + ЗначениеВРеквизитФормы(ДеревоПланаЗапроса, "ДеревоПланаВыполненияЗапроса"); + СуммарнаяСтоимостьЗапроса = СуммарнаяСтоимостьОбщая; + Элементы.ГруппаИнформацияОСтоимостиЗапроса.Видимость = Истина; + Элементы.ПоказыватьПланВыполненияЗапросаВВиде.Видимость = Истина; + Максимум = НайтиМаксимальныйПоказательСтоимости(ДеревоПланаЗапроса.Строки); + УстановитьОформлениеДанныхВКолонкеСтоимость(Максимум); + Иначе + Элементы.ГруппаИнформацияОСтоимостиЗапроса.Видимость = Ложь; + Элементы.ГруппаПланВыполненияЗапроса.ТекущаяСтраница = Элементы.ГруппаПланВыполненияЗапросаТекстовоеПредставление; + Элементы.ПоказыватьПланВыполненияЗапросаВВиде.Видимость = Ложь; + КонецЕсли; + + Возврат Истина; + +КонецФункции + +&НаСервере +Процедура УстановитьОформлениеДанныхВКолонкеСтоимость(Максимум) + + УсловноеОформление.Элементы.Очистить(); + ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); + + ПолеОформления = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); + ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ДеревоСтоимость"); + ПолеОформления.Использование = Истина; + + ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); + ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДеревоПланаВыполненияЗапроса.Стоимость"); + ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; + ЭлементОтбора.ПравоеЗначение = Максимум; + ЭлементОтбора.Использование = Истина; + ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра("Шрифт", Новый Шрифт(, , Истина)); + +КонецПроцедуры + + +&НаСервере +Функция НайтиМаксимальныйПоказательСтоимости(СтрокиДерева, Максимум = 0) + + + Для каждого Строка Из СтрокиДерева Цикл + Если Строка.Строки.Количество() > 0 Тогда + Максимум = НайтиМаксимальныйПоказательСтоимости(Строка.Строки, Максимум); + КонецЕсли; + Если Строка.Стоимость > Максимум Тогда + Максимум = Строка.Стоимость; + КонецЕсли; + КонецЦикла; + + Возврат Максимум; + +КонецФункции + +&НаКлиенте +Процедура ПриОткрытии(Отказ) + Если ЗначениеЗаполнено(ТребуетсяПрочитатьЖурналИмя) Тогда + ПодключитьОбработчикОжидания("ПрочитатьДанныеИзТехнологическогоЖурналаОбработчик", 2); + Элементы.ГруппаПолучениеПланаВыполненияЗапроса.Видимость = Истина; + КоличествоПопыток = 0; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПрочитатьДанныеИзТехнологическогоЖурналаОбработчик() + + Если ДанныеИзТехнологическогоЖурналаПрочитаны(ТребуетсяПрочитатьЖурналИмя) Тогда + ОтключитьОбработчикОжидания("ПрочитатьДанныеИзТехнологическогоЖурналаОбработчик"); + ТребуетсяПрочитатьЖурналИмя = Неопределено; + Элементы.ГруппаПолучениеПланаВыполненияЗапроса.Видимость = Ложь; + Иначе + Если КоличествоПопыток < 5 Тогда + КоличествоПопыток = КоличествоПопыток + 1; + Иначе + ОтключитьОбработчикОжидания("ПрочитатьДанныеИзТехнологическогоЖурналаОбработчик"); + ТребуетсяПрочитатьЖурналИмя = Неопределено; + Элементы.ГруппаПолучениеПланаВыполненияЗапроса.Видимость = Ложь; + ПоказатьПредупреждение(, НСтр("ru = 'Ошибка получения плана выполнения запроса'")); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПоказыватьПланВыполненияЗапросаВВидеПриИзменении(Элемент) + + Если ПоказыватьПланВыполненияЗапросаВВиде = 0 Тогда + Элементы.ГруппаПланВыполненияЗапроса.ТекущаяСтраница = Элементы.ГруппаПланВыполненияЗапросаSQLСервер; + Иначе + Элементы.ГруппаПланВыполненияЗапроса.ТекущаяСтраница = Элементы.ГруппаПланВыполненияЗапросаТекстовоеПредставление; + КонецЕсли; + +КонецПроцедуры + + + +#КонецОбласти + + diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/РезультатЗапроса.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/РезультатЗапроса.xml new file mode 100644 index 0000000..a8ce1b9 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/РезультатЗапроса.xml @@ -0,0 +1,22 @@ + + +
+ + РезультатЗапроса + + + ru + Результат запроса + + + + Managed + false + + PlatformApplication + MobilePlatformApplication + + + +
+
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/РезультатЗапроса/Ext/Form.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/РезультатЗапроса/Ext/Form.xml new file mode 100644 index 0000000..ff45a8b --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/РезультатЗапроса/Ext/Form.xml @@ -0,0 +1,72 @@ + +
+ + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Результат запроса</v8:content> + </v8:item> + + false + useIfNecessary + + + + + + + ПриСозданииНаСервере + + + + Результат + None + true + true + true + + + + + + + + cfg:ExternalDataProcessorObject.ИнструментыРазработчикаКонсольЗапросов + + true + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Результат</v8:content> + </v8:item> + + + mxl:SpreadsheetDocument + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Закрыть</v8:content> + </v8:item> + + + + ru + Закрыть форму + + + ЗакрытьФорму + DontUse + + +
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/РезультатЗапроса/Ext/Form/Module.bsl b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/РезультатЗапроса/Ext/Form/Module.bsl new file mode 100644 index 0000000..419ed24 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/РезультатЗапроса/Ext/Form/Module.bsl @@ -0,0 +1,19 @@ + +#Область ОбработчикиСобытий + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + Результат = Параметры.РезультатЗапроса; +КонецПроцедуры + +&НаКлиенте +Процедура ЗакрытьФорму(Команда) + Закрыть(); +КонецПроцедуры + +#КонецОбласти diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТаблицаЗначений.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТаблицаЗначений.xml new file mode 100644 index 0000000..ed1f539 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТаблицаЗначений.xml @@ -0,0 +1,22 @@ + + +
+ + ТаблицаЗначений + + + ru + Таблица значений + + + + Managed + false + + PlatformApplication + MobilePlatformApplication + + + +
+
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТаблицаЗначений/Ext/Form.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТаблицаЗначений/Ext/Form.xml new file mode 100644 index 0000000..ae44e02 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТаблицаЗначений/Ext/Form.xml @@ -0,0 +1,326 @@ + +
+ + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Таблица значений</v8:content> + </v8:item> + + LockOwnerWindow + false + useIfNecessary + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Форма группа кнопок</v8:content> + </v8:item> + + + + ru + Форма группа кнопок + + + + + + + + + + + + + + + + ПриСозданииНаСервере + + + + List + true + true + true + true + AsFile + НастройкиТаблицыЗначений + None + None + None + + + + false + + + + + НастройкиТаблицыЗначений + SearchStringRepresentation + + + + + + + НастройкиТаблицыЗначений + ViewStatusRepresentation + + + + + + + НастройкиТаблицыЗначений + SearchControl + + + + + + НастройкиТаблицыЗначенийПередНачаломДобавления + НастройкиТаблицыЗначенийПередУдалением + + + + НастройкиТаблицыЗначений.НаименованиеКолонки + EnterOnInput + + + + НастройкитаблицыЗначенийНаименованиеКолонкиОкончаниеВводаТекста + + + + НастройкиТаблицыЗначений.ТипКолонки + EnterOnInput + + + + НастройкитаблицыЗначенийТипКолонкиПриИзменении + + + +
+ + List + true + true + true + true + AsFile + ТаблицаЗначенийПараметр + None + None + None + + + + + + + ТаблицаЗначенийПараметр + SearchStringRepresentation + + + + + + + ТаблицаЗначенийПараметр + ViewStatusRepresentation + + + + + + + ТаблицаЗначенийПараметр + SearchControl + + + + +
+
+ + + + cfg:ExternalDataProcessorObject.ИнструментыРазработчикаКонсольЗапросов + + true + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Настройки таблицы значений</v8:content> + </v8:item> + + + v8:ValueTable + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Наименование колонки</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип колонки</v8:content> + </v8:item> + + + v8:TypeDescription + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Таблица значений параметр</v8:content> + </v8:item> + + + v8:ValueTable + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор текущего параметра</v8:content> + </v8:item> + + + v8:UUID + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор текущего запроса</v8:content> + </v8:item> + + + v8:UUID + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Имя файла</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Имя родителя</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Список типов</v8:content> + </v8:item> + + + v8:ValueListType + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Записать и закрыть</v8:content> + </v8:item> + + + + ru + Записать таблицу значений в параметр + + + ВыгрузитьТаблицуЗначений + Text + DontUse + + +
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТаблицаЗначений/Ext/Form/Module.bsl b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТаблицаЗначений/Ext/Form/Module.bsl new file mode 100644 index 0000000..8d21bce --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТаблицаЗначений/Ext/Form/Module.bsl @@ -0,0 +1,490 @@ +&НаКлиенте +Перем ИмяКолонкиПоУмолчанию; + +#Область ОбработчикиСобытий + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + // Считывание параметров передачи. + ПараметрыПередачи = ПолучитьИзВременногоХранилища(Параметры.АдресХранилища); + Объект.Запросы.Загрузить(ПараметрыПередачи.Запросы); + Объект.Параметры.Загрузить(ПараметрыПередачи.Параметры); + Объект.ИмяФайла = ПараметрыПередачи.ИмяФайла; + ИдентификаторТекущегоЗапроса = ПараметрыПередачи.ИдентификаторТекущегоЗапроса; + ИдентификаторТекущегоПараметра = ПараметрыПередачи.ИдентификаторТекущегоПараметра; + + Объект.ДоступныеТипыДанных = ОбъектОбработки().Метаданные().Реквизиты.ДоступныеТипыДанных.Тип; + ОбъектОбработки().СформироватьСписокТипов(СписокТипов); + + ЗаполнитьТаблицыПриОткрытии(); +КонецПроцедуры + +&НаКлиенте +Процедура НастройкиТаблицыЗначенийТипКолонкиПриИзменении(Элемент) + // Определение наименования колонки. + ПервыйТип = ""; + + ТекущаяКолонка = Элементы.НастройкиТаблицыЗначений.ТекущиеДанные; + ТипКолонки = ТекущаяКолонка.ТипКолонки; + СтароеИмяКолонки= ТекущаяКолонка.НаименованиеКолонки; + + ДоступныеТипы = ТекущаяКолонка.ТипКолонки.Типы(); + Количество = ДоступныеТипы.Количество(); + Если Количество > 0 Тогда + Флаг = Ложь; + Для каждого ЭлементСписка Из СписокТипов Цикл + Если ЭлементСписка.Представление = Строка(ДоступныеТипы.Получить(0)) Тогда + Флаг = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + Если Флаг Тогда + ПервыйТип = Строка(ДоступныеТипы.Получить(0)); // для примитивных типов. + Иначе + ПервыйТип = Новый(ДоступныеТипы.Получить(0)); + ПервыйТип = ИмяТипаПоЗначению(ПервыйТип); + КонецЕсли; + КонецЕсли; + + ИдентификаторСтроки = ТекущаяКолонка.ПолучитьИдентификатор(); + Если Найти(ВРег(СтароеИмяКолонки), ВРег(ИмяКолонкиПоУмолчанию)) <> 0 Тогда + НовоеИмяКолонки = СформироватьИмяКолонки(ПервыйТип, ИдентификаторСтроки); + Иначе + НовоеИмяКолонки = СтароеИмяКолонки; + КонецЕсли; + ТекущаяКолонка.НаименованиеКолонки = НовоеИмяКолонки; + + ТекущаяСтрока = Элементы.НастройкиТаблицыЗначений.ТекущаяСтрока; + + ИнициализацияКолонкиВТЗКлиент(СтароеИмяКолонки, НовоеИмяКолонки, ТипКолонки); +КонецПроцедуры + +&НаКлиенте +Процедура НастройкиТаблицыЗначенийПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + Отказ = Истина; + + ИдентификаторСтроки = Новый УникальныйИдентификатор; + ИмяКолонки = СформироватьИмяКолонки(ИмяКолонкиПоУмолчанию, ИдентификаторСтроки); + + МассивТипов = Новый Массив; + МассивТипов.Добавить(Тип("Строка")); + ТипКолонки = Новый ОписаниеТипов(МассивТипов); + + ЭлементНастройки = НастройкиТаблицыЗначений.Добавить(); + ЭлементНастройки.НаименованиеКолонки = ИмяКолонки; + ЭлементНастройки.ТипКолонки = ТипКолонки; + + ИнициализацияКолонкиВТЗКлиент("", ИмяКолонки, ТипКолонки) +КонецПроцедуры + +&НаКлиенте +Процедура НастройкиТаблицыЗначенийНаименованиеКолонкиОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, СтандартнаяОбработка) + ТекущаяКолонкаТЗ = Элементы.НастройкиТаблицыЗначений.ТекущиеДанные; + СтароеИмя = ТекущаяКолонкаТЗ.НаименованиеКолонки; + ТипКолонки = ТекущаяКолонкаТЗ.ТипКолонки; + ИдентификаторСтроки = ТекущаяКолонкаТЗ.ПолучитьИдентификатор(); + + Текст = УбратьСимволыИзТекста(Текст); + + Если Не ПустаяСтрока(Текст) Тогда + НовоеИмя = СформироватьИмяКолонки(Текст, ИдентификаторСтроки); + Иначе + НовоеИмя = СформироватьИмяКолонки(ИмяКолонкиПоУмолчанию, ИдентификаторСтроки); + + ПоказатьСообщениеПользователю(НСтр("ru = 'Наименование колонки не может быть пустым.'"), "Объект"); + КонецЕсли; + + ТекущаяКолонкаТЗ.НаименованиеКолонки = НовоеИмя; + + Если ТипКолонки.Типы().Количество() <> 0 Тогда + ИзменитьИмяРеквизитаИКолонкиСервер(СтароеИмя, НовоеИмя, ТипКолонки); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура НастройкиТаблицыЗначенийПередУдалением(Элемент, Отказ) + ТекущаяСтрока = Элементы.НастройкиТаблицыЗначений.ТекущаяСтрока; + ТекущаяКолонкаТЗ = Элементы.НастройкиТаблицыЗначений.ТекущиеДанные; + ИмяКолонки = ТекущаяКолонкаТЗ.НаименованиеКолонки; + ТипКолонки = ТекущаяКолонкаТЗ.ТипКолонки; + + Если ТипКолонки.Типы().Количество() <> 0 Тогда + УдалитьКолонкуСервер(ИмяКолонки); + КонецЕсли; + + ЭлементКоллекции = НастройкиТаблицыЗначений.НайтиПоИдентификатору(ТекущаяСтрока); + ИндексЭлементаКоллекции = НастройкиТаблицыЗначений.Индекс(ЭлементКоллекции); + НастройкиТаблицыЗначений.Удалить(ИндексЭлементаКоллекции); +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////// +// КОМАНДЫ + +&НаКлиенте +Процедура ВыгрузитьТаблицуЗначений(Команда) + ВыгрузитьТаблицуЗначенийСервер(); +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Функция ОбъектОбработки() + Возврат РеквизитФормыВЗначение("Объект"); +КонецФункции + +// Формирует колонки для Таблицы значений из Настроек таблицы значений. +// +// Изменяет реквизиты текущего параметра. +// +&НаКлиенте +Процедура ВыгрузитьТаблицуЗначенийСервер() + ПараметрыПередачи = ПоместитьЗапросыВСтруктуру(ИдентификаторТекущегоЗапроса, ИдентификаторТекущегоПараметра); + + Закрыть(); + Владелец = ЭтотОбъект.ВладелецФормы; + Владелец.Модифицированность = Истина; + + Оповестить("ВыгрузитьЗапросыВРеквизиты", ПараметрыПередачи); +КонецПроцедуры + +&НаСервере +Функция ВнутрЗначениеОбъектаТЗ() + ТЗ = РеквизитФормыВЗначение("ТаблицаЗначенийПараметр"); + Возврат ЗначениеВСтрокуВнутр(ТЗ); +КонецФункции + +&НаСервере +Функция ПоместитьЗапросыВСтруктуру(ИдентификаторЗапроса,ИдентификаторПараметра) + ПараметрыФормы = Объект.Параметры; + + ПредставлениеТЗ = СформироватьПредставлениеТаблицыЗначений(ПредставлениеТЗ); + + Для каждого Стр Из ПараметрыФормы Цикл + Если Стр.Идентификатор = ИдентификаторТекущегоПараметра Тогда + Стр.Тип = "ТаблицаЗначений"; + Стр.Значение = ВнутрЗначениеОбъектаТЗ(); + Стр.ТипВФорме = НСтр("ru = 'Таблица значений'"); + Стр.ЗначениеВФорме = ПредставлениеТЗ; + КонецЕсли; + КонецЦикла; + + ПараметрыПередачи = Новый Структура; + ПараметрыПередачи.Вставить("АдресХранилища", ОбъектОбработки().ПоместитьЗапросыВоВременноеХранилище(Объект, ИдентификаторЗапроса, ИдентификаторПараметра)); + + Возврат ПараметрыПередачи; +КонецФункции + +// Заполняет таблицы значений в форме по загружаемой таблице значений. +// +&НаСервере +Процедура ЗаполнитьТаблицыПриОткрытии() + ПараметрыФормы = Объект.Параметры; + Для каждого ТекущийПараметр Из ПараметрыФормы Цикл + Если ТекущийПараметр.Идентификатор = ИдентификаторТекущегоПараметра Тогда + Значение = ТекущийПараметр.Значение; + Если ПустаяСтрока(Значение) Тогда + Возврат; + Иначе + Прервать; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + // Формирование таблицы "Настройки". + ТЗ = ЗначениеИзСтрокиВнутр(Значение); + Если ТипЗнч(ТЗ) <> Тип("ТаблицаЗначений") Тогда + Возврат; + КонецЕсли; + + Колонки = ТЗ.Колонки; + Для Индекс = 0 По Колонки.Количество() - 1 Цикл + ТекущаяКолонка = Колонки.Получить(Индекс); + + ИмяКолонки = ТекущаяКолонка.Имя; + ТипКолонки = ТекущаяКолонка.ТипЗначения; + + Настройка = НастройкиТаблицыЗначений.Добавить(); + Настройка.НаименованиеКолонки = ИмяКолонки; + Настройка.ТипКолонки = ТипКолонки; + + ИнициализацияКолонкиВТЗСервер("", ИмяКолонки, ТипКолонки, ""); + КонецЦикла; + + // Заполнение таблицы значений. + Для каждого Строка Из ТЗ Цикл + ЭлементТЗ = ТаблицаЗначенийПараметр.Добавить(); + Для каждого Колонка Из ТЗ.Колонки Цикл + ЭлементТЗ[Колонка.Имя] = Строка[Колонка.Имя]; + КонецЦикла; + КонецЦикла; +КонецПроцедуры + +&НаСервере +Функция СформироватьПредставлениеТаблицыЗначений(Представление) + ТЗ = РеквизитФормыВЗначение("ТаблицаЗначенийПараметр"); + Представление = ОбъектОбработки().ФормированиеПредставленияЗначения(ТЗ); + + Возврат Представление; +КонецФункции + +// Формирует имя добавляемой колонки. +// Оно не должно совпадать с именем реквизита формы +// и с именем колонки. +// +// Параметры: +// Имя - передаваемое имя. +// +&НаКлиенте +Функция СформироватьИмяКолонки(знач ИмяКолонки, ИДТекСтроки) + НТЗ = НастройкиТаблицыЗначений; + Флаг = Истина; + Индекс = 0; + + ИмяКолонки = СокрЛП(ИмяКолонки); + + Пока Флаг Цикл + Имя = ИмяКолонки + Строка(Формат(Индекс, "ЧН=-")); + Имя = СтрЗаменить(Имя, "-", ""); + + // Если нет строки с таким именем. + Фильтр = Новый Структура("НаименованиеКолонки", Имя); + ОтфильтрованныеСтроки = НТЗ.НайтиСтроки(Фильтр); + Если ОтфильтрованныеСтроки.Количество() = 0 Тогда + Флаг = Ложь; + Иначе + Если ОтфильтрованныеСтроки.Получить(0).ПолучитьИдентификатор() <> ИДТекСтроки Тогда + Флаг = Истина; + Иначе + Флаг = Ложь; + КонецЕсли; + КонецЕсли; + + // Если нет колонки с таким именем. + Колонки = Элементы.ТаблицаЗначенийПараметр.ПодчиненныеЭлементы; + КолКолонок = Колонки.Количество(); + Для Индекс = 0 По КолКолонок - 1 Цикл + Если Колонки.Получить(Индекс).Имя = Имя Тогда + Флаг = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Результат = ?(Флаг, "", Имя); + + Индекс = Индекс + 1; + КонецЦикла; + + Возврат Результат; +КонецФункции + +&НаКлиенте +Процедура ИнициализацияКолонкиВТЗКлиент(СтароеИмяКолонки, НовоеИмяКолонки, ТипКолонки) + СообщениеСистемы = ""; + ИнициализацияКолонкиВТЗСервер(СтароеИмяКолонки, НовоеИмяКолонки, ТипКолонки, СообщениеСистемы); + Если НЕ ПустаяСтрока(СообщениеСистемы) Тогда + ПоказатьСообщениеПользователю(СообщениеСистемы, "Объект"); + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ИнициализацияКолонкиВТЗСервер(СтароеИмяКолонки, НовоеИмяКолонки, ТипКолонки, Сообщение = ""); + НачатьТранзакцию(); + + ИмяУдаляемогоРеквизита = ИмяРодителя + "." + СтароеИмяКолонки; + + // Заполнение массива удаляемыми реквизитами. + МассивУдаляемыхРеквизитов = Новый Массив; + РекРодителя = ПолучитьРеквизиты(ИмяРодителя); + Для каждого ТекРек Из РекРодителя Цикл + Если ТекРек.Имя = СтароеИмяКолонки Тогда + МассивУдаляемыхРеквизитов.Добавить(ИмяУдаляемогоРеквизита); + КонецЕсли; + КонецЦикла; + + // Выгрузка значений в таблицу значений. + Если Не ПустаяСтрока(СтароеИмяКолонки) Тогда + ТЗЗначений = ТаблицаЗначенийПараметр.Выгрузить(, СтароеИмяКолонки); + Иначе + ТЗЗначений = Неопределено; + КонецЕсли; + + // Добавление нового реквизита в объект. + ДобавляемыеРеквизиты = Новый Массив; + + НовыйРеквизит = Новый РеквизитФормы(НовоеИмяКолонки, ТипКолонки, ИмяРодителя, НовоеИмяКолонки, Ложь); + ДобавляемыеРеквизиты.Добавить(НовыйРеквизит); + ИзменитьРеквизиты(ДобавляемыеРеквизиты, МассивУдаляемыхРеквизитов); + + // Поиск колонки в "ТаблицаЗначенийПараметр" с условием ПутьКДанным=ПутьКНовомуРеквизиту. + ИмяДобавляемогоРеквизита = ИмяРодителя + "." + НовоеИмяКолонки; + НомерКолонки = ПоискКолонокВТЗСЗаданнымПутемКДанным(ИмяДобавляемогоРеквизита); + Если ТЗЗначений <> Неопределено Тогда + Если НомерКолонки <> Неопределено Тогда + ИмяПервойКолонки = ТЗЗначений.Колонки.Получить(0).Имя; + Индекс = 0; + Для Каждого Стр Из ТЗЗначений Цикл + ТаблицаЗначенийПараметр.Получить(Индекс)[НовоеИмяКолонки] = Стр[ИмяПервойКолонки]; + Индекс = Индекс + 1; + КонецЦикла; + КонецЕсли; + Иначе + НоваяКолонкаТаблицы = Элементы.Добавить(НовоеИмяКолонки, Тип("ПолеФормы"), Элементы.ТаблицаЗначенийПараметр); + НоваяКолонкаТаблицы.ПутьКДанным = ИмяДобавляемогоРеквизита; + НоваяКолонкаТаблицы.Вид = ВидПоляФормы.ПолеВвода; + КонецЕсли; + + ЗафиксироватьТранзакцию(); +КонецПроцедуры + +// Изменяет имя реквизита и колонки по идентификатору строки. +// +// Параметры: +// ИДСтроки - идентификатор строки таблицы значений настроек. +// Имя - новое передаваемое имя для реквизита и колонки. +// +&НаСервере +Процедура ИзменитьИмяРеквизитаИКолонкиСервер(СтароеИмя, НовоеИмя, ТипКолонки) + НачатьТранзакцию(); + + ИмяУдаляемогоРеквизита = ИмяРодителя + "." + СтароеИмя; + + // Заполнение массива удаляемыми реквизитами. + МассивУдаляемыхРеквизитов = Новый Массив; + РекРодителя = ПолучитьРеквизиты(ИмяРодителя); + Для каждого ТекРек Из РекРодителя Цикл + Если ТекРек.Имя = СтароеИмя Тогда + МассивУдаляемыхРеквизитов.Добавить(ИмяУдаляемогоРеквизита); + КонецЕсли; + КонецЦикла; + + // Выгрузка значений в таблицу значений. + ТЗЗначений = ТаблицаЗначенийПараметр.Выгрузить(, СтароеИмя); + + // Добавление нового реквизита в объект. + ДобавляемыеРеквизиты = Новый Массив; + НовыйРеквизит = Новый РеквизитФормы(НовоеИмя, ТипКолонки, ИмяРодителя, НовоеИмя, Ложь); + ДобавляемыеРеквизиты.Добавить(НовыйРеквизит); + ИзменитьРеквизиты(ДобавляемыеРеквизиты, МассивУдаляемыхРеквизитов); + + // Поиск колонки в "ТаблицаЗначенийПараметр" с условием ПутьКДанным = ПутьКНовомуРеквизиту. + ИмяДобавляемогоРеквизита = ИмяРодителя + "." + НовоеИмя; + НомерКолонки = ПоискКолонокВТЗСЗаданнымПутемКДанным(ИмяДобавляемогоРеквизита); + Если НомерКолонки <> Неопределено Тогда + ИмяПервойКолонки = ТЗЗначений.Колонки.Получить(0).Имя; + Индекс = 0; + Для Каждого СтарСтр Из ТЗЗначений Цикл + ТаблицаЗначенийПараметр.Получить(Индекс)[НовоеИмя] = СтарСтр[ИмяПервойКолонки]; + Индекс = Индекс + 1; + КонецЦикла; + КонецЕсли; + + ЗафиксироватьТранзакцию(); +КонецПроцедуры + +// Возвращает номер колонки с заданным путем. +// +// Параметры: +// ПутьКДанным - заданный путь. +// +// Возвращаемое значение: номер колонки или Неопределено. +// +&НаСервере +Функция ПоискКолонокВТЗСЗаданнымПутемКДанным(ПутьКДанным) + Колонки = Элементы.ТаблицаЗначенийПараметр.ПодчиненныеЭлементы; + КоличествоКолонок = Колонки.Количество(); + Флаг = Ложь; + Для Индекс = 0 По КоличествоКолонок - 1 Цикл + ТекКолонка = Колонки.Получить(Индекс); + Если ТекКолонка.ПутьКДанным = ПутьКДанным Тогда + Возврат Индекс; + КонецЕсли; + КонецЦикла; + Возврат Неопределено; +КонецФункции + +// Удаляет колонку по имени. +// +// Параметры: +// ИмяКолонки - имя колонки. +// +&НаСервере +Процедура УдалитьКолонкуСервер(ИмяКолонки) + ИмяУдаляемогоРеквизита = ИмяРодителя + "." + ИмяКолонки; + + // Заполнение массива удаляемыми реквизитами. + МассивУдаляемыхРеквизитов = Новый Массив; + РекРодителя = ПолучитьРеквизиты(ИмяРодителя); + Для каждого ТекРек Из РекРодителя Цикл + Если ТекРек.Имя = ИмяКолонки Тогда + МассивУдаляемыхРеквизитов.Добавить(ИмяУдаляемогоРеквизита); + КонецЕсли; + КонецЦикла; + + ИзменитьРеквизиты(, МассивУдаляемыхРеквизитов); +КонецПроцедуры + +&НаКлиенте +Процедура ПоказатьСообщениеПользователю(ТекстСообщения, ПутьКДанным) + ОчиститьСообщения(); + Сообщение = Новый СообщениеПользователю(); + Сообщение.Текст = ТекстСообщения; + Сообщение.ПутьКДанным = ПутьКДанным; + Сообщение.УстановитьДанные(Объект); + Сообщение.Сообщить(); +КонецПроцедуры + +&НаКлиенте +Функция УбратьСимволыИзТекста(знач Текст) + Результат = ""; + + ДлинаТекста = СтрДлина(Текст); + + Если ДлинаТекста = 0 Тогда + Возврат Результат; + КонецЕсли; + + Для Индекс = 0 По ДлинаТекста - 1 Цикл + СимволТекста = Лев(Текст, 1); + Если Не ЭтоСимвол(СимволТекста) Тогда + Результат = Результат + СимволТекста; + КонецЕсли; + Текст = Сред(Текст, 2); + КонецЦикла; + + Возврат Результат; +КонецФункции + +&НаКлиенте +Функция ЭтоСимвол(Символ) + // Символы между 1040 и 1103 - Русские буквы. + // Символы между 48 и 57 - Цифры. + // Символы между 65 и 122 - Английские буквы. + + Код = КодСимвола(Символ); + Если (Код >= 1040 И Код <= 1103) Или (Код >= 48 И Код <= 57) Или (Код >= 65 И Код <= 122) Тогда + Возврат Ложь; + Иначе + Возврат Истина; + КонецЕсли; +КонецФункции + +&НаСервере +Функция ИмяТипаПоЗначению(Значение) + + Возврат Значение.Метаданные().Имя; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////// +// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ + +ИмяРодителя = "ТаблицаЗначенийПараметр"; +ИмяКолонкиПоУмолчанию = "Колонка"; + +#КонецОбласти diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТекстЗапросаДляКонфигуратора.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТекстЗапросаДляКонфигуратора.xml new file mode 100644 index 0000000..866d6d7 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТекстЗапросаДляКонфигуратора.xml @@ -0,0 +1,22 @@ + + +
+ + ТекстЗапросаДляКонфигуратора + + + ru + Текст запроса для конфигуратора + + + + Managed + false + + PlatformApplication + MobilePlatformApplication + + + +
+
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТекстЗапросаДляКонфигуратора/Ext/Form.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТекстЗапросаДляКонфигуратора/Ext/Form.xml new file mode 100644 index 0000000..426ec58 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТекстЗапросаДляКонфигуратора/Ext/Form.xml @@ -0,0 +1,47 @@ + +
+ + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Текст запроса для конфигуратора</v8:content> + </v8:item> + + LockOwnerWindow + false + useIfNecessary + + + + + + + ПриСозданииНаСервере + + + + ТекстЗапроса + None + + + + + + + + cfg:ExternalDataProcessorObject.ИнструментыРазработчикаКонсольЗапросов + + true + + + + d5p1:TextDocument + + + +
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТекстЗапросаДляКонфигуратора/Ext/Form/Module.bsl b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТекстЗапросаДляКонфигуратора/Ext/Form/Module.bsl new file mode 100644 index 0000000..f6ab234 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/ТекстЗапросаДляКонфигуратора/Ext/Form/Module.bsl @@ -0,0 +1,37 @@ + +#Область ОбработчикиСобытий + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + Текст = Параметры.ТекстЗапроса; + ТекстЗапроса.УстановитьТекст(СформироватьТекстЗапросаДляКонфигуратора(Текст)); +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ + +&НаСервере +Функция СформироватьТекстЗапросаДляКонфигуратора(Текст) + Результат = """"; + Текст = Параметры.ТекстЗапроса; + ПереводСтроки = Символы.ВК+Символы.ПС; + Для Счетчик = 1 По СтрЧислоСтрок(Текст) Цикл + ТекСтрока = СтрПолучитьСтроку(Текст, Счетчик); + Если Счетчик > 1 Тогда + ТекСтрока = СтрЗаменить(ТекСтрока,"""",""""""); + Результат = Результат + ПереводСтроки + "|"+ ТекСтрока; + Иначе + ТекСтрока = СтрЗаменить(ТекСтрока,"""",""""""); + Результат = Результат + ТекСтрока; + КонецЕсли; + КонецЦикла; + Результат = Результат + """"; + Возврат Результат; +КонецФункции + +#КонецОбласти diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Форма.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Форма.xml new file mode 100644 index 0000000..116f85f --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Форма.xml @@ -0,0 +1,22 @@ + + +
+ + Форма + + + ru + Форма + + + + Managed + false + + PlatformApplication + MobilePlatformApplication + + + +
+
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Форма/Ext/Form.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Форма/Ext/Form.xml new file mode 100644 index 0000000..1743434 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Форма/Ext/Form.xml @@ -0,0 +1,1025 @@ + +
+ 90 + Use + false + useIfNecessary + + + + + + + + + + true + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа кнопок параметры</v8:content> + </v8:item> + + + + ru + Группа кнопок параметры + + + Item.Параметры + + + + + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Оформление</v8:content> + </v8:item> + + + + ru + Группа оформление + + + + + + + + + + + + ОбработкаОповещения + ПередЗакрытием + ПриСозданииНаСервере + ПриЗакрытии + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа план запроса панель</v8:content> + </v8:item> + + + + ru + Группа план запроса панель + + + Horizontal + None + false + + + + ПоказыватьПланВыполненияЗапроса + Right + Auto + + + + ПолучатьПланВыполненияЗапросаПриИзменении + + + + false + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Открыть</v8:content> + </v8:item> + + + + ru + Открыть план выполнения запроса + + + true + + + + ПоказатьПланВыполненияЗапросаНажатие + + + + + + None + 90 + 7 + true + true + true + true + AsFile + Объект.Параметры + None + None + None + + + + + + + Параметры + SearchStringRepresentation + + + + + + + Параметры + ViewStatusRepresentation + + + + + + + Параметры + SearchControl + + + + + + ПараметрыПередНачаломДобавления + ПараметрыПослеУдаления + ПараметрыПриИзменении + + + + Объект.Параметры.Имя + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Имя параметра</v8:content> + </v8:item> + + EnterOnInput + + + + + 1/0:ac0a61f4-db03-408b-bec0-6bc7dba2ae6a/1:5bdad865-f2c5-434b-8041-ba4aad3b6687 + EnterOnInput + true + false + + + + ТипВФормеНачалоВыбора + + + + 1/0:ac0a61f4-db03-408b-bec0-6bc7dba2ae6a/2:5bdad865-f2c5-434b-8041-ba4aad3b6687 + EnterOnInput + true + false + + + + + + + + ЗначениеВФормеПриИзменении + ЗначениеВФормеНачалоВыбора + + + + Объект.Параметры.Тип + false + EnterOnInput + true + + + + + Объект.Параметры.Значение + false + EnterOnInput + true + false + + + + + Объект.Параметры.ИдентификаторЗапроса + false + EnterOnInput + + + + +
+ + ТекстЗапроса + 90 + 12 + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Текст запроса контекстное меню группа сервис</v8:content> + </v8:item> + + + + ru + Текст запроса контекстное меню группа сервис + + + + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Оформление</v8:content> + </v8:item> + + + + ru + Текст запроса контекстное меню группа оформление + + + + + + + + + + + + + ТекстЗапросаПриИзменении + + + + РезультатЗапроса + + CollapseAllGroups + CopyToClipboard + ExpandAllGroups + Find + FindNext + FindPrevious + FixTable + PageSetup + Preview + PrintImmediately + SaveAs + SelectAll + ShowGroups + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + РезультатЗапросаПриИзменении + РезультатЗапросаВыбор + РезультатЗапросаПриИзмененииСодержимогоОбласти + + +
+ + + + cfg:ExternalDataProcessorObject.ИнструментыРазработчикаКонсольЗапросов + + true + true + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Текст запроса</v8:content> + </v8:item> + + + d5p1:TextDocument + + true + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор текущего запроса</v8:content> + </v8:item> + + + v8:UUID + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Результат запроса</v8:content> + </v8:item> + + + mxl:SpreadsheetDocument + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Список типов</v8:content> + </v8:item> + + + v8:ValueListType + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор текущего параметра</v8:content> + </v8:item> + + + v8:UUID + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Имя запроса по умолчанию</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Задан вопрос об установке расширения</v8:content> + </v8:item> + + + xs:boolean + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Показывать план выполнения запроса</v8:content> + </v8:item> + + + xs:decimal + + 10 + 0 + Any + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Идентификатор процесса ОС</v8:content> + </v8:item> + + + xs:string + + 10 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Каталог с лог файлами</v8:content> + </v8:item> + + + xs:string + + 0 + Variable + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Метка запроса</v8:content> + </v8:item> + + + xs:string + + 100 + Variable + + + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Запросы</v8:content> + </v8:item> + + + + ru + Открыть другой запрос + + + Ctrl+O + + StdPicture.Catalog + true + + ОткрытьФормуВыбораЗапроса + TextPicture + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Открыть конструктор запроса</v8:content> + </v8:item> + + + + ru + Открыть конструктор запроса + + + ОткрытьКонструкторЗапроса + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Заполнить параметры</v8:content> + </v8:item> + + + + ru + Заполнить параметры + + + F9 + + StdPicture.Reread + true + + СчитатьПараметрыИзТекстаЗапроса + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Дополнительно</v8:content> + </v8:item> + + + + ru + Настроить дополнительно + + + + StdPicture.SettingsStorage + true + + ОткрытьФормуНастроекАвтоСохранения + TextPicture + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Выполнить</v8:content> + </v8:item> + + + + ru + Выполнить запрос + + + F7 + + StdPicture.GenerateReport + true + + ВыполнитьЗапрос + TextPicture + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Выполнить весь запрос</v8:content> + </v8:item> + + + + ru + Выполнить запрос с временными таблицами + + + Shift+F7 + + StdPicture.BusinessProcessStart + true + + ВыполнитьЗапросСВременнымиТаблицами + Picture + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сохранить запросы в файл</v8:content> + </v8:item> + + + + ru + Сохранить запросы в файл + + + Ctrl+S + + StdPicture.SaveFile + true + + СохранитьЗапросыВФайл + Picture + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Сохранить запросы в другой файл</v8:content> + </v8:item> + + + + ru + Сохранить запросы как + + + + StdPicture.EndEdit + true + + СохранитьЗапросыВДругойФайл + Picture + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Открыть</v8:content> + </v8:item> + + + + ru + Выбрать запросы из файла + + + + StdPicture.OpenFile + true + + ВыбратьЗапросыИзФайла + TextPicture + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Текст запроса для конфигуратора</v8:content> + </v8:item> + + + + ru + Создать текст запроса для конфигуратора + + + + StdPicture.Replace + true + + СоздатьТекстЗапросаДляКонфигуратора + TextPicture + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Открыть в отдельном окне</v8:content> + </v8:item> + + + + ru + Открыть в отдельном окне результат запроса + + + + StdPicture.Document + true + + ОткрытьВОтдельномОкнеТабличныйДокумент + TextPicture + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Открыть значение</v8:content> + </v8:item> + + + + ru + Открыть объект из результата + + + Alt+O + + StdPicture.Magnifier + true + + ОткрытьОбъектИзРезультата + TextPicture + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Открыть список</v8:content> + </v8:item> + + + + ru + Открыть список из результата + + + Alt+P + ОткрытьСписокИзРезультата + Text + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Скопировать запрос</v8:content> + </v8:item> + + + + ru + Скопировать запрос + + + + StdPicture.CloneListItem + true + + СкопироватьЗапрос + TextPicture + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Выделить/отменить выделение</v8:content> + </v8:item> + + + + ru + Выделить ячейки + + + ВыделитьЯчейки + Text + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Выполнить выбор результата запроса</v8:content> + </v8:item> + + + + ru + Выполнить выбор результата запроса + + + ВыполнитьВыборРезультатаЗапроса + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Закомментировать</v8:content> + </v8:item> + + + + ru + Закомментировать + + + Ctrl+Num / + Закомментировать + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Раскомментировать</v8:content> + </v8:item> + + + + ru + Раскомментировать + + + Ctrl+Shift+Num / + Раскомментировать + DontUse + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Задать уникальный идентификатор</v8:content> + </v8:item> + + + + ru + Задать уникальный идентификатор + + + ЗадатьУникальныйИдентификатор + DontUse + + + + + + true + + + + xs:boolean + + true + + + + xs:boolean + + true + + + + xs:string + + 0 + Variable + + + true + + +
\ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Форма/Ext/Form/Module.bsl b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Форма/Ext/Form/Module.bsl new file mode 100644 index 0000000..20a998a --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Forms/Форма/Ext/Form/Module.bsl @@ -0,0 +1,1677 @@ + +#Область ОбработчикиСобытийФормы + +// Обработчик при создании на сервере. +// 1. Инициализируются возможные типы данных конфигурации для представления параметров. +// 2. Формируется путь к имени формы. +// 3. Автоматическое создание запроса в табличной части. +// +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + + Если Параметры.Свойство("АвтоТест") Тогда + Возврат; + КонецЕсли; + + ИмяЗапросаПоУмолчанию = НСтр("ru = 'Новый запрос'"); + + ОбработкаОбъект = ОбъектОбработки(); + Объект.ДоступныеТипыДанных = ОбработкаОбъект.Метаданные().Реквизиты.ДоступныеТипыДанных.Тип; + Объект.ПутьКФормам = ОбработкаОбъект.Метаданные().ПолноеИмя() + ".Форма"; + Объект.ЧередованиеЦветовВРезультатеЗапроса = Истина; + + Элемент = Объект.Запросы.Добавить(); + ИдентификаторТекущегоЗапроса = Новый УникальныйИдентификатор; + Элемент.Идентификатор = ИдентификаторТекущегоЗапроса; + Элемент.Имя = ИмяЗапросаПоУмолчанию; + + СписокТипов = ОбъектОбработки().СформироватьСписокТипов(); + ОбъектОбработки().ФильтрацияСпискаТипов(СписокТипов, ""); + + ЗаголовокФормы = НСтр("ru = 'Консоль запросов (%ИмяЗапросаПоУмолчанию%)'"); + ЗаголовокФормы = СтрЗаменить(ЗаголовокФормы, "%ИмяЗапросаПоУмолчанию%", ИмяЗапросаПоУмолчанию); + ЭтотОбъект.Заголовок = ЗаголовокФормы; + + Объект.ТипОбхода = "Авто"; + + ВключитьРежимВыбора(); + +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка) + + Если Не Модифицированность Тогда + Возврат; + КонецЕсли; + + Отказ = Истина; + + Текст = НСтр("ru = 'Данные изменены. Сохранить изменения?'"); + ОписаниеОповещения = Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтотОбъект); + ПоказатьВопрос(ОписаниеОповещения, Текст, РежимДиалогаВопрос.ДаНетОтмена); + +КонецПроцедуры + +&НаКлиенте +Процедура ПриЗакрытии() + Если ПоказыватьПланВыполненияЗапроса Тогда + ВыключениеТехнологическогоЖурнала(); + ПолучатьПланВыполненияЗапроса = Ложь; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПередЗакрытиемЗавершение(Ответ, ДополнительныеПараметры) Экспорт + + Если Ответ = КодВозвратаДиалога.Отмена Тогда + + Возврат; + + ИначеЕсли Ответ = КодВозвратаДиалога.Да Тогда + + ОписаниеОповещения = Новый ОписаниеОповещения("ПередЗакрытиемЗавершение", ЭтотОбъект, Объект.ИмяФайла); + СохранитьФайлЗапроса(ОписаниеОповещения); + + Иначе + + Модифицированность = Ложь; + Закрыть(); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) + Если ИмяСобытия = "ПередатьПараметрыНастроек" Тогда + ВыгрузитьНастройки(Параметр); + ИначеЕсли ИмяСобытия = "ПередатьПараметрыНастроекАвтоСохранения" Тогда + НастройкаАвтосохранения(); + ИначеЕсли ИмяСобытия = "ВыгрузитьЗапросыВРеквизиты" Тогда + ВыгрузитьЗапросыВРеквизиты(Параметр); + ИначеЕсли ИмяСобытия = "ОбновитьФормуКлиент" Тогда + ОбновитьФормуКлиент(); + КонецЕсли; +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////// +// ОБРАБОТЧИКИ СОБЫТИЙ ЭЛЕМЕНТОВ ФОРМЫ + +&НаКлиенте +Процедура ПоказатьПланВыполненияЗапросаНажатие(Элемент) + Если НЕ ЗначениеЗаполнено(МеткаЗапроса) Тогда + ПоказатьПредупреждение(Неопределено, НСтр("ru = 'Для получения плана выполнения запроса сначала требуется выполнить запрос.'")); + Возврат; + КонецЕсли; + + Если ТехнологическийЖурналДоступен() Тогда + ОткрытьФормуПланаВыполненияЗапроса(); + Иначе + ПодключитьОбработчикОжидания("ОпределитьВозможностьОткрытияТехнологическогоЖурнала", 5); + Элементы.ПоказатьПланВыполненияЗапроса.Заголовок = НСтр("ru = 'Подготовка...'"); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ТипВФормеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + + СтандартнаяОбработка = Ложь; + + ТекущийПараметр = Элементы.Параметры.ТекущиеДанные; + + ЗаголовокЭлемента = НСтр("ru = 'Выбрать тип'"); + ОписаниеОповещения = Новый ОписаниеОповещения("ТипВФормеЗавершениеВыбора", ЭтотОбъект); + СписокТипов.ПоказатьВыборЭлемента(ОписаниеОповещения, ЗаголовокЭлемента); + +КонецПроцедуры + +&НаКлиенте +Процедура ТипВФормеЗавершениеВыбора(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт + + Если ВыбранныйЭлемент <> Неопределено Тогда + + ТекущийПараметр = Элементы.Параметры.ТекущиеДанные; + ТекущийТип = ВыбранныйЭлемент; + + Если ТекущийТип.Значение = "ТаблицаЗначений" + Или ТекущийТип.Значение = "МоментВремени" + Или ТекущийТип.Значение = "Граница" Тогда + + ТипСтрока = ТипСтрока(ТекущийТип.Значение); + ТекущийПараметр.Тип = ТипСтрока; + ТекущийПараметр.ТипВФорме = ТекущийТип.Представление; + ТекущийПараметр.Значение = ""; + ТекущийПараметр.ЗначениеВФорме = ТекущийТип.Представление; + Иначе + ИнициализацияТипаИЗначенияПараметра(ТекущийПараметр, ТекущийТип); + КонецЕсли; + + Модифицированность = Истина; + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ПараметрыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа) + Отказ = Истина; + + Если Не Копирование Тогда + ИндексТекущегоЗапроса = ИндексТекущегоВопроса(); + Если ИндексТекущегоЗапроса = Неопределено Тогда + ТекстСообщения = НСтр("ru = 'Выберите запрос.'"); + ПоказатьСообщениеПользователю(ТекстСообщения, "Объект"); + Возврат; + КонецЕсли; + + ЭлементПараметр = Объект.Параметры.Добавить(); + ЭлементПараметр.ИдентификаторЗапроса = ИдентификаторТекущегоЗапроса; + ЭлементПараметр.Имя = ПолучитьИмяПараметра(); + ЭлементПараметр.Идентификатор = Новый УникальныйИдентификатор; + + ОбновитьФормуКлиент(); + + ПараметрыЭлементов = Элементы.Параметры; + ПараметрыЭлементов.ТекущаяСтрока = ЭлементПараметр.ПолучитьИдентификатор(); + ТипВФормеНачалоВыбора(ПараметрыЭлементов, Неопределено, Ложь); + Иначе + ЭлементКопирования = Элемент.ТекущиеДанные; + + ЭлементПараметр = Объект.Параметры.Добавить(); + ЭлементПараметр.Идентификатор = Новый УникальныйИдентификатор; + ЭлементПараметр.ИдентификаторЗапроса = ИдентификаторТекущегоЗапроса; + ЭлементПараметр.Имя = ЭлементКопирования.Имя; + ЭлементПараметр.Тип = ЭлементКопирования.Тип; + ЭлементПараметр.Значение = ЭлементКопирования.Значение; + ЭлементПараметр.ТипВФорме = ЭлементКопирования.ТипВФорме; + ЭлементПараметр.ЗначениеВФорме = ЭлементКопирования.ЗначениеВФорме; + КонецЕсли; + + Модифицированность = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура ТекстЗапросаПриИзменении(Элемент) + ИндексТекущегоЗапроса = ИндексТекущегоВопроса(); + Если ИндексТекущегоЗапроса = Неопределено Тогда + ТекстСообщения = НСтр("ru = 'Выберите запрос.'"); + ПоказатьСообщениеПользователю(ТекстСообщения, "Объект"); + Возврат; + КонецЕсли; + + ТЗ = ТекстЗапроса.ПолучитьТекст(); + ТекущийЗапрос = Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1); + + // Если имя запроса по умолчанию, тогда формируется имя запроса. + Если ТекущийЗапрос.Имя = ИмяЗапросаПоУмолчанию Тогда + ТекущийЗапрос.Имя = ПолучитьИмяЗапроса(ТЗ); + КонецЕсли; + + ТекущийЗапрос.Текст = ТЗ; +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеВФормеПриИзменении(Элемент) + ТекущийПараметр = Элементы.Параметры.ТекущиеДанные; + + Значение = ТекущийПараметр.ЗначениеВФорме; + ТекущийТип = ТекущийПараметр.Тип; + Если ТекущийТип <> "ТаблицаЗначений" И ТекущийТип <> "МоментВремени" И ТекущийТип <> "Граница" Тогда + ЗначВнутр = ЗначениеВСтрокуСервер(Значение); + ТекущийПараметр.Значение = ЗначВнутр; + + Модифицированность = Истина; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ПараметрыПриИзменении(Элемент) + Модифицированность = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура ПараметрыПослеУдаления(Элемент) + Модифицированность = Истина; +КонецПроцедуры + +&НаКлиенте +Процедура ЗначениеВФормеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) + ТекущийПараметр = Элементы.Параметры.ТекущиеДанные; + ТипПараметра = Элементы.Параметры.ТекущиеДанные.ТипВФорме; + + ИдентификаторТекущегоПараметра = ТекущийПараметр.Идентификатор; + + Если ТипПараметра = НСтр("ru = 'Таблица значений'") Тогда + Путь = Объект.ПутьКФормам + "." + "ТаблицаЗначений"; + ИначеЕсли ТипПараметра = НСтр("ru = 'Момент времени'") Тогда + Путь = Объект.ПутьКФормам + "." + "МоментВремени"; + ИначеЕсли ТипПараметра = НСтр("ru = 'Граница'") Тогда + Путь = Объект.ПутьКФормам + "." + "Граница"; + Иначе + Возврат; + КонецЕсли; + + ПередаваемыеЗапросы = ПоместитьЗапросыВСтруктуру(); + ОткрытьФорму(Путь, ПередаваемыеЗапросы, ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура РезультатЗапросаПриИзменении(Элемент) + // СЗахватывается" текущий запрос из списка запросов. + ИндексТекущегоЗапроса = ИндексТекущегоВопроса(); + Если ИндексТекущегоЗапроса = Неопределено Тогда + ТекстСообщения = НСтр("ru = 'Выберите запрос.'"); + ПоказатьСообщениеПользователю(ТекстСообщения, "Объект"); + Возврат; + КонецЕсли; + + // Выбор текущего запроса. + ТекущийЗапрос = Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1); + ТекущийЗапрос.АдресРезультата = ПоместитьВоВременноеХранилище(РезультатЗапроса, УникальныйИдентификатор); +КонецПроцедуры + +&НаКлиенте +Процедура РезультатЗапросаВыбор(Элемент, Область, СтандартнаяОбработка) + РасшифровкаЯчейки = Область.Расшифровка; + + ТипРасшифровки = ТипЗнч(РасшифровкаЯчейки); + + Если Объект.ДоступныеТипыДанных.СодержитТип(ТипРасшифровки) И РасшифровкаЯчейки <> Неопределено Тогда + СтандартнаяОбработка = Ложь; + ПоказатьЗначение(, РасшифровкаЯчейки); + Иначе + СтандартнаяОбработка = Истина; + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура РезультатЗапросаПриИзмененииСодержимогоОбласти(Элемент, Область) + // СЗахватывается" текущий запрос из списка запросов. + ИндексТекущегоЗапроса = ИндексТекущегоВопроса(); + Если ИндексТекущегоЗапроса = Неопределено Тогда + ТекстСообщения = НСтр("ru = 'Выберите запрос.'"); + ПоказатьСообщениеПользователю(ТекстСообщения, "Объект"); + Возврат; + КонецЕсли; + + // Выбор текущего запроса. + ТекущийЗапрос = Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1); + ТекущийЗапрос.АдресРезультата = ПоместитьВоВременноеХранилище(РезультатЗапроса, УникальныйИдентификатор); +КонецПроцедуры + +&НаКлиенте +Процедура ПолучатьПланВыполненияЗапросаПриИзменении(Элемент) + + Если ПоказыватьПланВыполненияЗапроса Тогда + РезультатВключения = ВключениеПланаВыполненияЗапроса(); + Если РезультатВключения.Результат Тогда + ПоказатьОповещениеПользователя(НСтр("ru = 'Показывать план выполнения запроса'"), , НСтр("ru = 'Включение анализа плана выполнения запроса занимает до одной минуты'")); + Элементы.ПоказатьПланВыполненияЗапроса.Доступность = Ложь; + ПодключитьОбработчикОжидания("ОпределитьВозможностьОткрытияТехнологическогоЖурнала", 3); + Иначе + ПоказыватьПланВыполненияЗапроса = Ложь; + ПоказатьПредупреждение(, РезультатВключения.Причина); + КонецЕсли; + Иначе + ВыключитьПланаВыполненияЗапроса(); + Элементы.ПоказатьПланВыполненияЗапроса.Доступность = Ложь; + КонецЕсли; + +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////// +// КОМАНДЫ + +&НаКлиенте +Процедура ЗадатьУникальныйИдентификатор(Команда) + НомерСтроки = Элементы.Параметры.ТекущаяСтрока; + Оповещение = Новый ОписаниеОповещения("ПослеВводаУникальногоИдентификатора", ЭтотОбъект, НомерСтроки); + УникальныйИдентификаторСтрокой = ""; + ПоказатьВводСтроки(Оповещение, УникальныйИдентификаторСтрокой, НСтр("ru = 'Введите уникальный идентификатор'")); +КонецПроцедуры + + +&НаКлиенте +Процедура Закомментировать(Команда) + Перем ПерваяСтрока, ПерваяКолонка, ПоследняяСтрока, ПоследняяКолонка; + + Элемент = Элементы.ТекстЗапроса; + Элемент.ПолучитьГраницыВыделения(ПерваяСтрока, ПерваяКолонка, ПоследняяСтрока, ПоследняяКолонка); + + ТекстДоИзменения = ТекстЗапроса.ПолучитьТекст(); + КоличествоСтрок = СтрЧислоСтрок(ТекстДоИзменения); + ВыделенныйФрагмент = ""; + ДлинаПоследнейСтроки = 0; + + Если ПоследняяКолонка = 1 Тогда + ПоследняяСтрока = ПоследняяСтрока - 1; + КонецЕсли; + Если ПерваяСтрока >= ПоследняяСтрока И ПоследняяКолонка = 1 Тогда + ПоследняяКолонка = СтрДлина(СтрПолучитьСтроку(ТекстДоИзменения, ПерваяСтрока)); + ПоследняяСтрока = ПерваяСтрока; + КонецЕсли; + + Для НомерСтроки = 1 По КоличествоСтрок Цикл + Фрагмент = СтрПолучитьСтроку(ТекстДоИзменения, НомерСтроки); + Если НомерСтроки >= ПерваяСтрока И + НомерСтроки <= ПоследняяСтрока + Тогда + Если НомерСтроки = ПерваяСтрока Тогда + ВыделенныйФрагмент = ВыделенныйФрагмент + "//" + Фрагмент; + Иначе + ВыделенныйФрагмент = ВыделенныйФрагмент + Символы.ПС + "//" +Фрагмент; + КонецЕсли; + Если НомерСтроки = ПоследняяСтрока Тогда + ДлинаПоследнейСтроки = СтрДлина(Фрагмент) + 3; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если ПоследняяКолонка = 1 Тогда + ПоследняяСтрока = ПоследняяСтрока + 1; + ДлинаПоследнейСтроки = 1; + ВыделенныйФрагмент = ВыделенныйФрагмент + Символы.ПС; + КонецЕсли; + + Элемент.УстановитьГраницыВыделения(ПерваяСтрока, 1, ПоследняяСтрока, ДлинаПоследнейСтроки); + Элемент.ВыделенныйТекст = ВыделенныйФрагмент; + Элемент.УстановитьГраницыВыделения(ПерваяСтрока, 1, ПоследняяСтрока, ДлинаПоследнейСтроки); +КонецПроцедуры + +&НаКлиенте +Процедура Раскомментировать(Команда) + Перем ПерваяСтрока, ПерваяКолонка, ПоследняяСтрока, ПоследняяКолонка; + Элемент = Элементы.ТекстЗапроса; + Элемент.ПолучитьГраницыВыделения(ПерваяСтрока, ПерваяКолонка, ПоследняяСтрока, ПоследняяКолонка); + + ТекстДоИзменения = ТекстЗапроса.ПолучитьТекст(); + КоличествоСтрок = СтрЧислоСтрок(ТекстДоИзменения); + ВыделенныйФрагмент = ""; + ДлинаПоследнейСтроки = ПоследняяКолонка; + + Если ПоследняяКолонка = 1 Тогда + ПоследняяСтрока = ПоследняяСтрока - 1; + КонецЕсли; + Если ПерваяСтрока >= ПоследняяСтрока И ПоследняяКолонка = 1 Тогда + ПоследняяКолонка = СтрДлина(СтрПолучитьСтроку(ТекстДоИзменения, ПерваяСтрока)); + ПоследняяСтрока = ПерваяСтрока; + КонецЕсли; + + Для НомерСтроки = 1 По КоличествоСтрок Цикл + Фрагмент = СтрПолучитьСтроку(ТекстДоИзменения, НомерСтроки); + Если НомерСтроки >= ПерваяСтрока И НомерСтроки <= ПоследняяСтрока Тогда + Если Лев(СокрЛ(Фрагмент), 2) = "//" Тогда + Позиция = Найти(Фрагмент, "//"); + Фрагмент = Лев(Фрагмент, Позиция - 1) + Сред(Фрагмент, Позиция + 2); + КонецЕсли; + Если НомерСтроки = ПерваяСтрока Тогда + ВыделенныйФрагмент = ВыделенныйФрагмент + Фрагмент; + Иначе + ВыделенныйФрагмент = ВыделенныйФрагмент + Символы.ПС + Фрагмент; + КонецЕсли; + Если НомерСтроки = ПоследняяСтрока Тогда + ДлинаПоследнейСтроки = СтрДлина(Фрагмент) + 3; + КонецЕсли; + КонецЕсли; + КонецЦикла; + + Если ПоследняяКолонка = 1 Тогда + ПоследняяСтрока = ПоследняяСтрока + 1; + ДлинаПоследнейСтроки = 1; + ВыделенныйФрагмент = ВыделенныйФрагмент + Символы.ПС; + КонецЕсли; + + Элемент.УстановитьГраницыВыделения(ПерваяСтрока, 1, ПоследняяСтрока, ДлинаПоследнейСтроки); + Элемент.ВыделенныйТекст = ВыделенныйФрагмент; + Элемент.УстановитьГраницыВыделения(ПерваяСтрока, 1, ПоследняяСтрока, ДлинаПоследнейСтроки); +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьВыборРезультатаЗапроса(Команда) + Для Каждого СтрокаЗапроса Из Объект.Запросы Цикл + Если СтрокаЗапроса.Идентификатор=ИдентификаторТекущегоЗапроса И Не ПустаяСтрока(СтрокаЗапроса.АдресРезультатовЗапроса) Тогда + ОповеститьОВыборе(Новый Структура("ДействиеВыбора, ДанныеВыбора", + Параметры.ДействиеВыбора, СтрокаЗапроса.АдресРезультатовЗапроса + )); + Возврат; + КонецЕсли; + КонецЦикла; + + ТекстПредупреждения = НСтр("ru = 'Необходимо ввести текст запроса и выполнить его.'"); + ПоказатьПредупреждение(, ТекстПредупреждения); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФормуВыбораЗапроса(Команда) + ПередаваемыеЗапросы = ПоместитьЗапросыВСтруктуру(); + Путь = Объект.ПутьКФормам + "." + "ВыборЗапроса"; + ОткрытьФорму(Путь, ПередаваемыеЗапросы, ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьКонструкторЗапроса(Команда) + + ИндексТекущегоЗапроса = ИндексТекущегоВопроса(); + Если ИндексТекущегоЗапроса = Неопределено Тогда + ТекстСообщения = НСтр("ru = 'Выберите запрос.'"); + ПоказатьСообщениеПользователю(ТекстСообщения, "Объект"); + Возврат; + КонецЕсли; + + ТекстЗапросаВФорме = ТекстЗапроса.ПолучитьТекст(); + + Если ВерсияКонфигурации835ИБольше() Тогда + #Если ТолстыйКлиентУправляемоеПриложение ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТонкийКлиент Тогда + КонструкторЗапроса = Неопределено; + Если ПустаяСтрока(ТекстЗапросаВФорме) Тогда + Выполнить("КонструкторЗапроса = Новый КонструкторЗапроса();"); + Иначе + Выполнить("КонструкторЗапроса = Новый КонструкторЗапроса(ТекстЗапросаВФорме);"); + КонецЕсли; + Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияКонструктораЗапроса", ЭтотОбъект, ИндексТекущегоЗапроса); + КонструкторЗапроса.Показать(Оповещение); + #Иначе + ТекстСообщения = НСтр("ru = 'Конструктор запроса доступен только в режимах: Тонкий клиент или Толстый клиент.'"); + ПоказатьПредупреждение(, ТекстСообщения); + #КонецЕсли + Иначе + #Если ТолстыйКлиентУправляемоеПриложение ИЛИ ТолстыйКлиентОбычноеПриложение Тогда + Если ПустаяСтрока(ТекстЗапросаВФорме) Тогда + КонструкторЗапроса = Новый КонструкторЗапроса(); + Иначе + КонструкторЗапроса = Новый КонструкторЗапроса(ТекстЗапросаВФорме); + КонецЕсли; + + Если КонструкторЗапроса.ОткрытьМодально() Тогда + ТекстЗапроса.УстановитьТекст(КонструкторЗапроса.Текст); + + ТекстЗапросаВФорме = ТекстЗапроса.ПолучитьТекст(); + + ТекущийЗапрос = Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1); + Если ТекущийЗапрос.Имя = ИмяЗапросаПоУмолчанию Тогда + ТекущийЗапрос.Имя = ПолучитьИмяЗапроса(ТекстЗапросаВФорме); + КонецЕсли; + ТекущийЗапрос.Текст = ТекстЗапросаВФорме; + Модифицированность = Истина; + ОбновитьФормуКлиент(); + КонецЕсли; + #Иначе + ТекстСообщения = НСтр("ru = 'Конструктор запроса доступен только в режиме Толстого клиента.'"); + ПоказатьПредупреждение(, ТекстСообщения); + #КонецЕсли + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СчитатьПараметрыИзТекстаЗапроса(Команда) + ЗаполнитьПараметрыКлиент(); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФормуНастроекАвтоСохранения(Команда) + ПередаваемыеНастройки = ПоместитьНастройкиВСтруктуру(); + Путь = Объект.ПутьКФормам + "." + "Настройки"; + + ОткрытьФорму(Путь, ПередаваемыеНастройки, ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьЗапрос(Команда) + ЗапуститьВыполнениеЗапроса(Ложь); +КонецПроцедуры + +&НаКлиенте +Процедура ВыполнитьЗапросСВременнымиТаблицами(Команда) + ЗапуститьВыполнениеЗапроса(Истина); +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьЗапросыВФайл(Команда) + + ОписаниеОповещения = Новый ОписаниеОповещения("УстановитьИмяФайлаЗапроса", ЭтотОбъект, Объект.ИмяФайла); + СохранитьФайлЗапроса(ОписаниеОповещения); + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьЗапросыВДругойФайл(Команда) + + ОписаниеОповещения = Новый ОписаниеОповещения("УстановитьИмяФайлаЗапроса", ЭтотОбъект, ""); + СохранитьФайлЗапроса(ОписаниеОповещения); + +КонецПроцедуры + +&НаКлиенте +Процедура УстановитьИмяФайлаЗапроса(ИмяФайла, ДополнительныеПараметры) Экспорт + + Объект.ИмяФайла = ИмяФайла; + Модифицированность = Ложь; + +КонецПроцедуры + +&НаКлиенте +Процедура ВыбратьЗапросыИзФайла(Команда) + + ОбработкаЧтенияФайла(Истина); + + КоличествоЗапросов = Объект.Запросы.Количество(); + Если КоличествоЗапросов > 0 Тогда + ИдентификаторТекущегоЗапроса = Объект.Запросы.Получить(0).Идентификатор; + Модифицированность = Ложь; + Иначе + Элемент = Объект.Запросы.Добавить(); + ИдентификаторТекущегоЗапроса = Новый УникальныйИдентификатор; + Элемент.Идентификатор = ИдентификаторТекущегоЗапроса; + Элемент.Имя = ИмяЗапросаПоУмолчанию; + Результат = Новый ТабличныйДокумент; + КонецЕсли; + + ОбновитьФормуКлиент(); +КонецПроцедуры + +&НаКлиенте +Процедура СоздатьТекстЗапросаДляКонфигуратора(Команда) + ПараметрыПередачи = Новый Структура; + ПараметрыПередачи.Вставить("ТекстЗапроса", ТекстЗапроса.ПолучитьТекст()); + + Путь = Объект.ПутьКФормам + "." + "ТекстЗапросаДляКонфигуратора"; + ОткрытьФорму(Путь, ПараметрыПередачи, ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьВОтдельномОкнеТабличныйДокумент(Команда) + ПараметрыПередачи = Новый Структура; + ПараметрыПередачи.Вставить("РезультатЗапроса", РезультатЗапроса); + + Путь = Объект.ПутьКФормам + "." + "РезультатЗапроса"; + ОткрытьФорму(Путь, ПараметрыПередачи, ЭтотОбъект); +КонецПроцедуры + +&НаКлиенте +Процедура СкопироватьЗапрос(Команда) + ИндексТекущегоЗапроса = ИндексТекущегоВопроса(); + Если ИндексТекущегоЗапроса = Неопределено Тогда + ПоказатьСообщениеПользователю(НСтр("ru = 'Выберите запрос.'"), "Объект"); + Возврат; + КонецЕсли; + + ЗапросОснование = Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1); + + ИдентификаторНовогоЗапроса = Новый УникальныйИдентификатор; + ИмяНовогоЗапроса = СформироватьИмяКопииЗапроса(ЗапросОснование.Имя); + + НовыйЗапрос = Объект.Запросы.Добавить(); + НовыйЗапрос.Идентификатор = ИдентификаторНовогоЗапроса; + НовыйЗапрос.Имя = ИмяНовогоЗапроса; + НовыйЗапрос.Текст = ЗапросОснование.Текст; + + // Копирование параметров из запроса основания в новый запрос + // из запроса, имеющего ИдентификаторТекущегоЗапроса. + СкопироватьПараметрыИзЗапроса(НовыйЗапрос); + + // Изменение значения ИдентификатораТекущегоЗапроса. + ИдентификаторТекущегоЗапроса = ИдентификаторНовогоЗапроса; + + // Обновление формы. + ОбновитьФормуКлиент(); + + Модифицированность = истина; +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьОбъектИзРезультата(Команда) + РасшифровкаЯчейки = РезультатЗапроса.ТекущаяОбласть.Расшифровка; + ТипРасшифровки = ТипЗнч(РасшифровкаЯчейки); + Если Объект.ДоступныеТипыДанных.СодержитТип(ТипРасшифровки) И РасшифровкаЯчейки <> Неопределено Тогда + ПоказатьЗначение(, РасшифровкаЯчейки); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьСписокИзРезультата(Команда) + РасшифровкаЯчейки = РезультатЗапроса.ТекущаяОбласть.Расшифровка; + ИмяФормыСписка = СформироватьИмяФормыСпискаДляСсылки(РасшифровкаЯчейки); + Если Не ПустаяСтрока(ИмяФормыСписка) Тогда + ОткрытьФорму(ИмяФормыСписка, , ЭтотОбъект); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ВыделитьЯчейки(Команда) + ОбластьРезультата = РезультатЗапроса.ТекущаяОбласть; + + ПерваяСтрока = ОбластьРезультата.Верх; + ПерваяКолонка = ОбластьРезультата.Лево; + ПоследняяСтрока = ОбластьРезультата.Низ; + ПоследняяКолонка = ОбластьРезультата.Право; + + ЭталоннаяОбласть = РезультатЗапроса.Область(ПерваяСтрока, ПерваяКолонка, ПерваяСтрока, ПерваяКолонка); + ШрифтЭталоннойОбласти = ЭталоннаяОбласть.Шрифт; + Если ШрифтЭталоннойОбласти = Неопределено Тогда + Возврат; + КонецЕсли; + + ФлагЖирности = Не ШрифтЭталоннойОбласти.Жирный; + Если ФлагЖирности = Неопределено Тогда + Возврат; + КонецЕсли; + + Для ИндексСтроки = ПерваяСтрока По ПоследняяСтрока Цикл + Для ИндексКолонки = ПерваяКолонка По ПоследняяКолонка Цикл + ТекущаяОбластьРезультата = РезультатЗапроса.Область(ИндексСтроки, ИндексКолонки, ИндексСтроки, ИндексКолонки); + ТекущийШрифт = ТекущаяОбластьРезультата.Шрифт; + Если ТекущийШрифт <> Неопределено Тогда + ТекущаяОбластьРезультата.Шрифт = Новый Шрифт(ТекущийШрифт,,, ФлагЖирности); + КонецЕсли; + КонецЦикла; + КонецЦикла; +КонецПроцедуры + +/////////////////////////////////////////////////////////////////////////// +// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ +&НаКлиенте +Процедура ПослеЗакрытияКонструктораЗапроса(ТекстЗапросаВФорме, ИндексТекущегоЗапроса) Экспорт + Если ТекстЗапросаВФорме <> Неопределено Тогда + ТекущийЗапрос = Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1); + Если ТекущийЗапрос.Имя = ИмяЗапросаПоУмолчанию Тогда + ТекущийЗапрос.Имя = ПолучитьИмяЗапроса(ТекстЗапросаВФорме); + КонецЕсли; + ТекущийЗапрос.Текст = ТекстЗапросаВФорме; + Модифицированность = Истина; + ОбновитьФормуКлиент(); + КонецЕсли; +КонецПроцедуры + + +&НаСервере +Функция ОбъектОбработки() + Возврат РеквизитФормыВЗначение("Объект"); +КонецФункции + +&НаСервере +Процедура ВыключениеТехнологическогоЖурнала() + ОбъектОбработки().ВыключениеТехнологическогоЖурнала(); +КонецПроцедуры + +// Передача табличной части "Запросы", "Параметры" в виде структуры. +// +&НаСервере +Функция ПоместитьЗапросыВСтруктуру() + АдресХранилища = ОбъектОбработки().ПоместитьЗапросыВоВременноеХранилище(Объект, ИдентификаторТекущегоЗапроса, ИдентификаторТекущегоПараметра); + ПараметрАдрес = Новый Структура; + ПараметрАдрес.Вставить("АдресХранилища", АдресХранилища); + Возврат ПараметрАдрес; +КонецФункции + +// Получение табличной части "Запросы" в виде структуры. +// Возвращает Идентификатор выбранного запроса, обновляет табличную часть "Запросы". +// +// Параметры: +// ПараметрыПередачи - Запросы из передаваемого объекта и Идентификатор текущего запроса. +// +&НаСервере +Функция ВыгрузитьЗапросыВРеквизиты(ПараметрыПередачи) + ПолученныеЗапросы = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).Запросы; + ПолученныеПараметры = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).Параметры; + Объект.ИмяФайла = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).ИмяФайла; + ИдентификаторТекущегоЗапроса = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).ИдентификаторТекущегоЗапроса; + ИдентификаторТекущегоПараметра = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).ИдентификаторТекущегоПараметра; + Объект.Запросы.Загрузить(ПолученныеЗапросы); + Объект.Параметры.Загрузить(ПолученныеПараметры); + + ВывестиРезультатЗапроса(); +КонецФункции + +&НаСервере +Процедура ВывестиРезультатЗапроса() + РезультатЗапроса = Новый ТабличныйДокумент; + Для каждого СтрЗапросы Из Объект.Запросы Цикл + Если СтрЗапросы.Идентификатор = ИдентификаторТекущегоЗапроса Тогда + ПолучитьРезультатЗапросаИзХранилища(РезультатЗапроса, СтрЗапросы.АдресРезультата); + + КоличествоСтрок = СтрЗапросы.КоличествоСтрок; + ВремяВыполнения = СтрЗапросы.ВремяВыполнения; + РезультирующаяСтрока = НСтр("ru = 'Результат запроса (количество строк = %КолСтрок%, время выполнения = %ВремяВыполнения% с)'"); + РезультирующаяСтрока = СтрЗаменить(РезультирующаяСтрока, "%КолСтрок%", Строка(КоличествоСтрок)); + РезультирующаяСтрока = СтрЗаменить(РезультирующаяСтрока, "%ВремяВыполнения%", Строка(ВремяВыполнения)); + Элементы.РезультатЗапроса.Заголовок = РезультирующаяСтрока; + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +// Передача настроек автосохранения. +// +&НаСервере +Функция ПоместитьНастройкиВСтруктуру() + АдресХранилища = ОбъектОбработки().ПоместитьНастройкиВоВременноеХранилище(Объект); + ПараметрАдрес = Новый Структура; + ПараметрАдрес.Вставить("АдресХранилища", АдресХранилища); + Возврат ПараметрАдрес; +КонецФункции + +// Получение настроек в виде структуры. +// +// Параметры: +// ПараметрыПередачи - настройки. +// +&НаСервере +Функция ВыгрузитьНастройки(ПараметрыПередачи) + Объект.ИспользоватьАвтосохранение = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).ИспользоватьАвтосохранение; + Объект.ПериодАвтосохранения = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).ПериодАвтосохранения; + Объект.ВыводитьВРезультатахЗапросаЗначенияСсылок = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).ВыводитьВРезультатахЗапросаЗначенияСсылок; + Объект.ТипОбхода = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).ТипОбхода; + Объект.ЧередованиеЦветовВРезультатеЗапроса = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).ЧередованиеЦветовВРезультатеЗапроса; +КонецФункции + +// Обновление формы. +// Обновление отображения параметров, текста запроса и результата. +// +&НаКлиенте +Процедура ОбновитьФормуКлиент() + // Обновление параметров. + Фильтр = Новый Структура; + Фильтр.Вставить("ИдентификаторЗапроса", ИдентификаторТекущегоЗапроса); + ФиксированныйФильтр = Новый ФиксированнаяСтруктура(Фильтр); + Элементы.Параметры.ОтборСтрок = ФиксированныйФильтр; + + Для каждого СтрЗапросы Из Объект.Запросы Цикл + Если СтрЗапросы.Идентификатор = ИдентификаторТекущегоЗапроса Тогда + // Обновление текста запроса. + ЭтотОбъект.ТекстЗапроса.УстановитьТекст(СтрЗапросы.Текст); + + // Вывод заголовка формы. + ЗаголовокФормы = НСтр("ru = 'Консоль запросов (%ИмяЗапроса%)'"); + ЗаголовокФормы = СтрЗаменить(ЗаголовокФормы, "%ИмяЗапроса%", СтрЗапросы.Имя); + ЭтотОбъект.Заголовок = ЗаголовокФормы; + + КонецЕсли; + КонецЦикла; + + // Вывод заголовка кнопки "Запросы". + КоличествоЗапросов = Объект.Запросы.Количество(); + ЗаголовокКнопкиВыбораЗапроса = НСтр("ru = 'Запросы'"); + Если КоличествоЗапросов > 1 Тогда + ЗаголовокКнопкиВыбораЗапроса = ЗаголовокКнопкиВыбораЗапроса + " (" + КоличествоЗапросов + ")"; + КонецЕсли; + Элементы.ФормаВыбратьЗапрос.Заголовок = ЗаголовокКнопкиВыбораЗапроса; + + #Если ВебКлиент Тогда + ЭтотОбъект.ОбновитьОтображениеДанных(); + #КонецЕсли +КонецПроцедуры + +&НаКлиенте +Функция ИндексТекущегоВопроса() + Результат = Неопределено; + Для каждого СтрЗапросы Из Объект.Запросы Цикл + Если СтрЗапросы.Идентификатор = ИдентификаторТекущегоЗапроса Тогда + Результат = СтрЗапросы.НомерСтроки; + КонецЕсли; + КонецЦикла; + Возврат Результат; +КонецФункции + +// Возвращает имя запроса по имени первой таблицы. +// +// Параметры: +// ТекстЗапроса - текст передаваемого запроса. +// +&НаКлиенте +Функция ПолучитьИмяЗапроса(знач ТекстЗапроса) + // Если пустой текст запроса тогда возвращается "Запрос". + Если ПустаяСтрока(ТекстЗапроса) Тогда + Результат = ИмяЗапросаПоУмолчанию; + Возврат Результат; + КонецЕсли; + + // Поиск зарезервированного слова "ВЫБРАТЬ". + Выбрать = "ВЫБРАТЬ"; + ДлинаВыбрать = СтрДлина(Выбрать); + ПозицияВыбрать = Найти(ВРег(ТекстЗапроса), Выбрать); + Если ПозицияВыбрать = 0 Тогда + Результат = ИмяЗапросаПоУмолчанию; + Возврат Результат; + КонецЕсли; + + // Срез строки текста запроса без зарезервированного слова "ВЫБРАТЬ". + ДлинаЗапроса = СтрДлина(ТекстЗапроса); + ТекстЗапроса = Сред(ТекстЗапроса, ПозицияВыбрать + ДлинаВыбрать); + + // Поиск первой "точки", чтобы определить имя таблицы. + Точка = "."; + ДлинаТочка = СтрДлина(Точка); + ПозицияТочка = Найти(ВРег(ТекстЗапроса), Точка); + Если ПозицияТочка = 0 Тогда + Результат = ИмяЗапросаПоУмолчанию; + Возврат Результат; + КонецЕсли; + + // Возвращается "Запрос:" и имя первой таблицы. + Результат = СокрЛП(Лев(ТекстЗапроса, ПозицияТочка - ДлинаТочка)); + Если ПустаяСтрока(Результат) Тогда + Результат = ИмяЗапросаПоУмолчанию; + КонецЕсли; + + Возврат Результат; +КонецФункции + +// Считывает параметры из текста запроса. +// +// Параметры: +// ТекстЗапроса - текст запроса. +// Удалять - флаг очистки списка параметров для текущего запроса. +// ИдентификаторЗапроса - Идентификатор текущего запроса. +// +&НаСервере +Процедура СчитатьПараметрыЗапроса(ТекстЗапроса, Удалять, ИдентификаторЗапроса) + // Считывание параметров из текст запроса в массив структуры. + РезультатСтруктура = ОбъектОбработки().СчитатьПараметрыЗапроса(ТекстЗапроса, ИдентификаторЗапроса); + + // Инициализация параметров. + ПараметрыВФорме = Объект.Параметры; + + // Удаление параметров для текущего запроса. + Если Удалять Тогда + КоличествоСтрок = ПараметрыВФорме.Количество() - 1; + Пока КоличествоСтрок >= 0 Цикл + ТекущийПараметр = ПараметрыВФорме.Получить(КоличествоСтрок); + Если ТекущийПараметр.ИдентификаторЗапроса = ИдентификаторЗапроса Тогда + ПараметрыВФорме.Удалить(КоличествоСтрок); + Модифицированность = Истина; + КонецЕсли; + КоличествоСтрок = КоличествоСтрок - 1; + КонецЦикла; + КонецЕсли; + + // Добавление параметров. + Фильтр = Новый Структура; + Фильтр.Вставить("ИдентификаторЗапроса", ИдентификаторЗапроса); + МассивПараметров = ПараметрыВФорме.НайтиСтроки(Фильтр); + + Для каждого СтрПараметр Из РезультатСтруктура Цикл + ЕстьПараметр = Ложь; + Для каждого Стр Из МассивПараметров Цикл + Если СтрПараметр.Имя = Стр.Имя Тогда + ЕстьПараметр = Истина; + КонецЕсли; + КонецЦикла; + Если Не ЕстьПараметр Или Не Удалять Тогда + ДобавитьПараметрВФорму(ПараметрыВФорме, СтрПараметр); + Модифицированность = Истина; + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +// Добавляет параметр из структуры в параметр формы. +// +// Параметры: +// ПараметрыВФорме - таблица значений "Параметры" в форме. +// ПараметрСтруктуры - текущая строка параметра массива структуры. +// +&НаСервере +Процедура ДобавитьПараметрВФорму(ПараметрыВФорме, ПараметрСтруктуры) + Значение = ПараметрСтруктуры.Значение; + Тип = ОбъектОбработки().ИмяТипаИзЗначения(Значение); + + // Основные реквизиты. + Элемент = ПараметрыВФорме.Добавить(); + Элемент.Идентификатор = Новый УникальныйИдентификатор; + Элемент.ИдентификаторЗапроса = ПараметрСтруктуры.ИдентификаторЗапроса; + Элемент.Имя = ПараметрСтруктуры.Имя; + Элемент.Тип = Тип; + Элемент.Значение = Значение; + + Значение = ЗначениеИзСтрокиВнутр(Значение); + + // Форменные реквизиты. + Элемент.ТипВФорме = Строка(ТипЗнч(Значение)); + Элемент.ЗначениеВФорме = Значение; +КонецПроцедуры + +// Вызов процедуры сохранения запросов в файл. +// +&НаКлиенте +Процедура НастройкаАвтосохранения() + Если Объект.ИспользоватьАвтосохранение Тогда + // Вызов процедуры сохранения запросов в файл. + ПериодАвтосохранения = Объект.ПериодАвтосохранения * 60; + Если ПериодАвтосохранения > 0 Тогда + ПодключитьОбработчикОжидания("СохранитьЗапросы", ПериодАвтосохранения); + КонецЕсли; + Иначе + ОтключитьОбработчикОжидания("СохранитьЗапросы"); + КонецЕсли; +КонецПроцедуры + +// Процедура сохранения запросов для автосохранения. +// +&НаКлиенте +Процедура СохранитьЗапросы() + + ИмяФайла = Объект.ИмяФайла; + Если Не ПустаяСтрока(ИмяФайла) Тогда + ДвоичныеДанные = СохранитьЗапросыСервер(); + ДвоичныеДанные.Записать(ИмяФайла); + ПоказатьОповещениеПользователя(НСтр("ru = 'Автосохранение прошло успешно.'"), ИмяФайла); + Модифицированность = Ложь; + КонецЕсли; + +КонецПроцедуры + +// Процедура сохранения запросов(серверная часть). +// +&НаСервере +Функция СохранитьЗапросыСервер() + + ДвоичныеДанные = ОбъектОбработки().ЗаписатьЗапросыВФайлXML(Объект); + Возврат ДвоичныеДанные; + +КонецФункции + +// Запускает выполнение запроса. +// +&НаКлиенте +Процедура ЗапуститьВыполнениеЗапроса(ВыводитьВременныеТаблицы) + // СЗахватывается" текущий запрос из списка запросов. + ИндексТекущегоЗапроса = ИндексТекущегоВопроса(); + Если ИндексТекущегоЗапроса = Неопределено Тогда + ТекстСообщения = НСтр("ru = 'Выберите запрос.'"); + ПоказатьСообщениеПользователю(ТекстСообщения, "Объект"); + Возврат; + КонецЕсли; + + НеотформатированныйТекст = ТекстЗапроса.ПолучитьТекст(); + ОтформатированныйТекст = СтрЗаменить(НеотформатированныйТекст, "|", ""); + + Если ПустаяСтрока(ОтформатированныйТекст) Тогда + ТекстПредупреждения = НСтр("ru = 'Введите текст запроса.'"); + ПоказатьПредупреждение(, ТекстПредупреждения ); + Возврат; + КонецЕсли; + + ТекстЗапроса.УстановитьТекст(ОтформатированныйТекст); + Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1).Текст = ОтформатированныйТекст; + + // Определение текста запроса. + ВыделенныйТекст = Элементы.ТекстЗапроса.ВыделенныйТекст; + Если Не ПустаяСтрока(ВыделенныйТекст) Тогда + Текст = ВыделенныйТекст; + Иначе + Текст = Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1).Текст; + КонецЕсли; + + ВыводитьИдентификатор = Объект.ВыводитьВРезультатахЗапросаЗначенияСсылок; + + // Очистка табличного документа "РезультатЗапроса" в форме. + РезультатЗапроса = Новый ТабличныйДокумент; + ТекстСообщения = ""; + + ОчиститьСообщения(); + + // Серверная часть для выполнения запроса. + ВыполнитьЗапросСервер(ИндексТекущегоЗапроса, РезультатЗапроса, ВыводитьВременныеТаблицы, ВыводитьИдентификатор, Текст, ТекстСообщения); + + Если Не ПустаяСтрока(ТекстСообщения) Тогда + ПоказатьСообщениеПользователю(ТекстСообщения, "Объект"); + КонецЕсли; +КонецПроцедуры + +// Загружает в результат запроса возвращаемый из Временного хранилища табличный документ. +// +// Параметры: +// РезультатЗапроса - Результат запроса. +// АдресРезультата - адрес временного хранилища, хранящийся. +// ТекстЗапроса - Строка - Текст запроса. +// +&НаСервере +Процедура ВыполнитьЗапросСервер(ИндексТекущегоЗапроса, ТабличныйДокументРезультата, ВыводитьВременныеТаблицы, ВыводитьИдентификатор, ТекстЗапроса, ТекстСообщения) + + // Убрать строки с комментариями. + КоличествоСтрок = СтрЧислоСтрок(ТекстЗапроса); + Текст = ""; + Для НомерСтроки = 1 По КоличествоСтрок Цикл + Фрагмент = СтрПолучитьСтроку(ТекстЗапроса, НомерСтроки); + Если Лев(СокрЛ(Фрагмент), 2) <> "//" Тогда + Текст = Текст + Фрагмент + Символы.ПС; + КонецЕсли; + КонецЦикла; + + // Заполнение параметров. + ЗаполнитьПараметрыПриВыполненииЗапроса(Текст); + + // Обнуление параметры. + ВремяВыполнения = 0; + КоличествоСтрок = 0; + + // Выбор текущего запроса. + ТекущийЗапрос = Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1); + // Выбор параметров по текущему запросу. + Фильтр = Новый Структура; + Фильтр.Вставить("ИдентификаторЗапроса", ТекущийЗапрос.Идентификатор); + МассивПараметров = Объект.Параметры.НайтиСтроки(Фильтр); + + МассивМаксШириныЯчеек = Новый Массив; + МассивМаксШириныЯчеек.Очистить(); + + ПорядокОбхода = Объект.ТипОбхода; + ИспользованиеЧередования = Объект.ЧередованиеЦветовВРезультатеЗапроса; + + Если ПоказыватьПланВыполненияЗапроса И ТехнологическийЖурналДоступен() Тогда + МеткаЗапроса = Строка(Новый УникальныйИдентификатор); + Иначе + МеткаЗапроса = ""; + КонецЕсли; + + // Выполнение запроса. + + // Будет сохранять результат запроса вместе с табличным документом - представлением результата... + ПараметрыВыводаЗапроса = Новый Структура; + ПараметрыВыводаЗапроса.Вставить("ВыводитьВременныеТаблицы", ВыводитьВременныеТаблицы); + ПараметрыВыводаЗапроса.Вставить("ВыводитьИдентификатор", ВыводитьИдентификатор); + ПараметрыВыводаЗапроса.Вставить("ПорядокОбхода", ПорядокОбхода); + ПараметрыВыводаЗапроса.Вставить("ИспользованиеЧередования", ИспользованиеЧередования); + + ОтчетПоВыполнениюЗапроса = Новый Структура; + ОтчетПоВыполнениюЗапроса.Вставить("КоличествоСтрок", КоличествоСтрок); + ОтчетПоВыполнениюЗапроса.Вставить("ВремяВыполнения", ВремяВыполнения); + ОтчетПоВыполнениюЗапроса.Вставить("ТекстСообщения", ТекстСообщения); + + Результат = ОбъектОбработки().ВыполнитьЗапрос(Текст, МассивПараметров, ТабличныйДокументРезультата, ПараметрыВыводаЗапроса, ОтчетПоВыполнениюЗапроса, МеткаЗапроса); + + Если ЗначениеЗаполнено(ОтчетПоВыполнениюЗапроса.ТекстСообщения) Тогда + ПоказатьСообщениеПользователю(ОтчетПоВыполнениюЗапроса.ТекстСообщения); + КонецЕсли; + + // Т..только если находимся в режиме выбора. + Если Не Параметры.РежимВыбора Тогда + Результат = Неопределено; + КонецЕсли; + + // Заполнение адреса временного хранилища для результата. + ТекущийЗапрос.АдресРезультата = ПоместитьВоВременноеХранилище(ТабличныйДокументРезультата, УникальныйИдентификатор); + ТекущийЗапрос.ВремяВыполнения = ОтчетПоВыполнениюЗапроса.ВремяВыполнения; + ТекущийЗапрос.КоличествоСтрок = ОтчетПоВыполнениюЗапроса.КоличествоСтрок; + + Если Не ПустаяСтрока(ТекущийЗапрос.АдресРезультатовЗапроса) Тогда + УдалитьИзВременногоХранилища(ТекущийЗапрос.АдресРезультатовЗапроса) + КонецЕсли; + Если Результат=Неопределено Тогда + ТекущийЗапрос.АдресРезультатовЗапроса = ""; + Иначе + ТекущийЗапрос.АдресРезультатовЗапроса = ПоместитьВоВременноеХранилище(Результат, ЭтотОбъект.УникальныйИдентификатор); + КонецЕсли; + + // Обновление заголовка результата запроса. + РезультирующаяСтрока = НСтр("ru = 'Результат запроса (количество строк = %КоличествоСтрок%, время выполнения = %ВремяВыполнения% с)'"); + РезультирующаяСтрока = СтрЗаменить(РезультирующаяСтрока, "%КоличествоСтрок%", Строка(ОтчетПоВыполнениюЗапроса.КоличествоСтрок)); + РезультирующаяСтрока = СтрЗаменить(РезультирующаяСтрока, "%ВремяВыполнения%", Строка(ОтчетПоВыполнениюЗапроса.ВремяВыполнения)); + + Элементы.РезультатЗапроса.Заголовок = РезультирующаяСтрока; + +КонецПроцедуры + +&НаСервере +Процедура ПолучитьРезультатЗапросаИзХранилища(ТабличныйДокументРезультата, АдресРезультата) + Если НЕ ПустаяСтрока(АдресРезультата) Тогда + РезультатИзВременногоХранилища = ПолучитьИзВременногоХранилища(АдресРезультата); + ТабличныйДокументРезультата = РезультатИзВременногоХранилища; + КонецЕсли; +КонецПроцедуры + +&НаСервере +Функция ЗначениеВСтрокуСервер(Значение) + Результат = ЗначениеВСтрокуВнутр(Значение); + Возврат Результат; +КонецФункции + +// Возвращает строковое представление типа. +// Например, для ссылки справочника возвращает "CatalogRef.ИмяСправочника". +// +&НаСервере +Функция ТипСтрока(Значение) + + СписокДобавленныхТипов = Новый СписокЗначений; + ОбъектОбработки().СформироватьСписокТипов(СписокДобавленныхТипов); + + ТипСтрока = Строка(Тип(Значение)); + Если Значение = "СписокЗначений" Тогда + Возврат "СписокЗначений"; + КонецЕсли; + + ТипНайден = Ложь; + Для Каждого ЭлементСписка Из СписокДобавленныхТипов Цикл + Если ЭлементСписка.Представление = ТипСтрока Тогда + ТипНайден = Истина; + Прервать; + КонецЕсли; + КонецЦикла; + + Если Не ТипНайден Тогда + ТипСтрока = XMLТип(Тип(Значение)).ИмяТипа; + КонецЕсли; + + Возврат ТипСтрока; + +КонецФункции + +// Формирование диалога по сохранению файла запросов. +// +&НаКлиенте +Процедура СохранитьФайлЗапроса(ОписаниеОповещения) + + Оповещение = Новый ОписаниеОповещения("СохранитьФайлЗапросаЗавершение", ЭтотОбъект, ОписаниеОповещения); + #Если Не ВебКлиент Тогда + // В тонком и толстом клиентах расширение подключено всегда. + СохранитьФайлЗапросаЗавершение(ОписаниеОповещения); + Возврат; + #КонецЕсли + + // Если расширение и так уже подключено, незачем про него спрашивать. + РасширениеПодключено = ПодключитьРасширениеРаботыСФайлами(); + Если РасширениеПодключено Тогда + СохранитьФайлЗапросаЗавершение(ОписаниеОповещения); + Возврат; + КонецЕсли; + + Если Не ЗаданВопросОбУстановкеРасширения Тогда + + ЗаданВопросОбУстановкеРасширения = Истина; + ОписаниеОповещенияВопрос = Новый ОписаниеОповещения("ЗадатьВопросОбУстановкеРасширения", ЭтотОбъект, Оповещение); + ПоказатьВопрос(ОписаниеОповещенияВопрос, Нстр("ru = 'Установить расширение для работы с файлами?'"), РежимДиалогаВопрос.ДаНет); + + Иначе + + СохранитьФайлЗапросаЗавершение(ОписаниеОповещения); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ЗадатьВопросОбУстановкеРасширения(Ответ, Оповещение) Экспорт + + Если Ответ = КодВозвратаДиалога.Да Тогда + + НачатьУстановкуРасширенияРаботыСФайлами(Оповещение); + + Иначе + + СохранитьФайлЗапросаЗавершение(Оповещение); + + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура СохранитьФайлЗапросаЗавершение(Оповещение) Экспорт + + ИмяФайла = Оповещение.ДополнительныеПараметры; + + Если ПодключитьРасширениеРаботыСФайлами() Тогда + Если ПустаяСтрока(ИмяФайла) Тогда + Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); + Диалог.Заголовок = НСтр("ru = 'Выберите файл запросов'"); + Диалог.ПредварительныйПросмотр = Ложь; + Диалог.Фильтр = НСтр("ru = 'Файл запросов (*.q1c)|*.q1c'"); + Диалог.Расширение = "q1c"; + Диалог.ПроверятьСуществованиеФайла = Истина; + Диалог.МножественныйВыбор = Ложь; + + Если Диалог.Выбрать() Тогда + ИмяФайла = Диалог.ПолноеИмяФайла; + КонецЕсли; + КонецЕсли; + + // Записываются текст и параметры запроса в файл. + Если Не ПустаяСтрока(ИмяФайла) Тогда + ДвоичныеДанные = СохранитьЗапросыСервер(); + ДвоичныеДанные.Записать(ИмяФайла); + ВыполнитьОбработкуОповещения(Оповещение, ИмяФайла); + КонецЕсли; + Иначе + ТекстСообщения = НСтр("ru = 'В данном браузере невозможно работать с файлами.'"); + ПоказатьСообщениеПользователю(ТекстСообщения, "Объект"); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОбработкаЧтенияФайла(Удалять) + // Выбор файла для загрузки. + Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); + Диалог.Заголовок = НСтр("ru = 'Выберите файл запросов'"); + Диалог.ПредварительныйПросмотр = Ложь; + Диалог.Фильтр = НСтр("ru = 'Файл запросов (*.q1c)|*.q1c'"); + Диалог.Расширение = "q1c"; + Диалог.ПроверятьСуществованиеФайла = Истина; + Диалог.МножественныйВыбор = Ложь; + Если Диалог.Выбрать() Тогда + ИмяФайла = Диалог.ПолноеИмяФайла; + КонецЕсли; + + // Чтение данных из файла. + Если Не ПустаяСтрока(ИмяФайла) Тогда + Если Удалять Тогда + Объект.Запросы.Очистить(); + Объект.Параметры.Очистить(); + КонецЕсли; + ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла); + ЗагрузитьЗапросыИзФайла(ДвоичныеДанные); + Объект.ИмяФайла = ИмяФайла; + КонецЕсли; +КонецПроцедуры + +&НаСервере +Процедура ЗагрузитьЗапросыИзФайла(ДвоичныеДанные) + + ОбъектВнешнейОбработки = ОбъектОбработки().ПрочитатьЗапросыИзФайлаXML(ДвоичныеДанные); + ЗаполнитьЗапросыИПараметрыИзОбъектаВнешнейОбработки(ОбъектВнешнейОбработки); + ВывестиРезультатЗапроса(); + +КонецПроцедуры + +// Заполняет из объекта внешней обработки запросы и параметры. +// +// Параметры: +// ОбъектОбработки - объект обработки. +// +&НаСервере +Процедура ЗаполнитьЗапросыИПараметрыИзОбъектаВнешнейОбработки(ОбъектОбработки) + ЗапросыОб = ОбъектОбработки.Запросы; + ПараметрыОб = ОбъектОбработки.Параметры; + + Объект.Запросы.Очистить(); + Объект.Параметры.Очистить(); + + // Заполнение запросов и параметров в форме. + Для каждого ТекЗапрос Из ЗапросыОб Цикл + ЭлементЗапроса = Объект.Запросы.Добавить(); + ЭлементЗапроса.Идентификатор = ТекЗапрос.Идентификатор; + ЭлементЗапроса.Имя = ТекЗапрос.Имя; + ЭлементЗапроса.Текст = ТекЗапрос.Текст; + КонецЦикла; + + Для каждого ТекПараметр Из ПараметрыОб Цикл + ТипСтрока = ТекПараметр.Тип; + + Значение = ТекПараметр.Значение; + Значение = ЗначениеИЗСтрокиВнутр(Значение); + + Если ТипСтрока = "ТаблицаЗначений" Или ТипСтрока = "МоментВремени" Или ТипСтрока = "Граница" Тогда + ЭлементПараметр = Объект.Параметры.Добавить(); + ЭлементПараметр.ИдентификаторЗапроса = ТекПараметр.ИдентификаторЗапроса; + ЭлементПараметр.Идентификатор = ТекПараметр.Идентификатор; + ЭлементПараметр.Имя = ТекПараметр.Имя; + ЭлементПараметр.Тип = СписокТипов.НайтиПоЗначению(ТипСтрока).Значение; + ЭлементПараметр.Значение = ТекПараметр.Значение; + ЭлементПараметр.ТипВФорме = СписокТипов.НайтиПоЗначению(ТипСтрока).Представление; + ЭлементПараметр.ЗначениеВФорме = ОбъектОбработки().ФормированиеПредставленияЗначения(Значение); + Иначе + Массив = Новый Массив; + Массив.Добавить(Тип(ТипСтрока)); + Описание = Новый ОписаниеТипов(Массив); + + ЭлементПараметр = Объект.Параметры.Добавить(); + ЭлементПараметр.ИдентификаторЗапроса = ТекПараметр.ИдентификаторЗапроса; + ЭлементПараметр.Идентификатор = ТекПараметр.Идентификатор; + ЭлементПараметр.Имя = ТекПараметр.Имя; + ЭлементПараметр.Тип = ТипСтрока; + ЭлементПараметр.ТипВФорме = Описание; + ЭлементПараметр.Значение = ЗначениеВСтрокуВнутр(Значение); + ЭлементПараметр.ЗначениеВФорме = Значение; + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +&НаКлиенте +Процедура ИнициализацияТипаИЗначенияПараметра(ТекущийПараметр, ТекущийТип) + // Тип в табличной части. + ТипСтрока = ТипСтрока(ТекущийТип.Значение); + ТекущийПараметр.Тип = ТипСтрока; + + // Тип в форме. + Массив = Новый Массив; + Массив.Добавить(Тип(ТекущийПараметр.Тип)); + Описание = Новый ОписаниеТипов(Массив); + + ТекущийПараметр.ТипВФорме = ТекущийТип.Представление; + + // Значение. + Значение = Описание.ПривестиЗначение(Тип(ТекущийТип.Значение)); + ТекущийПараметр.ЗначениеВФорме = Значение; + + ЗначениеВнутр = ЗначениеВСтрокуСервер(Значение); + ТекущийПараметр.Значение = ЗначениеВнутр; +КонецПроцедуры + +&НаСервере +Функция ПолучитьИмяПараметра() + ПараметрыВФорме = Объект.Параметры; + Флаг = Истина; + Индекс = 0; + + Пока Флаг Цикл + Имя = "Параметр" + Строка(Формат(Индекс, "ЧН=-")); + Имя = СтрЗаменить(Имя, "-", ""); + Фильтр = Новый Структура("Имя", Имя); + + ОтфильтрованныеСтроки = ПараметрыВФорме.НайтиСтроки(Фильтр); + Если ОтфильтрованныеСтроки.Количество() = 0 Тогда + Результат = Имя; + Флаг = Ложь; + КонецЕсли; + Индекс = Индекс+1; + КонецЦикла; + + Возврат Результат; +КонецФункции + +// Показывает сообщение или предупреждение пользователю. +// +// Параметры: +// ТекстСообщения - текст передаваемого сообщения. +// ПутьКДанным - путь к данным для сообщения. +// +&НаКлиентеНаСервереБезКонтекста +Процедура ПоказатьСообщениеПользователю(ТекстСообщения, ПутьКДанным = "") + Сообщение = Новый СообщениеПользователю; + Сообщение.Текст = ТекстСообщения; + Сообщение.ПутьКДанным = ПутьКДанным; + Сообщение.Сообщить(); +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьПараметрыКлиент() + // СЗахватывается" текущий запрос из списка запросов. + ИндексТекущегоЗапроса = ИндексТекущегоВопроса(); + Если ИндексТекущегоЗапроса = Неопределено Тогда + ПоказатьСообщениеПользователю(НСтр("ru = 'Выберите запрос.'"), "Объект"); + Возврат; + КонецЕсли; + + ТекущийЗапрос = Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1); + + Если Не ПустаяСтрока(ТекущийЗапрос.Текст) Тогда + Фильтр = Новый Структура; + Фильтр.Вставить("ИдентификаторЗапроса", ИдентификаторТекущегоЗапроса); + МассивПараметров = Объект.Параметры.НайтиСтроки(Фильтр); + + Если МассивПараметров.Количество() > 0 Тогда + Текст = НСтр("ru = 'Таблица параметров не пуста. Очистить таблицу?'"); + ОписаниеОповещения = Новый ОписаниеОповещения("ЗаполнитьПараметрыКлиентЗавершение", ЭтотОбъект, ТекущийЗапрос); + ПоказатьВопрос(ОписаниеОповещения, Текст, РежимДиалогаВопрос.ДаНет); + Иначе + ЗаполнитьПараметрыКлиентЗавершение(КодВозвратаДиалога.Да, ТекущийЗапрос); + КонецЕсли; + + Иначе + ПоказатьПредупреждение(, НСтр("ru = 'Текст запроса пустой.'")); + КонецЕсли; +КонецПроцедуры + +&НаКлиенте +Процедура ЗаполнитьПараметрыКлиентЗавершение(Ответ, ТекущийЗапрос) Экспорт + + Удалять = (Ответ = КодВозвратаДиалога.Да); + + СчитатьПараметрыЗапроса(ТекущийЗапрос.Текст, Удалять, ИдентификаторТекущегоЗапроса); + + ОбновитьФормуКлиент(); + +КонецПроцедуры + +&НаСервере +Функция СформироватьИмяФормыСпискаДляСсылки(Ссылка) + ИмяФормыСписка = ""; + + Если Ссылка = Неопределено Тогда + Возврат ИмяФормыСписка; + КонецЕсли; + + Если ЭтоСсылка(ТипЗнч(Ссылка)) Тогда + ИмяФормыСписка = Ссылка.Метаданные().ОсновнаяФормаСписка.ПолноеИмя(); + КонецЕсли; + + Возврат ИмяФормыСписка; +КонецФункции + +&НаСервере +Процедура ЗаполнитьПараметрыПриВыполненииЗапроса(ТекстЗапроса) + // Считывание параметров из текст запроса в массив структуры. + РезультатСтруктура = ОбъектОбработки().СчитатьПараметрыЗапроса(ТекстЗапроса, ИдентификаторТекущегоЗапроса); + + ФлагВыводаСообщения = Ложь; + ПараметрыВФорме = Объект.Параметры; + + Для каждого СчитанныйПараметр Из РезультатСтруктура Цикл + Фильтр = Новый Структура; + Фильтр.Вставить("ИдентификаторЗапроса", ИдентификаторТекущегоЗапроса); + МассивПараметров = Объект.Параметры.НайтиСтроки(Фильтр); + + НайденПараметр = Ложь; + Для Индекс = 0 По МассивПараметров.Количество() - 1 Цикл + Если НРег(МассивПараметров.Получить(Индекс).Имя) = НРег(СчитанныйПараметр.Имя) Тогда + НайденПараметр = Истина; + КонецЕсли; + КонецЦикла; + + Если Не НайденПараметр Тогда + Если Не ФлагВыводаСообщения Тогда + ПоказатьСообщениеПользователю(НСтр("ru = 'Найденные параметры были добавлены автоматически.'"), "Объект"); + ФлагВыводаСообщения = Истина; + КонецЕсли; + ДобавитьПараметрВФорму(ПараметрыВФорме, СчитанныйПараметр); + КонецЕсли; + КонецЦикла; +КонецПроцедуры + +// Копирует параметры из запроса имеющего идентификатор текущего запроса. +// +// Параметры: +// ЗапросПолучатель - запрос, к которому привязываются параметры. +// +&НаКлиенте +Процедура СкопироватьПараметрыИзЗапроса(ЗапросПолучатель) + ПараметрыЗапроса = Объект.Параметры; + + МассивПараметров = Новый Массив; + + Для каждого ТекущийПараметр Из ПараметрыЗапроса Цикл + Если ТекущийПараметр.ИдентификаторЗапроса <> ИдентификаторТекущегоЗапроса Тогда + Продолжить; + КонецЕсли; + МассивПараметров.Добавить(ТекущийПараметр); + КонецЦикла; + + КолПараметров = МассивПараметров.Количество(); + Для Индекс = 0 По КолПараметров - 1 Цикл + ЭлементПараметр = Объект.Параметры.Добавить(); + ЭлементПараметр.Идентификатор = Новый УникальныйИдентификатор; + ЭлементПараметр.ИдентификаторЗапроса = ЗапросПолучатель.Идентификатор; + ЭлементПараметр.Имя = МассивПараметров.Получить(Индекс).Имя; + ЭлементПараметр.Тип = МассивПараметров.Получить(Индекс).Тип; + ЭлементПараметр.Значение = МассивПараметров.Получить(Индекс).Значение; + ЭлементПараметр.ТипВФорме = МассивПараметров.Получить(Индекс).ТипВФорме; + ЭлементПараметр.ЗначениеВФорме = МассивПараметров.Получить(Индекс).ЗначениеВФорме; + КонецЦикла; +КонецПроцедуры + +// Формирует имя копии запроса. +// +// Параметры: +// Имя - передаваемое имя запроса. +// +&НаКлиенте +Функция СформироватьИмяКопииЗапроса(Имя) + Флаг = Истина; + Индекс = 1; + + Пока Флаг Цикл + ФормируемоеИмяЗапроса = НСтр("ru = '%ИмяЗапроса% - Копия %НомерКопии%'"); + ФормируемоеИмяЗапроса = СтрЗаменить(ФормируемоеИмяЗапроса, "%ИмяЗапроса%", Имя); + ФормируемоеИмяЗапроса = СтрЗаменить(ФормируемоеИмяЗапроса, "%НомерКопии%", Индекс); + + Фильтр = Новый Структура; + Фильтр.Вставить("Имя", ФормируемоеИмяЗапроса); + + МассивЗапросовПоФильтру = Объект.Запросы.НайтиСтроки(Фильтр); + + Если МассивЗапросовПоФильтру.Количество() = 0 Тогда + Флаг = Ложь; + КонецЕсли; + + Индекс = Индекс + 1; + КонецЦикла; + + Возврат ФормируемоеИмяЗапроса; +КонецФункции + +// Анализирует параметры запуска формы и по необходимости настраивает режим выбора. +&НаСервере +Процедура ВключитьРежимВыбора() + + НоваяКнопка = Элементы.ФормаВыполнитьВыборРезультатаЗапроса; + НоваяКнопка.Видимость = Параметры.РежимВыбора; + НоваяКнопка.Доступность = НоваяКнопка.Видимость; + + Если Не НоваяКнопка.Видимость Тогда + Возврат; + КонецЕсли; + + НоваяКнопка.КнопкаПоУмолчанию = Истина; + + ЗакрыватьПриВыборе = Параметры.ЗакрыватьПриВыборе; + Если Не ПустаяСтрока(Параметры.Заголовок) Тогда + Заголовок = Параметры.Заголовок; + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция ВключениеПланаВыполненияЗапроса() + РезультатВключения = Новый Структура("Результат, Причина", Истина, ""); + + Если ПоказПланаВыполненияВозможен() Тогда + ПараметрыТехнологическогоЖурнала = Новый Структура("КаталогСЛогФайлами, ИдентификаторПроцессаОС"); + ОбъектОбработки().ВключениеТехнологическогоЖурнала(ПараметрыТехнологическогоЖурнала, РезультатВключения); + Если РезультатВключения.Результат Тогда + ИдентификаторПроцессаОС = ПараметрыТехнологическогоЖурнала.ИдентификаторПроцессаОС; + КаталогСЛогФайлами = ПараметрыТехнологическогоЖурнала.КаталогСЛогФайлами; + КонецЕсли; + Иначе + РезультатВключения.Результат = Ложь; + РезультатВключения.Причина = НСтр("ru = 'Отображение плана выполнения запроса доступно только при работе на ОС Windows.'"); + КонецЕсли; + + Возврат РезультатВключения; +КонецФункции + +&НаСервере +Процедура ВыключитьПланаВыполненияЗапроса() + ОбъектОбработки().ВыключениеТехнологическогоЖурнала(); +КонецПроцедуры + +&НаСервере +Функция ТехнологическийЖурналДоступен() + + СписокФайлов = НайтиФайлы(КаталогСЛогФайлами, "*.log", Истина); + Для каждого Файл Из СписокФайлов Цикл + Если Найти(Файл.Путь, "_" + ИдентификаторПроцессаОС) > 0 Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + +&НаКлиенте +Процедура ОпределитьВозможностьОткрытияТехнологическогоЖурнала() + + Если ТехнологическийЖурналДоступен() Тогда + Элементы.ПоказатьПланВыполненияЗапроса.Доступность = Истина; + ОтключитьОбработчикОжидания("ОпределитьВозможностьОткрытияТехнологическогоЖурнала"); + КонецЕсли; + +КонецПроцедуры + +&НаКлиенте +Процедура ОткрытьФормуПланаВыполненияЗапроса() + + Если ЗначениеЗаполнено(МеткаЗапроса) Тогда + Отбор = Новый Структура("Идентификатор", ИдентификаторТекущегоЗапроса); + Строки = Объект.Запросы.НайтиСтроки(Отбор); + Если Строки.Количество() > 0 Тогда + ИмяЗапроса = Строки[0].Имя; + Иначе + ИмяЗапроса = ""; + КонецЕсли; + + ПараметрыЗапроса = Новый Структура("МеткаЗапроса, КаталогСЛогФайлами, ИдентификаторПроцессаОС, ИмяЗапроса", МеткаЗапроса, КаталогСЛогФайлами, ИдентификаторПроцессаОС, ИмяЗапроса); + ОткрытьФорму(Объект.ПутьКФормам + ".ПланВыполненияЗапроса", ПараметрыЗапроса, ЭтотОбъект, Истина); + КонецЕсли; + +КонецПроцедуры + +&НаСервере +Функция ПоказПланаВыполненияВозможен() + + СистемнаяИнформация = Новый СистемнаяИнформация(); + Если (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86) Или (СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64) Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; + +КонецФункции + +&НаСервереБезКонтекста +Функция ВерсияКонфигурации835ИБольше() + СистемнаяИнформация = Новый СистемнаяИнформация; + + Строка = СистемнаяИнформация.ВерсияПриложения; + Результат = Новый Массив; + + Разделитель = "."; + Позиция = Найти(Строка, Разделитель); + Пока Позиция > 0 Цикл + Подстрока = Лев(Строка, Позиция - 1); + Результат.Добавить(Число(Подстрока)); + Строка = Сред(Строка, Позиция + СтрДлина(Разделитель)); + Позиция = Найти(Строка, Разделитель); + КонецЦикла; + Результат.Добавить(Число(Строка)); + Если Результат[1] >= 3 И Результат[2] >= 5 Тогда + Возврат Истина; + КонецЕсли; + + Возврат Ложь; +КонецФункции + +&НаСервере +Функция ЭтоСсылка(Тип) + + Возврат Тип <> Тип("Неопределено") + И (Справочники.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ Документы.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ Перечисления.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().СодержитТип(Тип) + ИЛИ Задачи.ТипВсеСсылки().СодержитТип(Тип) + ИЛИ ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип)); + +КонецФункции + +Процедура ПослеВводаУникальногоИдентификатора(Результат, Параметр) + ЗначениеПараметраУникальныйИдентификатор = Новый УникальныйИдентификатор(Результат); + ТекущаяСтрока = Объект.Параметры.НайтиПоИдентификатору(Параметр); + ТекущаяСтрока.Значение = ЗначениеВСтрокуСервер(ЗначениеПараметраУникальныйИдентификатор); + ТекущаяСтрока.ЗначениеВФорме = ЗначениеПараметраУникальныйИдентификатор; +КонецПроцедуры + + +#КонецОбласти diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Templates/РезультатВыполненияЗапроса.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Templates/РезультатВыполненияЗапроса.xml new file mode 100644 index 0000000..7f769c9 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Templates/РезультатВыполненияЗапроса.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/src/ИнструментыРазработчикаКонсольЗапросов/Templates/РезультатВыполненияЗапроса/Ext/Template.xml b/src/ИнструментыРазработчикаКонсольЗапросов/Templates/РезультатВыполненияЗапроса/Ext/Template.xml new file mode 100644 index 0000000..48b14f3 --- /dev/null +++ b/src/ИнструментыРазработчикаКонсольЗапросов/Templates/РезультатВыполненияЗапроса/Ext/Template.xml @@ -0,0 +1,95 @@ + + + + ru + ru + + ru + Русский + Русский + + + + 1 + + + 0 + + 1 + + + 2 + + + ru + [ИмяЗапроса] (Записей в результате: [КоличествоСтрок]) + + + + + + + + 1 + + + + 3 + Значение + Расшифровка + + + + + true + 4 + 2 + 2 + + ЗапросИмя + + Rows + 0 + 0 + -1 + -1 + + + + ОбластьЯчейки + + Rectangle + 1 + 1 + 0 + 0 + + + + Solid + + + + 96 + + + 0 + 96 + 72 + Center + #5C5845 + Auto + Template + true + + + 0 + Top + Parameter + false + QuickChange + + + 72 + + \ No newline at end of file