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

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

Для начала работы вам потребуется доступ к конфигуратору или режиму предприятия с правами на отладку. Создание запроса может происходить в разных контекстах: внутри программного кода, в консоли запросов для быстрой проверки гипотез или в схеме компоновки данных. Мы сосредоточимся на программном создании объектов типа Запрос и разберем основные этапы подготовки текста запроса перед его выполнением.

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

Любой запрос в 1С строится по определенной логической схеме, где каждое предложение выполняет свою функцию. Основным оператором является ВЫБРАТЬ, который указывает системе, какие именно поля необходимо получить из источника данных. Без этого ключевого слова система не поймет, что от нее требуется, и выдаст синтаксическую ошибку при компиляции текста.

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

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

⚠️ Внимание: Никогда не пишите условия отбора в тексте запроса, используя жестко заданные значения, если эти значения могут меняться. Всегда используйте параметры запроса, передавая их из кода 1С. Это защитит ваш код от SQL-инъекций и позволит переиспользовать один и тот же текст запроса для разных ситуаций.

Если необходимо упорядочить результаты, применяется оператор УПОРЯДОЧИТЬ ПО. Сортировка может выполняться по нескольким полям одновременно, с указанием направления сортировки (возрастание или убывание). Отсутствие явной сортировки не гарантирует, что данные придут в каком-то определенном порядке, поэтому для отчетов этот пункт является обязательным.

💡

Используйте псевдонимы для таблиц сразу после оператора ИЗ, например: ИЗ Справочник.Номенклатура КАК Номенклатура. Это упростит дальнейшее обращение к полям в условиях и списках выбора.

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

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

В верхней части окна конструктора отображается дерево метаданных, где вы можете найти нужный справочник, документ или регистр. Перетаскивая элементы из дерева в область выбранных полей, вы автоматически формируете часть текста после ВЫБРАТЬ. Конструктор также позволяет добавлять соединения между таблицами, создавая необходимые операторы ЛЕВОЕ СОЕДИНЕНИЕ или ВНУТРЕННЕЕ СОЕДИНЕНИЕ без ручного ввода сложного синтаксиса.

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

📊 Как вы чаще всего создаете запросы в 1С?
Пишу вручную в текстовом редакторе
Использую Конструктор запросов
Копирую из старых обработок
Генерирую через СКД

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

Параметризация и работа с временными таблицами

Эффективный запрос в 1С редко обходится без параметров. Параметры позволяют передавать в текст запроса внешние данные: даты отчетного периода, выбранные элементы справочников, флаги включения тех или иных блоков отчета. Объявление параметров происходит в начале текста запроса или автоматически при использовании символа & перед именем переменной в условиях.

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

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

ПОМЕСТИТЬ ВременныеДокументы

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

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

;

ВЫБРАТЬ

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

ВременныеДокументы.Сумма

ИЗ ВременныеДокументы КАК ВременныеДокументы

⚠️ Внимание: При работе с временными таблицами не забывайте ставить точку с запятой ; после каждого оператора ПОМЕСТИТЬ. Отсутствие разделителя приведет к ошибке синтаксиса, так как система не сможет определить границу между командами.

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

☑️ Правильная параметризация запроса

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

Соединения таблиц и типы джойнов

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

Самым распространенным типом является ЛЕВОЕ СОЕДИНЕНИЕ. При таком соединении в результат попадают все строки из левой таблицы (той, что указана первой), а из правой таблицы подтягиваются только совпадающие записи. Если совпадений нет, поля из правой таблицы будут заполнены пустыми значениями (NULL). Это идеальный вариант, когда нужно получить список всех документов, даже если к некоторым из них не привязаны дополнительные данные.

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

Тип соединения Левая таблица Правая таблица Результат при отсутствии совпадения
ЛЕВОЕ Все строки Только совпадения Строка есть, поля справа пустые
ВНУТРЕННЕЕ Только совпадения Только совпадения Строка исключается из выборки
ПОЛНОЕ Все строки Все строки Строка есть, пустые поля с одной стороны

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

Что такое декартово произведение?

Это ситуация, когда при соединении таблиц без условия или с неверным условием количество строк результата равно произведению количества строк в исходных таблицах. Например, соединение 1000 документов и 1000 товаров без условия даст 1 000 000 строк.

Агрегация данных и группировка

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

Использование агрегатных функций неразрывно связано с оператором СГРУППИРОВАТЬ ПО. Все поля, которые не участвуют в вычислениях (не обернуты в функции), должны быть обязательно перечислены в этом операторе. Система группирует строки по уникальным комбинациям значений указанных полей, а затем для каждой группы вычисляет агрегатные значения.

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

⚠️ Внимание: Функция ЕСТЬNULL часто необходима при группировке, если в группируемом поле могут быть пустые значения. Без нее строки с пустыми значениями могут быть исключены из группировки или сгруппированы некорректно в зависимости от версии платформы.

Помимо простой группировки, можно использовать оператор ИМЕЮЩИЕ, который работает аналогично ГДЕ, но применяется уже к результатам группировки. Это позволяет отфильтровать группы, например, показать только тех контрагентов, у которых сумма долга превышает определенное значение. Фильтрация через ИМЕЮЩИЕ происходит после вычисления агрегатов, в отличие от ГДЕ, который работает до группировки.

💡

Порядок выполнения критичен: сначала работает ГДЕ (фильтрация строк), потом ГРУППИРОВКА (объединение), и только потом ИМЕЮЩИЕ (фильтрация групп). Нарушение этого порядка в логике запроса приведет к неверным цифрам в отчете.

Оптимизация и отладка запросов

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

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

Одной из распространенных проблем является использование функций в условиях отбора, например ГОД(Документ.Дата) = 2026. Такое условие запрещает использование индекса по дате, заставляя систему перебирать все записи подряд. Правильный подход — использовать диапазоны дат: Документ.Дата >= НачалоГода(2026) И Документ.Дата < КонецГода(2026).

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

⚠️ Внимание: Интерфейс и возможности инструментов отладки могут отличаться в разных версиях платформы 1С:Предприятие (8.2, 8.3, 8.4 и новее). Всегда сверяйтесь с документацией к вашей конкретной версии платформы, если не можете найти определенную кнопку или параметр в консоли запросов.
💡

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

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

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

Для передачи списка в запрос используется специальный тип параметра. В тексте запроса условие пишется как Поле В (&ПараметрСписка). В коде 1С перед выполнением запроса необходимо установить значение параметра, присвоив ему объект типа СписокЗначений или массив. Система автоматически развернет этот список в набор значений для оператора В.

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

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

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

Чаще всего это происходит из-за опечатки в имени поля или таблицы. Проверьте, используете ли вы правильный псевдоним таблицы перед именем поля. Также убедитесь, что поле действительно существует в выбранной таблице или виртуальной таблице регистра. Если поле вычисляемое, проверьте правильность его объявления в секции выбора.

Можно ли выполнять запросы из внешней обработки без доступа к конфигуратору?

Да, можно. Объект Запрос доступен в режиме предприятия. Однако для выполнения запроса у пользователя должны быть соответствующие права доступа к данным (права на чтение таблиц). Если прав недостаточно, система выдаст ошибку доступа, даже если синтаксис запроса верен.

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

В консоли запросов выделите весь текст (Ctrl+A), скопируйте его (Ctrl+C) и вставьте в модуль объекта или общий модуль. Не забудьте проверить параметры: если в консоли они подставлялись автоматически, то в модуле вам нужно будет явно создать объект ПараметрыЗапроса и заполнить их перед вызовом метода Выполнить().