1. Добавляем общий модуль АБ_ВыгрузкаЗапроса в свою конфигурацию, можно попробовать через расширение.
// АБ_ВыгрузкаЗапроса.ЗаписатьЗапросыВФайлXML(Запрос)
///////////////////////////////////////////////////////////////////////////
// ФУНКЦИИ РАБОТЫ С XML-ФАЙЛАМИ
// Записывает Запросы(текст и параметры запроса) в файл XML.
//
// Параметры:
// ИмяФайла - имя файла XML.
// Объект - передаваемый объект обработки.
//
Функция ЗаписатьЗапросыВФайлXML(знач ОбъектЗапроса, ИмяФайла = "C:\Запросы\TekZapros.q1c") Экспорт
ФайлXML = Новый ЗаписьXML;
ФайлXML.ОткрытьФайл(ИмяФайла);
ФайлXML.ЗаписатьОбъявлениеXML();
ФайлXML.ЗаписатьНачалоЭлемента("querylist");
// выгрузка запроса.
Для Сч =1 По 2 Цикл
ФайлXML.ЗаписатьНачалоЭлемента("query");
Если Сч = 1 Тогда
ФайлXML.ЗаписатьАтрибут("name", "Запрос");
Иначе
ФайлXML.ЗаписатьАтрибут("name", "ИсходныйЗапрос");
КонецЕсли;
ФайлXML.ЗаписатьНачалоЭлемента("text");
ТекстЗапроса = ОбъектЗапроса.Текст;
Для Счетчик = 1 По СтрЧислоСтрок(ТекстЗапроса) Цикл
ПереносСтр = Символы.ВК + Символы.ПС;
ТекСтрока = СтрПолучитьСтроку(ТекстЗапроса, Счетчик);
ФайлXML.ЗаписатьТекст(ТекСтрока);
ФайлXML.ЗаписатьБезОбработки(ПереносСтр);
КонецЦикла;
ФайлXML.ЗаписатьКонецЭлемента();
// Запись параметров в XML-файл.
Если ОбъектЗапроса.Параметры.Количество() > 0 Тогда
ФайлXML.ЗаписатьНачалоЭлемента("parameters");
Для каждого ТекПараметр из ОбъектЗапроса.Параметры Цикл
ИмяПараметра = ТекПараметр.Ключ;
ТипПараметра = СтрЗаменить(Строка(ТипЗнч(ТекПараметр.Значение))," ","");//ТекПараметр.Тип; !!!
ЗначениеПараметра = ТекПараметр.Значение;
ФайлXML.ЗаписатьНачалоЭлемента("parameter");
ФайлXML.ЗаписатьАтрибут("name", ИмяПараметра);
Если ТипПараметра = "Списокзначений" Тогда
ТЗ = Новый ТаблицаЗначений;
тз.Колонки.Добавить("Значения");
Для каждого ТекЗнач Из ЗначениеПараметра Цикл
НовСтрТЗ = тз.Добавить();
НовСтрТЗ.Значения = ТекЗнач.Значение;
КонецЦикла;
ФайлXML.ЗаписатьАтрибут("type", "ТаблицаЗначений");
ЗаписатьТаблицуЗначенийВXML(ФайлXML, ТЗ); //!!!
ИначеЕсли ТипПараметра = "Массив" Тогда //!!!
ТЗ = Новый ТаблицаЗначений;
тз.Колонки.Добавить("Значения");
Для каждого ТекЗнач Из ЗначениеПараметра Цикл
НовСтрТЗ = тз.Добавить();
НовСтрТЗ.Значения = ТекЗнач;
КонецЦикла;
ФайлXML.ЗаписатьАтрибут("type", "ТаблицаЗначений"); //!!!
ЗаписатьТаблицуЗначенийВXML(ФайлXML, ТЗ); //!!!
ИначеЕсли ТипПараметра = "Таблицазначений" Тогда
ФайлXML.ЗаписатьАтрибут("type", "ТаблицаЗначений");
ЗаписатьТаблицуЗначенийВXML(ФайлXML, ЗначениеПараметра);
ИначеЕсли ТипПараметра = "Моментвремени" Тогда
ФайлXML.ЗаписатьАтрибут("type", "МоментВремени");
ЗаписатьМоментВремениВXML(ФайлXML, ЗначениеПараметра);
ИначеЕсли ТипПараметра = "Граница" Тогда
ФайлXML.ЗаписатьАтрибут("type", ТипПараметра);
ЗаписатьГраницуВXML(ФайлXML, ЗначениеПараметра);
Иначе
ИмяТипа = ИмяТипаИзЗначения(ЗначениеПараметра);
ФайлXML.ЗаписатьАтрибут("type", ИмяТипа);
ФайлXML.ЗаписатьАтрибут("value", XMLСтрока(ЗначениеПараметра));
КонецЕсли;
ФайлXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ФайлXML.ЗаписатьКонецЭлемента();
КонецЕсли;
ФайлXML.ЗаписатьКонецЭлемента();
КонецЦикла;
ФайлXML.ЗаписатьКонецЭлемента();
ФайлXML.Закрыть();
вСохранитьЗапросыВФайл(ОбъектЗапроса,СтрЗаменить(ИмяФайла,"q1c","sel"));
Возврат Истина;
КонецФункции
// Записывает строки списка значений в Файл XML.
//
// Параметры:
// ФайлXML - записьXML.
// Значение - список значений.
//
Процедура ЗаписатьСписокЗначенийВXML(ФайлXML, Значение)
Если ТипЗнч(Значение) <> Тип("СписокЗначений") Тогда
Возврат;
КонецЕсли;
Для каждого СтрСписка из Значение Цикл
ЗначениеЭлементаСписка = СтрСписка.Значение;
// Определение имени типа.
ИмяТипа = ИмяТипаИзЗначения(ЗначениеЭлементаСписка);
ФайлXML.ЗаписатьНачалоЭлемента("item");
ФайлXML.ЗаписатьАтрибут("type", ИмяТипа);
ФайлXML.ЗаписатьАтрибут("value", XMLСтрока(ЗначениеЭлементаСписка));
ФайлXML.ЗаписатьКонецЭлемента();
КонецЦикла;
КонецПроцедуры
// Записывает строки списка значений в Файл XML.
//
// Параметры:
// ФайлXML - записьXML.
// Значение - список значений.
//
Процедура ЗаписатьМассивВXML(ФайлXML, Значение)
Если ТипЗнч(Значение) <> Тип("Массив") Тогда
Возврат;
КонецЕсли;
Для каждого СтрСписка из Значение Цикл
ЗначениеЭлементаСписка = СтрСписка;
// Определение имени типа.
ИмяТипа = ИмяТипаИзЗначения(ЗначениеЭлементаСписка);
ФайлXML.ЗаписатьНачалоЭлемента("item");
ФайлXML.ЗаписатьАтрибут("type", ИмяТипа);
ФайлXML.ЗаписатьАтрибут("value", XMLСтрока(ЗначениеЭлементаСписка));
ФайлXML.ЗаписатьКонецЭлемента();
КонецЦикла;
КонецПроцедуры
// Записывает ячейки таблицы значений в Файл XML.
//
// Параметры:
// ФайлXML - записьXML.
// Значение - таблица значений.
//
Процедура ЗаписатьТаблицуЗначенийВXML(ФайлXML, Значение)
Если ТипЗнч(Значение) <> Тип("ТаблицаЗначений") Тогда
Возврат;
КонецЕсли;
КолКолонок = Значение.Колонки.Количество();
КолСтрок = Значение.Количество();
ФайлXML.ЗаписатьАтрибут("colcount", XMLСтрока(КолКолонок));
ФайлXML.ЗаписатьАтрибут("rowcount", 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.ЗаписатьКонецЭлемента();
КонецЦикла;
КонецЦикла;
//ag(!!!
//если параметр не заполнен - добавим пустую ТЗ
Если СтрокаИндекс = 0 тогда
Для КолонкаИндекс = 0 по КолКолонок - 1 Цикл
//ЗначениеЭлементаСписка = Значение.Получить(СтрокаИндекс).Получить(КолонкаИндекс);
ИмяКолонки = Значение.Колонки.Получить(КолонкаИндекс).Имя;
// Определение имени типа.
ИмяТипа = xmlТип(Значение.Колонки.Получить(КолонкаИндекс).ТипЗначения.Типы()[0]).ИмяТипа;
//ИмяТипаИзЗначения(ЗначениеЭлементаСписка);
ФайлXML.ЗаписатьНачалоЭлемента("item");
ФайлXML.ЗаписатьАтрибут("nameCol", ИмяКолонки);
//ФайлXML.ЗаписатьАтрибут("row", XMLСтрока(СтрокаИндекс));
ФайлXML.ЗаписатьАтрибут("col", XMLСтрока(КолонкаИндекс));
ФайлXML.ЗаписатьАтрибут("type", ИмяТипа);
//ФайлXML.ЗаписатьАтрибут("value", XMLСтрока(ЗначениеЭлементаСписка));
ФайлXML.ЗаписатьКонецЭлемента();
КонецЦикла;
КонецЕсли;
//ag)
КонецПроцедуры
// Записывает момент времени в Файл 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Тип(ТипЗнч(Значение)).ИмяТипа;
КонецЕсли;
Возврат ИмяТипа;
КонецФункции
// Определяет условие конца тэга "query" или "parameters"
//
// Параметры:
// ФайлXML - чтениеXML.
//
Функция ПроверкаКонцаТэгов(ФайлXML)
Если (ФайлXML.ТипУзла = ТипУзлаXML.КонецЭлемента и ФайлXML.Имя = "query")
или (ФайлXML.ТипУзла = ТипУзлаXML.КонецЭлемента и ФайлXML.Имя = "parameters") Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
//////////////////////////////////////////////////////////////////////////////////////////////
// для обычной консоли
Функция вСохранитьЗапросыВФайл(ОбъектЗапроса, ИмяФайла = "C:\Запросы\TekZapros.sel")
ДеревоЗапросов = Новый ДеревоЗначений;
ДеревоЗапросов.Колонки.Добавить("Запрос");
ДеревоЗапросов.Колонки.Добавить("ТекстЗапроса");
ДеревоЗапросов.Колонки.Добавить("ПараметрыЗапроса");
ДеревоЗапросов.Колонки.Добавить("СпособВыгрузки");
мТекущаяСтрока = ДеревоЗапросов.Строки.Добавить();
мТекущаяСтрока.Запрос = "Запросы";
мТекущаяСтрока.ТекстЗапроса = ОбъектЗапроса.Текст;
ТаблПараметров = Новый ТаблицаЗначений;
ТаблПараметров.Колонки.Добавить("ИмяПараметра");
ТаблПараметров.Колонки.Добавить("ЭтоВыражение");
ТаблПараметров.Колонки.Добавить("ЗначениеПараметра");
Для каждого ТекПараметр Из ОбъектЗапроса.Параметры Цикл
НовСтрПар = ТаблПараметров.Добавить();
НовСтрПар.ЗначениеПараметра = ТекПараметр.Значение;
НовСтрПар.ИмяПараметра = ТекПараметр.Ключ;
НовСтрПар.ЭтоВыражение = Ложь;
КонецЦикла;
мТекущаяСтрока.ПараметрыЗапроса = ТаблПараметров;
мТекущаяСтрока.СпособВыгрузки = 2;
// и копию
мТекущаяСтрока2 = мТекущаяСтрока.Строки.Добавить();
мТекущаяСтрока2.Запрос = "Исходный запрос";
мТекущаяСтрока2.ТекстЗапроса = ОбъектЗапроса.Текст;
мТекущаяСтрока2.ПараметрыЗапроса = ТаблПараметров;
мТекущаяСтрока2.СпособВыгрузки = 2;
ЗначениеВФайл(ИмяФайла, ДеревоЗапросов);
Возврат Истина;
КонецФункции // СохранитьЗапросыВФайл()
Необходимо поменять путь выгрузки в модуле:
2. Запускаем отладку и останавливаемся перед выполнением запроса, например, у меня была внешняя обработка:
3. Открываем код общего модуля АБ_ВыгрузкаЗапроса, выделяем строку и нажимаем "Вычислить выражение":
Значение должно быть Истина, это означает, что файл выгружен:
4. Заходим в консоль запросов и указываем файл, который мы выгружали:
Все параметры заполнились: