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

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

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

Язык запросов 1С — встроенный механизм платформы для выборки данных из базы. Разбираем название, синтаксис, отличия от SQL и даём примеры запросов.

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

Главная особенность этого языка — он декларативный и предназначен только для чтения данных. С его помощью нельзя изменить, удалить или добавить записи в базу: для этого существует объектная модель платформы. Запрос описывает, какие данные нужны, а платформа сама решает, как их получить из конкретной СУБД — MS SQL Server, PostgreSQL, Oracle или файловой базы.

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

Как правильно называется язык запросов 1С

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

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

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

Минимальный запрос состоит из секций ВЫБРАТЬ и ИЗ. В первой перечисляются поля, во второй — источник данных, то есть объект метаданных. Например, выборка всех элементов справочника номенклатуры выглядит так:

ВЫБРАТЬ

Номенклатура.Ссылка,

Номенклатура.Наименование

ИЗ

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

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

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

Чем язык запросов 1С отличается от SQL

Хотя синтаксис внешне похож на SQL, это принципиально другой уровень абстракции. Платформа транслирует текст запроса в SQL конкретной СУБД, подставляя реальные имена таблиц и полей. Поэтому разработчик 1С не знает (и не должен знать), как называются таблицы в базе данных — он обращается к Документ.РеализацияТоваровУслуг, а не к физической таблице вида _Document123.

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

КритерийЯзык запросов 1СКлассический SQL
Источник данныхОбъекты метаданных и виртуальные таблицыФизические таблицы и представления
Изменение данныхНевозможно, только чтениеINSERT, UPDATE, DELETE
Зависимость от СУБДНет, один текст для любой СУБДДиалекты различаются
СпецификаВиртуальные таблицы, итоги, иерархияХранимые процедуры, триггеры

Где используется язык запросов на практике

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

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

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

Виртуальные таблицы и типовые приёмы

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

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

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

Как изучить и проверить запрос без риска для базы

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

Проверять новые запросы следует на копии рабочей базы. Язык запросов не изменяет данные, поэтому прямой порчи информации вызвать нельзя, но тяжёлый запрос способен надолго заблокировать таблицы и остановить работу пользователей в клиент-серверном режиме. Это особенно актуально для запросов с соединениями нескольких виртуальных таблиц без ограничения периода.

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

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

Состав полей выборки
Норма

Все нужные поля присутствуют, типы соответствуют ожиданиям

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

Поле пустое или содержит NULL из-за левого соединения

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

Совпадает с контрольной выборкой через отчёт или список

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

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

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

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

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

Запрос «висит» — проверьте параметры виртуальных таблиц и индексацию

Итог

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

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

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

Язык запросов 1С — это тот же самый SQL?

Нет. Синтаксис похож, но это самостоятельный язык более высокого уровня. Платформа транслирует его в SQL конкретной СУБД, поэтому один и тот же текст работает на MS SQL Server, PostgreSQL и в файловом варианте. Прямые SQL-запросы к базе 1С в обход платформы не поддерживаются и могут нарушить целостность данных.

Можно ли через запрос изменить или удалить данные?

Нельзя. Язык запросов предназначен только для чтения. Для изменения данных используется объектная модель: получение объекта по ссылке, изменение реквизитов и вызов метода записи. Это сделано намеренно — объектная запись проходит проверки, обработчики событий и контроль прав.

Где писать и отлаживать запросы без изменения конфигурации?

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

Что такое виртуальные таблицы и почему без них нельзя?

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

Нужно ли знать SQL разработчику 1С?

Для повседневной работы достаточно языка запросов 1С. Знание SQL полезно при диагностике производительности: план запроса на стороне СУБД помогает понять, почему платформа построила неоптимальное обращение к данным. Но писать прямые SQL-запросы к базе 1С не следует.

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

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