К статье
Практический материал

Разработка и Конфигурация · 12 мин

Схемы запросов в 1С: устройство, применение и практика работы

Что такое схема запроса в 1С, как устроен конструктор, какие пакеты и временные таблицы используются, типичные ошибки и способы проверки результата.

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

Запросы — основной способ чтения данных в 1С. Через них строятся отчёты, динамические списки, обработки, обмены данными и проверки перед записью документов. Понимание того, как устроена схема запроса, позволяет не просто копировать готовые тексты, а осознанно проектировать выборки: убирать лишние соединения, корректно работать с виртуальными таблицами, использовать пакеты и временные таблицы там, где они действительно нужны.

Материал рассчитан на разработчиков и внедренцев, которые уже знакомы с конфигуратором и хотят системно разобраться в устройстве запросов: от простого конструктора до программной модификации схемы и диагностики медленных выборок.

Что входит в схему запроса

Любой запрос в 1С, независимо от способа создания, состоит из однотипных логических блоков. Источники данных — физические таблицы (справочники, документы, регистры) и виртуальные таблицы (остатки, обороты, срезы). Связи описывают, как соединяются источники: левое, внутреннее, полное соединение. Поля определяют, какие колонки попадут в результат, включая вычисляемые выражения и агрегатные функции.

Далее идут блоки ограничения и формирования результата: условия (отбор по значениям и параметрам), группировки с итогами, упорядочивание, а также итоги по иерархии. Отдельный уровень — пакет запросов: несколько операторов в одном тексте, разделённых точкой с запятой, где промежуточные результаты помещаются во временные таблицы и используются дальше.

Способы построения: конструктор, текст и объект СхемаЗапроса

Конструктор запроса в конфигураторе — визуальный инструмент, который открывается из модуля или при создании запроса в консоли. Он позволяет мышью выбрать таблицы, перетащить поля, задать связи и условия, а затем платформа сама генерирует корректный текст. Конструктор удобен для изучения синтаксиса и быстрой сборки типовых выборок, но не показывает всех тонкостей: например, сложные выражения и вложенные запросы в нём редактировать менее наглядно.

Текстовый вариант — написание запроса вручную на языке запросов 1С. Это основной рабочий способ для опытных разработчиков: текст легче версионировать, ревьюить и отлаживать. Синтаксис близок к SQL, но имеет свои ключевые слова и особенности: ВЫБРАТЬ, ИЗ, ЛЕВОЕ СОЕДИНЕНИЕ, ГДЕ, СГРУППИРОВАТЬ ПО, ИТОГИ, ПОМЕСТИТЬ.

Третий путь — программный объект СхемаЗапроса. Он позволяет загрузить готовый текст запроса, изменить его структуру из кода (добавить поле, заменить условие, убрать соединение) и получить обратно модифицированный текст. Это стандартный приём в универсальных отчётах и обработках, где состав полей заранее неизвестен и формируется настройками пользователя.

bsl
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(ТекстЗапроса);
Пакет = СхемаЗапроса.ПакетЗапросов[0];
Оператор = Пакет.Операторы[0];
Оператор.ВыбираемыеПоля.Добавить("Номенклатура.Код");
НовыйТекст = СхемаЗапроса.ПолучитьТекстЗапроса();

Пакеты запросов и временные таблицы

Пакетный запрос — это несколько операторов в одном тексте, выполняемых последовательно. Типовой сценарий: первый оператор собирает отфильтрованные данные и помещает их во временную таблицу через конструкцию ПОМЕСТИТЬ ВТ_Товары, а второй соединяет эту временную таблицу с остатками или ценами. Такой подход уменьшает объём обрабатываемых данных на каждом шаге и часто заметно ускоряет выполнение.

