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

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; 

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

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

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

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

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

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

См. также

SALE! 20%

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

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

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

13000 10400 руб.

02.09.2020    122167    670    389    

714

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

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

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

3 стартмани

05.02.2024    4041    25    obmailok    17    

63

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

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

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

1 стартмани

31.01.2024    2000    2    Yashazz    0    

29

СКД на JavaScript в 1С

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

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

2 стартмани

11.12.2023    8160    20    John_d    25    

123

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

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

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

05.12.2023    4656    PROSTO-1C    13    

61

Модель СКД

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

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

1 стартмани

15.11.2023    5806    15    kalyaka    5    

86

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

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

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

18.09.2023    6703    accounting_cons    5    

29

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

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

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

01.09.2023    4520    KVIKS    15    

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

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

староверы подтянулись :-D
magdeevik; DmitrySinichnikov; +2 Ответить
6. dhurricane 21.07.21 10:29 Сейчас в теме
(4) Вы не согласны с каким-либо определением? Ну так укажите с каким, разверните, пожалуйста, свой комментарий. Попробуем подискутировать. :-)
8. vano-ekt 123 21.07.21 12:39 Сейчас в теме
(6) мой комментарий не к вам обращен, настолько подискутировать не с кем?)
magdeevik; DmitrySinichnikov; +2 Ответить
9. dhurricane 21.07.21 13:05 Сейчас в теме
(8) Мне не следует Вам писать, пока Вы явно ко мне не обратитесь? Желание подискутировать является постыдным?
10. vano-ekt 123 21.07.21 13:21 Сейчас в теме
(9)
magdeevik; Neuroproton; DmitrySinichnikov; +3 Ответить
12. dhurricane 21.07.21 17:56 Сейчас в теме
(10) Ну что ж. Этот мем работает в обе стороны. Полагаю, Вы заходите в комменты к постам дабы нагадить и не более.
11. Sashares 34 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 1053 22.07.21 12:04 Сейчас в теме
И такая вставка приводи к ошибке времени выполнения.
Что за ошибка? Текст запроса должен остаться валидным насколько я понимаю.

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

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