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

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

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

Основы синтаксиса и структура запроса

Любой запрос в 1С начинается с ключевого слова ВЫБРАТЬ, за которым следует перечень полей, которые необходимо получить. В отличие от классического SQL, здесь нет звезды (*) для выбора всех полей, что заставляет разработчика явно указывать нужные атрибуты. Это требование повышает читаемость кода и снижает объем передаваемых данных.

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

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

💡

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

Рассмотрим базовую структуру на примере выборки номенклатуры:

ВЫБРАТЬ

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

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

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

ИЗ

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

ГДЕ

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

Здесь мы видим использование ключевого слова КАК для присвоения псевдонимов. Это стандартная практика, делающая код самодокументируемым. Обратите внимание, что поле ЭтоГруппа является служебным реквизитом справочника, который часто используется для фильтрации папок и элементов.

Работа с соединениями таблиц (JOIN)

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

Существует несколько типов соединений, каждый из которых влияет на итоговый набор строк. Внутреннее соединение (INNER) оставляет только те записи, для которых есть соответствие в обеих таблицах. Левое соединение (LEFT) сохраняет все записи из левой таблицы, добавляя данные из правой там, где они есть, и заполняя пустоты NULL-значениями.

  • 🔗 ВНУТРЕННЕЕ СОЕДИНЕНИЕ: возвращает только пересекающиеся данные двух таблиц.
  • ⬅️ ЛЕВОЕ СОЕДИНЕНИЕ: возвращает все данные из левой таблицы плюс совпадения из правой.
  • ➡️ ПРАВОЕ СОЕДИНЕНИЕ: зеркально левому, используется крайне редко из-за читаемости.
  • 🔄 ПОЛНОЕ СОЕДИНЕНИЕ: объединяет все записи из обеих таблиц без потерь.

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

☑️ Проверка соединения таблиц

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

Пример левого соединения документа реализации с табличной частью:

ВЫБРАТЬ

ДокументРеализацияТоваровУслуг.Ссылка,

Товары.Номенклатура,

Товары.Количество

ИЗ

Документ.РеализацияТоваровУслуг КАК ДокументРеализацияТоваровУслуг

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

ПО ДокументРеализацияТоваровУслуг.Ссылка = Товары.Ссылка

Использование временных таблиц и пакетов запросов

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

Синтаксически временная таблица создается с помощью конструкции ПОМЕСТИТЬ.. ИЗ. Имя такой таблицы всегда начинается с символа #. Это мощный инструмент для декомпозиции задачи: сначала вы отбираете сырые данные, затем фильтруете их, группируете и только потом выводите финальный результат.

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

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

ПОМЕСТИТЬ ВременныеОстатки

ВЫБРАТЬ

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

СУММА(ОстаткиТоваровОстатки.КоличествоОстаток) КАК Количество

ИЗ

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

ГДЕ

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

ВЫБРАТЬ

ВременныеОстатки.Номенклатура,

ВременныеОстатки.Количество

ИЗ

#ВременныеОстатки КАК ВременныеОстатки

ГДЕ

ВременныеОстатки.Количество > 0

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

Временные таблицы существуют только в контексте выполнения пакета запросов. Если вы попытаетесь обратиться к таблице #ВремТаб из другого, независимого запроса, система выдаст ошибку"Неизвестное поле" или"Таблица не найдена".

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

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

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

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

Функция Описание Тип возвращаемого значения
СУММА Вычисляет сумму значений поля Число
КОЛИЧЕСТВО Подсчитывает количество записей Число
ЕСТЬNULL Заменяет NULL на указанное значение Тип аргумента
ПОДСТРОКА Извлекает часть строки Строка

Особое внимание стоит уделить функции ЕСТЬNULL. В 1С отсутствие значения (NULL) часто приводит к ошибкам при арифметических операциях. Обернув поле в эту функцию, вы гарантируете, что вместо пустоты будет подставлен ноль или другое значение по умолчанию.

💡

Порядок полей в блоке ПО влияет на сортировку результата внутри групп. Если вам нужна специфическая последовательность, явно указывайте поля в нужном порядке.

