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

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

SQL в 1С: что это такое и как работает на примерах

Что такое SQL в контексте 1С, как устроен язык запросов 1С, чем он отличается от классического SQL. Разбор примеров запросов, типовых ошибок и ограничений.

Когда пользователи и начинающие разработчики спрашивают «что такое SQL в 1С», они обычно смешивают две разные вещи: классический язык SQL, на котором «разговаривают» СУБД вроде Microsoft SQL Server или PostgreSQL, и встроенный язык запросов платформы 1С, который лишь внешне напоминает SQL. Разобраться в разнице важно, потому что от этого зависит, как вы будете писать отчёты, выбирать данные и оптимизировать производительность.

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

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

Что такое SQL и какое отношение он имеет к 1С

SQL (Structured Query Language) — стандартный язык для работы с реляционными базами данных: выборки, вставки, обновления и удаления записей. На нём напрямую работают администраторы баз данных и разработчики приложений, не связанных с 1С.

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

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

Язык запросов 1С опирается на логическую модель данных конфигурации. Вы обращаетесь к «Справочник.Номенклатура» или «Документ.РеализацияТоваровУслуг», а не к физическим таблицам вида _Reference123. Платформа сама знает, какие таблицы и поля задействовать.

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

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

Пример запроса 1С с разбором

Рассмотрим типовую задачу: получить список товаров с остатками по конкретному складу. В модуле это выглядит так:

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

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

"ВЫБРАТЬ

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

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

|ИЗ

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

|ГДЕ

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

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

| Остатки.Номенклатура.Наименование";

Запрос.УстановитьПараметр("Период", ТекущаяДатаСеанса());

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

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

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

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

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

Главное отличие — язык запросов 1С предназначен только для чтения данных. В нём нет аналогов INSERT, UPDATE, DELETE: изменение данных выполняется через объектную модель (запись документов, наборов записей), что гарантирует срабатывание бизнес-логики и контроль прав.

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

КритерийЯзык запросов 1СКлассический SQL
НазначениеТолько чтение данныхЧтение и изменение данных
Обращение к даннымЧерез объекты метаданныхЧерез физические таблицы
Переносимость между СУБДПолная, трансляция платформойЗависит от диалекта СУБД
Права доступаУчитываются автоматическиНастраиваются отдельно

Когда допустим прямой SQL к базе 1С

Прямые запросы к СУБД оправданы в узких сценариях: интеграция с внешними BI-системами, разовая аналитика по большим объёмам, диагностика блокировок администратором. Во всех случаях — только чтение.

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

Типичные ошибки при работе с запросами в 1С

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

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

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

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

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

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

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

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

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

Доли секунды — секунды на типовых объёмах

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

Десятки секунд и рост с увеличением базы

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

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

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

Все условия только в секции ГДЕ

Количество обращений к базе
Норма

Один запрос на операцию

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

Запрос выполняется в цикле

Часто задаваемые вопросы

Можно ли изменять данные базы 1С напрямую через SQL?

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

Нужно ли знать классический SQL, чтобы писать запросы в 1С?

Не обязательно, но полезно. Базовые конструкции — выборка, фильтрация, группировка, соединения — совпадают по логике, поэтому знание SQL ускоряет освоение. Однако специфику 1С (виртуальные таблицы, итоги, параметры сеанса) придётся изучать отдельно.

Какие СУБД поддерживает платформа 1С?

Платформа работает с Microsoft SQL Server, PostgreSQL (включая отечественные сборки), Oracle Database и IBM Db2. Один и тот же запрос на языке 1С выполняется на любой из них без изменений — трансляцию выполняет платформа.

Что такое виртуальная таблица в запросе 1С?

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

Как внешней системе получить данные из 1С без прямого SQL?

Используйте штатные интерфейсы: OData (REST-доступ к объектам), HTTP-сервисы и веб-сервисы, планы обмена. Они работают через платформу, соблюдают права и не зависят от внутренней структуры таблиц базы.

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

Частые причины: в отчёте запрос выполняется под пользователем с ограничением прав RLS, добавляющим условия; используются другие параметры периода; либо отчёт дополнительно обрабатывает результат в коде. Сравните текст запроса и параметры в обоих случаях.

Итог

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

В 1С используется собственный язык запросов, похожий на SQL, но предназначенный только для чтения и работающий с объектами метаданных. Платформа сама транслирует его в SQL конкретной СУБД. Прямая запись в базу через SQL запрещена; для интеграций применяйте OData, HTTP-сервисы и планы обмена.