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

Если вы когда-нибудь пытались написать запрос в конфигураторе 1С 8.3 или анализировали код типовой обработки, то наверняка сталкивались с конструкциями вроде ВЫБРАТЬ или ГДЕ. Это не случайное сходство с SQL — у языка запросов есть собственная специфика, которая делает его уникальным инструментом для работы с базами данных платформы. Далее мы разберём, почему его нельзя назвать "просто SQL", как он интегрирован в архитектуру , и где его изучать с нуля.

Статья будет полезна:

  • 👨‍💻 Разработчикам 1С, которые хотят систематизировать знания о языке запросов;
  • 📊 Аналитикам, работающим с отчётами и выборками данных;
  • 🖥️ Администраторам баз, оптимизирующим производительность систем;
  • 🎓 Студентам и новичкам, осваивающим платформу с нуля.
📊 Как часто вы используете язык запросов в 1С?
Ежедневно
Несколько раз в неделю
Редко, только для отчётов
Никогда не использовал

Официальное название языка запросов 1С

Итак, язык запросов в 1С называется "Встроенный язык запросов 1С:Предприятие" (или сокращённо — язык запросов 1С). Это не самостоятельный язык программирования, а часть встроенного языка платформы, который используется для работы с данными в базе. Важно понимать, что он не является диалектом SQL, хотя и имеет с ним много общего.

В документации (например, в справке разработчика) этот инструмент описывается как средство для:

  • 🔍 Выборки данных из таблиц базы;
  • 📊 Формирования отчётов и аналитических выборок;
  • 🔄 Объединения и преобразования информации из разных источников;
  • 🛠️ Оптимизации сложных операций с большими объёмами данных.

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

  • 📌 Работу с иерархическими справочниками;
  • 📌 Поддержку периодических регистров;
  • 📌 Встроенные функции для работы с датами, строками и числами в формате .
⚠️ Внимание: В старых версиях платформы (до 1С:Предприятие 8.0) язык запросов имел ограниченный функционал и сильно отличался от современного. Если вы работаете с устаревшими конфигурациями, проверьте совместимость синтаксиса в официальных релизах.

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

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

Основу любого запроса составляют три ключевых блока:

  1. ВЫБРАТЬ — указывает, какие поля нужно получить;
  2. ИЗ — определяет источник данных (таблицу или виртуальную таблицу);
  3. ГДЕ — задаёт условия отбора.

Пример простого запроса, который выбирает все документы ЗаказПокупателя за текущий месяц:

ВЫБРАТЬ

ЗаказПокупателя.Ссылка КАК Ссылка,

ЗаказПокупателя.Дата КАК Дата,

ЗаказПокупателя.СуммаДокумента КАК Сумма

ИЗ

Документ.ЗаказПокупателя КАК ЗаказПокупателя

ГДЕ

ЗаказПокупателя.Дата МЕЖДУ &НачалоМесяца И &КонецМесяца

Отличия от SQL:

Особенность В языке запросов 1С В стандартном SQL
Обращение к таблицам Через объекты метаданных (Документ.ЗаказПокупателя) Через физические имена таблиц (Orders)
Параметры Используются с префиксом & (&НачалоМесяца) Обычно передаются как переменные или через :param
Агрегатные функции СУММА(), КОЛИЧЕСТВО(), МАКСИМУМ() SUM(), COUNT(), MAX()
Работа с датами Функции НАЧАЛОПЕРИОДА(), КОНЕЦПЕРИОДА() Обычно через DATEADD или кастинг строк

Ещё одна уникальная черта — поддержка виртуальных таблиц. Это специальные представления данных, которые формируются платформой на лету. Например, виртуальная таблица РегистрНакопления.ТоварыНаСкладах.Остатки() позволяет получить актуальные остатки товаров без ручного расчёта.

💡

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

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

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

1. Формирование отчётов

Большинство стандартных отчётов (Оборотно-сальдовая ведомость, Анализ субконто) построены на основе запросов. Разработчики также создают кастомные отчёты с помощью конструктора запросов или вручную.

2. Обработки и загрузка данных

При обмене данными между системами (например, при интеграции с 1С:ЗУП и 1С:Бухгалтерией) запросы используются для:

  • 📥 Выгрузки данных в XML/JSON;
  • 📤 Загрузки информации из внешних источников;
  • 🔄 Синхронизации справочников.

3. Оптимизация производительности

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

4. Автоматизация бизнес-процессов

В 1С:Документооборот или 1С:ERP запросы применяются для:

  • 📌 Автоматического контроля остатков;
  • 📌 Формирования уведомлений о просроченных задолях;
  • 📌 Анализа продаж по регионам.

