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

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

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

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

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

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

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

Что такое запрос и зачем он нужен в 1С

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

Альтернатива запросу — обход объектов встроенным языком через методы вроде Выбрать(). Такой подход работает, но почти всегда медленнее: платформа загружает каждый объект целиком, тогда как запрос забирает только нужные поля и выполняет фильтрацию на стороне сервера базы данных. На больших объёмах разница в скорости кратная.

Типичные задачи, которые решаются запросами: получение остатков и оборотов по регистрам, подбор документов по условиям, поиск дублей в справочниках, построение произвольных отчётов, наполнение динамических списков на формах. Если задача начинается со слов «выбрать все…», «показать только те…», «сгруппировать по…» — это задача для запроса.

Из чего состоит запрос: основные секции

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

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

Значения для отборов передаются через параметры со знаком амперсанда: ГДЕ Дата МЕЖДУ &НачалоПериода И &КонецПериода. Параметры устанавливаются методом УстановитьПараметр() перед выполнением. Это и безопаснее, и быстрее, чем подстановка значений прямо в текст запроса.

Как выполнить простой запрос в коде
  1. 1
    Создайте объект: Запрос = Новый Запрос; и задайте свойство Запрос.Текст с текстом запроса
  2. 2
    Установите параметры: Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(ДатаНачала))
  3. 3
    Выполните: Результат = Запрос.Выполнить() и получите выборку: Выборка = Результат.Выбрать()
  4. 4
    Обойдите выборку в цикле Пока Выборка.Следующий() Цикл и обработайте поля
  5. 5
    Проверьте, что выборка не пустая и поля содержат ожидаемые значения

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

Синтаксис намеренно сделан похожим на SQL, чтобы снизить порог входа, но это не SQL. Запрос пишется к объектам конфигурации — Справочник.Номенклатура, Документ.РеализацияТоваровУслуг, РегистрНакопления.ТоварыНаСкладах.Остатки, — а платформа сама переводит его в запросы к MS SQL Server, PostgreSQL, Oracle или файловой базе. Один и тот же текст работает на любой поддерживаемой СУБД без изменений.

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

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

Как написать запрос: конструктор и ручное написание

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

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

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

Типичные ошибки и проблемы производительности

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

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

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

Типичные ошибки
01
Запрос в цикле — сотни обращений к базе вместо одного; заменяется одним запросом с соединением или параметром-таблицей
02
Условия на виртуальную таблицу в секции ГДЕ вместо параметров — платформа читает весь регистр целиком
03
Соединение таблиц без псевдонимов и с неоднозначными полями — ошибки выполнения и нечитаемый текст
04
Подстановка значений конкатенацией строк вместо параметров — риск ошибок синтаксиса и некорректной работы с типами
05
Получение через запрос полей, которые потом не используются — лишняя нагрузка на СУБД и сеть

Где запросы используются в конфигурации

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

В динамических списках форм запрос задаётся в свойстве «Произвольный запрос». Он определяет, какие строки видит пользователь в списке документов или справочника. Ограничение: для корректной работы интерактивных действий (изменение, удаление) в выборке должна быть ссылка на основной объект списка.

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

Как проверить, что запрос работает правильно

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

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

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

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

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

Совпадает с ожидаемым по данным интерфейса или штатного отчёта

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

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

Время выполнения на рабочем объёме
Норма

Доли секунды или единицы секунд для типовой выборки

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

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

Значения сумм и остатков
Норма

Сходятся с типовым отчётом по тому же регистру

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

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

Поведение при пустых параметрах
Норма

Запрос возвращает осмысленный результат или пустую выборку без ошибки

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

Ошибка выполнения или выборка всей таблицы при незаполненном параметре

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

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

Нет. Язык запросов 1С предназначен только для чтения данных. Запись выполняется через объектную модель: создание и изменение объектов документов, справочников, наборов записей регистров с последующим вызовом метода Записать(). Это гарантирует срабатывание прикладной логики и контроль прав.

Что такое пакетный запрос и когда он нужен?

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

Чем запрос отличается от схемы компоновки данных?

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

Нужно ли знать SQL, чтобы писать запросы в 1С?

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

Почему запрос работает в консоли, но выдаёт ошибку в коде?

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

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

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

Итог

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

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