Объект "Схема запроса" и расширения языка запросов СКД

18.07.21

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

Если использовать объект СхемаЗапроса для модификации текстов запросов, содержащих расширения СКД, то могут возникнуть ошибки времени исполнения. И полученных запрос не будет работать. В статье расскажу, как этого избежать.

В дополнение к отличным статьям:

infostart.ru/1c/articles/1222743/

infostart.ru/1c/articles/1453473/

infostart.ru/public/1118622/

про использование объекта «СхемаЗапроса» для редактирования текстов запросов, хочу обратить внимание на один момент.

Я использую объект «СхемаЗапроса» для модификации запросов в типовых конфигурациях. Это, на мой взгляд, самый правильный способ. В типовых конфигурапциях,  как правило, текст запроса формируется в зависимости нескольких условий и функциональных опций и может браться из разных мест в конфигурации. Также разработчики конфигурации используют сложные запросы с несколькими соединениями и если надо, допустим, добавить еще одно, то через функцию СтрЗаменить это сделать достаточно сложно.

Обычно для модификации запроса использую следующий код.

Например, надо в текст запроса надо добавить колонки из нового регистра.

СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(ДинамическийСписок.ТекстЗапроса);

ЗапросСхемы = СхемаЗапроса.ПакетЗапросов[0];
ОператорВыбрать = ЗапросСхемы.Операторы[0];

ВыбираемыеПоля = ОператорВыбрать.ВыбираемыеПоля;
УсловияОтбора = ОператорВыбрать.Отбор;
ИсточникОтбора = ОператорВыбрать.Источники[0];		

ПсевдонимОсновнойТаблицы = ИсточникОтбора.Источник.Псевдоним;

// добавление источников
ИсточникНовыйРегистр = ОператорВыбрать.Источники.Добавить("РегистрСведений.<Регистр_с_которым_соединяем_основную_таблицу>", 
			"<псевдоним_регистра_в_запросе>");

// по умолчанию, при добавлении источника объект СхемаЗапроса пытается сам установить связи,
// как правило, неудачно, поэтому очистим их и явно добавим связи
ИсточникНовыйРегистр.Соединения.Очистить();

// добавление связей
СоединениеНовыйРегистр = ИсточникОтбора.Соединения.Добавить(ИсточникНовыйРегистр, 
			СтрШаблон("<псевдоним_регистра_в_запросе>.<реквизит_для_связи_с_основной_таблицей> = %1.Ссылка", ПсевдонимОсновнойТаблицы));

// добавление колонок
КоличествоКолонок = ЗапросСхемы.Колонки.Количество();

ВыбираемыеПоля.Добавить("<псевдоним_регистра_в_запросе>.<добавляемая_колонка_1>");
ЗапросСхемы.Колонки[КоличествоКолонок].Псевдоним = "<псевдоним_добавляемой_колонки_1>";
КоличествоКолонок = КоличествоКолонок + 1; 

ВыбираемыеПоля.Добавить("<псевдоним_регистра_в_запросе>.<добавляемая_колонка_2>");
ЗапросСхемы.Колонки[КоличествоКолонок].Псевдоним = "<псевдоним_добавляемой_колонки_2>";
КоличествоКолонок = КоличествоКолонок + 1; 

ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();		

ДинамическийСписок.ТекстЗапроса = ТекстЗапроса;

Все отлично работает, но если в запросе не присутствуют расширения языка запросов СКД. В этом случае так запрос отличается от сделанного «вручную». Пример взят из конфигурации 1С:Документооборот.

{ГДЕ
	(ЗадачаИсполнителя.Выполнена = &Выполнена) КАК Поле2,
	(ЗадачаИсполнителя.СрокИсполнения < &ДатаДляОтображенияПросроченных
			И ЗадачаИсполнителя.СрокИсполнения > ДАТАВРЕМЯ(1, 1, 1)) КАК Поле4,
	(ЗадачаИсполнителя.ПринятаКИсполнению = &ОтображатьСтарыеЗадачи) КАК Поле6,
	(ЗадачаИсполнителя.Автор = &Автор) КАК Поле8,
	(ЗадачаИсполнителя.Проект = &Проект) КАК Поле10}

