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

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

Что такое запросы в 1С:Предприятие и как с ними работать

Что такое запросы в 1С:Предприятие, как устроен язык запросов, где применяются запросы и как написать первый запрос в консоли и конфигураторе.

Запрос в 1С:Предприятие — это обращение к базе данных на специальном встроенном языке, которое выбирает, группирует и агрегирует данные из таблиц справочников, документов, регистров и других объектов конфигурации. По смыслу язык запросов 1С близок к SQL, но оперирует не физическими таблицами СУБД, а объектами метаданных: вы пишете ВЫБРАТЬ ... ИЗ Справочник.Номенклатура, а платформа сама преобразует это в обращение к реальным таблицам хранилища.

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

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

Как устроен язык запросов 1С

Язык запросов 1С декларативный: вы описываете, какие данные нужны, а платформа сама решает, как их получить. Базовая конструкция состоит из секций: ВЫБРАТЬ (какие поля), ИЗ (откуда), ГДЕ (условия отбора), СГРУППИРОВАТЬ ПО (группировка), УПОРЯДОЧИТЬ ПО (сортировка). Порядок секций фиксирован, нарушать его нельзя.

Источниками данных служат виртуальные и реальные таблицы объектов метаданных: Справочник.Номенклатура, Документ.РеализацияТоваровУслуг, РегистрНакопления.ОстаткиТоваров. У регистров есть виртуальные таблицы — Остатки, Обороты, СрезПоследних, — которые платформа рассчитывает на лету и которые сильно упрощают получение итогов.

Ключевые возможности сверх базового набора: соединения таблиц (ЛЕВОЕ СОЕДИНЕНИЕ и др.), объединения (ОБЪЕДИНИТЬ ВСЕ), агрегатные функции (СУММА, КОЛИЧЕСТВО, МАКСИМУМ), вложенные запросы, временные таблицы (ПОМЕСТИТЬ) и итоги (ИТОГИ ПО). Полный синтаксис описан в документации платформы и в синтакс-помощнике конфигуратора.

Где применяются запросы в 1С

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

Второй сценарий — программное выполнение в коде модулей: создание объекта Запрос, установка параметров, получение результата и обход выборки. Так делают проверки при проведении документов, заполнение табличных частей, обмены данными и сервисные обработки.

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

Способы получения данных

Запрос

Быстро выбирает большие объёмы, поддерживает группировки и соединения. Ограничение: только чтение, изменять данные запросом нельзя.

Объектный перебор (Выбрать)

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

СКД

Запрос плюс гибкие настройки отчёта для пользователя. Требует понимания схемы компоновки.

Как написать первый запрос: пошагово

Самый безопасный способ учиться — консоль запросов в режиме предприятия на копии базы. Консоль есть в составе стандартных инструментов разработчика (ИР) и во многих открытых публикациях; она выполняет запрос и сразу показывает таблицу результата, не трогая данные.

В конфигураторе удобнее стартовать с конструктора запроса: правый клик в модуле → «Конструктор запроса». Он позволяет мышкой выбрать таблицы, поля, связи и условия, а текст сгенерирует автоматически. Это хороший способ выучить синтаксис — смотреть, какой текст строится по вашим действиям.

Первый запрос в консоли
  1. 1
    Откройте консоль запросов в копии рабочей базы.
  2. 2
    Напишите: ВЫБРАТЬ Номенклатура.Ссылка, Номенклатура.Наименование ИЗ Справочник.Номенклатура КАК Номенклатура
  3. 3
    Добавьте отбор: ГДЕ НЕ Номенклатура.ПометкаУдаления
  4. 4
    Выполните запрос и сверьте количество строк с количеством элементов в списке справочника.
  5. 5
    Усложните: добавьте СГРУППИРОВАТЬ ПО и СУММА для агрегации, проверьте итоги по контрольным значениям.

Пример программного выполнения в модуле:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Остатки.Номенклатура КАК Номенклатура,