Временные таблицы живут в пределах менеджера временных таблиц. Если запрос выполняется через объект Запрос с установленным свойством МенеджерВременныхТаблиц, таблицы доступны между несколькими вызовами Выполнить() — это позволяет строить сложные многошаговые алгоритмы. После использования временную таблицу стоит уничтожать оператором УНИЧТОЖИТЬ, чтобы не держать лишние данные в памяти сервера.

Когда пакет не нужен: если выборка простая и укладывается в один оператор, дробление на временные таблицы только усложнит отладку. Признак того, что пакет оправдан, — повторное использование одной и той же отфильтрованной выборки в нескольких соединениях или необходимость сначала материализовать тяжёлый расчёт.

Как собрать пакетный запрос
  1. 1
    Определите минимальный набор данных, который нужен на всех последующих шагах, и отфильтруйте его первым оператором с ПОМЕСТИТЬ
  2. 2
    Во втором операторе соедините временную таблицу с остальными источниками, указывая параметры виртуальных таблиц
  3. 3
    Добавьте финальный оператор выборки с упорядочиванием и при необходимости УНИЧТОЖИТЬ для временных таблиц
  4. 4
    Выполните запрос в консоли и проверьте количество строк и значения на контрольном примере

Параметры, отборы и виртуальные таблицы

Параметры запроса передаются через символ & и метод УстановитьПараметр(). Важное правило: отборы по периоду, организации, складу и другим измерениям виртуальных таблиц нужно задавать в параметрах самой виртуальной таблицы (в круглых скобках после её имени), а не в секции ГДЕ. Отбор в ГДЕ сначала заставит платформу рассчитать виртуальную таблицу целиком, а потом отбросить лишние строки — на больших базах это критично для производительности.

Условия в секции ГДЕ уместны для отборов по полям, которых нет среди параметров виртуальной таблицы, и для сложных логических выражений. Отдельный случай — отбор по списку значений: параметру присваивается массив или список, а в тексте используется конструкция В (&Список) или В ИЕРАРХИИ (&Группа) для отбора по папке справочника с учётом вложенности.

Проверка результата и диагностика

Проверять запрос нужно не только на то, что он выполняется без ошибок, но и на корректность данных. Базовый приём — сверка с эталоном: взять один документ или один товар с известными значениями и убедиться, что запрос возвращает именно их. Второй приём — контроль количества строк: резкое увеличение числа строк после добавления соединения почти всегда означает дублирование из-за связи «один ко многим» без нужной агрегации.

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

Контрольные точки

Как проверить результат запроса

Количество строк результата
Норма

Совпадает с ожидаемым числом объектов или осознанно больше из-за детализации

Тревожный признак

Строки задублированы после добавления соединения — связь построена по неуникальному полю

Значения сумм и остатков
Норма

Совпадают со стандартным отчётом по той же выборке

Тревожный признак

Суммы завышены кратно — вероятно, соединение с таблицей движений без группировки

Время выполнения
Норма

Запрос отрабатывает за приемлемое время на объёме, близком к рабочему

Тревожный признак

Резкий рост времени при увеличении периода — не заданы параметры виртуальной таблицы

Типичные ошибки при работе со схемами запросов

Большинство проблем с запросами в 1С повторяются от проекта к проекту. Их полезно знать заранее, чтобы распознавать по симптомам, а не искать часами.

Типичные ошибки
01
Отбор в ГДЕ вместо параметров виртуальной таблицы — запрос рассчитывает остатки по всей базе и работает медленно
02
Левое соединение с последующим условием ГДЕ по правой таблице — условие фактически превращает соединение во внутреннее, строки теряются
03
Обращение к реквизиту через точку (разыменование) в списке полей без необходимости — порождает скрытые соединения и замедляет запрос
04
Использование ПЕРВЫЕ без упорядочивания — состав отобранных строк непредсказуем
05
Забытые временные таблицы без УНИЧТОЖИТЬ в длительных обработках — рост потребления памяти на сервере

