epf_QueryConsole/src/ИнструментыРазработчикаКонс.../Forms/ВыборЗапроса/Ext/Form/Module.bsl

457 lines
27 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

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

#Область ОбработчикиСобытий
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("АвтоТест") Тогда
Возврат;
КонецЕсли;
// Считывание параметров передачи.
ПараметрыПередачи = ПолучитьИзВременногоХранилища(Параметры.АдресХранилища);
Объект.Запросы.Загрузить(ПараметрыПередачи.Запросы);
Объект.Параметры.Загрузить(ПараметрыПередачи.Параметры);
Объект.ИмяФайла = ПараметрыПередачи.ИмяФайла;
ИдентификаторТекущегоЗапроса = ПараметрыПередачи.ИдентификаторТекущегоЗапроса;
ИдентификаторТекущегоПараметра = ПараметрыПередачи.ИдентификаторТекущегоПараметра;
ОбработкаОбъект = ОбъектОбработки();
Объект.ДоступныеТипыДанных = ОбработкаОбъект.Метаданные().Реквизиты.ДоступныеТипыДанных.Тип;
СписокТипов = ОбъектОбработки().СформироватьСписокТипов();
ОбработкаОбъект.ФильтрацияСпискаТипов(СписокТипов, "");
Фильтр = Новый Структура;
Фильтр.Вставить("Идентификатор", ИдентификаторТекущегоЗапроса);
СтрокиЗапросовСИдентификатор = Объект.Запросы.НайтиСтроки(Фильтр);
Если СтрокиЗапросовСИдентификатор.Количество() > 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;
КонецЦикла;
Возврат ФормируемоеИмяЗапроса;
КонецФункции
#КонецОбласти