Пример группировки продаж по менеджерам:

ВЫБРАТЬ

Продажи.Менеджер,

СУММА(Продажи.Сумма) КАК ОбщаяСумма,

КОЛИЧЕСТВО(Продажи.Ссылка) КАК КоличествоЧеков

ИЗ

Документ.ЧекККМ.Продажи КАК Продажи

ГДЕ

Продажи.Дата МЕЖДУ &Начало И &Конец

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

Продажи.Менеджер

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

ОбщаяСумма УБЫВ

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

Написание работающего запроса — это только половина дела. В высоконагруженных системах 1С критически важна скорость выполнения. Неоптимизированный запрос может"положить" сервер на несколько минут, блокируя работу других пользователей. Основное правило оптимизации — сужение выборки на ранних этапах.

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

⚠️ Внимание: Избегайте использования функций в левой части условий сравнения (например, ГОД(Дата) = 2026). Это запрещает использование индекса по полю Дата, заставляя систему перебирать все записи подряд. Пишите Дата МЕЖДУ...

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

  • 🚀 Используйте индексы: проверяйте, что поля в условиях WHERE проиндексированы.
  • 📉 Фильтруйте заранее: отбирайте нужный период и организацию до соединений.
  • Избегайте SELECT *: выбирайте только те поля, которые реально нужны отчету.
📊 Какой этап написания запроса для вас самый сложный?
Построение соединений (JOIN)
Работа с временными таблицами
Оптимизация скорости
Синтаксис группировки

Анализ плана выполнения запроса в Консоли запросов помогает понять, какие этапы занимают больше всего времени. Если вы видите полный обход таблицы (Table Scan) там, где ожидается поиск по индексу, стоит пересмотреть условия отбора.

Частые ошибки и способы их устранения

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

Другая частая проблема — неверная работа с типами данных при использовании параметров. Если в коде 1С параметру присвоено значение типа Строка, а в запросе оно сравнивается с полем типа Число, возникнет ошибка преобразования типов. Всегда инициализируйте параметры перед выполнением запроса.

⚠️ Внимание: Конфигурация базы данных и структура таблиц могут меняться при обновлении типовой конфигурации. Запросы, жестко привязанные к конкретным именам таблиц, могут перестать работать после обновления. Используйте объекты метаданных там, где это возможно.

Ошибка"Таблица не найдена" часто возникает при опечатках в именах виртуальных таблиц или при попытке обратиться к таблице, которая не была добавлена в список источников запроса. Внимательно проверяйте дерево полей в Консоли запросов.

Что делать, если запрос выполняется долго, но без ошибок?

Попробуйте выполнить его с меньшим периодом. Если скорость нормальная — проблема в объеме данных. Проверьте индексы и попробуйте разбить запрос на этапы с использованием временных таблиц.

Для отладки используйте метод ТекстЗапроса объекта запроса, чтобы вывести сформированный текст в журнал регистрации или консоль. Это помогает увидеть реальные значения параметров, подставленные в запрос перед выполнением.

В чем разница между Виртуальной таблицей и обычной таблицей регистра?

Обычная таблица регистра содержит все записанные движения (строки таблицы). Виртуальная табеля — это специальный механизм, который"на лету" рассчитывает итоги (остатки, обороты) или выбирает последние записи, используя оптимизированные алгоритмы платформы. Работать через виртуальные таблицы всегда быстрее для отчетов.

Можно ли выполнить запрос к базе данных напрямую через SQL?

Технически это возможно через ODBC или специальные обработки, но категорически не рекомендуется в рабочей конфигурации 1С. Прямой SQL обходит механизмы блокировок, транзакций и прав доступа 1С, что может привести к порче данных или блокировке сеансов.

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

Для передачи списка используйте тип значения СписокЗначений в коде 1С. В тексте запроса такой параметр обрабатывается автоматически, раскрываясь в конструкцию В (Значение1, Значение2..). Это эффективнее, чем склеивать строку запроса вручную.

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

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

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

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