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