| Остатки.КоличествоОстаток КАК Остаток

|ИЗ

| РегистрНакопления.ОстаткиТоваров.Остатки(&Период, Склад = &Склад) КАК Остатки";

Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());

Запрос.УстановитьПараметр("Склад", Склад);

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

// обработка строки результата

КонецЦикла;

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

Соединения, группировки и временные таблицы

Соединения нужны, когда данные лежат в разных таблицах: шапка документа и остатки, номенклатура и цены. ЛЕВОЕ СОЕДИНЕНИЕ сохраняет все строки левой таблицы, подставляя NULL там, где пары не нашлось, — это стандартный способ показать «все товары, включая те, по которым нет остатков». Внутреннее соединение оставляет только совпавшие пары.

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

Группировка с агрегатными функциями заменяет программные циклы суммирования: СУММА(Количество) с СГРУППИРОВАТЬ ПО Номенклатура даст итог по каждому товару одним обращением к базе. Помните правило: все неагрегатные поля в секции ВЫБРАТЬ обязаны входить в список группировки.

Производительность запросов: что проверять

Главный враг производительности — обращение к виртуальным таблицам без параметров. Запрос к Остатки без указания периода и отбора заставляет платформу считать остатки по всей таблице движений. Всегда передавайте период и отборы в параметры виртуальной таблицы, а не фильтруйте потом в секции ГДЕ.

Второй типичный источник тормозов — соединения по неиндексированным полям и использование функций над полями в условиях (ПОДСТРОКА, ГОД в секции ГДЕ), что отключает использование индексов. Условия формулируйте так, чтобы сравнивались поля напрямую с параметрами.

Для диагностики используйте технологический журнал с событиями DBMSSQL/DBPOSTGRS, план запроса на стороне СУБД и замеры времени выполнения. Если запрос в отчёте выполняется минутами — почти всегда причина в отсутствии отборов на виртуальных таблицах или в соединении больших таблиц без предварительного сужения через временные таблицы.

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

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

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

Совпадает с количеством записей в списке объекта при тех же отборах

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

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

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

Итог по СУММА равен контрольной сумме из стандартного отчёта

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

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

Значения NULL
Норма

NULL только там, где левое соединение не нашло пару

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

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

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

Запросы в 1С только читают данные — изменить записи запросом нельзя, для этого служит объектная модель. Ещё одно ограничение: язык запросов не поддерживает произвольный SQL-синтаксис конкретной СУБД (хинты, оконные функции в общем случае), платформа сознательно ограничивает диалект ради переносимости между СУБД.

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

Типичные ошибки
01
Виртуальная таблица без параметров периода и отборов — запрос сканирует весь регистр и тормозит.
02
Подстановка значений в текст запроса конкатенацией вместо параметров — ошибки типов и риск некорректной выборки.
03
Соединение двух больших таблиц без предварительного отбора во временные таблицы — экспоненциальный рост времени выполнения.
04
Использование РАЗЛИЧНЫЕ для борьбы с дублями вместо исправления соединения — маскирует дефект и замедляет запрос.
05
Отбор по НЕ в условии соединения вместо секции ГДЕ — теряются строки левой таблицы при левом соединении.

Частые вопросы о запросах в 1С

Чем язык запросов 1С отличается от SQL?

Синтаксис похож, но операндом служат объекты метаданных, а не физические таблицы. Платформа сама транслирует запрос в диалект используемой СУБД, поэтому один и тот же запрос работает на MS SQL, PostgreSQL, Oracle и файловой базе. За переносимость заплачено ограничением: недоступны специфичные функции и хинты конкретной СУБД.

Где потренироваться писать запросы без риска?

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

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

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

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

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

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

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

Как передать список значений в параметр запроса?

Передайте массив или список значений через УстановитьПараметр и используйте условие Поле В (&Список). Платформа сама развернёт коллекцию в условие IN на стороне СУБД.

Итог

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

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