Пример использования в обработке:

// Получаем список клиентов с задолженностью более 30 дней

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

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

"ВЫБРАТЬ

| Клиенты.Наименование КАК Клиент,

| СУММА(Документы.СуммаДокумента) КАК Задолженность

|ИЗ

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

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

| ПО Клиенты.Ссылка = Документы.Клиент

|ГДЕ

| Документы.Дата < &ТекДата МИНУС ДЕНЬ(30)

| И Документы.Оплачено = ЛОЖЬ

|СГРУППИРОВАТЬ ПО

| Клиенты.Наименование

|ИМЕЮЩИЕ

| СУММА(Документы.СуммаДокумента) > 0";

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

💡

Запросы в 1С выполняются на сервере, что снижает нагрузку на клиентское приложение и ускоряет работу с большими базами.

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

Хотя синтаксис языка запросов похож на SQL, между ними есть принципиальные различия. Разберём ключевые из них.

1. Работа с объектами метаданных

В SQL вы оперируете физическими таблицами базы данных (например, dbo.Orders). В источниками данных выступают объекты конфигурации:

  • 📋 Справочники (Справочник.Номенклатура);
  • 📄 Документы (Документ.ПоступлениеТоваров);
  • 📊 Регистры (РегистрНакопления.ТоварыНаСкладах).

2. Поддержка периодических данных

В 1С есть уникальная возможность работать с данными, привязанными к периодам времени (например, остатки товаров на определённую дату). Для этого используются виртуальные таблицы регистров с указанием периода:

ВЫБРАТЬ

ТоварыНаСкладах.Товар КАК Товар,

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

ИЗ

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

3. Встроенные функции

Язык запросов включает специализированные функции, которых нет в стандартном SQL:

  • 📅 НАЧАЛОПЕРИОДА(Дата, Месяц) — возвращает начало периода;
  • 💰 ОКРУГЛ(Число, Точность) — округление с учётом правил ;
  • 🔤 СОКРЛП(Строка) — удаляет лишние пробелы.

4. Особенности соединений (JOIN)

В поддерживаются стандартные типы соединений (ЛЕВОЕ, ПРАВОЕ, ПОЛНОЕ), но есть нюансы:

  • 🔗 Соединения могут выполняться не только по полям, но и по ссылкам на объекты;
  • 🔗 Поддерживаются неявные соединения через точку (например, Документ.Клиент.Наименование).
⚠️ Внимание: В некоторых СУБД (например, PostgreSQL) запросы транслируются в нативный SQL, но это не гарантирует 100% совместимости. Всегда тестируйте сложные запросы на рабочей базе.

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

Если вы только начинаете осваивать язык запросов , вот пошаговый план обучения:

☑️ План обучения языку запросов 1С

Выполнено: 0 / 5

1. Официальная документация

Начните с справки по языку запросов в ИТС. Там подробно описаны:

  • 📖 Все операторы и функции;
  • 📖 Правила написания запросов;
  • 📖 Примеры для типовых задач.

2. Практика в конфигураторе

Откройте любую базу в режиме Конфигуратор и перейдите в Файл → Новый → Запрос. Здесь можно:

  • 🛠️ Тестировать запросы в реальном времени;
  • 🛠️ Использовать конструктор запросов для визуального построения;
  • 🛠️ Просматривать план выполнения (F5) для оптимизации.

3. Курсы и обучающие материалы

Рекомендуемые ресурсы:

  • 🎓 1С:Учебный центр — курсы по разработке, включая блок по запросам;
  • 🎓 YouTube-каналы: 1С для программистов, Инфостарт;
  • 🎓 Книга "1С:Предприятие 8.3. Практическое пособие разработчика" (М.Г. Радченко).

4. Разбор типовой конфигурации

Анализируйте запросы в стандартных отчётах (например, в 1С:Управление торговлей):

  • 🔍 Откройте отчёт Валовая прибыль;
  • 🔍 Перейдите в Модуль объекта (F12);
  • 🔍 Найдите процедуры с запросами и изучите их логику.
Пример простого запроса для начинающих

ВЫБРАТЬ ПЕРВЫЕ 10

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

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

ИЗ

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

ГДЕ

НЕ Справочник.Номенклатура.ПометкаУдаления

И Справочник.Номенклатура.ЭтоГруппа = ЛОЖЬ

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

Наименование

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

Оптимизация запросов в 1С: советы и трюки

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

1. Используйте индексы

Если запрос часто выполняется по одному и тому же полю, добавьте индекс:

ИНДЕКСИРОВАТЬ ПО

Дата,

Контрагент

2. Избегайте ВЫБРАТЬ *

