Работа с запросами в 1С СКД. Язык выражений СКД и подмена запросов

21.04.20

Разработка - СКД

Хотя эта статья называется «Работа с запросами в 1С СКД», нельзя не упомянуть про язык выражений СКД. Да – у системы компоновки данных есть свой язык! Это не язык платформы 1С, это не язык запросов. Это еще один язык, который используется 1С в СКД для обработки полученного набора (ов) данных.

 

 

Работа с запросами в 1С СКД. Язык выражений СКД и подмена запросов.

 

С помощью языка запросов СКД получает данные (например) с сервера СУБД и затем производится обработку (на сервере приложений) с помощью языка выражений СКД. Элементы этого языка могут использоваться:

  • В схеме компоновки - для описания вычисляемых полей, выражений ресурсов, выражений связи наборов данных.
  • В пользовательских полях.
  • При вычислении параметров макетов.

Документацию по данному языку можно найти в справке к платформе (не синтаксис помощник) – в конфигураторе вызов через F1.

1С СКД

 

Самый интересный раздел, безусловно, это «Функции языка выражений системы компоновки данных», а также «Агрегатные функции». Использование этих функций мы рассматривали в нашем курсе по СКД. Важно знать об этом разделе хотя бы, потому что в языке выражений СКД есть функции, которых (к сожалению) пока нет в языке запросов 1С. Например, округление числа «Окр» или длина строки «ДлинаСтроки» и другие. Также язык выражений СКД позволяет использовать функции общих модулей.

На закуску интересная статья про функцию «Представление» и про то, какие ошибки возникают из-за разной реализации данной функции в языке запросов и в языке выражений СКД.

 

Обманываем СКД!

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

В этом случае можно воспользоваться возможность изменить текст запроса в схеме компоновки данных при программном формировании отчета в процедуре модуля объекта «ПриКомпоновкеРезультата».

Разберем на таком простом примере. Необходимо сделать отчет, который будет выводить все документы в базе. Допустим номер, дата, признак проведения. Плохой отчет, но хороший образец для демонстрации. Понятно, что включать в текст запроса набора данных все документы идея так себе. А если учесть, что документы могут добавляться или удаляться – вообще не реализуемая. Поэтому в наборе данных мы добавим запрос только по одному виду документа (будем считать, что этот документ будет в базе всегда). И добавим отбор по периоду (через отбор).

1С СКД

 

1С СКД

 

1С СКД

 

Далее подменяем в модуле отчета текст запроса:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	
	СхемаКомпоновкиДанных = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"); // Получаем схему компоновки данных
	
	СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = ""; // Очищаем запрос в наборе данных
	ДокументыКонфигурации = Метаданные.Документы; 				 // Получаем коллекцию метаданных документов 
	КоличествоДокументов = ДокументыКонфигурации.Количество();   // Определяем общее количество документов в конфигурации
	Сч = 1;
	ТекстЗапроса = "";
	Для Каждого Док Из ДокументыКонфигурации Цикл
		ТекстЗапроса = ТекстЗапроса + 		// Для каждого документа формируем текст запроса к его таблице
		"ВЫБРАТЬ							
		|	Док.Номер КАК Номер,
		|	Док.Дата КАК Дата,
		|	Док.Проведен КАК Проведен
		|ИЗ
		|	Документ."+Док.Имя+" КАК Док";  // В текст запроса нам необходимо лишь подставить имя таблицы документа в дереве метаданных
		
		Если Сч < КоличествоДокументов Тогда // Если документ не последний в коллекции - добавляем инструкцию "ОБЪЕДИНИТЬ ВСЕ" для
			ТекстЗапроса = ТекстЗапроса +     // объединения результатов запросов по документам в единый список
			"
			|ОБЪЕДИНИТЬ ВСЕ
			|";
		КонецЕсли;			
		Сч = Сч + 1;
	КонецЦикла;
	СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = ТекстЗапроса;
	
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.ПолучитьНастройки(),ДанныеРасшифровки);
    
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,,ДанныеРасшифровки);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);	
	
