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

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

Как создать запрос в 1С: практическое руководство

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

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

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

Материал рассчитан на тех, кто работает в конфигураторе 1С:Предприятие 8.3. Примеры приведены на типовых объектах — справочнике «Номенклатура», документе и регистре накопления, — которые есть практически в любой конфигурации.

Где в 1С создаются запросы и какой инструмент выбрать

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

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

Сравнение инструментов

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

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

Ручное написание текста

Полный контроль над синтаксисом, параметрами и виртуальными таблицами. Требует знания языка запросов.

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

Инструмент отладки на живых данных. Не встраивается в конфигурацию, используется только для проверки и анализа.

СКД (схема компоновки)

Для отчётов с настройками пользователя. Запрос — только источник данных, оформление делает компоновщик.

Создание запроса через конструктор: пошагово

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

В левой части конструктора отображаются таблицы базы данных: справочники, документы, регистры. Перетащите нужную таблицу (например, «Справочник.Номенклатура») в поле «Таблицы». Затем из раскрывшегося списка полей перенесите в поле «Поля» нужные реквизиты: Ссылка, Наименование, Код. На закладке «Условия» задайте отбор, например НЕ ПометкаУдаления. На закладке «Порядок» добавьте сортировку по наименованию.

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

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

Структура текста запроса: ВЫБРАТЬ, ИЗ, ГДЕ

Язык запросов 1С напоминает SQL, но ключевые слова пишутся на русском (допускается и английский синтаксис: SELECT, FROM, WHERE). Минимальный запрос выглядит так: ВЫБРАТЬ Номенклатура.Ссылка, Номенклатура.Наименование ИЗ Справочник.Номенклатура КАК Номенклатура. Псевдоним после КАК позволяет коротко обращаться к таблице.

Секция ГДЕ задаёт отбор. Важный приём — параметры: вместо жёсткого значения пишут &Параметр, а значение подставляется перед выполнением через Запрос.УстановитьПараметр("Организация", Организация). Это защищает от ошибок форматирования дат и строк и делает запрос универсальным.

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

bsl
ВЫБРАТЬ
	Продажи.Номенклатура КАК Номенклатура,
	СУММА(Продажи.Количество) КАК Количество
ИЗ
	РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК Продажи
СГРУППИРОВАТЬ ПО
	Продажи.Номенклатура

Работа с виртуальными таблицами и соединениями

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

Для объединения данных нескольких таблиц используются соединения: ЛЕВОЕ СОЕДИНЕНИЕ, ВНУТРЕННЕЕ СОЕДИНЕНИЕ и другие. Левое соединение сохраняет все строки левой таблицы, подставляя NULL там, где пары не нашлось. Внутреннее оставляет только совпадающие строки. Типичный сценарий — справочник номенклатуры слева и остатки справа, чтобы видеть и товары с нулевым остатком.

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

Выполнение запроса в коде и обход результата

Текст запроса сам по себе ничего не возвращает — нужно создать объект Запрос, установить текст и параметры, затем вызвать Выполнить(). Результат — объект «РезультатЗапроса», из которого данные получают двумя способами: Выгрузить() возвращает таблицу значений, удобную для табличного документа или дальнейшей обработки, а Выбрать() — выборку для последовательного обхода в цикле Пока Выборка.Следующий() Цикл.

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

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

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

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

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

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

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

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

Суммы по группам
Норма

Итог по отчёту сходится с типовым отчётом конфигурации

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

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

NULL в полях
Норма

NULL только там, где левое соединение допускает отсутствие пары

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

NULL в ключевых полях — неверный тип соединения

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

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

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

Минутное ожидание — нет отборов, сканирование всей таблицы

Типичные ошибки и ограничения языка запросов

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

Частые ошибки новичков: обращение к полю без псевдонима таблицы при неоднозначности, использование * вместо явного списка полей (замедляет работу и мешает отладке), фильтрация по виртуальной таблице в секции ГДЕ вместо параметров, забытый УстановитьПараметр перед выполнением — платформа выдаст ошибку «Параметр не найден».

Ещё одна ловушка — сравнение с NULL. Обычное сравнение с NULL не работает: нужно использовать ЕСТЬ NULL или функцию ЕСТЬNULL(Поле, ЗначениеПоУмолчанию), особенно после левых соединений.

Типичные ошибки
01
Отбор в секции ГДЕ вместо параметров виртуальной таблицы — запрос читает лишние данные и тормозит
02
Соединение без проверки дублей — суммы в отчёте завышены в разы
03
Забытый УстановитьПараметр — ошибка выполнения или пустой результат
04
Сравнение с NULL через равенство — условие никогда не срабатывает, нужен ЕСТЬ NULL
05
Использование ВЫБРАТЬ * — лишняя нагрузка и неочевидный состав полей

Когда запроса недостаточно: альтернативы

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

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

Итог

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

Запрос создаётся через конструктор или текстом, выполняется объектом Запрос с параметрами, результат обходится выборкой или выгружается в таблицу значений. Отборы задавайте параметрами виртуальных таблиц, соединения проверяйте на дубли, NULL обрабатывайте через ЕСТЬNULL, а тяжёлые запросы сначала тестируйте на копии базы.

Частые вопросы о создании запросов в 1С

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

Да, если в конфигурации есть встроенная консоль запросов или отчёты на СКД с произвольным источником. Также существуют внешние обработки-консоли, которые запускаются в режиме предприятия через «Файл → Открыть» — для этого нужны права на запуск внешних обработок.

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

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

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

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

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

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

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

Да, для этого служит ОБЪЕДИНИТЬ (с дубликатами строк) и ОБЪЕДИНИТЬ ВСЕ... вернее, наоборот: ОБЪЕДИНИТЬ убирает дубликаты, ОБЪЕДИНИТЬ ВСЕ сохраняет все строки и работает быстрее. Состав и порядок полей в объединяемых выборках должны совпадать.

Опасен ли неправильный запрос для данных в базе?

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