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

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

Как составить запрос 1С: практическое руководство

Как составить запрос 1С: синтаксис языка запросов, конструктор, примеры ВЫБРАТЬ, ГДЕ, СГРУППИРОВАТЬ, виртуальные таблицы, типичные ошибки и проверка результата.

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

Чтобы составить рабочий запрос, достаточно понять четыре вещи: структуру оператора ВЫБРАТЬ, способы отбора через ГДЕ, работу с соединениями и группировками, а также особенности виртуальных таблиц регистров. Ниже разобраны все эти элементы с примерами, которые можно сразу использовать в конфигураторе или консоли запросов.

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

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

Язык запросов 1С — декларативный язык выборки данных, синтаксически близкий к SQL, но адаптированный под структуру метаданных конфигурации. Вместо физических таблиц базы данных вы обращаетесь к объектам конфигурации по их именам: Справочник.Номенклатура, Документ.РеализацияТоваровУслуг, РегистрНакопления.ТоварыНаСкладах.

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

Важное отличие от SQL: язык запросов 1С предназначен только для чтения. Операторов INSERT, UPDATE, DELETE в нём нет — изменение данных выполняется объектными средствами платформы.

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

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

ВЫБРАТЬ

Номенклатура.Ссылка,

Номенклатура.Наименование,

Номенклатура.Артикул

ИЗ

Справочник.Номенклатура КАК Номенклатура

ГДЕ

НЕ Номенклатура.ПометкаУдаления

Псевдоним после КАК (например, «Номенклатура») упрощает обращение к полям и делает текст читаемым. Поле Ссылка — это уникальный идентификатор объекта; его выбирают почти всегда, чтобы потом можно было получить сам объект.

Условие ГДЕ поддерживает сравнения (=, <>, >, <), логические операторы И, ИЛИ, НЕ, проверку В (список), ПОДОБНО для поиска по шаблону и проверку на NULL. Параметры в запрос передаются через символ «&»: ГДЕ Номенклатура.Родитель = &Группа.

Параметры задаются в коде перед выполнением запроса: Запрос.УстановитьПараметр("Группа", ГруппаСсылка). Если параметр не установлен, запрос вызовет ошибку при выполнении.

Как собрать запрос конструктором без ручного набора

Конструктор запроса — встроенный инструмент конфигуратора, который генерирует текст по выбранным таблицам и полям. Чтобы открыть его, поместите курсор в модуль, нажмите правую кнопку мыши и выберите «Конструктор запроса…». Если текст запроса уже есть, конструктор загрузит его для редактирования.

Порядок работы в конструкторе запроса
  1. 1
    Откройте модуль, поставьте курсор в место вставки запроса, вызовите «Конструктор запроса» из контекстного меню
  2. 2
    На закладке «Таблицы и поля» выберите нужную таблицу из дерева базы данных и перенесите её в список таблиц
  3. 3
    Перетащите нужные поля в список полей запроса
  4. 4
    На закладке «Условия» задайте отборы, на закладке «Объединения/Псевдонимы» проверьте имена таблиц
  5. 5
    Нажмите ОК — текст запроса появится в модуле, выполните его в консоли и проверьте результат

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

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

Соединения таблиц и вложенные запросы

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

ВЫБРАТЬ

Реализация.Номер,

Реализация.Дата,

Товары.Номенклатура,

Товары.Количество,

Товары.Сумма

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары

ПО Реализация.Ссылка = Товары.Ссылка

ГДЕ

Реализация.Проведен

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

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

Группировка, итоги и сортировка

Чтобы посчитать суммы и количества по группам, применяют СГРУППИРОВАТЬ ПО с агрегатными функциями СУММА, КОЛИЧЕСТВО, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ:

ВЫБРАТЬ

Товары.Номенклатура,

СУММА(Товары.Количество) КАК Количество,

СУММА(Товары.Сумма) КАК Сумма

ИЗ

Документ.РеализацияТоваровУслуг.Товары КАК Товары

СГРУППИРОВАТЬ ПО

Товары.Номенклатура

УПОРЯДОЧИТЬ ПО

Сумма УБЫВ