КонецПроцедуры

 

Через метаданные обходим все документы в конфигурации и через «ОБЪЕДИНИТЬ ВСЕ» соединяем запрос к каждому документу в один. Установим отбор по дате начала и посмотрим, что при этом происходит, остановившись в отладчике после получения макета компоновки, и изучим одно из его свойств:

1С СКД

 

Здесь мы видим реальный запрос, который СКД передает для выполнения платформе. С уже установленным отбором. Причем отбор установлен для каждого документа автоматически как нам и было нужно (по этой причине я выбрал выборку за период через отбор, а не через параметры). Об этом (как СКД меняет текст запроса) мы поговорим в следующем разделе.

Но это не все. Вам может показаться, что это какой-то искусственно придуманный пример и в реальной жизни не нужен. Давайте заглянем в отчет «ОстаткиИДоступностьТоваров» из УТ 11.4. В основном наборе отчета есть такой параметр:

1С СКД

 

Посмотрим теперь модуль отчета процедуру «ПриКомпоновкеРезультата»:

 

1С СКД

 

Здесь видно, что параметр, объявленный в наборе, заменяется с помощью вызова функции «ТекстЗапросаВесУпаковки» на запрос, получающий вес упаковки через единицу и номенклатуру из основного набора. Если посмотреть текст этой функции (запрос, возвращаемый функцией, занимает один экран), то становится понятно, почему этот код не был включен в основной набор – тогда текст запроса в основном наборе получился бы совершенно нечитаемым.

 

Серия статей по СКД

Предыдущая статься .., Следующая статья ..
Автор курсов образовательного проекта Profession Store. Павел Шемякин

СКД запросы

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

12000 9600 руб.

02.09.2020    101314    560    385    

602

1C:Предприятие для программистов: Запросы и отчеты. Онлайн-интенсив с 27 ноября по 27 декабря 2023г.

1С-программирование Запросы СКД Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Данный онлайн-курс предусматривает углубленное изучение языка запросов и возможностей системы компоновки данных, которые понадобятся при разработке отчетов, работающих на платформе “1С:Предприятие” в рамках различных прикладных решений. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”, а также для опытных пользователей различных прикладных решений, которые используют в своей работе отчеты разного назначения. Курс является вторым курсом траектории развития 1С-Разработчика, с углубленным изучением тем "Язык запросов" и "Отчеты", которые были рассмотрены в рамках “Базового курса для начинающих 1С-программистов”.

7500 руб.

04.10.2023    2522    48    0    

47

Модель СКД

Инструментарий разработчика СКД Платформа 1С v8.3 Система компоновки данных Абонемент ($m)

DSL для работы с СКД.

1 стартмани

15.11.2023    3901    10    kalyaka    4    

80

Разрыв страницы в СКД. Легко!

СКД Платформа 1С v8.3 Система компоновки данных Бесплатно (free)

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

01.09.2023    3157    KVIKS    15    

76

Гибкие отборы через СКД на управляемых формах. Демо-обработка

СКД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

В данной публикации предлагаю вам рабочий пример использования системы компоновки данных для отборов на управляемых формах.

2 стартмани

07.06.2023    4583    26    quazare    7    

46

Вывод элементов иерархии верхнего уровня на СКД

СКД Платформа 1С v8.3 Абонемент ($m)

Как получить родителя первого уровня иерархического справочника с помощью СКД.

1 стартмани

06.06.2023    4197    echo77    6    

72

Обработка результатов запроса произвольными вычисляемыми полями. Обзор некоторых новых функций СКД

Запросы СКД Платформа 1С v8.3 Запросы Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

В данной статье вспомним, как обрабатывать результаты запроса в вычисляемых полях СКД, а также сделаем небольшой обзор на новые функции СКД платформы 8.3.20.

07.02.2023    5488    quazare    7    