Отдельно стоит упомянуть работу с итогами. Конструкция ИТОГИ ПО удобна для построения деревьев в отчётах, но требует обхода результата методом Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам). Попытка обойти такой результат линейно приводит к неверной интерпретации данных — строки итогов смешиваются со строками детализации.

Когда запрос не подходит и что использовать вместо

Запрос — инструмент чтения и агрегации, но не универсальное решение. Если нужно изменить данные в цикле с проверками и бизнес-логикой, правильнее получить выборку запросом, а изменения выполнять объектными методами через ПолучитьОбъект() — так сохраняются обработчики событий и контроль целостности. Прямая запись через запросы в 1С не предусмотрена, и обход этого принципа через COM или внешние инструменты разрушает логику учёта.

Для сложных отчётов с настраиваемыми отборами и группировками вместо ручной сборки текста стоит использовать систему компоновки данных (СКД): она сама строит итоговую схему запроса на основе настроек пользователя. Для простых динамических списков в формах достаточно стандартного произвольного запроса списка с основной таблицей — платформа сама оптимизирует выборку видимых строк.

Маршрут решения

Как выбрать подход

Нужна разовая выборка для обработки или проверкиНапишите текст запроса вручную и отладьте его в консоли запросов
Состав полей и отборов задаёт пользователь в настройкахИспользуйте СКД или программную модификацию через объект СхемаЗапроса
Одна и та же отфильтрованная выборка нужна в нескольких соединенияхОформите пакетный запрос с временной таблицей через ПОМЕСТИТЬ
Нужно изменить данные, а не прочитатьИспользуйте объектные методы записи, а не попытки обойти запись запросом

FAQ: частые вопросы о схемах запросов

Чем схема запроса отличается от текста запроса?

Текст запроса — это строка на языке запросов. Схема запроса — его объектное представление: платформа разбирает текст в структуру из пакетов, операторов, источников и полей, которую можно менять программно. Связь двусторонняя: из текста получают схему методом УстановитьТекстЗапроса, обратно — ПолучитьТекстЗапроса.

Можно ли редактировать запрос СКД через объект СхемаЗапроса?

Да, это распространённый приём: текст запроса из набора данных СКД загружается в СхемаЗапроса, модифицируется (например, добавляется поле или условие) и возвращается обратно. Важно сохранять совместимость полей с настройками компоновки — удалённое поле, используемое в настройках, вызовет ошибку.

Почему запрос в консоли работает быстро, а в отчёте медленно?

Частые причины: в отчёте параметры виртуальных таблиц заполняются из настроек иначе, чем в консоли; добавляются отборы СКД, которые накладываются на уже рассчитанные данные; объём данных в рабочей базе больше тестовой. Сравните итоговый текст запроса и значения параметров в обоих случаях.

Когда нужно использовать УНИЧТОЖИТЬ для временной таблицы?

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

Что делает конструкция РАЗЛИЧНЫЕ и когда она вредна?

РАЗЛИЧНЫЕ убирает дубли строк из результата. Она полезна, когда дубли возникают законно — например, при соединении с табличной частью. Но если РАЗЛИЧНЫЕ используется, чтобы скрыть ошибку в связях, запрос работает медленнее, а первопричина остаётся. Сначала проверьте, почему появляются дубли.

Как научиться писать запросы, если знаю только конструктор?

Практичный путь: собирайте запрос в конструкторе, затем читайте сгенерированный текст и сопоставляйте элементы интерфейса с конструкциями языка. После этого начните вносить правки прямо в текст и проверять результат в консоли. Так постепенно вырабатывается навык писать запросы без конструктора.

Итог

Что важно запомнить

Схема запроса — это структура выборки: источники, связи, поля, отборы и пакеты. Собирайте её конструктором, текстом или объектом СхемаЗапроса в зависимости от задачи. Параметры виртуальных таблиц задавайте в самих таблицах, результат сверяйте с эталоном, а дубли строк и просадки скорости диагностируйте по связям и отборам.