Когда фактически выполняется запрос в Построителе отчета или запроса 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При работе с объектами ПостроительОтчета и ПостроительЗапроса многие разработчики сталкиваются с неожиданным поведением метода Выполнить(). На первый взгляд кажется, что вызов этого метода должен приводить к мгновенному обращению к базе данных, однако практика и замеры производительности показывают иное. Давайте вместе разберем, как именно платформа управляет выполнением запросов в этих объектах и почему это происходит именно так.

Разбор механизма работы метода Выполнить()

Важно понимать, что в объектной модели ПостроительОтчета метод Выполнить() по своей сути не является командой на отправку запроса к СУБД. Согласно документации и внутренним особенностям платформы, этот метод лишь выставляет внутренний флаг необходимости перевыполнения запроса. Это значит, что само «общение» с информационной базой откладывается на более поздний этап.

Фактическое выполнение запроса происходит только в момент обращения к результату построителя. Это классическая реализация концепции «ленивых вычислений» (lazy evaluation). Платформа ждет до последнего, пока прикладной код явно не запросит данные для отображения или обработки.

В какой момент происходит обращение к данным?

Разберем типичный сценарий использования. Допустим, мы настраиваем построитель и хотим получить данные. Многие ошибочно полагают, что запрос уже «готов» после первого этапа:


// Это действие НЕ вызывает обращение к базе данных
Построитель.Выполнить();

// Запрос к БД будет выполнен только сейчас:
РезультатЗапроса = Построитель.Результат;
Данные = РезультатЗапроса.Выгрузить();

Таким образом, выполнение происходит именно в момент обращения к свойству Результат или вызова методов получения данных, таких как Выгрузить() или Выбрать(). Если вы вызываете Выполнить() повторно без изменения настроек, платформа использует уже сформированный результат, если флаг перевыполнения не был сброшен.

Почему это было реализовано именно так?

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

Благодаря «ленивым вычислениям», платформа позволяет:

  1. Изменять настройки построителя сколько угодно раз без лишней нагрузки на сервер.
  2. Подготовить план запроса (аналог prepare в SQL) до его реального выполнения.
  3. Выполнить запрос один раз только тогда, когда данные действительно потребовались для вывода в ТабличныйДокумент или для программной обработки.

Осторожно: работа в отладчике

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

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

Рекомендации для разработчиков

Анализируя ситуацию с ПостроительОтчета, мы приходим к следующим выводам:

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

← На главную