38
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. tormozit 7074 11.04.20 16:03 Сейчас в теме
СтрЗаменить() - довольно опасная техника модификации текста запроса, т.к. при отсутствии в тексте заменяемой строки она делает ничего. Но в то же время она имеет свои неоспоримые преимущества перед капризной и ресурсоемкой схемой запроса. Поэтому отказываться от нее нельзя. Зато можно снизить риск от ее использования путем проверки наличия в тексте заменяемой строки. Я в большинстве случаев использую такой аналог этой функции
Функция СтрЗаменитьОбязательно(ГдеЗаменять, Знач ЧтоЗаменять, Знач НаЧтоЗаменять, ОставитьЧтоЗаменять = Ложь) Экспорт 
	
	Если Найти(ГдеЗаменять, ЧтоЗаменять) < 1 Тогда
		ВызватьИсключение "Шаблонная строка """ + ЧтоЗаменять + """ не найдена в тексте";
	КонецЕсли; 
	Если ОставитьЧтоЗаменять Тогда
		НаЧтоЗаменять = ЧтоЗаменять + НаЧтоЗаменять;
	КонецЕсли; 
	ГдеЗаменять = СтрЗаменить(ГдеЗаменять, ЧтоЗаменять, НаЧтоЗаменять);
	Возврат ГдеЗаменять;

КонецФункции
Показать
Sothale; nyam-nyam; rpgshnik; dvsidelnikov; mmitin; dim9; user774630; +7 Ответить
2. genayo 11.04.20 17:29 Сейчас в теме
(1) А почему <1 а не =0?
8. TMV 14 12.04.20 07:31 Сейчас в теме
(2) Видимо, были случаи, когда непредсказуемая платформа выдавала совершенно неожиданный отрицательный результат)
9. genayo 12.04.20 08:02 Сейчас в теме
(8) Так вот и интересно, как и когда такое может быть.
25. EvgenMokrousov 1 25.12.20 09:06 Сейчас в теме
(2) от функции Найти() ждёшь положительное значение > 0, если нашлось вхождение подстроки, следовательно всё что < 1 программистом трактуется как отсутствие вхождения подстроки.
Сам так любил писать )
12. toypaul 63 13.04.20 08:34 Сейчас в теме
(1) эту претензию можно отправить разработчиками типовых конфигураций.

я только не понял - а чем плохо то, что она не делает ничего? например, в этом случае при определенном стечении обстоятельств такого поля может не быть и соот-но замены такой не будет. и что? таблицы ненужные СКД сама в этом случае отбросит.
13. tormozit 7074 13.04.20 09:41 Сейчас в теме
(12) Так я и не утверждал, что делать ничего - всегда плохо, а лишь считаю что в большинстве случаев это плохо. В них такую привязку можно и нужно делать жесткой и тем самым повышать надежность кода, т.к. будущие правки текста запроса могут выполняться людьми или механизмами не знающими о важности сохранения в неизменном виде какого то фрагмента текста запроса. Лучше сразу после такой некорректной правки получить исключение, чем программа будет молча работать и показывать некорректный результат и в разы увеличивать длительность поиска причины ее некорректной работы.
17. toypaul 63 13.04.20 13:10 Сейчас в теме
(13) Я пытаюсь объяснить, что ваш камент не к месту в этом конкретном случае. А пример кода так и вовсе вреден. Никакого исключения тут выдавать не надо. Все должно работать ровно так как написано.
18. tormozit 7074 13.04.20 13:33 Сейчас в теме
(17) В теме статьи указано "Подмена запросов". В статье показана подмена с использованием функции СтрЗаменить. Я привел ее аналог и описал в чем его преимущества и в каких случаях. Возможно в конкретном случае мой комментарий и не к месту, но по поводу безусловной вредности моего примера кода утверждение очень смелое.
21. Bit_Man 02.06.20 12:01 Сейчас в теме
(13) Разработчика не должно волновать (или не входило в его задачу учитывать) "будущие правки текста людьми или механизмами не знающими о важности сохранения в неизменном виде какого то фрагмента текста запроса". Те кто изменяет конфу, должны понимать и проверять, как изменения влияют на работу в режиме предприятия.
22. tormozit 7074 02.06.20 13:04 Сейчас в теме
(21) Перефразируя тебя, можно написать "пишу код, не думая о том, какова вероятность что при доработках его сломают и поймут это далеко не сразу".
23. Bit_Man 03.06.20 02:53 Сейчас в теме
(22)Ну тогда все так думают, кто используют СтрЗаменить без поиска вхождение искомой подстроки
3. bayce 44 11.04.20 17:35 Сейчас в теме
Запрос в цикле это страшное зло
4. awk 741 11.04.20 18:08 Сейчас в теме
(3) Не всегда.
ltfriend; +1 Ответить
6. ixijixi 1686 12.04.20 00:06 Сейчас в теме
(3) А где Вы увидели в примере запрос в цикле? В цикле собирается ТЕКСТ запроса, не более.
san4o; SanchoD; +2 Ответить
5. ltfriend 919 11.04.20 22:45 Сейчас в теме
Я бы не полагался, на какой-то документ, который есть всегда, а написал бы (как в типовых)
ВЫБРАТЬ
ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК Дата,
"" КАК Номер,
ИСТИНА КАК Проведен
SanchoD; sogesti; toypaul; +3 Ответить
16. toypaul 63 13.04.20 13:07 Сейчас в теме
(5) Да ... знаю, что аудитория ИС готова докопаться да любой строчки кода и любой буквы в статье. Это даже хорошо - когда конструктивно (как в этом случае). Просто статья была написана для внутреннего потребления (где многое простят), а потом было решено выложить на ИС.
7. TMV 14 12.04.20 07:28 Сейчас в теме
С темой подмены запросов можно ознакомиться в ЗУП3.
sogesti; toypaul; +2 Ответить
10. fancy 35 13.04.20 08:13 Сейчас в теме
А для чего очищать текст запроса перед его установкой?
СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = ""; // Очищаем запрос в наборе данных
11. toypaul 63 13.04.20 08:29 Сейчас в теме
(10) Надо спросить автора этого кода :). Вообще-то эта строчка не нужна
14. logarifm 1114 13.04.20 12:31 Сейчас в теме
Если уж на это пошло и Вы подменяете запрос исходя из того, что в зависимости от конфигурации необходимо работать с разным набором документов. То тут уже косяк потому как в моей конфигурации документа ПриходнаяНакладая нет и отчет вообще не откроется. Следовательно пример является не верным. В таких случаях необходимо применять не НаборДанных Запрос, а Внешнюю таблицу.
15. toypaul 63 13.04.20 13:04 Сейчас в теме
(14) У внешней таблицы нет запроса, следовательно такой подход не сработает. В таких случаях необходимо применить главный инструмент разработчика - "мозг" и поменять документ, которого нет на тот, который есть. И тогда отчет откроется.
19. logarifm 1114 13.04.20 20:10 Сейчас в теме
(15)Это не рабочий пример! И внешнией таблицы есть запрос поскольку она должна с чего-то состоять. Тоесть пример надо переформулировать в коректный и прменить именно внешнюю таблицу. То есть то что есть сейчас в ПриКомпоновке результата сделать формирование внешней таблицы запросом, а свое "ЭГО"я думаю надо запихнуть себеб глубокооо в одно место и следовательно думать, что отвечать ну уж по давно не делитантам в этом деле!
20. logarifm 1114 13.04.20 20:11 Сейчас в теме
Есть такое понятие как нормализация данных - и этот отчет и пример лажа!
24. CnupT 69 31.07.20 04:56 Сейчас в теме
(20)Мы ведь не на Мисте, давайте будем взаимно вежливы.
Оставьте свое сообщение