В текст запроса добавляются автоматические созданные псевдонимы "Поле2", "Поле4" и т.д.

И такая вставка приводи к ошибке времени выполнения.

Видимо, расширение языка запроса СКД появилось позже чем объект «СхемаЗапроса». И авторы расширения запросов СКД старались сделать, чтобы это расширение было максимально совместимым с тем, что создано до этого. Но этот момент остался вне их внимания.

Для исправления ситуации я добавляю следующий код.

// нужно очистить псевдонимы выражений отбора компоновки данных, иначе генерится запрос
// с псевдонимами, который приводит к ошибке исполнения.
Для каждого ВыражениеОтбора Из ОператорВыбрать.ВыраженияОтбораКомпоновкиДанных Цикл
	ВыражениеОтбора.Псевдоним = "";
КонецЦикла;

И итоге, получаем следующий код:

СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(ДинамическийСписок.ТекстЗапроса);

ЗапросСхемы = СхемаЗапроса.ПакетЗапросов[0];
ОператорВыбрать = ЗапросСхемы.Операторы[0];

ВыбираемыеПоля = ОператорВыбрать.ВыбираемыеПоля;
УсловияОтбора = ОператорВыбрать.Отбор;
ИсточникОтбора = ОператорВыбрать.Источники[0];		

ПсевдонимОсновнойТаблицы = ИсточникОтбора.Источник.Псевдоним;

// добавление источников
ИсточникНовыйРегистр = ОператорВыбрать.Источники.Добавить("РегистрСведений.<Регистр_с_которым_соединяем_основную_таблицу>", 
			"<псевдоним_регистра_в_запросе>");

// по умолчанию, при добавлении источника объект СхемаЗапроса пытается сам установить связи,
// как правило, неудачно, поэтому очистим их и явно добавим связи
ИсточникНовыйРегистр.Соединения.Очистить();

// добавление связей
СоединениеНовыйРегистр = ИсточникОтбора.Соединения.Добавить(ИсточникНовыйРегистр, 
			СтрШаблон("<псевдоним_регистра_в_запросе>.<реквизит_для_связи_с_основной_таблицей> = %1.Ссылка", ПсевдонимОсновнойТаблицы));

// добавление колонок
КоличествоКолонок = ЗапросСхемы.Колонки.Количество();

ВыбираемыеПоля.Добавить("<псевдоним_регистра_в_запросе>.<добавляемая_колонка_1>");
ЗапросСхемы.Колонки[КоличествоКолонок].Псевдоним = "<псевдоним_добавляемой_колонки_1>";
КоличествоКолонок = КоличествоКолонок + 1; 

ВыбираемыеПоля.Добавить("<псевдоним_регистра_в_запросе>.<добавляемая_колонка_2>");
ЗапросСхемы.Колонки[КоличествоКолонок].Псевдоним = "<псевдоним_добавляемой_колонки_2>";
КоличествоКолонок = КоличествоКолонок + 1; 

// нужно очистить псевдонимы выражений отбора компоновки данных, иначе генерится запрос
// с псевдонимами, который приводит к ошибке исполнения.
Для каждого ВыражениеОтбора Из ОператорВыбрать.ВыраженияОтбораКомпоновкиДанных Цикл
	ВыражениеОтбора.Псевдоним = "";
КонецЦикла;

ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();		

ДинамическийСписок.ТекстЗапроса = ТекстЗапроса;

В этом случае получаемый тест запрос идентичен такому же запросу, написанному вручную или через конструктор запроса.

Надеюсь, будет полезно. Спасибо за внимание!

СхемаЗапроса СКД изменение текста запроса

См. также

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

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

10000 руб.

02.09.2020    156549    849    398    

855

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

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

15.05.2024    8084    implecs_team    6    

46

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

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

3 стартмани

05.02.2024    6747    52    obmailok    21    

79

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

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

1 стартмани

31.01.2024    3087    4    Yashazz    1    

34

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

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

2 стартмани

11.12.2023    10582    23    John_d    25    

124

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

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

05.12.2023    7700    PROSTO-1C    14    

