Предисловие
В своей предыдущей публикации я поделился своим способом сохранять настроенные запросы (с параметрами и временными таблицами) для открытия в консоли запросов с диска ИТС. Сегодня я расскажу (и поделюсь кодом) как сделать это для набора данных СКД.
Извлечение настроенного запроса СКД
Платформа 1С окончательно настраивает запросы наборов данных СКД в момент создания объекта МакетКомпоновкиДанных, этот объект возвращает функция Выполнить() объекта КомпоновщикМакетаКомпоновкиДанных. Если СКД формируется программно, то нам нужно остановить выполнение в этой точке, если же СКД полностью формируется платформой, нужно будет создать объект МакетКомпоновкиДанных.
Напишем несколько простых функций:
//Возвращает запрос указанного набора данных из объекта МакетКомпоновкиДанных
Функция ЗапросИзМКД(МакетКомпоновкиДанных, ИмяНабораДанных=Неопределено)
ЗапросРезультат = Новый Запрос;
ИспользуемоеИмяНабораДанных = ИмяНабораДанных;
Если МакетКомпоновкиДанных.НаборыДанных.Количество() = 1 Тогда
ИспользуемоеИмяНабораДанных = МакетКомпоновкиДанных.НаборыДанных[0].Имя;
КонецЕсли;
Если ИспользуемоеИмяНабораДанных = Неопределено Тогда
Возврат "Не удалось определить требуемый набор данных, вероятно их несколько, укажите имя набора данных";
КонецЕсли;
Если СтрНайти(ИспользуемоеИмяНабораДанных, ".") > 0 Тогда
ЧастиИмени = СтрРазделить(ИспользуемоеИмяНабораДанных, ".");
Если ЧастиИмени.Количество() = 2 Тогда
ЗапросРезультат.Текст = МакетКомпоновкиДанных.НаборыДанных[ЧастиИмени[0]].Элементы[ЧастиИмени[1]].Запрос;
Иначе
Возврат "Непредусмотренная вложенность наборов данных";
КонецЕсли;
Иначе
ЗапросРезультат.Текст = МакетКомпоновкиДанных.НаборыДанных[ИспользуемоеИмяНабораДанных].Запрос;
КонецЕсли;
Для Каждого ТекПараметр Из МакетКомпоновкиДанных.ЗначенияПараметров Цикл
Если СтрНайти(ЗапросРезультат.Текст, "&"+ТекПараметр.Имя) > 0 Тогда
ЗапросРезультат.УстановитьПараметр(ТекПараметр.Имя, ТекПараметр.Значение);
КонецЕсли;
КонецЦикла;
Возврат ЗапросРезультат;
КонецФункции
//Возвращает запрос для отчета с СКД
Функция ЗапросИзОтчета(ОтчетОбъект, ИмяНабораДанных=Неопределено)
НастройкиОтчета = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(ОтчетОбъект.СхемаКомпоновкиДанных, НастройкиОтчета);
Возврат ЗапросИзМКД(МакетКомпоновки, ИмяНабораДанных);
КонецФункции
//Сохраняет запрос из набора данных СКД
Функция СохранитьЗапросСКД(ОтчетОбъект_МакетКомпоновкиДанных, ИмяНабораДанных=Неопределено, ИмяКаталогаИлиПолноеИмяФайла) Экспорт
Если ТипЗнч(ОтчетОбъект_МакетКомпоновкиДанных) = Тип("МакетКомпоновкиДанных") Тогда
ЗапросОбъект = ЗапросИзМКД(ОтчетОбъект_МакетКомпоновкиДанных, ИмяНабораДанных);
Иначе
ЗапросОбъект = ЗапросИзОтчета(ОтчетОбъект_МакетКомпоновкиДанных, ИмяНабораДанных);
КонецЕсли;
Если ТипЗнч(ЗапросОбъект) <> Тип("Запрос") Тогда
Возврат ЗапросОбъект;
КонецЕсли;
Возврат СохранитьЗапрос(ЗапросОбъект, ИмяКаталогаИлиПолноеИмяФайла);
КонецФункции
Как это использовать?
Создайте серверный общий модуль (или модуль расширения) и скопируйте туда эти функции. Также туда нужно скопировать функции из предыдущей публикации. Пусть общий модуль называется, например "Отладка". Затем нужно будет определить точку останова. Если отчет полностью формируется платформой то останавливаем в процедуре ПриКомпоновкеРезультата() модуля объекта отчета (если в отчете нет такой процедуры, то придется её создать). Если отчет формируется программно, то ищем момент создания объекта МакетКомпоновкиДанных и останавливаем в строке, следующей за ней.
Далее нажимаем Shift+F9 и пишем
1) Отладка.СохранитьЗапросСКД(ЭтотОбъект, "<ИмяНабораДанных>", "\\Host\Share")
либо
2) Отладка.СохранитьЗапросСКД(МакетКомпоновкиДанных, "<ИмяНабораДанных>", "\\Host\Share")
Вариант 1 используем если отчет полностью формируется платформой - первым параметром передаем ОтчетОбъект, вариант 2 используем если есть программное создание объекта МакетКомпоновкиДанных.
Второй параметр ИмяНабораДанных можно не указывать, если в СКД только один набора данных.
\\Host\Share - имя сетевого каталога, куда будет сохранен запрос (этот каталог должен быть доступен для записи пользователем, под которым запущен сервер 1С Предприятие).
Запрос со всеми параметрами будет сохранен в файл \\Host\Share\Запрос_{ТекущаяДатаИВремя}.q1c. При открытии файла *.q1c в консоли запросов запрос и все параметры будут восстановлены. Файл *.q1c открывается консолью запросов, которое идет в комплекте с БСП.
Тестовое окружение
Работа функций проверялась на платформе 8.3.16.