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

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

Как создать новый запрос в 1С

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

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

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

Где создаётся запрос и что для этого нужно

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

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

Создание запроса через конструктор

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

В окне конструктора слева отображается список доступных таблиц базы данных. Перенесите нужную таблицу в среднюю колонку, затем выберите из неё поля, которые должны попасть в выборку. На закладках «Связи», «Условия», «Группировка», «Итоги» и «Порядок» настраиваются соединения таблиц, отборы, агрегация и сортировка результата.

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

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

Написание текста запроса вручную

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

Отборы задаются в секции ГДЕ. Вместо конкретных значений в условиях почти всегда используются параметры с символом амперсанда: ГДЕ Родитель = &Родитель. Подстановка значений прямой конкатенацией строк — грубая ошибка: это ломает текст при спецсимволах и открывает путь к ошибкам исполнения.

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

Выполнение запроса в коде

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

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

Если запрос используется внутри транзакции документа и нужна блокировка считываемых данных, применяется объект БлокировкаДанных либо конструкция ДЛЯ ИЗМЕНЕНИЯ в тексте запроса. Без этого при конкурентной работе пользователей возможны конфликты блокировок.

Проверка результата и отладка

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

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

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

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

Выполнение без ошибок
Норма

Метод Выполнить() отрабатывает, исключения нет

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

Ошибка синтаксиса или «Поле не найдено» — проверьте имена таблиц и реквизитов

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

Число строк соответствует ожидаемой выборке

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

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

Дубли строк
Норма

Каждая строка выборки уникальна по смыслу

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

Строки задваиваются — причина в соединении без корректного условия связи

Типичные ошибки при создании запроса

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

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

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

Когда конструктор, а когда ручной текст

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

Для схем компоновки данных (отчёты на СКД) запрос также пишется вручную или через конструктор, но внутри конструктора схемы компоновки — там действуют свои расширения языка запросов, например выражения периодичности и характеристики.

Сравнение подходов

Конструктор запроса

Подходит для стандартных выборок и обучения; ограничение — неудобен при динамически изменяемом тексте

Ручной текст в модуле

Подходит для динамических условий и сложной логики; требует внимательности к синтаксису

Консоль запросов

Подходит для тестирования на реальных данных без изменения конфигурации; не является частью прикладного кода

Итог

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

Запрос создаётся текстом на языке запросов, чаще всего через конструктор. Параметры передаются через УстановитьПараметр, результат получают методом Выполнить с последующей выборкой или выгрузкой. Проверяйте текст в консоли запросов до переноса в рабочий код.

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

Можно ли создать запрос без конфигуратора?

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

Чем запрос отличается от таблицы значений?

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

Почему запрос возвращает пустой результат?

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

Как выбрать только первые несколько строк?

Используйте конструкцию ВЫБРАТЬ ПЕРВЫЕ N, где N — количество строк. Обязательно добавьте секцию УПОРЯДОЧИТЬ ПО, иначе платформа вернёт произвольный набор строк, который может меняться от выполнения к выполнению.

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

Да, через ОБЪЕДИНИТЬ или ОБЪЕДИНИТЬ ВСЕ. Первый вариант убирает дублирующиеся строки, второй сохраняет все и работает быстрее. Количество и типы полей в объединяемых выборках должны совпадать.

Что делать, если запрос выполняется слишком долго?

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