Разработка и Конфигурация · 11 мин
Схема запроса в 1С: устройство, применение и практические приёмы
Что такое схема запроса в 1С, как она устроена, как получить и изменить текст запроса программно, когда использовать объект СхемаЗапроса вместо конструктора.
Схема запроса в 1С — это встроенный объект платформы, который представляет текст запроса в виде структуры данных: пакетов, операторов, источников, полей, соединений и отборов. Вместо того чтобы править запрос как обычную строку, разработчик работает с его логической моделью — добавляет поля, меняет условия, удаляет таблицы программными методами. Это особенно удобно, когда один и тот же запрос должен меняться в зависимости от настроек отчёта или прав пользователя.
Объект называется СхемаЗапроса. Он появился в платформе 8.3.5 и с тех пор стал стандартным инструментом для динамической модификации запросов. Схему можно создать «с нуля», загрузить в неё готовый текст запроса методом УстановитьТекстЗапроса(), а затем получить обратно изменённый текст через ПолучитьТекстЗапроса().
Важно понимать разницу между схемой запроса и схемой компоновки данных (СКД). СКД — это механизм построения отчётов целиком, а схема запроса отвечает только за текст запроса: его можно использовать и внутри СКД, и в обычном программном коде, и в консоли запросов.
Из чего состоит схема запроса
Схема запроса имеет иерархическую структуру, которая повторяет логику языка запросов 1С. На верхнем уровне находится коллекция ПакетЗапросов — каждый пакет соответствует одному запросу в пакетном запросе. Пакет бывает двух типов: обычный запрос выборки (ЗапросВыбораСхемыЗапроса) и запрос уничтожения временной таблицы (ЗапросУничтоженияТаблицыСхемыЗапроса).
Внутри запроса выборки находятся операторы (Операторы) — каждый оператор соответствует одному SELECT, объединённому через ОБЪЕДИНИТЬ. В операторе доступны коллекции:
ВыбираемыеПоля— поля выборки, включая выражения и псевдонимы;Источники— таблицы запроса и соединения между ними;Отборы— условия WHERE в виде строк выражений;Группировка,Порядок,Итоги— соответствующие секции запроса;Параметры— описание параметров запроса.
Каждый источник содержит информацию об имени таблицы, псевдониме и соединениях с другими источниками. Поля источника доступны через Источник.ДоступныеПоля, что позволяет проверить существование поля до его добавления в выборку.
Как загрузить и изменить существующий запрос
Самый частый сценарий — взять готовый запрос из макета или модуля и доработать его под текущие условия. Порядок действий простой: создать объект, установить текст, внести изменения, получить текст обратно.
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса);
ЗапросВыбора = СхемаЗапроса.ПакетЗапросов[0];
Оператор = ЗапросВыбора.Операторы[0];
// Добавляем поле в выборку
Оператор.ВыбираемыеПоля.Добавить("Продажи.СуммаОборот");
// Добавляем отбор
Оператор.Отборы.Добавить("Продажи.Организация = &Организация");
НовыйТекст = СхемаЗапроса.ПолучитьТекстЗапроса();
Полученный текст передаётся в свойство Текст объекта Запрос, после чего запрос выполняется обычным способом с установкой параметров. При добавлении отбора через схему параметр &Организация автоматически появляется в описании параметров схемы, но его значение нужно установить в объекте запроса вручную.
Обратите внимание: индексация коллекций в схеме запроса начинается с нуля, как и во всех коллекциях встроенного языка. Обращение ПакетЗапросов[0] возвращает первый запрос пакета.
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса);
Оператор = СхемаЗапроса.ПакетЗапросов[0].Операторы[0];
Оператор.Отборы.Добавить("Контрагент = &Контрагент");
Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();Создание запроса с нуля через схему
Схема позволяет построить запрос полностью программно, без исходного текста. Для этого создаётся пакет, в него добавляется оператор, в оператор — источник, а затем выбираемые поля и условия.
СхемаЗапроса = Новый СхемаЗапроса;
Пакет = СхемаЗапроса.ПакетЗапросов[0];
Оператор = Пакет.Операторы[0];
Источник = Оператор.Источники.Добавить("Справочник.Номенклатура", "Номенклатура");
Оператор.ВыбираемыеПоля.Добавить("Номенклатура.Ссылка");
Оператор.ВыбираемыеПоля.Добавить("Номенклатура.Наименование");
Такой подход оправдан, когда структура запроса заранее неизвестна: например, пользователь сам выбирает, какие реквизиты выводить в отчёт. В остальных случаях проще хранить базовый текст запроса в макете и править его через схему — так код остаётся читаемым, а запрос можно проверить конструктором.
При создании источника вторым параметром указывается псевдоним таблицы. Если псевдоним не задан, платформа сформирует его автоматически, что усложняет последующие обращения к полям.
Где схема запроса применяется на практике
Динамические списки
В формах списков с произвольным запросом схема позволяет добавить отборы и поля без переписывания основного текста. Например, в зависимости от роли пользователя к запросу динамического списка добавляется условие на доступные склады или организации.
Отчёты на СКД
В событии ПриКомпоновкеРезультата можно получить текст запроса из схемы компоновки данных, изменить его через СхемаЗапроса и вернуть обратно. Это стандартный приём для подстановки таблицы значений вместо реальной таблицы или для отсечения лишних данных по настройкам пользователя.
Универсальные обработки и консоли
Консоли запросов и инструменты разработчика используют схему для анализа текста: построения дерева запроса, списка параметров, быстрого перехода к описанию полей. Если вы пишете собственный инструмент анализа запросов, схема — единственный штатный способ разобрать текст на составляющие без собственного парсера.
- 1Создайте объект: СхемаЗапроса = Новый СхемаЗапроса
- 2Загрузите текст методом УстановитьТекстЗапроса() или постройте структуру с нуля
- 3Найдите нужный пакет и оператор по индексу или по таблице-приёмнику
- 4Добавьте или удалите поля, отборы, соединения через коллекции оператора
- 5Получите итоговый текст методом ПолучитьТекстЗапроса()
- 6Присвойте текст объекту Запрос и установите все параметры
- 7Выполните запрос и проверьте результат на тестовых данных
Ограничения и подводные камни
Схема запроса поддерживает не все конструкции языка запросов. Ряд выражений — например, некоторые сложные конструкции ВЫБОР, вложенные таблицы в определённых позициях, специфические хинты — может не отображаться в модели или теряться при повторном получении текста. Поэтому после модификации всегда сверяйте итоговый текст с ожидаемым.
Вторая типичная проблема — работа с пакетными запросами. Если исходный текст содержит несколько запросов (помещение во временные таблицы, выборка, уничтожение), нужно явно обращаться к нужному пакету по индексу. Изменение нулевого пакета, когда результат формируется в третьем, — частая причина «неработающего» кода.
Третий момент — отборы хранятся как строки выражений. Платформа не проверяет их синтаксис при добавлении, поэтому опечатка в имени поля обнаружится только при выполнении запроса. Для составных условий используйте скобки и соединяйте выражения операторами И/ИЛИ вручную в строке отбора.
Когда схема запроса не нужна
Если запрос статичен и меняется только набор параметров, достаточно обычного объекта Запрос с текстом в макете или модуле. Схема добавляет лишний слой кода без практической выгоды.
Если требуется интерактивная настройка отбора пользователем, правильнее использовать СКД или настройки динамического списка — они решают задачу декларативно. Схема запроса оправдана там, где структуру запроса нужно менять алгоритмически: добавлять соединения, менять источники, вырезать секции по условиям безопасности.
Как выбрать подход
Как проверить результат работы со схемой
Простейшая проверка — вывести итоговый текст запроса через Сообщить() или в журнал регистрации и выполнить его в консоли запросов с теми же параметрами. Совпадение результата с ожиданиями подтверждает корректность модификации.
Для регламентных отчётов полезно сравнить результат до и после изменения на одних и тех же тестовых данных: количество строк, итоговые суммы и состав колонок должны меняться строго в соответствии с внесённой правкой.
Как проверить результат
Содержит все добавленные поля и отборы, синтаксис читаем
Потеряны секции исходного запроса или появились дубли полей
Запрос выполняется без ошибок, параметры заполнены
Ошибка «Поле не найдено» или «Параметр не установлен»
Строки и итоги соответствуют логике добавленных условий
Отбор не применился — вероятно, изменён не тот пакет запроса
Частые вопросы о схеме запроса
Чем схема запроса отличается от схемы компоновки данных?
Схема запроса работает только с текстом запроса: полями, источниками, отборами. Схема компоновки данных — это механизм построения отчёта целиком: наборы данных, связи, ресурсы, настройки, макеты. Внутри СКД запрос набора данных можно редактировать через СхемаЗапроса.
Можно ли с помощью схемы запроса выполнить запрос?
Нет. Схема только хранит и изменяет структуру запроса. Для выполнения нужно получить текст методом ПолучитьТекстЗапроса(), присвоить его объекту Запрос, установить параметры и вызвать Выполнить().
Как узнать, какие параметры требуются запросу после изменений?
Используйте метод НайтиПараметры() объекта Запрос после присвоения текста — он вернёт описание всех параметров, встречающихся в тексте. Также параметры видны в коллекции Параметры самой схемы запроса.
Сохраняются ли комментарии и форматирование исходного текста?
Нет. Метод ПолучитьТекстЗапроса() генерирует текст заново по модели, поэтому исходное форматирование и комментарии теряются. Если читаемость текста критична, храните эталонную версию отдельно в макете.
Работает ли схема запроса с временными таблицами?
Да. Каждый запрос пакета, помещающий результат во временную таблицу, доступен как отдельный элемент ПакетЗапросов со свойством ТаблицаДляПомещения. Запросы уничтожения временных таблиц представлены типом ЗапросУничтоженияТаблицыСхемыЗапроса.
Что делать, если схема не распознаёт конструкцию моего запроса?
Проверьте, не используется ли редкая конструкция языка запросов. Практический обходной путь: разделить запрос на части — править через схему только поддерживаемую часть, а специфические секции добавлять в текст отдельно. Обязательно сравнивайте итоговый текст с исходным.
Что важно запомнить
Схема запроса (объект СхемаЗапроса) представляет текст запроса в виде редактируемой структуры и позволяет программно менять поля, источники и отборы. Она не выполняет запрос и не проверяет выражения — итоговый текст всегда проверяйте в консоли. Применяйте схему там, где структура запроса меняется алгоритмически; для статичных запросов достаточно обычного объекта Запрос.