Всегда указывайте только те поля, которые действительно нужны. Это уменьшает объём передаваемых данных.

3. Ограничивайте выборку

Используйте ПЕРВЫЕ N или условия в ГДЕ, чтобы не грузить лишние записи:

ВЫБРАТЬ ПЕРВЫЕ 100

Документ.ЗаказПокупателя.Ссылка КАК Ссылка

ГДЕ

Документ.ЗаказПокупателя.Дата >= &НачалоПериода

4. Работайте с виртуальными таблицами

Для регистров накопления используйте виртуальные таблицы вместо ручного расчёта остатков. Например:

// Плохо (ручной расчёт)

ВЫБРАТЬ

РегистрНакопленияТовары.Товар КАК Товар,

СУММА(РегистрНакопленияТовары.Количество) КАК Остаток

ИЗ

РегистрНакопления.Товары КАК РегистрНакопленияТовары

ГДЕ

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

СГРУППИРОВАТЬ ПО

РегистрНакопленияТовары.Товар

// Хорошо (виртуальная таблица)

ВЫБРАТЬ

ТоварыНаСкладах.Товар КАК Товар,

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

ИЗ

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

5. Анализируйте план выполнения

В конфигураторе нажмите F5 после выполнения запроса, чтобы увидеть план выполнения. Это поможет выявить "узкие места":

  • 🔍 Полное сканирование таблиц (Table Scan);
  • 🔍 Отсутствие индексов;
  • 🔍 Сложные вложенные подзапросы.
⚠️ Внимание: В кластерных базах (например, на 1С:Сервер предприятия) оптимизация запросов критична — неэффективный код может заблокировать работу других пользователей.

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

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

1. Игнорирование типов данных

В поля могут иметь сложные типы (например, Ссылка.Документ). Если в запросе неверно указан тип, возникнет ошибка:

// Ошибка: поле "Дата" сравнивается со строкой

ГДЕ Дата = "01.01.2023"

// Правильно:

ГДЕ Дата = ДАТАВРЕМЯ(2023, 1, 1)

2. Избыточные соединения

Частая ошибка — соединение таблиц, когда это не нужно. Например, если требуется только справочник Номенклатура, не стоит присоединять к нему Документ.РеализацияТоваров без необходимости.

3. Неправильная работа с NULL

В вместо NULL используется ЗНАЧЕНИЕ НЕ ОПРЕДЕЛЕНО. Неучёт этого ведёт к ошибкам:

// Ошибка: сравнение с NULL

ГДЕ Поле = NULL

// Правильно:

ГДЕ Поле ЕСТЬ NULL

ИЛИ Поле = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка())

4. Забытые параметры

Если в запросе используются параметры (например, &НачалоПериода), но они не передаются при выполнении, возникнет ошибка:

Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекДата())); // Обязательно!

5. Неучёт прав доступа

Запрос может вернуть пустой результат, если у пользователя нет прав на доступ к данным. Проверяйте права в Администрирование → Пользователи.

💡

Всегда тестируйте запросы на копии рабочей базы, особенно если они затрагивают критичные данные (например, бухгалтерские проводки).

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

Можно ли использовать SQL-команды напрямую в 1С?

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

Как ускорить медленный запрос?

Сначала проанализируйте план выполнения (F5 в конфигураторе). Типичные способы оптимизации:

  • Добавьте индексы по полям, используемым в ГДЕ;
  • Разбейте сложный запрос на несколько простых;
  • Используйте виртуальные таблицы вместо ручных расчётов;
  • Ограничьте выборку по дате или другим критериям.
Где хранится текст запроса в конфигурации?

Тексты запросов могут находиться:

  • В модулях объектов (например, в модуле отчёта);
  • В общих модулях;
  • В обработках (например, в обработке загрузки данных).

Чтобы найти все запросы в конфигурации, используйте поиск по тексту (Ctrl+Shift+F) с ключевыми словами ВЫБРАТЬ или Новый Запрос.

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

Да, для этого используется оператор ОБНОВИТЬ. Пример:

ОБНОВИТЬ Документ.ЗаказПокупателя

УСТАНОВИТЬ Статус = &НовыйСтатус

ГДЕ Ссылка В (&СписокЗаказов)

Однако такие запросы требуют особой осторожности — они могут заблокировать таблицы и вызвать ошибки при параллельной работе пользователей.

Как передавать динамические параметры в запрос?

Используйте метод УстановитьПараметр():

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

Запрос.Текст = "ВЫБРАТЬ Товары ИЗ Справочник.Номенклатура ГДЕ Артикул = &Артикул";

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

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

Для передачи списка значений используйте временные таблицы или конструкцию В(&Список).