В мире 1С:Предприятие терминология часто вызывает путаницу — особенно когда речь заходит о работе с данными. Многие новички и даже опытные пользователи задаются вопросом: как называется язык запросов в 1С, чем он отличается от стандартного SQL, и где его применяют на практике. Эта статья не только даст точный ответ на вопрос о названии, но и раскроет ключевые аспекты работы с запросами в системе — от базового синтаксиса до нюансов оптимизации.
Если вы когда-нибудь пытались написать запрос в конфигураторе 1С 8.3 или анализировали код типовой обработки, то наверняка сталкивались с конструкциями вроде ВЫБРАТЬ или ГДЕ. Это не случайное сходство с SQL — у языка запросов 1С есть собственная специфика, которая делает его уникальным инструментом для работы с базами данных платформы. Далее мы разберём, почему его нельзя назвать "просто SQL", как он интегрирован в архитектуру 1С, и где его изучать с нуля.
Статья будет полезна:
- 👨💻 Разработчикам 1С, которые хотят систематизировать знания о языке запросов;
- 📊 Аналитикам, работающим с отчётами и выборками данных;
- 🖥️ Администраторам баз, оптимизирующим производительность систем;
- 🎓 Студентам и новичкам, осваивающим платформу с нуля.
Официальное название языка запросов 1С
Итак, язык запросов в 1С называется "Встроенный язык запросов 1С:Предприятие" (или сокращённо — язык запросов 1С). Это не самостоятельный язык программирования, а часть встроенного языка платформы, который используется для работы с данными в базе. Важно понимать, что он не является диалектом SQL, хотя и имеет с ним много общего.
В документации 1С (например, в справке разработчика) этот инструмент описывается как средство для:
- 🔍 Выборки данных из таблиц базы;
- 📊 Формирования отчётов и аналитических выборок;
- 🔄 Объединения и преобразования информации из разных источников;
- 🛠️ Оптимизации сложных операций с большими объёмами данных.
Почему не SQL? Дело в том, что 1С:Предприятие работает со своей собственной объектной моделью данных, где таблицы базы данных (СУБД) представляются как объекты метаданных (справочники, документы, регистры и т.д.). Язык запросов 1С адаптирован под эту модель, поэтому его синтаксис учитывает особенности платформы, например:
- 📌 Работу с иерархическими справочниками;
- 📌 Поддержку периодических регистров;
- 📌 Встроенные функции для работы с датами, строками и числами в формате 1С.
⚠️ Внимание: В старых версиях платформы (до 1С:Предприятие 8.0) язык запросов имел ограниченный функционал и сильно отличался от современного. Если вы работаете с устаревшими конфигурациями, проверьте совместимость синтаксиса в официальных релизах.
Синтаксис языка запросов 1С: основные конструкции
Синтаксис языка запросов 1С внешне напоминает SQL, но имеет ряд уникальных особенностей. Рассмотрим базовые конструкции, которые используются чаще всего.
Основу любого запроса составляют три ключевых блока:
ВЫБРАТЬ— указывает, какие поля нужно получить;ИЗ— определяет источник данных (таблицу или виртуальную таблицу);ГДЕ— задаёт условия отбора.
Пример простого запроса, который выбирает все документы ЗаказПокупателя за текущий месяц:
ВЫБРАТЬ
ЗаказПокупателя.Ссылка КАК Ссылка,
ЗаказПокупателя.Дата КАК Дата,
ЗаказПокупателя.СуммаДокумента КАК Сумма
ИЗ
Документ.ЗаказПокупателя КАК ЗаказПокупателя
ГДЕ
ЗаказПокупателя.Дата МЕЖДУ &НачалоМесяца И &КонецМесяца
Отличия от SQL:
| Особенность | В языке запросов 1С | В стандартном SQL |
|---|---|---|
| Обращение к таблицам | Через объекты метаданных (Документ.ЗаказПокупателя) |
Через физические имена таблиц (Orders) |
| Параметры | Используются с префиксом & (&НачалоМесяца) |
Обычно передаются как переменные или через :param |
| Агрегатные функции | СУММА(), КОЛИЧЕСТВО(), МАКСИМУМ() |
SUM(), COUNT(), MAX() |
| Работа с датами | Функции НАЧАЛОПЕРИОДА(), КОНЕЦПЕРИОДА() |
Обычно через DATEADD или кастинг строк |
Ещё одна уникальная черта — поддержка виртуальных таблиц. Это специальные представления данных, которые формируются платформой на лету. Например, виртуальная таблица РегистрНакопления.ТоварыНаСкладах.Остатки() позволяет получить актуальные остатки товаров без ручного расчёта.
Если запрос возвращает большое количество данных, используйте конструкцию ИНДЕКСИРОВАТЬ ПО для ускорения выборки. Например: ИНДЕКСИРОВАТЬ ПО Дата
Где применяется язык запросов в 1С
Язык запросов 1С используется практически во всех сценариях, где требуется работа с данными. Вот основные области применения:
1. Формирование отчётов
Большинство стандартных отчётов (Оборотно-сальдовая ведомость, Анализ субконто) построены на основе запросов. Разработчики также создают кастомные отчёты с помощью конструктора запросов или вручную.
2. Обработки и загрузка данных
При обмене данными между системами (например, при интеграции с 1С:ЗУП и 1С:Бухгалтерией) запросы используются для:
- 📥 Выгрузки данных в XML/JSON;
- 📤 Загрузки информации из внешних источников;
- 🔄 Синхронизации справочников.
3. Оптимизация производительности
Запросы позволяют перенести нагрузку с клиентской части на сервер, уменьшая время выполнения операций. Например, вместо того чтобы в цикле обходить все документы РеализацияТоваров, можно одним запросом получить нужные данные.
4. Автоматизация бизнес-процессов
В 1С:Документооборот или 1С:ERP запросы применяются для:
- 📌 Автоматического контроля остатков;
- 📌 Формирования уведомлений о просроченных задолях;
- 📌 Анализа продаж по регионам.
Пример использования в обработке:
// Получаем список клиентов с задолженностью более 30 дней
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Клиенты.Наименование КАК Клиент,
| СУММА(Документы.СуммаДокумента) КАК Задолженность
|ИЗ
| Справочник.Клиенты КАК Клиенты
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров КАК Документы
| ПО Клиенты.Ссылка = Документы.Клиент
|ГДЕ
| Документы.Дата < &ТекДата МИНУС ДЕНЬ(30)
| И Документы.Оплачено = ЛОЖЬ
|СГРУППИРОВАТЬ ПО
| Клиенты.Наименование
|ИМЕЮЩИЕ
| СУММА(Документы.СуммаДокумента) > 0";
Результат = Запрос.Выполнить();
Запросы в 1С выполняются на сервере, что снижает нагрузку на клиентское приложение и ускоряет работу с большими базами.
Отличия языка запросов 1С от SQL
Хотя синтаксис языка запросов 1С похож на SQL, между ними есть принципиальные различия. Разберём ключевые из них.
1. Работа с объектами метаданных
В SQL вы оперируете физическими таблицами базы данных (например, dbo.Orders). В 1С источниками данных выступают объекты конфигурации:
- 📋 Справочники (
Справочник.Номенклатура); - 📄 Документы (
Документ.ПоступлениеТоваров); - 📊 Регистры (
РегистрНакопления.ТоварыНаСкладах).
2. Поддержка периодических данных
В 1С есть уникальная возможность работать с данными, привязанными к периодам времени (например, остатки товаров на определённую дату). Для этого используются виртуальные таблицы регистров с указанием периода:
ВЫБРАТЬ
ТоварыНаСкладах.Товар КАК Товар,
ТоварыНаСкладах.КоличествоОстаток КАК Остаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&ТекДата) КАК ТоварыНаСкладах
3. Встроенные функции
Язык запросов 1С включает специализированные функции, которых нет в стандартном SQL:
- 📅
НАЧАЛОПЕРИОДА(Дата, Месяц)— возвращает начало периода; - 💰
ОКРУГЛ(Число, Точность)— округление с учётом правил 1С; - 🔤
СОКРЛП(Строка)— удаляет лишние пробелы.
4. Особенности соединений (JOIN)
В 1С поддерживаются стандартные типы соединений (ЛЕВОЕ, ПРАВОЕ, ПОЛНОЕ), но есть нюансы:
- 🔗 Соединения могут выполняться не только по полям, но и по ссылкам на объекты;
- 🔗 Поддерживаются неявные соединения через точку (например,
Документ.Клиент.Наименование).
⚠️ Внимание: В некоторых СУБД (например, PostgreSQL) запросы 1С транслируются в нативный SQL, но это не гарантирует 100% совместимости. Всегда тестируйте сложные запросы на рабочей базе.
Как изучить язык запросов 1С с нуля
Если вы только начинаете осваивать язык запросов 1С, вот пошаговый план обучения:
☑️ План обучения языку запросов 1С
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. Игнорирование типов данных
В 1С поля могут иметь сложные типы (например, Ссылка.Документ). Если в запросе неверно указан тип, возникнет ошибка:
// Ошибка: поле "Дата" сравнивается со строкой
ГДЕ Дата = "01.01.2023"
// Правильно:
ГДЕ Дата = ДАТАВРЕМЯ(2023, 1, 1)
2. Избыточные соединения
Частая ошибка — соединение таблиц, когда это не нужно. Например, если требуется только справочник Номенклатура, не стоит присоединять к нему Документ.РеализацияТоваров без необходимости.
3. Неправильная работа с NULL
В 1С вместо NULL используется ЗНАЧЕНИЕ НЕ ОПРЕДЕЛЕНО. Неучёт этого ведёт к ошибкам:
// Ошибка: сравнение с NULL
ГДЕ Поле = NULL
// Правильно:
ГДЕ Поле ЕСТЬ NULL
ИЛИ Поле = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка())
4. Забытые параметры
Если в запросе используются параметры (например, &НачалоПериода), но они не передаются при выполнении, возникнет ошибка:
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ТекДата())); // Обязательно!
5. Неучёт прав доступа
Запрос может вернуть пустой результат, если у пользователя нет прав на доступ к данным. Проверяйте права в Администрирование → Пользователи.
Всегда тестируйте запросы на копии рабочей базы, особенно если они затрагивают критичные данные (например, бухгалтерские проводки).
FAQ: Частые вопросы о языке запросов 1С
Можно ли использовать SQL-команды напрямую в 1С?
В большинстве случаев — нет. Платформа 1С:Предприятие абстрагирует работу с базой данных, и прямой SQL не поддерживается. Однако в некоторых СУБД (например, PostgreSQL или MS SQL) можно выполнять нативные запросы через ВыполнитьSQL(), но это не рекомендуется из-за риска нарушить целостность данных.
Как ускорить медленный запрос?
Сначала проанализируйте план выполнения (F5 в конфигураторе). Типичные способы оптимизации:
- Добавьте индексы по полям, используемым в
ГДЕ; - Разбейте сложный запрос на несколько простых;
- Используйте виртуальные таблицы вместо ручных расчётов;
- Ограничьте выборку по дате или другим критериям.
Где хранится текст запроса в конфигурации?
Тексты запросов могут находиться:
- В модулях объектов (например, в модуле отчёта);
- В общих модулях;
- В обработках (например, в обработке загрузки данных).
Чтобы найти все запросы в конфигурации, используйте поиск по тексту (Ctrl+Shift+F) с ключевыми словами ВЫБРАТЬ или Новый Запрос.
Можно ли в запросе обновить данные?
Да, для этого используется оператор ОБНОВИТЬ. Пример:
ОБНОВИТЬ Документ.ЗаказПокупателя
УСТАНОВИТЬ Статус = &НовыйСтатус
ГДЕ Ссылка В (&СписокЗаказов)
Однако такие запросы требуют особой осторожности — они могут заблокировать таблицы и вызвать ошибки при параллельной работе пользователей.
Как передавать динамические параметры в запрос?
Используйте метод УстановитьПараметр():
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Товары ИЗ Справочник.Номенклатура ГДЕ Артикул = &Артикул";
Запрос.УстановитьПараметр("Артикул", "A100");
Результат = Запрос.Выполнить();
Для передачи списка значений используйте временные таблицы или конструкцию В(&Список).