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

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

Что значит запрос в 1С и как читать его текст

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

Фраза «что значит в запросе» обычно возникает у тех, кто впервые открывает модуль 1С и видит текст, начинающийся со слов «ВЫБРАТЬ … ИЗ … ГДЕ». Это язык запросов 1С — встроенный способ обратиться к данным информационной базы: справочникам, документам, регистрам. Запрос не изменяет данные, а только читает их и возвращает таблицу результата, которую программа дальше обрабатывает.

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

Ниже разобрано, что означают основные конструкции языка запросов 1С, как пошагово читать чужой запрос, какие ошибки встречаются чаще всего и как проверить, что запрос возвращает именно те данные, которые нужны.

Что такое запрос в 1С и где он встречается

Запрос — это объект встроенного языка 1С, который содержит текст на языке запросов и набор параметров. Текст описывает выборку, а метод Выполнить() возвращает результат в виде таблицы значений или выборки, которую можно обойти в цикле.

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

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

Базовая структура: ВЫБРАТЬ, ИЗ, ГДЕ

Минимальный запрос состоит из двух обязательных секций. ВЫБРАТЬ перечисляет поля, которые нужно получить, ИЗ указывает таблицу-источник: справочник, документ или регистр. Например: ВЫБРАТЬ Ссылка, Наименование ИЗ Справочник.Номенклатура — вернёт список всех элементов справочника.

Секция ГДЕ фильтрует строки. Условия записываются через сравнения и логические операторы И, ИЛИ, НЕ. Для подстановки значений используются параметры со знаком «&»: ГДЕ Поставщик = &Поставщик. Перед выполнением параметру присваивают значение методом УстановитьПараметр — так безопаснее, чем подстановка строки в текст, и запрос можно кэшировать.

Псевдонимы через КАК делают результат читаемым: ВЫБРАТЬ Сумма КАК СуммаДокумента. Если поле не переименовать, в результате оно сохранит исходное имя, что не всегда удобно при обращении из кода.

bsl
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка, Сумма КАК СуммаДокумента
|ИЗ Документ.РеализацияТоваровУслуг
|ГДЕ Дата МЕЖДУ &Начало И &Конец";
Запрос.УстановитьПараметр("Начало", НачалоМесяца(ТекущаяДата()));
Запрос.УстановитьПараметр("Конец", КонецМесяца(ТекущаяДата()));
Результат = Запрос.Выполнить().Выгрузить();

Что означают основные ключевые слова

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

КонструкцияЧто означаетКогда применяется
СОЕДИНЕНИЕ (ЛЕВОЕ, ВНУТРЕННЕЕ)Объединение двух таблиц по условиюНужны данные из справочника и регистра одновременно
СГРУППИРОВАТЬ ПОСворачивание строк с агрегатами СУММА, КОЛИЧЕСТВОИтоги по контрагенту, периоду, складу
УПОРЯДОЧИТЬ ПОСортировка результатаВывод по дате, алфавиту, убыванию суммы
ИТОГИ ПОИерархические итоги при обходе выборкиДерево «контрагент — документы»
РАЗЛИЧНЫЕУбрать дубли строкНужен список уникальных значений
ПЕРВЫЕ NОграничение количества строкТоп-10 клиентов, проверка выборки
ПОМЕСТИТЬСохранить промежуточный результат во временную таблицуСложные запросы из нескольких этапов
ВЫБОР КОГДА … ТОГДА … КОНЕЦУсловное значение поля (аналог if)Признаки, статусы, расчётные колонки

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

Как читать чужой запрос по шагам

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

Дальше двигайтесь от источников к результату: какие физические таблицы и виртуальные таблицы используются, какие отборы наложены, какие соединения связывают данные. Обращайте внимание на тип соединения: ВНУТРЕННЕЕ отсекает несовпадающие строки, ЛЕВОЕ сохраняет все строки левой таблицы.

Порядок разбора запроса
  1. 1
    Найдите все секции ПОМЕСТИТЬ и выпишите имена временных таблиц
  2. 2
    Определите финальную выборку пакета и её источники
  3. 3
    Проверьте параметры виртуальных таблиц и секцию ГДЕ — что именно отфильтровано
  4. 4
    Посмотрите типы соединений и условия связи таблиц
  5. 5
    Проверьте группировки и агрегатные функции — на каком уровне считаются итоги
  6. 6
    Выполните запрос в консоли с реальными параметрами и сверьте результат

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

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

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

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

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

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

Совпадает с ожидаемым по отбору (можно сверить со списком в базе)

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

Строк нет вовсе или их явно больше из-за дублирования при соединении

Суммы по группировке
Норма

Сходятся с типовым отчётом по тем же данным

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

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

Значения параметров
Норма

Все параметры заполнены, типы соответствуют полям

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

Параметр не установлен — платформа выдаёт ошибку или пустой результат

Типичные ошибки и ограничения

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

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

Третья типичная проблема — сравнение полей разных типов или сравнение с NULL. Любое сравнение с NULL даёт ложь, поэтому для полей из левого соединения используют ЕСТЬNULL(Поле, ЗначениеПоУмолчанию) или условие ПОЛЕ ЕСТЬ NULL.

Типичные ошибки
01
Соединение без полного условия — строки перемножаются, суммы задваиваются
02
Виртуальная таблица без периода и отборов — запрос выполняется минутами
03
Сравнение с NULL напрямую — условие никогда не срабатывает
04
Фильтр в ГДЕ после ЛЕВОГО СОЕДИНЕНИЯ — теряются строки левой таблицы
05
Подстановка строковых значений прямо в текст запроса — риск ошибок и проблем с кавычками, используйте параметры

Когда запрос не нужен: альтернативы

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

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

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

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

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

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

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

Язык запросов 1С похож на SQL синтаксически, но работает с объектами метаданных (справочниками, документами, регистрами), а не с физическими таблицами СУБД. Платформа сама транслирует текст в SQL конкретной базы. Прямой доступ к данным средствами SQL в обход платформы не поддерживается и может нарушить целостность базы.

Можно ли изменить данные через запрос?

Нет, язык запросов только читает данные. Для записи используются методы объектов: Записать() у документа или элемента справочника, наборы записей регистров. Это принципиальное ограничение платформы.

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

Чаще всего дело в параметрах: в коде параметр не установлен, имеет другой тип или другое значение (например, дата без времени против даты с временем). Проверьте значения параметров непосредственно перед Выполнить() через отладчик.

Что значит амперсанд (&) в тексте запроса?

Это обозначение параметра. Имя после & должно совпадать с именем, переданным в УстановитьПараметр. Параметры позволяют переиспользовать один текст запроса с разными значениями и защищают от ошибок при подстановке строк.

Что такое пакетный запрос?

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

Как ускорить медленный запрос?

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

Итог

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

Запрос в 1С — это чтение данных по описанию: ВЫБРАТЬ поля ИЗ таблицы ГДЕ условия. Ключевые навыки — понимать секции, виртуальные таблицы и типы соединений, задавать отборы через параметры и проверять результат в консоли запросов на реальных данных.