Работа с запросами в 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. Павел Шемякин

СКД запросы

См. также

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

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

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

13000 руб.

02.09.2020    120006    656    389    

702

Генератор схемы компоновки данных (СКД), написание кода схемы программно

Инструментарий разработчика СКД Платформа 1С v8.3 Конфигурации 1cv8 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

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

3 стартмани

05.02.2024    3897    24    obmailok    17    

63

Набор-объект для СКД по тексту или запросу

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

Есть список полей в виде текста, или запрос - закидываем в набор СКД.

1 стартмани

31.01.2024    1964    2    Yashazz    0    

29

СКД на JavaScript в 1С

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

Долгое время поддерживаю web-портал, в котором появилась необходимость создавать отчеты. Просмотрев различные фреймворки на js, я решил сделать свое решение, которое позволяло бы быстро разрабатывать и добавлять новые отчеты на web-портал.

2 стартмани

11.12.2023    8040    20    John_d    25    

122

Использование менеджера временных таблиц в СКД

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

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

05.12.2023    4529    PROSTO-1C    13    

61

Модель СКД

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

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

1 стартмани

15.11.2023    5712    15    kalyaka    5    

85

Пользовательские настройки отчетов 1С. Часть 1. Простые и расширенные настройки

СКД Инструкции пользователю Платформа 1С v8.3 Конфигурации 1cv8 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Простые приемы работы с отчетами на СКД. Что нужно знать пользователю про настройку отчетов, чтобы использовать их на полную катушку.

18.09.2023    6361    accounting_cons    5    

29

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

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

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

01.09.2023    4414    KVIKS    15    

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

КонецФункции
Показать
Sothale; nyam-nyam; rpgshnik; dvsidelnikov; mmitin; dim9; user774630; +7 Ответить
2. genayo 11.04.20 17:29 Сейчас в теме
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 7133 13.04.20 09:41 Сейчас в теме
(12) Так я и не утверждал, что делать ничего - всегда плохо, а лишь считаю что в большинстве случаев это плохо. В них такую привязку можно и нужно делать жесткой и тем самым повышать надежность кода, т.к. будущие правки текста запроса могут выполняться людьми или механизмами не знающими о важности сохранения в неизменном виде какого то фрагмента текста запроса. Лучше сразу после такой некорректной правки получить исключение, чем программа будет молча работать и показывать некорректный результат и в разы увеличивать длительность поиска причины ее некорректной работы.
17. toypaul 63 13.04.20 13:10 Сейчас в теме
(13) Я пытаюсь объяснить, что ваш камент не к месту в этом конкретном случае. А пример кода так и вовсе вреден. Никакого исключения тут выдавать не надо. Все должно работать ровно так как написано.
18. tormozit 7133 13.04.20 13:33 Сейчас в теме
(17) В теме статьи указано "Подмена запросов". В статье показана подмена с использованием функции СтрЗаменить. Я привел ее аналог и описал в чем его преимущества и в каких случаях. Возможно в конкретном случае мой комментарий и не к месту, но по поводу безусловной вредности моего примера кода утверждение очень смелое.
21. Bit_Man 02.06.20 12:01 Сейчас в теме
(13) Разработчика не должно волновать (или не входило в его задачу учитывать) "будущие правки текста людьми или механизмами не знающими о важности сохранения в неизменном виде какого то фрагмента текста запроса". Те кто изменяет конфу, должны понимать и проверять, как изменения влияют на работу в режиме предприятия.
22. tormozit 7133 02.06.20 13:04 Сейчас в теме
(21) Перефразируя тебя, можно написать "пишу код, не думая о том, какова вероятность что при доработках его сломают и поймут это далеко не сразу".
23. Bit_Man 03.06.20 02:53 Сейчас в теме
(22)Ну тогда все так думают, кто используют СтрЗаменить без поиска вхождение искомой подстроки
3. bayce 45 11.04.20 17:35 Сейчас в теме
Запрос в цикле это страшное зло
4. awk 741 11.04.20 18:08 Сейчас в теме
6. ixijixi 1761 12.04.20 00:06 Сейчас в теме
(3) А где Вы увидели в примере запрос в цикле? В цикле собирается ТЕКСТ запроса, не более.
san4o; SanchoD; +2 Ответить
5. ltfriend 951 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 1116 13.04.20 12:31 Сейчас в теме
Если уж на это пошло и Вы подменяете запрос исходя из того, что в зависимости от конфигурации необходимо работать с разным набором документов. То тут уже косяк потому как в моей конфигурации документа ПриходнаяНакладая нет и отчет вообще не откроется. Следовательно пример является не верным. В таких случаях необходимо применять не НаборДанных Запрос, а Внешнюю таблицу.
15. toypaul 63 13.04.20 13:04 Сейчас в теме
(14) У внешней таблицы нет запроса, следовательно такой подход не сработает. В таких случаях необходимо применить главный инструмент разработчика - "мозг" и поменять документ, которого нет на тот, который есть. И тогда отчет откроется.
19. logarifm 1116 13.04.20 20:10 Сейчас в теме
(15)Это не рабочий пример! И внешнией таблицы есть запрос поскольку она должна с чего-то состоять. Тоесть пример надо переформулировать в коректный и прменить именно внешнюю таблицу. То есть то что есть сейчас в ПриКомпоновке результата сделать формирование внешней таблицы запросом, а свое "ЭГО"я думаю надо запихнуть себеб глубокооо в одно место и следовательно думать, что отвечать ну уж по давно не делитантам в этом деле!
20. logarifm 1116 13.04.20 20:11 Сейчас в теме
Есть такое понятие как нормализация данных - и этот отчет и пример лажа!
24. CnupT 69 31.07.20 04:56 Сейчас в теме
(20)Мы ведь не на Мисте, давайте будем взаимно вежливы.
Оставьте свое сообщение