Как получить текст запроса из скд 1с
Подскажите пожалуйста по такому вопросу. Есть отчет на СКД. Я его формирую.
Сейчас хотелось бы в конфигураторе отловить получение сформированных настроек в режиме предприятия, для их имитации программным образом и дальнейшего использования.
Кажется все через эту процедуру? Давно не отлавливал .
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
(0) > Давно не отлавливал
Чой-то ржу.
Да, Андрей, через эту тоже можно
Подскажите где будет лучше, нужны все настройки формируемой скд, текст запроса, отловить, все параметры .
Каталог статей
Текст запроса можно получить в процедуре ПриКомпоновкеРезультата() и исправить его перед выполнением.
Например есть параметр типа список строк, и в зависимости от его содержимого надо переделать отбор в запросе.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// в запросе есть строка «ГДЕ &ПараметрыПоиска». Формируем нужный текст условий и подставляем его вместо &ПараметрыПоиска
ПараметрыПоиска = Настройки.ПараметрыДанных.Элементы.Найти(«СтрокиОтбораНазванияФайла»);
Если ПараметрыПоиска.Использование Тогда
СтрокаОтбора= «»;
Для каждого СтрокаСписка из ПараметрыПоиска.Значение Цикл
СтрокаОтбора = СтрокаОтбора + ?(СтрокаОтбора= «»,»»,» ИЛИ «) + «ХранилищеФайловСрезПоследних.Наименование ПОДОБНО «»» + СтрокаСписка.Значение + «»»»;
КонецЦикла;
Иначе
СтрокаОтбора = «Истина»;
КонецЕсли;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
Запрос = СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос;
Запрос = СтрЗаменить(Запрос,»&ПараметрыПоиска»,СтрокаОтбора);
СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = Запрос;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
// Скомпонуем результат
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
// Выводим результат в табличный документ
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Работа с запросами в 1С СКД. Язык выражений СКД и подмена запросов
Хотя эта статья называется «Работа с запросами в 1С СКД» нельзя не упомянуть про язык выражений СКД. Да – у системы компоновки данных (СКД) есть свой язык! Это не язык платформы 1С, это не язык запросов. Это еще один язык, который используется 1С в СКД для обработки полученного набора (ов) данных.
То есть с помощью языка запросов СКД получает данные (например) с сервера СУБД и затем производится обработку (на сервере приложений) с помощью языка выражений СКД. Элементы этого языка могут использоваться:
В схеме компоновки — для описания вычисляемых полей, выражений ресурсов, выражений связи наборов данных
В пользовательских полях
При вычислении параметров макетов
Документацию по данному языку можно найти в справке к платформе (не синтаксис помощник) – в конфигураторе вызов через F1.
Самый интересный раздел, безусловно, это «Функции языка выражений системы компоновки данных», а также «Агрегатные функции». Использование этих функций мы рассматривали в нашем курсе по 1С СКД. Важно знать об этом разделе хотя бы, потому что в языке выражений СКД есть функции, которых (к сожалению) пока нет в языке запросов 1С. Например, округление числа «Окр» или длина строки «ДлинаСтроки» и другие. Также язык выражений СКД позволяет использовать функции общих модулей.
На закуску интересная статья про функцию «Представление» и про то, какие ошибки возникают из-за разной реализации данной функции в языке запросов и в языке выражений системы компоновки данных (СКД).
Обманываем СКД!
Иногда в отчетах на СКД возникает необходимость изменить текст запроса, заданный в наборе данных в зависимости от некоторых условий. При этом нужно сохранить все настройки параметров, отборов, условного оформления и т.п.
В этом случае можно воспользоваться возможность изменить текст запроса в схеме компоновки данных при программном формировании отчета в процедуре модуля объекта «ПриКомпоновкеРезультата».
Разберем на таком простом примере . Необходимо сделать отчет, который будет выводить все документы в базе. Допустим номер, дата, признак проведения. Плохой отчет, но хороший образец для демонстрации. Понятно, что включать в текст запроса набора данных все документы идея так себе. А если учесть, что документы могут добавляться или удаляться – вообще не реализуемая. Поэтому в наборе данных мы добавим запрос только по одному виду документа (будем считать, что этот документ будет в базе всегда). И добавим отбор по периоду (через отбор).
Далее подменяем в модуле отчета текст запроса:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
СхемаКомпоновкиДанных = ПолучитьМакет(«ОсновнаяСхемаКомпоновкиДанных»); // Получаем схему компоновки данных
СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = «»; // Очищаем запрос в наборе данных
ДокументыКонфигурации = Метаданные.Документы; // Получаем коллекцию метаданных документов
КоличествоДокументов = ДокументыКонфигурации.Количество(); // Определяем общее количество документов в конфигурации
Сч = 1;
ТекстЗапроса = «»;
Для Каждого Док Из ДокументыКонфигурации Цикл
ТекстЗапроса = ТекстЗапроса + // Для каждого документа формируем текст запроса к его таблице
«ВЫБРАТЬ
| Док.Номер КАК Номер,
| Док.Дата КАК Дата,
| Док.Проведен КАК Проведен
|ИЗ
| Документ.»+Док.Имя+» КАК Док»; // В текст запроса нам необходимо лишь подставить имя таблицы документа в дереве метаданных
ТекстЗапроса = ТекстЗапроса + // объединения результатов запросов по документам в единый список
«
|ОБЪЕДИНИТЬ ВСЕ
|»;
КонецЕсли;
Сч = Сч + 1;
КонецЦикла;
СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = ТекстЗапроса;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Компоновщик Настроек.ПолучитьНастройки(),ДанныеРасшифровки);
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ,ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры
Через метаданные обходим все документы в конфигурации и через «ОБЪЕДИНИТЬ ВСЕ» соединяем запрос к каждому документу в один. Установим отбор по дате начала и посмотрим, что при этом происходит, остановившись в отладчике после получения макета компоновки, и изучим одно из его свойств:

