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