Сохранение настроенного запроса набора данных СКД

18.03.21

Разработка - Универсальные функции

Как сохранить запрос набора данных СКД в том виде, каким он будет выполнен системой для открытия в консоли запросов с диска ИТС.

Предисловие

В своей предыдущей публикации я поделился своим способом сохранять настроенные запросы (с параметрами и временными таблицами) для открытия в консоли запросов с диска ИТС. Сегодня я расскажу (и поделюсь кодом) как сделать это для набора данных СКД.

Извлечение настроенного запроса СКД

Платформа 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.

Вступайте в нашу телеграмм-группу Инфостарт

отчет СКД запрос извлечь сохранение параметры консоль

См. также

Универсальные функции Работа с интерфейсом Программист 1С v8.3 Бесплатно (free)

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

14.05.2025    4530    DeerCven    14    

50

Универсальные функции Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    44314    dimanich70    83    

160

Универсальные функции Программист 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    6533    6    John_d    13    

58

Универсальные функции Программист Стажер 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    54354    atdonya    31    

67

Универсальные функции Программист 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    8291    ke.92@mail.ru    17    

67

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    22064    YA_418728146    8    

174
Для отправки сообщения требуется регистрация/авторизация