Здесь мы видим реальный запрос, который СКД передает для выполнения платформе. С уже установленным отбором. Причем отбор установлен для каждого документа автоматически как нам и было нужно (по этой причине я выбрал выборку за период через отбор, а не через параметры). Об этом (как СКД меняет текст запроса) мы поговорим в следующем разделе.
Но это не все. Вам может показаться, что это какой-то искусственно придуманный пример и в реальной жизни не нужен. Давайте заглянем в отчет «ОстаткиИДоступностьТоваров» из УТ 11.4. В основном наборе отчета есть такой параметр:
Работа с запросами в 1С СКД . Особенности работы запросов в СКД. Часть 1
Главная особенность системы компоновки данных (СКД) в 1С при работе с «наборами данных запрос» заключается в том, что запрос выполняемый платформой может отличаться от запроса, который вы написали в наборе данных.
В процессе чтения статьи вы уже сталкивались с таким поведением системы компоновки данных в разделе «Расширение языка запросов 1С для СКД». Это (наличие управляющих конструкций расширения в запросе) один из факторов, влияющих на результирующий запрос. Где можно «поймать» этот запрос вы могли заметить в разделе «Обманываем СКД» — в процедуре «ПриКомпоновкеРезультата» в отладчике при программном формировании отчета в объекте МакетКомпоновкиДанных можно обратиться к свойству «НаборыДанных», в наборе (если это набор данных запрос) смотрим свойство «Запрос».
В этом разделе разберем если не все, то большинство ситуаций срабатывания механизма замены (модификации) запроса. Среди них будут как ожидаемые, так и неожиданные примеры.
Вспомогательные данные
При выполнении запроса для вывода в отчет в запрос дополнительно включаются — данные о представлении агрегатных объектов, при наличии группировок — данные для сортировки и сама сортировка.
Для детальных записей это выглядит так:

При наличии группировок так:

Использовать группировки запроса если возможно
Начиная с определенного релиза платформы 1С (по-моему, с 8.3.14) в 1С СКД появилась для «наборов данных запрос» опция «Использовать группировки запроса если возможно»:
В отчете с группировкой
по номенклатуре и ресурсами «Количество» и «Сумма» получаем
по номенклатуре и ресурсами «Количество» и «Сумма» получаем
То на него указанная опция не действует. Видимо к регистрам накопления «невозможно» применить эту опцию
Посмотри наш курс по 1С СКД от Павла Шемякина.
Необязательное условие
Этот пример мы уже рассматривали в предыдущем разделе про расширение языка запросов. Повторим еще раз и рассмотрим чуть больше примеров:
Исходный текст запроса
Если не задан ни один параметр
Если задан один параметр
Если заданы оба параметра
Здесь важно заметить, что условия могут применяться отдельно только если они перечисленные через «,» и при использовании обоих условий они соединяются с помощью оператора «И». Если условия должны соединяться по-другому, то в этом случае общее выражение заключается в одни фигурные скобки
Только в этом случае отчет будет работать, если не заданы оба параметры или если оба параметры заданы. Если задан только один параметр, будет выдаваться ошибка (потому что в итоговый запрос будут включены оба параметра
Необязательная таблица
Такой пример мы тоже уже разбирали. Исходный запрос:
Если выбрано поле остатка
Если поле остатка не выбрано
Теперь рассмотрим запрос чуть сложнее
В нем мы получаем данные по продажам, из связанной накладной получаем статью расходов, из статьи получаем формулу расчета. Реквизиты «Статья» и «ФормулаРасчета» могут не включаться в отчет. Допустим, нам не нужна статья, но нужна формула расчета. Какой итоговый запрос мы получим в этом случае
Реквизит «Статья» исключен из запроса и некорректно исключена связанная с ним таблица по накладным. До сих пор мы рассматривали элементы расширения языка запросов. Посмотрим, как выглядят они в конструкторе запросов. Необязательные таблицы можно увидеть на закладке «Компоновка данных — Таблицы»
Здесь кроме колонки «Обязательная» есть колонка «Номер группы». Поскольку наши таблицы включены в разные группы, то и в запросе они исключаются/включаются независимо. Если какая-то таблица включается в запрос и при этом в запрос должны включаться таблицы, от которых она зависит, то такие таблицы должны включаться в одну группу. Поэтому для таблицы «СтатьиДоходовРасходов» установим номер группы равный 1. Посмотрим, какие получатся исходный и результирующий запросы
Странно конечно получается, если мы запрос создаем в конструкторе запросов (до этого в первом исходном запросе я расставил скобки «<>» руками)
Таблицы расположены в разных группах, но как бы одна внутри другой
При этом если исключить статью в отчете, но оставить формулу расчета, результирующий запрос получается верный, несмотря на то, что группы у таблиц разные
Видимо здесь имеет значение еще и порядок соединений в исходном запросе. Но все-таки надежней будет размещать таблицы в одной группе.
