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

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

Что означают ключевые слова в запросе 1С: подробный разбор языка запросов

Разбираем, что означают ключевые слова в запросе 1С: ВЫБРАТЬ, ГДЕ, СОЕДИНЕНИЕ, РАЗЛИЧНЫЕ, ПЕРВЫЕ, ИТОГИ. Примеры, типичные ошибки и советы для разработчиков.

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

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

Что такое запрос в 1С и где он встречается

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

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

Базовая структура: что означают ВЫБРАТЬ, ИЗ и ГДЕ

Минимальный запрос состоит из трёх частей. ВЫБРАТЬ (SELECT) перечисляет поля, которые нужно получить. ИЗ (FROM) указывает источник данных — например, Справочник.Номенклатура или Документ.РеализацияТоваровУслуг. ГДЕ (WHERE) задаёт условие отбора строк.

Пример простейшего запроса:

ВЫБРАТЬ

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

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

ИЗ

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

ГДЕ

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

Здесь КАК Номенклатура — это псевдоним таблицы, который упрощает обращение к полям. Условие НЕ Номенклатура.ПометкаУдаления исключает помеченные на удаление элементы — одна из самых частых ошибок новичков: забыть этот фильтр и получить в отчёте «мусорные» строки.

Модификаторы выборки: РАЗЛИЧНЫЕ, ПЕРВЫЕ, РАЗРЕШЕННЫЕ

После слова ВЫБРАТЬ могут стоять уточняющие ключевые слова. РАЗЛИЧНЫЕ (DISTINCT) убирает дубли строк из результата. ПЕРВЫЕ N (TOP) ограничивает количество возвращаемых записей — полезно, когда нужен один последний документ или топ-10 товаров.

РАЗРЕШЕННЫЕ (ALLOWED) — специфичное для 1С ключевое слово: оно включает в результат только те записи, на которые у текущего пользователя есть права (механизм RLS). Без него запрос может вернуть данные, которые пользователь не должен видеть, либо вызвать ошибку доступа.

Ключевое словоЧто означаетКогда применять
РАЗЛИЧНЫЕИсключает повторяющиеся строкиСписки уникальных контрагентов, складов
ПЕРВЫЕ NОграничивает число строкПоследний документ, топ продаж
РАЗРЕШЕННЫЕУчитывает права доступа RLSОтчёты для пользователей с ограничениями

Важно понимать: ПЕРВЫЕ без сортировки (УПОРЯДОЧИТЬ ПО) возвращает произвольные записи. Если нужен именно последний документ, обязательно добавьте сортировку по дате по убыванию.

Соединения таблиц: ЛЕВОЕ, ВНУТРЕННЕЕ и их ловушки

ЛЕВОЕ СОЕДИНЕНИЕ (LEFT JOIN) возвращает все строки левой таблицы и подтягивает совпадения из правой; если совпадения нет — поля правой таблицы будут NULL. ВНУТРЕННЕЕ СОЕДИНЕНИЕ (INNER JOIN) возвращает только те строки, где совпадение есть в обеих таблицах.

Типичная ошибка — использовать внутреннее соединение там, где нужно левое. Например, при выборке товаров с остатками внутреннее соединение отбросит товары без остатков, и они пропадут из отчёта. Если нулевые остатки нужны — применяйте левое соединение и обрабатывайте NULL через функцию ЕСТЬNULL(Поле, 0).

Типичные ошибки
01
Внутреннее соединение вместо левого — из результата пропадают строки без совпадений
02
Соединение по неточному условию — строки задваиваются, суммы в отчёте завышаются
03
Отсутствие фильтра по пометке удаления — в выборку попадают удалённые объекты
04
Использование ПЕРВЫЕ без УПОРЯДОЧИТЬ ПО — возвращается случайная запись
05
Сравнение с NULL через знак равенства — условие никогда не срабатывает, нужен оператор ЕСТЬ NULL

Группировки, итоги и агрегатные функции

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

