Разработка и Конфигурация · 10 мин
Что такое язык запросов 1С и как он работает
Язык запросов 1С: назначение, синтаксис, отличия от SQL, примеры запросов, виртуальные таблицы, конструктор запроса и типичные ошибки разработчиков.
Язык запросов 1С — это встроенный инструмент платформы «1С:Предприятие», предназначенный для выборки данных из информационной базы. Он похож на SQL, но работает не с физическими таблицами базы данных, а с объектами метаданных конфигурации: справочниками, документами, регистрами накопления и сведений. Разработчик описывает, какие данные нужны, а платформа сама формирует обращение к СУБД.
Запросы применяются практически везде: при построении отчётов, заполнении документов, проверке остатков, подборе данных в формах, обмене между базами. Без владения языком запросов невозможно писать эффективный код на встроенном языке 1С, потому что альтернатива — перебор объектов в цикле — работает на порядки медленнее и нагружает сервер.
Материал рассчитан на начинающих разработчиков и внедренцев: разберём назначение языка, основные конструкции, виртуальные таблицы, способы выполнения запроса из кода и типичные ошибки, которые приводят к медленной работе и неверным данным.
Назначение языка запросов и его отличия от SQL
Главная задача языка запросов — получение данных для дальнейшей обработки: вывода в отчёт, заполнения табличной части, контроля условий перед проведением документа. Запрос только читает данные; изменить информационную базу через запрос нельзя, для записи используются объекты встроенного языка.
Внешне синтаксис напоминает SQL: есть конструкции ВЫБРАТЬ (SELECT), ИЗ (FROM), ГДЕ (WHERE), СГРУППИРОВАТЬ ПО (GROUP BY), соединения таблиц. Однако есть принципиальные отличия. Во-первых, запрос обращается к сущностям конфигурации (Справочник.Номенклатура, Документ.РеализацияТоваров), а не к физическим таблицам. Во-вторых, платформа автоматически учитывает разделители, права доступа на уровне записей (RLS) и особенности конкретной СУБД. В-третьих, в языке есть специфические механизмы: виртуальные таблицы регистров, иерархия справочников, представления ссылок.
Базовый синтаксис: как устроен простой запрос
Минимальный запрос состоит из двух секций: что выбрать и откуда. Например, выборка всех элементов справочника контрагентов выглядит так:
ВЫБРАТЬ
Контрагенты.Ссылка,
Контрагенты.Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
Для фильтрации используется секция ГДЕ с условиями и параметрами. Параметр обозначается символом «&» и передаётся из кода, что защищает от подстановки небезопасных значений:
ВЫБРАТЬ
Товары.Ссылка,
Товары.Наименование,
Товары.Цена
ИЗ
Справочник.Номенклатура КАК Товары
ГДЕ
Товары.Родитель = &Группа
И НЕ Товары.ПометкаУдаления
УПОРЯДОЧИТЬ ПО
Товары.Наименование
Обратите внимание на псевдоним таблицы «КАК Товары»: он упрощает чтение и обязателен при соединении нескольких таблиц. Секция УПОРЯДОЧИТЬ ПО задаёт сортировку результата. Для ограничения количества строк применяется конструкция «ВЫБРАТЬ ПЕРВЫЕ 100».
- 1Откройте консоль запросов или конструктор запроса в конфигураторе
- 2Выберите таблицу-источник и нужные поля
- 3Добавьте условие ГДЕ с параметром вместо жёсткого значения
- 4Выполните запрос и проверьте состав строк
- 5Перенесите текст в модуль и передайте параметры через Запрос.УстановитьПараметр()
Соединения, группировки и итоги
Реальные задачи редко ограничиваются одной таблицей. Для объединения данных используются соединения: ЛЕВОЕ СОЕДИНЕНИЕ (все строки левой таблицы плюс совпадения справа), ВНУТРЕННЕЕ СОЕДИНЕНИЕ (только совпадающие строки) и реже — ПРАВОЕ и ПОЛНОЕ. Классический пример — документ с табличной частью:
ВЫБРАТЬ
Реализация.Ссылка,
Реализация.Контрагент,
Товары.Номенклатура,
Товары.Количество
ИЗ
Документ.РеализацияТоваров КАК Реализация
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров.Товары КАК Товары
ПО Товары.Ссылка = Реализация.Ссылка
ГДЕ
Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
Для агрегации применяются функции СУММА, КОЛИЧЕСТВО, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ вместе с секцией СГРУППИРОВАТЬ ПО. Например, сумма продаж по каждому контрагенту получается группировкой по полю Контрагент с функцией СУММА(Товары.Сумма). Условия на сгруппированные значения задаются через ИМЕЮЩИЕ, а не через ГДЕ — это частая ошибка новичков.
Секция ИТОГИ ПО формирует иерархические итоги прямо в результате запроса, что удобно для древовидных отчётов. Однако в системе компоновки данных (СКД) итоги обычно строятся настройками отчёта, и дублировать их в тексте запроса не нужно.
Виртуальные таблицы регистров
Особенность языка запросов 1С — виртуальные таблицы регистров, которые платформа рассчитывает автоматически. Для регистров накопления это Остатки, Обороты, ОстаткиИОбороты; для регистров сведений — СрезПервых и СрезПоследних. Они позволяют одной строкой получить данные, которые вручную пришлось бы вычислять сложной агрегацией движений.
Пример получения остатков товаров на складе:
ВЫБРАТЬ
Остатки.Номенклатура,
Остатки.КоличествоОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, Склад = &Склад) КАК Остатки
Параметры виртуальной таблицы (период, условие) указываются в скобках сразу после её имени. Важно передавать условия именно в параметры виртуальной таблицы, а не в секцию ГДЕ: тогда фильтрация выполняется на раннем этапе, и запрос работает заметно быстрее, особенно на больших регистрах.
Выполнение запроса из встроенного языка
Текст запроса выполняется через объект Запрос. Типовой фрагмент кода выглядит так:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Наименование ПОДОБНО &Шаблон";
Запрос.УстановитьПараметр("Шаблон", "%" + СтрокаПоиска + "%");
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// обработка строки
КонецЦикла;
Результат можно обработать двумя способами: методом Выбрать() — построчным обходом, экономичным по памяти, или методом Выгрузить() — получением таблицы значений целиком, что удобно для заполнения табличных частей и форм. Перед обходом полезно проверить Результат.Пустой(), чтобы не выполнять лишних действий при пустой выборке.
Для сложных сценариев используются пакетные запросы (несколько запросов в одном тексте, разделённые точкой с запятой) и временные таблицы через менеджер временных таблиц. Это позволяет один раз отобрать данные, поместить их во временную таблицу и многократно соединять с ней в последующих запросах пакета.
Конструктор запроса и консоль запросов
Начинающим не обязательно писать текст вручную. В конфигураторе есть визуальный конструктор запроса: он вызывается из контекстного меню при редактировании модуля и позволяет выбрать таблицы, поля, условия, соединения и группировки мышью. Результат конструктор превращает в готовый текст, который затем можно доработать вручную.
Для отладки запросов на реальных данных применяется консоль запросов — внешняя обработка, которая выполняет текст запроса с заданными параметрами и показывает результат. Она незаменима при анализе медленных отчётов: можно проверить запрос отдельно от кода, подобрать условия и убедиться в корректности данных до внесения изменений в конфигурацию.
Как проверить корректность запроса
Строки соответствуют отбору, суммы сходятся с данными регистра
Дубли строк, лишние NULL, расхождение итогов
Запрос отрабатывает быстро на рабочем объёме данных
Заметная задержка даже на тестовой базе
Отборы переданы в параметры виртуальной таблицы
Фильтрация только в секции ГДЕ
Когда запрос необходим, а когда есть альтернативы
Запрос — правильный выбор, когда нужно прочитать много записей, рассчитать итоги, соединить данные нескольких объектов или построить отчёт. Для одиночного обращения к известной ссылке (получить один реквизит конкретного элемента) иногда проще использовать обращение через точку, хотя массовые обращения «в цикле по ссылкам» — антипаттерн: каждое обращение идёт в базу отдельно.
Для отчётов предпочтительна система компоновки данных: запрос в ней — только источник данных, а группировки, отборы и оформление настраиваются без изменения кода. Пользовательские отборы в СКД платформа добавляет к запросу автоматически, что избавляет разработчика от ручной обработки произвольных условий.
Что важно запомнить
Язык запросов 1С читает данные объектов конфигурации и не изменяет их. Ключевые навыки: работа с параметрами, соединениями, группировками и виртуальными таблицами регистров. Эффективный запрос фильтрует данные как можно раньше — через параметры виртуальных таблиц, а не через ГДЕ.
Частые вопросы о языке запросов 1С
Можно ли изменить данные базы с помощью запроса?
Нет. Язык запросов предназначен только для чтения. Запись, проведение и удаление выполняются методами объектов встроенного языка: Записать(), Записать(РежимЗаписиДокумента.Проведение), УстановитьПометкуУдаления().
Чем виртуальная таблица отличается от обычной таблицы регистра?
Обычная таблица регистра хранит сами движения (проводки). Виртуальная таблица — это рассчитываемый платформой результат: остатки на дату, обороты за период, срез последних значений. Обращение к ней заменяет сложную ручную агрегацию.
Почему запрос с соединением возвращает дубли строк?
Дубли появляются, когда в присоединяемой таблице несколько строк соответствуют одной строке основной таблицы — например, соединение документа с его табличной частью. Это нормальное поведение; если нужны уникальные документы, применяйте группировку или РАЗЛИЧНЫЕ.
Обязательно ли учить синтаксис наизусть?
Нет. Конструктор запроса формирует текст визуально, а консоль запросов помогает отладить результат. Понимание логики — соединений, группировок, параметров виртуальных таблиц — важнее механического знания ключевых слов.
Что делать, если запрос работает медленно?
Проверьте, передаются ли отборы в параметры виртуальных таблиц, нет ли соединений по неиндексированным полям и лишних соединений с виртуальными таблицами. Для глубокого анализа используйте технологический журнал и план запроса на стороне СУБД.
Подходит ли язык запросов для обмена данными между базами?
Да, запросы часто используются как источник данных при выгрузке: сначала запросом отбираются нужные объекты, затем результат сериализуется или передаётся через механизмы обмена. Сам запрос при этом по-прежнему только читает данные.