1974 lines
118 KiB
Plaintext
1974 lines
118 KiB
Plaintext
|
||
#Область ОбработчикиСобытийФормы
|
||
|
||
// Обработчик при создании на сервере.
|
||
// 1. Инициализируются возможные типы данных конфигурации для представления параметров.
|
||
// 2. Формируется путь к имени формы.
|
||
// 3. Автоматическое создание запроса в табличной части.
|
||
//
|
||
&НаСервере
|
||
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
|
||
|
||
Если Параметры.Свойство("АвтоТест") Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
ИмяЗапросаПоУмолчанию = НСтр("ru = 'Новый запрос'");
|
||
|
||
ОбработкаОбъект = ОбъектОбработки();
|
||
Объект.ДоступныеТипыДанных = ОбработкаОбъект.Метаданные().Реквизиты.ДоступныеТипыДанных.Тип;
|
||
Объект.ПутьКФормам = ОбработкаОбъект.Метаданные().ПолноеИмя() + ".Форма";
|
||
Объект.ЧередованиеЦветовВРезультатеЗапроса = Истина;
|
||
|
||
Элемент = Объект.Запросы.Добавить();
|
||
ИдентификаторТекущегоЗапроса = Новый УникальныйИдентификатор;
|
||
Элемент.Идентификатор = ИдентификаторТекущегоЗапроса;
|
||
Элемент.Имя = ИмяЗапросаПоУмолчанию;
|
||
|
||
СписокТипов = ОбъектОбработки().СформироватьСписокТипов();
|
||
ОбъектОбработки().ФильтрацияСпискаТипов(СписокТипов, "");
|
||
|
||
ЗаголовокФормы = НСтр("ru = 'Консоль запросов (%ИмяЗапросаПоУмолчанию%)'");
|
||
ЗаголовокФормы = СтрЗаменить(ЗаголовокФормы, "%ИмяЗапросаПоУмолчанию%", ИмяЗапросаПоУмолчанию);
|
||
ЭтотОбъект.Заголовок = ЗаголовокФормы;
|
||
|
||
Объект.ТипОбхода = "Авто";
|
||
|
||
ВключитьРежимВыбора();
|
||
|
||
///SPS
|
||
Объект.ТекИдентификаторЗапроса = ИдентификаторТекущегоЗапроса;
|
||
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура ПередЗакрытием(Отказ, СтандартнаяОбработка)
|
||
|
||
Если Не Модифицированность Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
Отказ = Истина;
|
||
|
||
Текст = НСтр("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).Идентификатор;
|
||
Модифицированность = Ложь;
|
||
Иначе
|
||
Элемент = Объект.Запросы.Добавить();
|
||
ИдентификаторТекущегоЗапроса = Новый УникальныйИдентификатор;
|
||
Элемент.Идентификатор = ИдентификаторТекущегоЗапроса;
|
||
Элемент.Имя = ИмяЗапросаПоУмолчанию;
|
||
Результат = Новый ТабличныйДокумент;
|
||
КонецЕсли;
|
||
|
||
///SPS
|
||
Объект.ТекИдентификаторЗапроса = ИдентификаторТекущегоЗапроса;
|
||
|
||
ОбновитьФормуКлиент();
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура СоздатьТекстЗапросаДляКонфигуратора(Команда)
|
||
ПараметрыПередачи = Новый Структура;
|
||
ПараметрыПередачи.Вставить("ТекстЗапроса", ТекстЗапроса.ПолучитьТекст());
|
||
|
||
Путь = Объект.ПутьКФормам + "." + "ТекстЗапросаДляКонфигуратора";
|
||
ОткрытьФорму(Путь, ПараметрыПередачи, ЭтотОбъект);
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура ОткрытьВОтдельномОкнеТабличныйДокумент(Команда)
|
||
ПараметрыПередачи = Новый Структура;
|
||
ПараметрыПередачи.Вставить("РезультатЗапроса", РезультатЗапроса);
|
||
|
||
Путь = Объект.ПутьКФормам + "." + "РезультатЗапроса";
|
||
ОткрытьФорму(Путь, ПараметрыПередачи, ЭтотОбъект);
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура СкопироватьЗапрос(Команда)
|
||
ИндексТекущегоЗапроса = ИндексТекущегоВопроса();
|
||
Если ИндексТекущегоЗапроса = Неопределено Тогда
|
||
ПоказатьСообщениеПользователю(НСтр("ru = 'Выберите запрос.'"), "Объект");
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
ЗапросОснование = Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1);
|
||
|
||
ИдентификаторНовогоЗапроса = Новый УникальныйИдентификатор;
|
||
ИмяНовогоЗапроса = СформироватьИмяКопииЗапроса(ЗапросОснование.Имя);
|
||
|
||
НовыйЗапрос = Объект.Запросы.Добавить();
|
||
НовыйЗапрос.Идентификатор = ИдентификаторНовогоЗапроса;
|
||
НовыйЗапрос.Имя = ИмяНовогоЗапроса;
|
||
НовыйЗапрос.Текст = ЗапросОснование.Текст;
|
||
|
||
// Копирование параметров из запроса основания в новый запрос
|
||
// из запроса, имеющего ИдентификаторТекущегоЗапроса.
|
||
СкопироватьПараметрыИзЗапроса(НовыйЗапрос);
|
||
|
||
// Изменение значения ИдентификатораТекущегоЗапроса.
|
||
ИдентификаторТекущегоЗапроса = ИдентификаторНовогоЗапроса;
|
||
|
||
///SPS
|
||
Объект.ТекИдентификаторЗапроса = ИдентификаторТекущегоЗапроса;
|
||
|
||
// Обновление формы.
|
||
ОбновитьФормуКлиент();
|
||
|
||
Модифицированность = истина;
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура ОткрытьОбъектИзРезультата(Команда)
|
||
РасшифровкаЯчейки = РезультатЗапроса.ТекущаяОбласть.Расшифровка;
|
||
ТипРасшифровки = ТипЗнч(РасшифровкаЯчейки);
|
||
Если Объект.ДоступныеТипыДанных.СодержитТип(ТипРасшифровки) И РасшифровкаЯчейки <> Неопределено Тогда
|
||
ПоказатьЗначение(, РасшифровкаЯчейки);
|
||
КонецЕсли;
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура ОткрытьСписокИзРезультата(Команда)
|
||
РасшифровкаЯчейки = РезультатЗапроса.ТекущаяОбласть.Расшифровка;
|
||
ИмяФормыСписка = СформироватьИмяФормыСпискаДляСсылки(РасшифровкаЯчейки);
|
||
Если Не ПустаяСтрока(ИмяФормыСписка) Тогда
|
||
ОткрытьФорму(ИмяФормыСписка, , ЭтотОбъект);
|
||
КонецЕсли;
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура ВыделитьЯчейки(Команда)
|
||
ОбластьРезультата = РезультатЗапроса.ТекущаяОбласть;
|
||
|
||
ПерваяСтрока = ОбластьРезультата.Верх;
|
||
ПерваяКолонка = ОбластьРезультата.Лево;
|
||
ПоследняяСтрока = ОбластьРезультата.Низ;
|
||
ПоследняяКолонка = ОбластьРезультата.Право;
|
||
|
||
ЭталоннаяОбласть = РезультатЗапроса.Область(ПерваяСтрока, ПерваяКолонка, ПерваяСтрока, ПерваяКолонка);
|
||
ШрифтЭталоннойОбласти = ЭталоннаяОбласть.Шрифт;
|
||
Если ШрифтЭталоннойОбласти = Неопределено Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
ФлагЖирности = Не ШрифтЭталоннойОбласти.Жирный;
|
||
Если ФлагЖирности = Неопределено Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
Для ИндексСтроки = ПерваяСтрока По ПоследняяСтрока Цикл
|
||
Для ИндексКолонки = ПерваяКолонка По ПоследняяКолонка Цикл
|
||
ТекущаяОбластьРезультата = РезультатЗапроса.Область(ИндексСтроки, ИндексКолонки, ИндексСтроки, ИндексКолонки);
|
||
ТекущийШрифт = ТекущаяОбластьРезультата.Шрифт;
|
||
Если ТекущийШрифт <> Неопределено Тогда
|
||
ТекущаяОбластьРезультата.Шрифт = Новый Шрифт(ТекущийШрифт,,, ФлагЖирности);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецЦикла;
|
||
КонецПроцедуры
|
||
|
||
///////////////////////////////////////////////////////////////////////////
|
||
// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ
|
||
&НаКлиенте
|
||
Процедура ПослеЗакрытияКонструктораЗапроса(ТекстЗапросаВФорме, ИндексТекущегоЗапроса) Экспорт
|
||
Если ТекстЗапросаВФорме <> Неопределено Тогда
|
||
ТекущийЗапрос = Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1);
|
||
Если ТекущийЗапрос.Имя = ИмяЗапросаПоУмолчанию Тогда
|
||
ТекущийЗапрос.Имя = ПолучитьИмяЗапроса(ТекстЗапросаВФорме);
|
||
КонецЕсли;
|
||
ТекущийЗапрос.Текст = ТекстЗапросаВФорме;
|
||
Модифицированность = Истина;
|
||
ОбновитьФормуКлиент();
|
||
КонецЕсли;
|
||
КонецПроцедуры
|
||
|
||
|
||
&НаСервере
|
||
Функция ОбъектОбработки()
|
||
Возврат РеквизитФормыВЗначение("Объект");
|
||
КонецФункции
|
||
|
||
&НаСервере
|
||
Процедура ВыключениеТехнологическогоЖурнала()
|
||
ОбъектОбработки().ВыключениеТехнологическогоЖурнала();
|
||
КонецПроцедуры
|
||
|
||
// Передача табличной части "Запросы", "Параметры" в виде структуры.
|
||
//
|
||
&НаСервере
|
||
Функция ПоместитьЗапросыВСтруктуру()
|
||
АдресХранилища = ОбъектОбработки().ПоместитьЗапросыВоВременноеХранилище(Объект, ИдентификаторТекущегоЗапроса, ИдентификаторТекущегоПараметра);
|
||
ПараметрАдрес = Новый Структура;
|
||
ПараметрАдрес.Вставить("АдресХранилища", АдресХранилища);
|
||
Возврат ПараметрАдрес;
|
||
КонецФункции
|
||
|
||
// Получение табличной части "Запросы" в виде структуры.
|
||
// Возвращает Идентификатор выбранного запроса, обновляет табличную часть "Запросы".
|
||
//
|
||
// Параметры:
|
||
// ПараметрыПередачи - Запросы из передаваемого объекта и Идентификатор текущего запроса.
|
||
//
|
||
&НаСервере
|
||
Функция ВыгрузитьЗапросыВРеквизиты(ПараметрыПередачи)
|
||
ПолученныеЗапросы = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).Запросы;
|
||
ПолученныеПараметры = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).Параметры;
|
||
Объект.ИмяФайла = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).ИмяФайла;
|
||
ИдентификаторТекущегоЗапроса = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).ИдентификаторТекущегоЗапроса;
|
||
ИдентификаторТекущегоПараметра = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).ИдентификаторТекущегоПараметра;
|
||
Объект.Запросы.Загрузить(ПолученныеЗапросы);
|
||
Объект.Параметры.Загрузить(ПолученныеПараметры);
|
||
|
||
///SPS
|
||
Объект.ТекИдентификаторЗапроса = ИдентификаторТекущегоЗапроса;
|
||
|
||
ВывестиРезультатЗапроса();
|
||
КонецФункции
|
||
|
||
&НаСервере
|
||
Процедура ВывестиРезультатЗапроса()
|
||
РезультатЗапроса = Новый ТабличныйДокумент;
|
||
Для каждого СтрЗапросы Из Объект.Запросы Цикл
|
||
Если СтрЗапросы.Идентификатор = ИдентификаторТекущегоЗапроса Тогда
|
||
ПолучитьРезультатЗапросаИзХранилища(РезультатЗапроса, СтрЗапросы.АдресРезультата);
|
||
|
||
КоличествоСтрок = СтрЗапросы.КоличествоСтрок;
|
||
ВремяВыполнения = СтрЗапросы.ВремяВыполнения;
|
||
РезультирующаяСтрока = НСтр("ru = 'Результат запроса (количество строк = %КолСтрок%, время выполнения = %ВремяВыполнения% с)'");
|
||
РезультирующаяСтрока = СтрЗаменить(РезультирующаяСтрока, "%КолСтрок%", Строка(КоличествоСтрок));
|
||
РезультирующаяСтрока = СтрЗаменить(РезультирующаяСтрока, "%ВремяВыполнения%", Строка(ВремяВыполнения));
|
||
Элементы.РезультатЗапроса.Заголовок = РезультирующаяСтрока;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецПроцедуры
|
||
|
||
// Передача настроек автосохранения.
|
||
//
|
||
&НаСервере
|
||
Функция ПоместитьНастройкиВСтруктуру()
|
||
АдресХранилища = ОбъектОбработки().ПоместитьНастройкиВоВременноеХранилище(Объект);
|
||
ПараметрАдрес = Новый Структура;
|
||
ПараметрАдрес.Вставить("АдресХранилища", АдресХранилища);
|
||
Возврат ПараметрАдрес;
|
||
КонецФункции
|
||
|
||
// Получение настроек в виде структуры.
|
||
//
|
||
// Параметры:
|
||
// ПараметрыПередачи - настройки.
|
||
//
|
||
&НаСервере
|
||
Функция ВыгрузитьНастройки(ПараметрыПередачи)
|
||
Объект.ИспользоватьАвтосохранение = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).ИспользоватьАвтосохранение;
|
||
Объект.ПериодАвтосохранения = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).ПериодАвтосохранения;
|
||
Объект.ВыводитьВРезультатахЗапросаЗначенияСсылок = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).ВыводитьВРезультатахЗапросаЗначенияСсылок;
|
||
Объект.ТипОбхода = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).ТипОбхода;
|
||
Объект.ЧередованиеЦветовВРезультатеЗапроса = ПолучитьИзВременногоХранилища(ПараметрыПередачи.АдресХранилища).ЧередованиеЦветовВРезультатеЗапроса;
|
||
КонецФункции
|
||
|
||
// Обновление формы.
|
||
// Обновление отображения параметров, текста запроса и результата.
|
||
//
|
||
&НаКлиенте
|
||
Процедура ОбновитьФормуКлиент()
|
||
// Обновление параметров.
|
||
Фильтр = Новый Структура;
|
||
Фильтр.Вставить("ИдентификаторЗапроса", ИдентификаторТекущегоЗапроса);
|
||
ФиксированныйФильтр = Новый ФиксированнаяСтруктура(Фильтр);
|
||
Элементы.Параметры.ОтборСтрок = ФиксированныйФильтр;
|
||
|
||
Для каждого СтрЗапросы Из Объект.Запросы Цикл
|
||
Если СтрЗапросы.Идентификатор = ИдентификаторТекущегоЗапроса Тогда
|
||
// Обновление текста запроса.
|
||
ЭтотОбъект.ТекстЗапроса.УстановитьТекст(СтрЗапросы.Текст);
|
||
|
||
// Вывод заголовка формы.
|
||
ЗаголовокФормы = НСтр("ru = 'Консоль запросов (%ИмяЗапроса%)'");
|
||
ЗаголовокФормы = СтрЗаменить(ЗаголовокФормы, "%ИмяЗапроса%", СтрЗапросы.Имя);
|
||
ЭтотОбъект.Заголовок = ЗаголовокФормы;
|
||
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
// Вывод заголовка кнопки "Запросы".
|
||
КоличествоЗапросов = Объект.Запросы.Количество();
|
||
ЗаголовокКнопкиВыбораЗапроса = НСтр("ru = 'Запросы'");
|
||
Если КоличествоЗапросов > 1 Тогда
|
||
ЗаголовокКнопкиВыбораЗапроса = ЗаголовокКнопкиВыбораЗапроса + " (" + КоличествоЗапросов + ")";
|
||
КонецЕсли;
|
||
Элементы.ФормаВыбратьЗапрос.Заголовок = ЗаголовокКнопкиВыбораЗапроса;
|
||
|
||
#Если ВебКлиент Тогда
|
||
ЭтотОбъект.ОбновитьОтображениеДанных();
|
||
#КонецЕсли
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Функция ИндексТекущегоВопроса()
|
||
Результат = Неопределено;
|
||
Для каждого СтрЗапросы Из Объект.Запросы Цикл
|
||
Если СтрЗапросы.Идентификатор = ИдентификаторТекущегоЗапроса Тогда
|
||
Результат = СтрЗапросы.НомерСтроки;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Возврат Результат;
|
||
КонецФункции
|
||
|
||
// Возвращает имя запроса по имени первой таблицы.
|
||
//
|
||
// Параметры:
|
||
// ТекстЗапроса - текст передаваемого запроса.
|
||
//
|
||
&НаКлиенте
|
||
Функция ПолучитьИмяЗапроса(знач ТекстЗапроса)
|
||
// Если пустой текст запроса тогда возвращается "Запрос".
|
||
Если ПустаяСтрока(ТекстЗапроса) Тогда
|
||
Результат = ИмяЗапросаПоУмолчанию;
|
||
Возврат Результат;
|
||
КонецЕсли;
|
||
|
||
// Поиск зарезервированного слова "ВЫБРАТЬ".
|
||
Выбрать = "ВЫБРАТЬ";
|
||
ДлинаВыбрать = СтрДлина(Выбрать);
|
||
ПозицияВыбрать = Найти(ВРег(ТекстЗапроса), Выбрать);
|
||
Если ПозицияВыбрать = 0 Тогда
|
||
Результат = ИмяЗапросаПоУмолчанию;
|
||
Возврат Результат;
|
||
КонецЕсли;
|
||
|
||
// Срез строки текста запроса без зарезервированного слова "ВЫБРАТЬ".
|
||
ДлинаЗапроса = СтрДлина(ТекстЗапроса);
|
||
ТекстЗапроса = Сред(ТекстЗапроса, ПозицияВыбрать + ДлинаВыбрать);
|
||
|
||
// Поиск первой "точки", чтобы определить имя таблицы.
|
||
Точка = ".";
|
||
ДлинаТочка = СтрДлина(Точка);
|
||
ПозицияТочка = Найти(ВРег(ТекстЗапроса), Точка);
|
||
Если ПозицияТочка = 0 Тогда
|
||
Результат = ИмяЗапросаПоУмолчанию;
|
||
Возврат Результат;
|
||
КонецЕсли;
|
||
|
||
// Возвращается "Запрос:" и имя первой таблицы.
|
||
Результат = СокрЛП(Лев(ТекстЗапроса, ПозицияТочка - ДлинаТочка));
|
||
Если ПустаяСтрока(Результат) Тогда
|
||
Результат = ИмяЗапросаПоУмолчанию;
|
||
КонецЕсли;
|
||
|
||
Возврат Результат;
|
||
КонецФункции
|
||
|
||
// Считывает параметры из текста запроса.
|
||
//
|
||
// Параметры:
|
||
// ТекстЗапроса - текст запроса.
|
||
// Удалять - флаг очистки списка параметров для текущего запроса.
|
||
// ИдентификаторЗапроса - Идентификатор текущего запроса.
|
||
//
|
||
&НаСервере
|
||
Процедура СчитатьПараметрыЗапроса(ТекстЗапроса, Удалять, ИдентификаторЗапроса)
|
||
// Считывание параметров из текст запроса в массив структуры.
|
||
РезультатСтруктура = ОбъектОбработки().СчитатьПараметрыЗапроса(ТекстЗапроса, ИдентификаторЗапроса);
|
||
|
||
// Инициализация параметров.
|
||
ПараметрыВФорме = Объект.Параметры;
|
||
|
||
// Удаление параметров для текущего запроса.
|
||
Если Удалять Тогда
|
||
КоличествоСтрок = ПараметрыВФорме.Количество() - 1;
|
||
Пока КоличествоСтрок >= 0 Цикл
|
||
ТекущийПараметр = ПараметрыВФорме.Получить(КоличествоСтрок);
|
||
Если ТекущийПараметр.ИдентификаторЗапроса = ИдентификаторЗапроса Тогда
|
||
ПараметрыВФорме.Удалить(КоличествоСтрок);
|
||
Модифицированность = Истина;
|
||
КонецЕсли;
|
||
КоличествоСтрок = КоличествоСтрок - 1;
|
||
КонецЦикла;
|
||
КонецЕсли;
|
||
|
||
// Добавление параметров.
|
||
Фильтр = Новый Структура;
|
||
Фильтр.Вставить("ИдентификаторЗапроса", ИдентификаторЗапроса);
|
||
МассивПараметров = ПараметрыВФорме.НайтиСтроки(Фильтр);
|
||
|
||
Для каждого СтрПараметр Из РезультатСтруктура Цикл
|
||
ЕстьПараметр = Ложь;
|
||
Для каждого Стр Из МассивПараметров Цикл
|
||
Если СтрПараметр.Имя = Стр.Имя Тогда
|
||
ЕстьПараметр = Истина;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
Если Не ЕстьПараметр Или Не Удалять Тогда
|
||
ДобавитьПараметрВФорму(ПараметрыВФорме, СтрПараметр);
|
||
Модифицированность = Истина;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
КонецПроцедуры
|
||
|
||
// Добавляет параметр из структуры в параметр формы.
|
||
//
|
||
// Параметры:
|
||
// ПараметрыВФорме - таблица значений "Параметры" в форме.
|
||
// ПараметрСтруктуры - текущая строка параметра массива структуры.
|
||
//
|
||
&НаСервере
|
||
Процедура ДобавитьПараметрВФорму(ПараметрыВФорме, ПараметрСтруктуры)
|
||
Значение = ПараметрСтруктуры.Значение;
|
||
Тип = ОбъектОбработки().ИмяТипаИзЗначения(Значение);
|
||
|
||
// Основные реквизиты.
|
||
Элемент = ПараметрыВФорме.Добавить();
|
||
Элемент.Идентификатор = Новый УникальныйИдентификатор;
|
||
Элемент.ИдентификаторЗапроса = ПараметрСтруктуры.ИдентификаторЗапроса;
|
||
Элемент.Имя = ПараметрСтруктуры.Имя;
|
||
Элемент.Тип = Тип;
|
||
Элемент.Значение = Значение;
|
||
|
||
Значение = ЗначениеИзСтрокиВнутр(Значение);
|
||
|
||
// Форменные реквизиты.
|
||
Элемент.ТипВФорме = Строка(ТипЗнч(Значение));
|
||
Элемент.ЗначениеВФорме = Значение;
|
||
КонецПроцедуры
|
||
|
||
// Вызов процедуры сохранения запросов в файл.
|
||
//
|
||
&НаКлиенте
|
||
Процедура НастройкаАвтосохранения()
|
||
Если Объект.ИспользоватьАвтосохранение Тогда
|
||
// Вызов процедуры сохранения запросов в файл.
|
||
ПериодАвтосохранения = Объект.ПериодАвтосохранения * 60;
|
||
Если ПериодАвтосохранения > 0 Тогда
|
||
ПодключитьОбработчикОжидания("СохранитьЗапросы", ПериодАвтосохранения);
|
||
КонецЕсли;
|
||
Иначе
|
||
ОтключитьОбработчикОжидания("СохранитьЗапросы");
|
||
КонецЕсли;
|
||
КонецПроцедуры
|
||
|
||
// Процедура сохранения запросов для автосохранения.
|
||
//
|
||
&НаКлиенте
|
||
Процедура СохранитьЗапросы()
|
||
|
||
ИмяФайла = Объект.ИмяФайла;
|
||
Если Не ПустаяСтрока(ИмяФайла) Тогда
|
||
ДвоичныеДанные = СохранитьЗапросыСервер();
|
||
ДвоичныеДанные.Записать(ИмяФайла);
|
||
ПоказатьОповещениеПользователя(НСтр("ru = 'Автосохранение прошло успешно.'"), ИмяФайла);
|
||
Модифицированность = Ложь;
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Процедура сохранения запросов(серверная часть).
|
||
//
|
||
&НаСервере
|
||
Функция СохранитьЗапросыСервер()
|
||
|
||
ДвоичныеДанные = ОбъектОбработки().ЗаписатьЗапросыВФайлXML(Объект);
|
||
Возврат ДвоичныеДанные;
|
||
|
||
КонецФункции
|
||
|
||
// Запускает выполнение запроса.
|
||
//
|
||
&НаКлиенте
|
||
Процедура ЗапуститьВыполнениеЗапроса(ВыводитьВременныеТаблицы)
|
||
// СЗахватывается" текущий запрос из списка запросов.
|
||
ИндексТекущегоЗапроса = ИндексТекущегоВопроса();
|
||
Если ИндексТекущегоЗапроса = Неопределено Тогда
|
||
ТекстСообщения = НСтр("ru = 'Выберите запрос.'");
|
||
ПоказатьСообщениеПользователю(ТекстСообщения, "Объект");
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
НеотформатированныйТекст = ТекстЗапроса.ПолучитьТекст();
|
||
ОтформатированныйТекст = СтрЗаменить(НеотформатированныйТекст, "|", "");
|
||
|
||
Если ПустаяСтрока(ОтформатированныйТекст) Тогда
|
||
ТекстПредупреждения = НСтр("ru = 'Введите текст запроса.'");
|
||
ПоказатьПредупреждение(, ТекстПредупреждения );
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
ТекстЗапроса.УстановитьТекст(ОтформатированныйТекст);
|
||
Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1).Текст = ОтформатированныйТекст;
|
||
|
||
// Определение текста запроса.
|
||
ВыделенныйТекст = Элементы.ТекстЗапроса.ВыделенныйТекст;
|
||
Если Не ПустаяСтрока(ВыделенныйТекст) Тогда
|
||
Текст = ВыделенныйТекст;
|
||
Иначе
|
||
Текст = Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1).Текст;
|
||
КонецЕсли;
|
||
|
||
ВыводитьИдентификатор = Объект.ВыводитьВРезультатахЗапросаЗначенияСсылок;
|
||
|
||
// Очистка табличного документа "РезультатЗапроса" в форме.
|
||
РезультатЗапроса = Новый ТабличныйДокумент;
|
||
ТекстСообщения = "";
|
||
|
||
ОчиститьСообщения();
|
||
|
||
// Серверная часть для выполнения запроса.
|
||
ВыполнитьЗапросСервер(ИндексТекущегоЗапроса, РезультатЗапроса, ВыводитьВременныеТаблицы, ВыводитьИдентификатор, Текст, ТекстСообщения);
|
||
|
||
Если Не ПустаяСтрока(ТекстСообщения) Тогда
|
||
ПоказатьСообщениеПользователю(ТекстСообщения, "Объект");
|
||
КонецЕсли;
|
||
КонецПроцедуры
|
||
|
||
// Загружает в результат запроса возвращаемый из Временного хранилища табличный документ.
|
||
//
|
||
// Параметры:
|
||
// РезультатЗапроса - Результат запроса.
|
||
// АдресРезультата - адрес временного хранилища, хранящийся.
|
||
// ТекстЗапроса - Строка - Текст запроса.
|
||
//
|
||
&НаСервере
|
||
Процедура ВыполнитьЗапросСервер(ИндексТекущегоЗапроса, ТабличныйДокументРезультата, ВыводитьВременныеТаблицы, ВыводитьИдентификатор, ТекстЗапроса, ТекстСообщения)
|
||
|
||
// Убрать строки с комментариями.
|
||
КоличествоСтрок = СтрЧислоСтрок(ТекстЗапроса);
|
||
Текст = "";
|
||
Для НомерСтроки = 1 По КоличествоСтрок Цикл
|
||
Фрагмент = СтрПолучитьСтроку(ТекстЗапроса, НомерСтроки);
|
||
Если Лев(СокрЛ(Фрагмент), 2) <> "//" Тогда
|
||
Текст = Текст + Фрагмент + Символы.ПС;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
// Заполнение параметров.
|
||
ЗаполнитьПараметрыПриВыполненииЗапроса(Текст);
|
||
|
||
// Обнуление параметры.
|
||
ВремяВыполнения = 0;
|
||
КоличествоСтрок = 0;
|
||
|
||
// Выбор текущего запроса.
|
||
ТекущийЗапрос = Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1);
|
||
// Выбор параметров по текущему запросу.
|
||
Фильтр = Новый Структура;
|
||
Фильтр.Вставить("ИдентификаторЗапроса", ТекущийЗапрос.Идентификатор);
|
||
МассивПараметров = Объект.Параметры.НайтиСтроки(Фильтр);
|
||
|
||
МассивМаксШириныЯчеек = Новый Массив;
|
||
МассивМаксШириныЯчеек.Очистить();
|
||
|
||
ПорядокОбхода = Объект.ТипОбхода;
|
||
ИспользованиеЧередования = Объект.ЧередованиеЦветовВРезультатеЗапроса;
|
||
|
||
Если ПоказыватьПланВыполненияЗапроса И ТехнологическийЖурналДоступен() Тогда
|
||
МеткаЗапроса = Строка(Новый УникальныйИдентификатор);
|
||
Иначе
|
||
МеткаЗапроса = "";
|
||
КонецЕсли;
|
||
|
||
// Выполнение запроса.
|
||
|
||
// Будет сохранять результат запроса вместе с табличным документом - представлением результата...
|
||
ПараметрыВыводаЗапроса = Новый Структура;
|
||
ПараметрыВыводаЗапроса.Вставить("ВыводитьВременныеТаблицы", ВыводитьВременныеТаблицы);
|
||
ПараметрыВыводаЗапроса.Вставить("ВыводитьИдентификатор", ВыводитьИдентификатор);
|
||
ПараметрыВыводаЗапроса.Вставить("ПорядокОбхода", ПорядокОбхода);
|
||
ПараметрыВыводаЗапроса.Вставить("ИспользованиеЧередования", ИспользованиеЧередования);
|
||
|
||
ОтчетПоВыполнениюЗапроса = Новый Структура;
|
||
ОтчетПоВыполнениюЗапроса.Вставить("КоличествоСтрок", КоличествоСтрок);
|
||
ОтчетПоВыполнениюЗапроса.Вставить("ВремяВыполнения", ВремяВыполнения);
|
||
ОтчетПоВыполнениюЗапроса.Вставить("ТекстСообщения", ТекстСообщения);
|
||
|
||
Результат = ОбъектОбработки().ВыполнитьЗапрос(Текст, МассивПараметров, ТабличныйДокументРезультата, ПараметрыВыводаЗапроса, ОтчетПоВыполнениюЗапроса, МеткаЗапроса);
|
||
///SPS маркер для отладки
|
||
|
||
Если ЗначениеЗаполнено(ОтчетПоВыполнениюЗапроса.ТекстСообщения) Тогда
|
||
ПоказатьСообщениеПользователю(ОтчетПоВыполнениюЗапроса.ТекстСообщения);
|
||
КонецЕсли;
|
||
|
||
// Т..только если находимся в режиме выбора.
|
||
Если Не Параметры.РежимВыбора Тогда
|
||
Результат = Неопределено;
|
||
КонецЕсли;
|
||
|
||
// Заполнение адреса временного хранилища для результата.
|
||
ТекущийЗапрос.АдресРезультата = ПоместитьВоВременноеХранилище(ТабличныйДокументРезультата, УникальныйИдентификатор);
|
||
ТекущийЗапрос.ВремяВыполнения = ОтчетПоВыполнениюЗапроса.ВремяВыполнения;
|
||
ТекущийЗапрос.КоличествоСтрок = ОтчетПоВыполнениюЗапроса.КоличествоСтрок;
|
||
|
||
Если Не ПустаяСтрока(ТекущийЗапрос.АдресРезультатовЗапроса) Тогда
|
||
УдалитьИзВременногоХранилища(ТекущийЗапрос.АдресРезультатовЗапроса)
|
||
КонецЕсли;
|
||
Если Результат=Неопределено Тогда
|
||
ТекущийЗапрос.АдресРезультатовЗапроса = "";
|
||
Иначе
|
||
ТекущийЗапрос.АдресРезультатовЗапроса = ПоместитьВоВременноеХранилище(Результат, ЭтотОбъект.УникальныйИдентификатор);
|
||
КонецЕсли;
|
||
|
||
// Обновление заголовка результата запроса.
|
||
РезультирующаяСтрока = НСтр("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 Тогда
|
||
Возврат Истина;
|
||
КонецЕсли;
|
||
|
||
Возврат Ложь;
|
||
КонецФункции
|
||
|
||
&НаСервере
|
||
Функция ЭтоСсылка(Тип)
|
||
|
||
Возврат Тип <> Тип("Неопределено")
|
||
И (Справочники.ТипВсеСсылки().СодержитТип(Тип)
|
||
ИЛИ Документы.ТипВсеСсылки().СодержитТип(Тип)
|
||
ИЛИ Перечисления.ТипВсеСсылки().СодержитТип(Тип)
|
||
ИЛИ ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(Тип)
|
||
ИЛИ ПланыСчетов.ТипВсеСсылки().СодержитТип(Тип)
|
||
ИЛИ ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(Тип)
|
||
ИЛИ БизнесПроцессы.ТипВсеСсылки().СодержитТип(Тип)
|
||
ИЛИ БизнесПроцессы.ТипВсеСсылкиТочекМаршрутаБизнесПроцессов().СодержитТип(Тип)
|
||
ИЛИ Задачи.ТипВсеСсылки().СодержитТип(Тип)
|
||
ИЛИ ПланыОбмена.ТипВсеСсылки().СодержитТип(Тип));
|
||
|
||
КонецФункции
|
||
|
||
Процедура ПослеВводаУникальногоИдентификатора(Результат, Параметр)
|
||
ЗначениеПараметраУникальныйИдентификатор = Новый УникальныйИдентификатор(Результат);
|
||
ТекущаяСтрока = Объект.Параметры.НайтиПоИдентификатору(Параметр);
|
||
ТекущаяСтрока.Значение = ЗначениеВСтрокуСервер(ЗначениеПараметраУникальныйИдентификатор);
|
||
ТекущаяСтрока.ЗначениеВФорме = ЗначениеПараметраУникальныйИдентификатор;
|
||
КонецПроцедуры
|
||
|
||
#КонецОбласти
|
||
|
||
#Область ДоработкиSPS
|
||
|
||
&НаКлиенте
|
||
Процедура SPS_РазвернутьТекстЗапроса(Команда)
|
||
Если НЕ Объект.ИспользоватьПредставления Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
// СЗахватывается" текущий запрос из списка запросов.
|
||
ИндексТекущегоЗапроса = ИндексТекущегоВопроса();
|
||
Если ИндексТекущегоЗапроса = Неопределено Тогда
|
||
ТекстСообщения = НСтр("ru = 'Выберите запрос.'");
|
||
ПоказатьСообщениеПользователю(ТекстСообщения, "Объект");
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
НеотформатированныйТекст = ТекстЗапроса.ПолучитьТекст();
|
||
ОтформатированныйТекст = СтрЗаменить(НеотформатированныйТекст, "|", "");
|
||
|
||
Если ПустаяСтрока(ОтформатированныйТекст) Тогда
|
||
ТекстПредупреждения = НСтр("ru = 'Введите текст запроса.'");
|
||
ПоказатьПредупреждение(, ТекстПредупреждения );
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
ТекстЗапроса.УстановитьТекст(ОтформатированныйТекст);
|
||
Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1).Текст = ОтформатированныйТекст;
|
||
|
||
// Определение текста запроса.
|
||
ВыделенныйТекст = Элементы.ТекстЗапроса.ВыделенныйТекст;
|
||
Если Не ПустаяСтрока(ВыделенныйТекст) Тогда
|
||
Текст = ВыделенныйТекст;
|
||
Иначе
|
||
Текст = Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1).Текст;
|
||
КонецЕсли;
|
||
|
||
ВыводитьИдентификатор = Объект.ВыводитьВРезультатахЗапросаЗначенияСсылок;
|
||
|
||
ТекстСообщения = "";
|
||
|
||
// Серверная часть для выполнения запроса.
|
||
// ВыполнитьЗапросСервер(ИндексТекущегоЗапроса, РезультатЗапроса, ВыводитьВременныеТаблицы, ВыводитьИдентификатор, Текст, ТекстСообщения);
|
||
|
||
|
||
ТекстРезультат = SPS_РазвернутьТекстЗапросаНаСервере(ИндексТекущегоЗапроса, Текст);
|
||
|
||
Если НЕ ТекстРезультат = Текст Тогда
|
||
Если Не ПустаяСтрока(ВыделенныйТекст) Тогда
|
||
НовыйТекст = СтрЗаменить(ОтформатированныйТекст, ВыделенныйТекст, ТекстРезультат);
|
||
Иначе
|
||
НовыйТекст = ТекстРезультат;
|
||
КонецЕсли;
|
||
|
||
ТекстЗапроса.УстановитьТекст(НовыйТекст);
|
||
Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1).Текст = НовыйТекст;
|
||
КонецЕсли;
|
||
КонецПроцедуры
|
||
|
||
&НаСервере
|
||
Функция SPS_РазвернутьТекстЗапросаНаСервере(ИндексТекущегоЗапроса, ТекстЗапроса)
|
||
// Заполнение параметров.
|
||
ЗаполнитьПараметрыПриВыполненииЗапроса(ТекстЗапроса);
|
||
|
||
// Убрать строки с комментариями.
|
||
КоличествоСтрок = СтрЧислоСтрок(ТекстЗапроса);
|
||
Текст = "";
|
||
Для НомерСтроки = 1 По КоличествоСтрок Цикл
|
||
Фрагмент = СтрПолучитьСтроку(ТекстЗапроса, НомерСтроки);
|
||
Если Лев(СокрЛ(Фрагмент), 2) <> "//" Тогда
|
||
Текст = Текст + Фрагмент + Символы.ПС;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
// Выбор текущего запроса.
|
||
ТекущийЗапрос = Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1);
|
||
// Выбор параметров по текущему запросу.
|
||
Фильтр = Новый Структура;
|
||
Фильтр.Вставить("ИдентификаторЗапроса", ТекущийЗапрос.Идентификатор);
|
||
МассивПараметров = Объект.Параметры.НайтиСтроки(Фильтр);
|
||
|
||
РезультатТекст = ОбъектОбработки().SPS_РазвернутьТекстЗапроса(ТекстЗапроса, МассивПараметров);
|
||
|
||
Возврат РезультатТекст;
|
||
КонецФункции
|
||
|
||
&НаКлиенте
|
||
Процедура SPS_ЗагрузитьЗапросыИзСтрокиXML(Удалять=Истина)
|
||
СтрXML = "";
|
||
|
||
Если Удалять Тогда
|
||
Объект.Запросы.Очистить();
|
||
Объект.Параметры.Очистить();
|
||
КонецЕсли;
|
||
|
||
ПараметрыОп = Новый Структура("СтрXML", СтрXML);
|
||
Оповещение = Новый ОписаниеОповещения("SPS_ЗагрузитьЗапросыИзСтрокиXML_ПослеВвода", ЭтаФорма, ПараметрыОп);
|
||
ПоказатьВводСтроки(Оповещение, СтрXML, "Введите текст XML",,Истина);
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура SPS_ЗагрузитьЗапросыИзСтрокиXML_ПослеВвода(Строка, ДополнительныеПараметры) Экспорт
|
||
СтрXML = ?(Строка = Неопределено, ДополнительныеПараметры.СтрXML, Строка);
|
||
|
||
Если ПустаяСтрока(СтрXML) Тогда
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
Поток = Новый ПотокВПамяти();
|
||
ЗаписьТ = Новый ЗаписьТекста(Поток);
|
||
ЗаписьТ.Записать(СтрXML);
|
||
ЗаписьТ.Закрыть();
|
||
ЗаписьТ = Неопределено;
|
||
СтрXML = Неопределено;
|
||
|
||
ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
|
||
Поток = Неопределено;
|
||
|
||
ЗагрузитьЗапросыИзФайла(ДвоичныеДанные);
|
||
ДвоичныеДанные = Неопределено;
|
||
|
||
КоличествоЗапросов = Объект.Запросы.Количество();
|
||
Если КоличествоЗапросов > 0 Тогда
|
||
ИдентификаторТекущегоЗапроса = Объект.Запросы.Получить(0).Идентификатор;
|
||
Модифицированность = Ложь;
|
||
Иначе
|
||
Элемент = Объект.Запросы.Добавить();
|
||
ИдентификаторТекущегоЗапроса = Новый УникальныйИдентификатор;
|
||
Элемент.Идентификатор = ИдентификаторТекущегоЗапроса;
|
||
Элемент.Имя = ИмяЗапросаПоУмолчанию;
|
||
Результат = Новый ТабличныйДокумент;
|
||
КонецЕсли;
|
||
|
||
Объект.ТекИдентификаторЗапроса = ИдентификаторТекущегоЗапроса;
|
||
Объект.ИмяФайла = ПолучитьИмяВременногоФайла(".q1c");
|
||
|
||
ОбновитьФормуКлиент();
|
||
|
||
КонецПроцедуры
|
||
|
||
&НаКлиенте
|
||
Процедура SPS_ВыбратьЗапросыИзСтрокиXML(Команда)
|
||
SPS_ЗагрузитьЗапросыИзСтрокиXML();
|
||
КонецПроцедуры
|
||
|
||
&НаСервере
|
||
Функция SPS_СериализацияТаблицы(ТЗ)
|
||
ЗаписьJSON = Новый ЗаписьJSON;
|
||
ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет));
|
||
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ТЗ);
|
||
Возврат ЗаписьJSON.Закрыть();
|
||
КонецФункции
|
||
|
||
&НаКлиенте
|
||
Процедура SPS_ВыгрузитьРезультат(Команда)
|
||
// СЗахватывается" текущий запрос из списка запросов.
|
||
ИндексТекущегоЗапроса = ИндексТекущегоВопроса();
|
||
Если ИндексТекущегоЗапроса = Неопределено Тогда
|
||
ТекстСообщения = НСтр("ru = 'Выберите запрос.'");
|
||
ПоказатьСообщениеПользователю(ТекстСообщения, "Объект");
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
НеотформатированныйТекст = ТекстЗапроса.ПолучитьТекст();
|
||
ОтформатированныйТекст = СтрЗаменить(НеотформатированныйТекст, "|", "");
|
||
|
||
Если ПустаяСтрока(ОтформатированныйТекст) Тогда
|
||
ТекстПредупреждения = НСтр("ru = 'Введите текст запроса.'");
|
||
ПоказатьПредупреждение(, ТекстПредупреждения );
|
||
Возврат;
|
||
КонецЕсли;
|
||
|
||
ТекстЗапроса.УстановитьТекст(ОтформатированныйТекст);
|
||
Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1).Текст = ОтформатированныйТекст;
|
||
|
||
// Определение текста запроса.
|
||
ВыделенныйТекст = Элементы.ТекстЗапроса.ВыделенныйТекст;
|
||
Если Не ПустаяСтрока(ВыделенныйТекст) Тогда
|
||
Текст = ВыделенныйТекст;
|
||
Иначе
|
||
Текст = Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1).Текст;
|
||
КонецЕсли;
|
||
|
||
ВыводитьИдентификатор = Объект.ВыводитьВРезультатахЗапросаЗначенияСсылок;
|
||
|
||
// Очистка табличного документа "РезультатЗапроса" в форме.
|
||
РезультатЗапроса = Новый ТабличныйДокумент;
|
||
ТекстСообщения = "";
|
||
|
||
ОчиститьСообщения();
|
||
|
||
// Серверная часть для выполнения запроса.
|
||
JSON = SPS_ВыгрузитьРезультат_Сервер(ИндексТекущегоЗапроса, Текст, ТекстСообщения);
|
||
|
||
Если Не ПустаяСтрока(ТекстСообщения) Тогда
|
||
ПоказатьСообщениеПользователю(ТекстСообщения, "Объект");
|
||
КонецЕсли;
|
||
|
||
Если Не ПустаяСтрока(JSON) Тогда
|
||
ПараметрыТаб = Новый Структура("ТаблицаJSON", JSON);
|
||
ОткрытьФорму(Объект.ПутьКФормам + "." + "SPS_ТаблицаЗначений_Результат", ПараметрыТаб, ЭтаФорма);
|
||
Иначе
|
||
ПоказатьПредупреждение(,"Не удалось выгрузить");
|
||
КонецЕсли;
|
||
|
||
КонецПроцедуры
|
||
|
||
// Загружает в результат запроса возвращаемый из Временного хранилища табличный документ.
|
||
//
|
||
// Параметры:
|
||
// РезультатЗапроса - Результат запроса.
|
||
// АдресРезультата - адрес временного хранилища, хранящийся.
|
||
// ТекстЗапроса - Строка - Текст запроса.
|
||
//
|
||
&НаСервере
|
||
Функция SPS_ВыгрузитьРезультат_Сервер(ИндексТекущегоЗапроса, ТекстЗапроса, ТекстСообщения)
|
||
|
||
// Убрать строки с комментариями.
|
||
КоличествоСтрок = СтрЧислоСтрок(ТекстЗапроса);
|
||
Текст = "";
|
||
Для НомерСтроки = 1 По КоличествоСтрок Цикл
|
||
Фрагмент = СтрПолучитьСтроку(ТекстЗапроса, НомерСтроки);
|
||
Если Лев(СокрЛ(Фрагмент), 2) <> "//" Тогда
|
||
Текст = Текст + Фрагмент + Символы.ПС;
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
// Заполнение параметров.
|
||
ЗаполнитьПараметрыПриВыполненииЗапроса(Текст);
|
||
|
||
// Обнуление параметры.
|
||
ВремяВыполнения = 0;
|
||
КоличествоСтрок = 0;
|
||
|
||
// Выбор текущего запроса.
|
||
ТекущийЗапрос = Объект.Запросы.Получить(ИндексТекущегоЗапроса - 1);
|
||
// Выбор параметров по текущему запросу.
|
||
Фильтр = Новый Структура;
|
||
Фильтр.Вставить("ИдентификаторЗапроса", ТекущийЗапрос.Идентификатор);
|
||
МассивПараметров = Объект.Параметры.НайтиСтроки(Фильтр);
|
||
|
||
МассивМаксШириныЯчеек = Новый Массив;
|
||
МассивМаксШириныЯчеек.Очистить();
|
||
|
||
ПорядокОбхода = Объект.ТипОбхода;
|
||
|
||
Если ПоказыватьПланВыполненияЗапроса И ТехнологическийЖурналДоступен() Тогда
|
||
МеткаЗапроса = Строка(Новый УникальныйИдентификатор);
|
||
Иначе
|
||
МеткаЗапроса = "";
|
||
КонецЕсли;
|
||
|
||
// Выполнение запроса.
|
||
|
||
// Будет сохранять результат запроса вместе с табличным документом - представлением результата...
|
||
ПараметрыВыводаЗапроса = Новый Структура;
|
||
ПараметрыВыводаЗапроса.Вставить("ПорядокОбхода", ПорядокОбхода);
|
||
|
||
ОтчетПоВыполнениюЗапроса = Новый Структура;
|
||
ОтчетПоВыполнениюЗапроса.Вставить("КоличествоСтрок", КоличествоСтрок);
|
||
ОтчетПоВыполнениюЗапроса.Вставить("ВремяВыполнения", ВремяВыполнения);
|
||
ОтчетПоВыполнениюЗапроса.Вставить("ТекстСообщения", ТекстСообщения);
|
||
|
||
ТЗРезультатаЗапроса = Неопределено;
|
||
ОбъектОбработки().SPS_ВыполнитьЗапрос_ВыгрузитьТаблицу(Текст, МассивПараметров, ТЗРезультатаЗапроса, ПараметрыВыводаЗапроса, ОтчетПоВыполнениюЗапроса, МеткаЗапроса);
|
||
///SPS маркер для отладки
|
||
|
||
Если ЗначениеЗаполнено(ОтчетПоВыполнениюЗапроса.ТекстСообщения) Тогда
|
||
ПоказатьСообщениеПользователю(ОтчетПоВыполнениюЗапроса.ТекстСообщения);
|
||
КонецЕсли;
|
||
|
||
Результат = "";
|
||
|
||
Если Не Неопределено = ТЗРезультатаЗапроса Тогда
|
||
Результат = SPS_СериализацияТаблицы(ТЗРезультатаЗапроса);
|
||
КонецЕсли;
|
||
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
//ДоработкиSPS
|
||
#КонецОбласти
|
||
|