68
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. G_106671522237067631974 19.07.21 11:02 Сейчас в теме
2. Yashazz 4788 20.07.21 19:02 Сейчас в теме
Во-первых, "расширения", если мы о выражениях СКД, появились гораздо раньше схемы запроса. Во-вторых, не хотите граблей в неожиданных местах - не юзайте эту приблуду, а работайте с нормальными текстовыми фрагментами. Это гораздо более управляемо, прозрачно, наглядно, и никаких сюрпризов. И отлаживается проще. И валится меньше, если внезапно меняется концепция.

Словом, работа зачётная и публикация хорошая, но - имхо - зря.
tvv56; Светлый ум; Sashares; zqzq; homer_; +5 1 Ответить
3. zqzq 25 21.07.21 09:34 Сейчас в теме
В старых релизах 1С (8.2) конструктор запросов тоже добавлял такие псевдонимы для расширения СКД. А схема запросов дублирует функционал конструктора запросов. Видимо, конструктор поправили, а схему запросов забыли.
7. dhurricane 21.07.21 10:33 Сейчас в теме
(3) Проверил на платформе 8.3.17.1989. Конструктор в конфигураторе также добавляет псевдонимы.
4. vano-ekt 124 21.07.21 09:39 Сейчас в теме
(2)
Это гораздо более управляемо, прозрачно, наглядно, и никаких сюрпризов.

староверы подтянулись :-D
magdeevik; DmitrySinichnikov; +2 Ответить
6. dhurricane 21.07.21 10:29 Сейчас в теме
(4) Вы не согласны с каким-либо определением? Ну так укажите с каким, разверните, пожалуйста, свой комментарий. Попробуем подискутировать. :-)
8. vano-ekt 124 21.07.21 12:39 Сейчас в теме
(6) мой комментарий не к вам обращен, настолько подискутировать не с кем?)
magdeevik; DmitrySinichnikov; +2 Ответить
9. dhurricane 21.07.21 13:05 Сейчас в теме
(8) Мне не следует Вам писать, пока Вы явно ко мне не обратитесь? Желание подискутировать является постыдным?
10. vano-ekt 124 21.07.21 13:21 Сейчас в теме
(9)
magdeevik; Neuroproton; DmitrySinichnikov; +3 Ответить
12. dhurricane 21.07.21 17:56 Сейчас в теме
(10) Ну что ж. Этот мем работает в обе стороны. Полагаю, Вы заходите в комменты к постам дабы нагадить и не более.
11. Sashares 35 21.07.21 13:31 Сейчас в теме
(2)
Это гораздо более управляемо, прозрачно, наглядно, и никаких сюрпризов.


И работает быстрее.
5. dhurricane 21.07.21 10:27 Сейчас в теме
Просто очищать псевдонимы отборов КД кажется некорректным. Более правильным будет проверять псевдоним на соответствие шаблону "Поле<Число>". Ведь среди отборов, к примеру, вместо:
{ГДЕ
	ЗадачаИсполнителя.Автор.Подразделение = &Подразделение}
может оказаться
{ГДЕ
	ЗадачаИсполнителя.Автор.Подразделение.* КАК Подразделение}
И тогда очистка псевдонимов "влоб" сломает такой отбор.
zqzq; lika_master; Yashazz; mysm; +4 Ответить
13. avp449 22.07.21 11:10 Сейчас в теме
У схемы запроса есть свойство "РежимКомпоновкиДанных". Вы пробовали его включать?

Лишние псевдонимы может и обычный конструктор запросов добавить, если открыть его не из конструктора схемы КД, а просто из модуля.
dima_gsv; +1 Ответить
14. kalyaka 1103 22.07.21 12:04 Сейчас в теме
И такая вставка приводи к ошибке времени выполнения.
Что за ошибка? Текст запроса должен остаться валидным насколько я понимаю.

В текст запроса добавляются автоматические созданные псевдонимы "Поле2", "Поле4" и т.д.
Вы имели в виду, что в настройки отбора динамического списка добавляются данные поля? И вам они не нужны после правки?

нужно очистить псевдонимы выражений отбора компоновки данных, иначе генерится запрос
Очистка псевдонимов полей условий отбора приведет к генерации дефолтных значений типа Поле4, Поле5 и т.д. Смысл их очищать наверно есть только если вы хотите некоторые из них переопределить по иному. Т.е. у вас возникает конфликт псевдонимов в отборе?
Оставьте свое сообщение