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