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