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

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

СКД запросы

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта 1С:Предприятие 8 Платные (руб)

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

16500 руб.

02.09.2020    244819    1341    419    

1122

Инструментарий разработчика СКД Программист 1С 8.3 Бесплатно (free)

В этой статье представлен СКДБилдер — общий модуль-обёртка над объектной моделью СКД, который сокращает код в 3-4 раза и делает его читаемым.

29.01.2026    4742    263    shapa_pro    25    

65

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Статья написана по результатам проведенного внутреннего обучающего вебинара для разработчиков ГК «СофтБаланс». Если осилить 25 000 знаков - задача для вас непосильная, где-то на бескрайних просторах интернета видео есть (или будет). Но здесь информация точнее. Разберем, чем запрос для СКД принципиально отличается от обычного запроса и как модифицируется в зависимости от настроек. Изучим «базовый рецепт» написания запроса для СКД, сформируем чек-лист. Полезно будет всем – от стажеров до тех. лидов. Всем, кто не снимает галку «автозаполнение» и пишет запросы для отчетов в консоли запросов – читать (вдумчиво) обязательно.

29.10.2025    15286    ovetgana    112    

105

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

01.07.2025    8975    krasnoshchekovpavel    5    

66

СКД Программист Стажер 1С:Предприятие 8 Россия Бесплатно (free)

Несколько способов управления формами выбора параметров и отборов СКД.

10.04.2025    8191    Neti    0    

41

СКД Программист 1С:Предприятие 8 Бесплатно (free)

Хорошая отчетная форма - сродни искусству. Есть какое-то невероятное эстетическое удовольствие в том, чтобы разобраться в логике учета и анализируемых показателях, спроектировать архитектуру хранения данных так, чтобы оптимально собрать эти показатели вместе с аналитическими разрезами в запросе, а затем настроить отображение так, чтобы, глядя на результат, сразу было понятно, что это за отчет и какие задачи он призван решать. Система компоновки данных - это моя первая, главная и, наверное, единственная "рабочая" любовь. Ее я использую везде, где только можно и где нельзя тоже. Хочу поделиться с вами некоторыми практическими приемами в работе с отчетами на СКД, которые, надеюсь, будут полезны.

27.02.2025    15391    ovetgana    50    

93

СКД Программист 1С:Предприятие 8 Бесплатно (free)

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

24.12.2024    13007    Akcium    17    

46

СКД Механизмы типовых конфигураций Запросы Программист 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    9419    AlexeyPROSTO_1C    1    

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

КонецФункции
Показать
Hammerbet; Shmell; Sothale; nyam-nyam; top_1c; dvsidelnikov; mmitin; dim9; user774630; +9 Ответить
2. genayo 11.04.20 17:29 Сейчас в теме
(1) А почему <1 а не =0?
8. TMV 2 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 64 13.04.20 08:34 Сейчас в теме
(1) эту претензию можно отправить разработчиками типовых конфигураций.

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