Конструкция ИТОГИ ПО — особенность 1С: она добавляет в результат итоговые записи по указанным измерениям. Это удобно для построения деревьев (например, продажи по регионам с расшифровкой по менеджерам), но увеличивает объём результата. В СКД итоги обычно строятся средствами компоновки, и дублировать их в тексте запроса не нужно.

КОЛИЧЕСТВО(Поле) и КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Поле) — разные вещи. Первый вариант считает все непустые значения, второй — только уникальные. Для подсчёта числа разных документов всегда используйте РАЗЛИЧНЫЕ, иначе получите завышенные цифры.
ПЗ
Практическое замечание

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

У регистров накопления и сведений есть виртуальные таблицы: Остатки, Обороты, СрезПоследних, СрезПервых. Они вычисляются платформой на лету и принимают параметры в скобках: период, условие отбора. Например, РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &Склад).

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

Как написать и проверить запрос
  1. 1
    Откройте конструктор запроса в модуле и выберите нужные таблицы и поля
  2. 2
    Добавьте условия отбора через параметры (&Имя), а не конкатенацией строк
  3. 3
    Для виртуальных таблиц укажите параметры в скобках, а не в ГДЕ
  4. 4
    Выполните запрос в консоли запросов на тестовой копии базы и сверьте результат с ожидаемым
  5. 5
    Проверьте время выполнения на реальном объёме данных и наличие задвоений строк

Условия, объединения и вложенные запросы

Кроме ГДЕ, в языке есть ИМЕЮЩИЕ (HAVING) — фильтр по результатам агрегации, например ИМЕЮЩИЕ СУММА(Сумма) > 100000. Оператор В (IN) проверяет вхождение значения в список или результат вложенного запроса. ОБЪЕДИНИТЬ (UNION) склеивает результаты нескольких запросов, а ОБЪЕДИНИТЬ ВСЕ — то же самое, но без удаления дублей, что работает быстрее.

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

Как проверить, что запрос работает правильно

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

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

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

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

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

Совпадает с ожидаемым числом объектов

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

Строк больше — вероятно задвоение из-за соединения

Суммы по документам
Норма

Сходятся со стандартным отчётом конфигурации

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

Суммы завышены — дубли строк или лишнее ОБЪЕДИНИТЬ ВСЕ

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

Доли секунды на типовой выборке

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

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

NULL в полях
Норма

NULL только там, где данных действительно нет

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

NULL в ключевых полях — неправильный тип соединения

Итог

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

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

Частые вопросы

Что означает ошибка «Поле не найдено» в запросе 1С?

Запрос обращается к полю, которого нет в указанной таблице, либо имя написано с опечаткой. Проверьте точное имя реквизита в конфигураторе и убедитесь, что используется правильный псевдоним таблицы. Надёжнее всего собрать запрос заново через конструктор — он подставляет только существующие поля.

Чем запрос 1С отличается от обычного SQL?

Запрос 1С работает с объектами метаданных, а не с физическими таблицами СУБД, поддерживает только чтение данных и имеет специфические конструкции: РАЗРЕШЕННЫЕ, ИТОГИ ПО, виртуальные таблицы регистров, ПОМЕСТИТЬ. Операторы INSERT, UPDATE и DELETE в языке запросов 1С отсутствуют.

Что означает символ & в тексте запроса?

Амперсанд обозначает параметр запроса. Значение параметра задаётся в коде через метод УстановитьПараметр("Имя", Значение) до выполнения запроса. Параметры позволяют безопасно подставлять значения и дают платформе возможность оптимизировать выполнение.

Когда использовать временные таблицы вместо вложенных запросов?

Временные таблицы оправданы, когда промежуточный результат используется несколько раз или соединение через вложенный запрос работает медленно. Их можно проиндексировать, что ускоряет последующие соединения. Для одноразовой простой логики достаточно вложенного запроса.

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

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

Что означает «пакетный запрос» и зачем он нужен?

Пакетный запрос — это несколько запросов в одном тексте, разделённые точкой с запятой. Обычно первые запросы создают временные таблицы (ПОМЕСТИТЬ), а последний возвращает итоговый результат. Метод ВыполнитьПакет() возвращает массив результатов всех запросов пакета.