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

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

Как сделать запрос в 1С: пошаговое руководство

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

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

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

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

Что нужно знать перед написанием запроса

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

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

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

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

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

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

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

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

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

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

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

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Товар,

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

|ИЗ

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

|ГДЕ

| Номенклатура.Родитель = &Группа

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

Запрос.УстановитьПараметр("Группа", ГруппаТоваров);

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

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

Сообщить(Выборка.Артикул + " — " + Выборка.Товар);

КонецЦикла;

Обратите внимание на детали. Псевдоним таблицы (КАК Номенклатура) обязателен для читаемости и обращения к полям. Параметр &Группа объявляется прямо в тексте, а значение передается через УстановитьПараметр() до выполнения. Проверка НЕ ПометкаУдаления — стандартная практика, чтобы не выбирать удаленные объекты.

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

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

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

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

Пример запроса остатков по складу:

"ВЫБРАТЬ

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

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

|ИЗ

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

|ГДЕ

| Остатки.КоличествоОстаток > 0";

Для регистра сведений с периодичностью используйте СрезПоследних(&Период, Условие) или СрезПервых — например, чтобы получить актуальную цену товара на дату документа.

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

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

Типовой процесс отладки: скопируйте текст запроса из модуля в консоль, заполните параметры в специальной таблице (тип определяется автоматически или задается вручную), выполните и изучите результат в табличном виде. Если запрос в модуле работает не так, сравните значения параметров — в 9 случаях из 10 проблема в пустом параметре или параметре не того типа.

Консоль незаменима для проверки соединений: видно, где строки задвоились из-за связи «один ко многим» или пропали из-за внутреннего соединения вместо левого.

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

Пакетные запросы и временные таблицы

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

Временные таблицы живут в менеджере временных таблиц (Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц) и доступны всем запросам пакета. Это снижает нагрузку: платформа не пересчитывает одни и те же данные в каждом соединении.

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

Типичные ошибки
01
Отбор по измерениям виртуальной таблицы в секции ГДЕ вместо параметров — запрос работает в разы медленнее на больших регистрах
02
Соединение с табличной частью документа без отбора по ссылке — читается вся табличная часть всех документов
03
Получение поля через точку от ссылки (Товар.Наименование) в списке полей — платформа делает скрытые соединения; лучше явно соединиться со справочником
04
Забытый УстановитьПараметр — запрос либо падает с ошибкой, либо возвращает пустой результат без объяснений
05
Использование ВЫБРАТЬ * или лишних полей — лишний трафик и память, особенно в циклах

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

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

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

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

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

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

Совпадает с ожидаемым числом объектов по отбору

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

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

Суммы по числовым полям
Норма

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

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

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

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

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

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

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

Пустые параметры
Норма

Запрос с незаполненным параметром ведет себя предсказуемо

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

Падает с ошибкой или возвращает всю таблицу без отбора

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

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

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

Можно ли выполнить запрос без прав на все объекты?

Да, для этого есть ключевое слово РАЗРЕШЕННЫЕ в начале запроса: будут выбраны только те записи, на чтение которых у пользователя есть права. Без РАЗРЕШЕННЫЕ запрос при отсутствии прав упадет с ошибкой. Учтите, что РАЗРЕШЕННЫЕ добавляет проверки и замедляет выполнение.

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

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

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

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

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

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

Где лучше писать запросы для отчетов?

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

Итог

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

Запрос в 1С строится по схеме: объект Запрос → текст с источником и параметрами → УстановитьПараметр → Выполнить → обход результата. Отборы по виртуальным таблицам задавайте в их параметрах, пользовательские данные передавайте только через параметры, отлаживайте текст в консоли запросов, а результат проверяйте на дубли и сверкой сумм с типовым отчетом.