При работе с профессиональным инструментарием «Инструменты разработчика» (ИР) часто возникает вопрос: как перенести в консоль логику отчета, которая прописана не в самой схеме компоновки данных (СКД), а в модуле объекта? В современных конфигурациях (ЗУП 3.1, ERP 2.5) отчеты редко представляют собой «чистый» запрос. Текст запроса может динамически собираться, параметры — устанавливаться программно, а наборы данных — подменяться прямо перед выполнением. Рассмотрим подробно, как эффективно отлаживать такие отчеты, используя возможности Консоли компоновки данных ИР.
Самый простой, но «ручной» способ — это получение итогового текста запроса, который система генерирует после всех программных манипуляций в модуле объекта. Разберем этот процесс по шагам:
ПриКомпоновкеРезультата или вызов компоновщика макета).КомпоновщикМакета.Выполнить().МакетКомпоновки. Внутри этого объекта в коллекции НаборыДанных содержится итоговый текст запроса со всеми подставленными условиями и расширениями.Проанализируем пример кода для извлечения запроса в отладчике:
// В отладчике можно вычислить следующее выражение:
МакетКомпоновки.НаборыДанных.НаборДанных1.Запрос
Полученный текст запроса можно просто скопировать и вставить в Консоль компоновки ИР. Однако помните, что в этом случае вы потеряете связь с параметрами и настройками СКД, поэтому этот метод хорош только для быстрой проверки логики самого запроса.
Консоль компоновки ИР позволяет имитировать работу модуля объекта через встроенные обработчики. Рассмотрим, как правильно перенести код из конфигуратора в консоль. Проанализируем ситуацию: в отчете используется общий модуль для заполнения общих запросов (например, ЗарплатаКадрыОбщиеНаборыДанных).
Чтобы этот код заработал в консоли, перейдем на вкладку «События» и выберем обработчик «Перед компоновкой макета». Важно учитывать специфику контекста ИР. Вместо обращения ЭтотОбъект.СхемаКомпоновкиДанных, которое мы привыкли видеть в модуле отчета, в консоли следует обращаться напрямую к доступным переменным.
Рассмотрим пример адаптации кода:
// Код в модуле объекта отчета:
ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеЗапросы(ЭтотОбъект.СхемаКомпоновкиДанных.НаборыДанных, Истина);
// Код для вставки в обработчик Консоли ИР "Перед компоновкой макета":
ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеЗапросы(Схема.НаборыДанных, Истина);
Обратим внимание, что в контексте обработчика ИР объект Схема уже определен. Если вы попытаетесь использовать Объект.СхемаКомпоновкиДанных, система может выдать ошибку «Поле объекта не обнаружено», так как структура временного объекта в консоли отличается от типового отчета.
Выясним причину, по которой иногда даже перенос кода не помогает: отчет может зависеть от множества параметров сеанса или временных таблиц, созданных ранее. В консоли ИР есть мощная функция «захвата» текущего состояния схемы компоновки.
Посмотрим, как это сделать:
СхемыКомпоновкиДанных и НастроекКомпоновкиДанных и откроет их в новом окне консоли.Этот способ является наиболее предпочтительным для сложных отчетов в ERP-системах, так как он позволяет увидеть схему «как она есть» в памяти 1С непосредственно перед выполнением запроса к СУБД.
Если вы работаете с внешним отчетом (файл .erf), в составе ИР предусмотрен специальный инструмент — «Консоль внешних отчетов». Разберем ее преимущество: в отличие от обычной консоли СКД, она умеет загружать файл целиком, включая его модуль объекта.
Рассмотрим порядок действий:
.erf.Проанализируем типичные ошибки, с которыми сталкиваются разработчики:
1. Контекст исполнения кода. В обработчиках консоли ИР переменная ЭтотОбъект может ссылаться на саму обработку консоли, а не на ваш отчет. Всегда проверяйте, какие переменные проброшены в контекст (обычно это Схема, Настройки, КомпоновщикНастроек).
2. Использование параметров сеанса. Если программный код в модуле объекта обращается к параметрам сеанса, которые не инициализированы в текущем сеансе работы с консолью, возникнет ошибка. В этом случае в обработчике «Перед выполнением» нужно принудительно вызвать инициализацию параметров, например:
// Пример инициализации для типовых конфигураций
УстановкаПараметровСеанса.УстановитьПараметрыСеансаПользователя();
3. Динамические наборы данных. Если отчет программно добавляет НаборДанныхОбъект, убедитесь, что в консоли ИР на вкладке «Внешние наборы данных» вы указали таблицу (например, ТаблицаЗначений), которая будет имитировать эти данные, иначе компоновка завершится с ошибкой отсутствия набора.
Резюмируем: для простых правок достаточно скопировать итоговый запрос из макета компоновки через отладчик. Для полноценной разработки и циклической отладки лучше использовать вкладку «События» в ИР, заменяя обращения к ЭтотОбъект на прямые ссылки на Схему и КомпоновщикНастроек.