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

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

Что такое язык запросов 1С и как он работает

Язык запросов 1С: назначение, синтаксис, отличия от SQL, примеры запросов, виртуальные таблицы, конструктор запроса и типичные ошибки разработчиков.

Язык запросов 1С — это встроенный инструмент платформы «1С:Предприятие», предназначенный для выборки данных из информационной базы. Он похож на SQL, но работает не с физическими таблицами базы данных, а с объектами метаданных конфигурации: справочниками, документами, регистрами накопления и сведений. Разработчик описывает, какие данные нужны, а платформа сама формирует обращение к СУБД.

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

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

Назначение языка запросов и его отличия от SQL

Главная задача языка запросов — получение данных для дальнейшей обработки: вывода в отчёт, заполнения табличной части, контроля условий перед проведением документа. Запрос только читает данные; изменить информационную базу через запрос нельзя, для записи используются объекты встроенного языка.

Внешне синтаксис напоминает SQL: есть конструкции ВЫБРАТЬ (SELECT), ИЗ (FROM), ГДЕ (WHERE), СГРУППИРОВАТЬ ПО (GROUP BY), соединения таблиц. Однако есть принципиальные отличия. Во-первых, запрос обращается к сущностям конфигурации (Справочник.Номенклатура, Документ.РеализацияТоваров), а не к физическим таблицам. Во-вторых, платформа автоматически учитывает разделители, права доступа на уровне записей (RLS) и особенности конкретной СУБД. В-третьих, в языке есть специфические механизмы: виртуальные таблицы регистров, иерархия справочников, представления ссылок.

Базовый синтаксис: как устроен простой запрос

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

ВЫБРАТЬ

Контрагенты.Ссылка,

Контрагенты.Наименование

ИЗ

Справочник.Контрагенты КАК Контрагенты

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

ВЫБРАТЬ

Товары.Ссылка,

Товары.Наименование,

Товары.Цена

ИЗ

Справочник.Номенклатура КАК Товары

ГДЕ

Товары.Родитель = &Группа

И НЕ Товары.ПометкаУдаления

УПОРЯДОЧИТЬ ПО

Товары.Наименование

Обратите внимание на псевдоним таблицы «КАК Товары»: он упрощает чтение и обязателен при соединении нескольких таблиц. Секция УПОРЯДОЧИТЬ ПО задаёт сортировку результата. Для ограничения количества строк применяется конструкция «ВЫБРАТЬ ПЕРВЫЕ 100».

Как написать первый запрос
  1. 1
    Откройте консоль запросов или конструктор запроса в конфигураторе
  2. 2
    Выберите таблицу-источник и нужные поля
  3. 3
    Добавьте условие ГДЕ с параметром вместо жёсткого значения
  4. 4
    Выполните запрос и проверьте состав строк
  5. 5
    Перенесите текст в модуль и передайте параметры через Запрос.УстановитьПараметр()

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

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

ВЫБРАТЬ

Реализация.Ссылка,

Реализация.Контрагент,

Товары.Номенклатура,

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

ИЗ

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

ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров.Товары КАК Товары

ПО Товары.Ссылка = Реализация.Ссылка

ГДЕ

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

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

Секция ИТОГИ ПО формирует иерархические итоги прямо в результате запроса, что удобно для древовидных отчётов. Однако в системе компоновки данных (СКД) итоги обычно строятся настройками отчёта, и дублировать их в тексте запроса не нужно.

Виртуальные таблицы регистров

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

Пример получения остатков товаров на складе:

ВЫБРАТЬ

Остатки.Номенклатура,

Остатки.КоличествоОстаток

ИЗ

РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, Склад = &Склад) КАК Остатки

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

Выполнение запроса из встроенного языка

Текст запроса выполняется через объект Запрос. Типовой фрагмент кода выглядит так:

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

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

"ВЫБРАТЬ

| Контрагенты.Ссылка

|ИЗ

| Справочник.Контрагенты КАК Контрагенты

|ГДЕ

| Контрагенты.Наименование ПОДОБНО &Шаблон";

Запрос.УстановитьПараметр("Шаблон", "%" + СтрокаПоиска + "%");

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

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

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

// обработка строки

КонецЦикла;

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

Для сложных сценариев используются пакетные запросы (несколько запросов в одном тексте, разделённые точкой с запятой) и временные таблицы через менеджер временных таблиц. Это позволяет один раз отобрать данные, поместить их во временную таблицу и многократно соединять с ней в последующих запросах пакета.

Типичные ошибки
01
Фильтрация через ГДЕ вместо параметров виртуальной таблицы — запрос сканирует весь регистр
02
Соединение по неиндексированным полям — резкое падение скорости на больших таблицах
03
Использование Выгрузить() там, где достаточно Выбрать() — лишний расход памяти
04
Подстановка строк в текст запроса вместо параметров — риск ошибок и инъекций
05
Соединение с виртуальной таблицей без отбора — дублирование тяжёлых вычислений

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

Начинающим не обязательно писать текст вручную. В конфигураторе есть визуальный конструктор запроса: он вызывается из контекстного меню при редактировании модуля и позволяет выбрать таблицы, поля, условия, соединения и группировки мышью. Результат конструктор превращает в готовый текст, который затем можно доработать вручную.

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

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

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

Результат выполнения
Норма

Строки соответствуют отбору, суммы сходятся с данными регистра

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

Дубли строк, лишние NULL, расхождение итогов

Скорость выполнения
Норма

Запрос отрабатывает быстро на рабочем объёме данных

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

Заметная задержка даже на тестовой базе

Условия виртуальных таблиц
Норма

Отборы переданы в параметры виртуальной таблицы

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

Фильтрация только в секции ГДЕ

Когда запрос необходим, а когда есть альтернативы

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

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

Итог

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

Язык запросов 1С читает данные объектов конфигурации и не изменяет их. Ключевые навыки: работа с параметрами, соединениями, группировками и виртуальными таблицами регистров. Эффективный запрос фильтрует данные как можно раньше — через параметры виртуальных таблиц, а не через ГДЕ.

Частые вопросы о языке запросов 1С

Можно ли изменить данные базы с помощью запроса?

Нет. Язык запросов предназначен только для чтения. Запись, проведение и удаление выполняются методами объектов встроенного языка: Записать(), Записать(РежимЗаписиДокумента.Проведение), УстановитьПометкуУдаления().

Чем виртуальная таблица отличается от обычной таблицы регистра?

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

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

Дубли появляются, когда в присоединяемой таблице несколько строк соответствуют одной строке основной таблицы — например, соединение документа с его табличной частью. Это нормальное поведение; если нужны уникальные документы, применяйте группировку или РАЗЛИЧНЫЕ.

Обязательно ли учить синтаксис наизусть?

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

Что делать, если запрос работает медленно?

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

Подходит ли язык запросов для обмена данными между базами?

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