Каждый разработчик 1С рано или поздно сталкивается с мистическим поведением отладчика: при пошаговом выполнении кода значения переменных (особенно таблиц значений, построителей отчетов или процессоров компоновки) внезапно «пропадают» — колонки «Значение» и «Тип» в окне «Вычислить выражение» становятся пустыми. Попытка сделать следующий шаг (клавиши F10 или F11) приводит к глухому зависанию конфигуратора, а через некоторое время система «отпускает» или предлагает перезапустить предмет отладки.
В этой статье мы подробно разберем, почему возникает этот эффект, как поведение платформы 1С:Предприятие связано с внутренними запросами к СУБД и какими способами можно предотвратить подобные зависания при разработке.
Давайте проанализируем, что происходит, когда мы добавляем сложный объект, такой как ПостроительОтчета или ПроцессорКомпоновкиДанных, в табло отладчика или пытаемся вычислить его через «Shift + F9».
Объект ПостроительОтчета содержит внутри себя не просто текст запроса, а сложную структуру метаданных, коллекций и настроек. Чтобы показать нам дерево свойств этого объекта в окне отладки, конфигуратор выполняет неявное обращение к его внутренним реквизитам. В этот момент платформа инициирует:
Если запрос в отчете написан неоптимально, содержит сложные вложенные соединения или обрабатывает гигантские массивы данных (что часто встречается в тяжелых конфигурациях, таких как «Альфа-Авто»), обращение отладчика к свойствам объекта вызывает долгое «подвисание» рабочего процесса сервера 1С (rphost). В результате разработчик видит пустые строки в отладчике, пока СУБД обрабатывает этот тяжелый неявный запрос.
Начиная с версии платформы 8.3.10, разработчики 1С внедрили механизм асинхронного вычисления значений в табло отладчика. Это было сделано для того, чтобы тяжелые вычисления не блокировали интерфейс конфигуратора намертво.
Рассмотрим, как это работает на практике и почему это приводит к «пропаданию» значений:
Построитель.В версиях платформы 1С 8.3.12 и выше активно развивался протокол отладки по HTTP. В отличие от классического TCP-протокола, HTTP-отладка гораздо более чувствительна к таймаутам соединения и объемам передаваемых данных между сервером отладки и конфигуратором.
Если фоновое вычисление свойств тяжелого объекта превышает лимит времени ожидания (таймаут), установленный на сервере или в настройках отладки, сетевое соединение разрывается. Отладчик «теряет» связь с предметом отладки, из-за чего при нажатии F5 система выдает сообщение с предложением перезапустить отлаживаемое приложение.
Рассмотрим типичный фрагмент кода отчета, при пошаговом прохождении которого отладчик может зависнуть на любой строке:
Если Построитель = Неопределено Тогда
Построитель = ОтчетОбъект.ПостроительОтчета;
КонецЕсли;
Построитель.ИзмеренияСтроки.Очистить();
Построитель.ИзмеренияКолонки.Очистить();
Построитель.Порядок.Очистить();
ОтчетОбъект.ДополнительныеПоляОтчета.Очистить();
Если Не Построитель.ВыводитьДетальныеЗаписи Тогда
Построитель.ВыбранныеПоля.Очистить();
КонецЕсли;
В данном примере при попытке просмотреть переменную Построитель на строках очистки коллекций (например, Построитель.ИзмеренияСтроки.Очистить()), отладчик будет принудительно инициализировать и вычислять всю структуру построителя отчета. Если в этот момент текст запроса построителя некорректен или база данных перегружена, зависание гарантировано.
Чтобы эффективно работать с отчетами и тяжелыми объектами в отладчике 1С, рекомендуем использовать следующие приемы:
Построитель или ПостроительОтчета целиком, вычисляйте конкретные простые свойства. Например, вместо просмотра всего дерева объекта введите в табло:
Построитель.Текст — для анализа текста запроса;
Построитель.Параметры — для просмотра параметров запроса.
Понимание внутренних механизмов работы платформы 1С:Предприятие 8 при взаимодействии с СУБД позволяет существенно сберечь время и нервы при разработке сложных аналитических отчетов.