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

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; 

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

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

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

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

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

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

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

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

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

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

16500 руб.

02.09.2020    262597    1462    421    

1171

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

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

вчера в 09:00    837    sapervodichka    34    

33

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

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

29.01.2026    7256    375    shapa_pro    27    

69

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

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

29.10.2025    20988    ovetgana    112    

115

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

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

01.07.2025    12004    krasnoshchekovpavel    7    

68

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

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

10.04.2025    11637    Neti    0    

42

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

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

27.02.2025    17185    ovetgana    50    

93

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

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

24.12.2024    14935    Akcium    17    

47
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. G_106671522237067631974 19.07.21 11:02 Сейчас в теме
Спасибо за статью!
2. Yashazz 4924 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 146 21.07.21 09:39 Сейчас в теме
(2)
Это гораздо более управляемо, прозрачно, наглядно, и никаких сюрпризов.

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


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

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

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

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