При работе с объектами ПостроительОтчета и ПостроительЗапроса многие разработчики сталкиваются с неожиданным поведением метода Выполнить(). На первый взгляд кажется, что вызов этого метода должен приводить к мгновенному обращению к базе данных, однако практика и замеры производительности показывают иное. Давайте вместе разберем, как именно платформа управляет выполнением запросов в этих объектах и почему это происходит именно так.
Важно понимать, что в объектной модели ПостроительОтчета метод Выполнить() по своей сути не является командой на отправку запроса к СУБД. Согласно документации и внутренним особенностям платформы, этот метод лишь выставляет внутренний флаг необходимости перевыполнения запроса. Это значит, что само «общение» с информационной базой откладывается на более поздний этап.
Фактическое выполнение запроса происходит только в момент обращения к результату построителя. Это классическая реализация концепции «ленивых вычислений» (lazy evaluation). Платформа ждет до последнего, пока прикладной код явно не запросит данные для отображения или обработки.
Разберем типичный сценарий использования. Допустим, мы настраиваем построитель и хотим получить данные. Многие ошибочно полагают, что запрос уже «готов» после первого этапа:
// Это действие НЕ вызывает обращение к базе данных
Построитель.Выполнить();
// Запрос к БД будет выполнен только сейчас:
РезультатЗапроса = Построитель.Результат;
Данные = РезультатЗапроса.Выгрузить();
Таким образом, выполнение происходит именно в момент обращения к свойству Результат или вызова методов получения данных, таких как Выгрузить() или Выбрать(). Если вы вызываете Выполнить() повторно без изменения настроек, платформа использует уже сформированный результат, если флаг перевыполнения не был сброшен.
С точки зрения архитектуры, такое решение является попыткой оптимизации. Рассмотрим ситуацию, когда пользователь интерактивно меняет отборы, группировки или порядок в окне отчета. Если бы каждое нажатие кнопки вызывало выполнение тяжелого запроса к SQL-серверу, система стала бы крайне медленной.
Благодаря «ленивым вычислениям», платформа позволяет:
prepare в SQL) до его реального выполнения.ТабличныйДокумент или для программной обработки.Существует важный нюанс, о котором обязан знать каждый разработчик: использование отладчика. Если вы добавите объект ПостроительОтчета с тяжелым запросом в окно «Табло» или попытаетесь «раскрыть» его свойства во время остановки кода, платформа может инициировать выполнение запроса автоматически, чтобы отобразить структуру данных или результат.
На практике это приводит к тому, что при отладке программа внезапно «зависает» на несколько секунд или даже минут. Если запрос сложный и обрабатывает большие объемы данных, отладка может стать крайне некомфортной. В таких случаях рекомендуем использовать профилировщик или технологический журнал для анализа реальной нагрузки, а не полагаться на просмотр свойств объекта в отладчике.
Анализируя ситуацию с ПостроительОтчета, мы приходим к следующим выводам:
Выполнить() точкой старта нагрузки на базу данных. Это лишь этап подготовки.Технологический журнал или SQL Profiler.ПостроительОтчета и ПостроительЗапроса считаются устаревшими (legacy-инструментами). В современных конфигурациях на 1С v8.3 приоритетным инструментом является Система Компоновки Данных (СКД).Понимание того, как и когда 1С обращается к данным, позволяет писать более предсказуемый и производительный код, избегая лишних ожиданий и «зависаний» системы.