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

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

Как работать с запросами в 1С: от первой выборки до оптимизации

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

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

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

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

Что такое запрос в 1С и где он применяется

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

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

Минимальный рабочий пример запроса в коде

Работа с запросом в модуле всегда состоит из четырёх шагов: создание объекта, задание текста, установка параметров и обработка результата. Ниже — типовой шаблон выборки документов за период.

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

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

"ВЫБРАТЬ

| РеализацияТоваровУслуг.Ссылка КАК Документ,

| РеализацияТоваровУслуг.Контрагент КАК Контрагент,

| РеализацияТоваровУслуг.СуммаДокумента КАК Сумма

|ИЗ

| Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

|ГДЕ

| РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода

| И РеализацияТоваровУслуг.Проведен";

Запрос.УстановитьПараметр("НачалоПериода", НачалоДня(НачалоПериода));

Запрос.УстановитьПараметр("КонецПериода", КонецДня(КонецПериода));

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

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

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

Сообщить(Строка(Выборка.Документ) + " — " + Выборка.Сумма);

КонецЦикла;

Обратите внимание на детали. Параметры в тексте начинаются с символа «&» и передаются через УстановитьПараметр() — никогда не подставляйте значения в текст запроса конкатенацией строк: это ломает типы данных и открывает путь к ошибкам. Псевдонимы полей (КАК Документ) задают имена колонок результата, по которым потом обращаются в выборке.

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

Порядок создания запроса
  1. 1
    Создайте объект: Запрос = Новый Запрос
  2. 2
    Заполните Запрос.Текст, используя псевдонимы полей через КАК
  3. 3
    Передайте все значения через УстановитьПараметр()
  4. 4
    Выполните запрос и получите выборку или таблицу значений
  5. 5
    Обойдите результат и проверьте его на пустоту через Результат.Пустой()

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

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

Для отладки на реальных данных используют внешние обработки-консоли запросов. Они позволяют выполнить текст с конкретными параметрами на копии рабочей базы, увидеть результат в виде таблицы и замерить время выполнения. Это безопасно, если консоль работает только на чтение данных.

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

Параметры, отборы и виртуальные таблицы

Условия отбора задаются в секции ГДЕ. Ключевое правило производительности: отбор должен использовать индексированные поля — дата, номер, ссылка, измерения регистров. Условие по произвольному строковому реквизиту через ПОДОБНО заставит СУБД перебрать всю таблицу.

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

ВЫБРАТЬ

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

ТоварыОстатки.КоличествоОстаток КАК Остаток

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки(

&Период,

Склад = &Склад

И Номенклатура В (&СписокНоменклатуры)) КАК ТоварыОстатки

Для отбора по списку значений используйте оператор В (&Список), передавая параметром массив или список значений. Для проверки иерархии справочника — В ИЕРАРХИИ (&Группа). Для необязательных отборов в отчётах применяйте СКД, а не разветвление текста запроса в коде.

Соединения и группировки

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

Типовая ошибка — соединение по неуникальному ключу, из-за которого строки дублируются, а суммы в отчёте завышаются. Перед соединением убедитесь, что справа на каждое значение ключа приходится не более одной строки, либо осознанно группируйте результат. Проверить дубли можно, добавив в запрос КОЛИЧЕСТВО(*) с группировкой по ключу.

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