Правило группировки: в списке выборки могут быть либо поля, по которым идёт группировка, либо агрегатные функции. Если добавить «сырое» поле, не входящее в группировку, запрос вернёт ошибку.

Чтобы отфильтровать уже сгруппированные данные (например, оставить только группы с суммой больше порога), используется секция ИМЕЮЩИЕ — она работает после группировки, в отличие от ГДЕ, которая фильтрует строки до неё. Конструкция ИТОГИ ПО формирует иерархические итоги и применяется в основном при обходе результата в коде.

Виртуальные таблицы регистров и параметры

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

ВЫБРАТЬ

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

Остатки.Склад,

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

ИЗ

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

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

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

ГДЕ или параметры виртуальной таблицы

Условие в параметрах виртуальной таблицы

Платформа вычисляет итоги только по нужным измерениям — быстро и экономно. Рекомендуемый способ.

Условие в секции ГДЕ

Итоги рассчитываются по всем данным, отбор происходит после. Допустимо только на малых объёмах или когда условие нельзя выразить параметрами.

Проверка результата и типичные ошибки

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

Проверяйте не только итоговую сумму, но и количество строк: неожиданное удвоение строк почти всегда означает ошибку в соединении, а «исчезнувшие» документы — слишком жёсткое условие ГДЕ или ВНУТРЕННЕЕ соединение вместо ЛЕВОГО.

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

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

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

Совпадает с ожидаемым числом документов или позиций

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

Строк кратно больше — ошибка в соединении; меньше — лишний отбор

Суммы по регистру
Норма

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

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

Расхождения — неверный период, тип виртуальной таблицы или условие

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

Запрос отрабатывает за секунды на рабочем объёме данных

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

Выполняется минутами — условия не в параметрах виртуальной таблицы или нет отбора по периоду

Типичные ошибки при составлении запросов
01
Отбор по регистру через ГДЕ вместо параметров виртуальной таблицы — резкое падение производительности
02
ВНУТРЕННЕЕ соединение там, где нужно ЛЕВОЕ — пропадают объекты без связанных строк
03
Соединение табличных частей без условия по Ссылке — задвоение и умножение строк
04
Использование поля в выборке без группировки и без агрегатной функции — ошибка выполнения
05
Обращение к неустановленному параметру &amp;Параметр — запрос падает с ошибкой
06
Выборка без ограничения периода по большим журналам документов — долгое выполнение

Ещё одна частая проблема — сравнение с NULL. В языке запросов любое сравнение с NULL даёт ложь, поэтому проверку пишут через «ЕСТЬ NULL» или оборачивают поле функцией ЕСТЬNULL(Поле, ЗначениеПоУмолчанию).

Когда запроса недостаточно: временные таблицы и пакетные запросы

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

ВЫБРАТЬ

Реализация.Ссылка

ПОМЕСТИТЬ ДокументыЗаПериод

ИЗ

Документ.РеализацияТоваровУслуг КАК Реализация

ГДЕ

Реализация.Дата МЕЖДУ &Начало И &Конец

;

ВЫБРАТЬ

Товары.Номенклатура,

СУММА(Товары.Количество) КАК Количество

ИЗ

ДокументыЗаПериод КАК Документы

ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК Товары

ПО Документы.Ссылка = Товары.Ссылка

СГРУППИРОВАТЬ ПО

Товары.Номенклатура

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

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

Как выбрать инструмент под задачу

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

Как выбрать способ работы с запросом

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

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

Итог

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

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

Частые вопросы

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

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

Можно ли составить запрос, не зная программирования?

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

Почему запрос выполняется очень долго?

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

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

Передайте в параметр массив или список значений, а в тексте используйте конструкцию «В (&Список)»: ГДЕ Номенклатура В (&СписокНоменклатуры). Платформа сама развернёт коллекцию в набор значений сравнения.

Что делать, если запрос возвращает задвоенные строки?

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

Опасно ли выполнять запросы в рабочей базе?

Запросы только читают данные и не могут что-либо изменить или удалить. Риск другой: тяжёлый запрос без отборов может надолго загрузить сервер и замедлить работу пользователей. Поэтому тестируйте с ограничением периода и в непиковое время.