При разработке внешних отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с серьезным ограничением платформы: Конструктор запроса в Конфигураторе не «видит» поля, добавленные через расширения. Это происходит потому, что контекст расширения применяется в режиме «Предприятие», а Конфигуратор работает только с основной метаданной базой. Рассмотрим подробнее, как обойти это ограничение и заставить отчет работать с новыми данными.
Когда мы создаем внешний отчет (файл .erf), он существует автономно от конфигурации. Даже если расширение подключено к текущей базе, Конструктор запроса при редактировании схемы компоновки данных опирается на структуру основной конфигурации. Если нужного поля там нет, конструктор выдаст ошибку «Поле не найдено», а при попытке сохранить запрос — просто удалит «несуществующее» поле. Проанализируем основные способы решения этой задачи.
Этот метод считается одним из самых гибких. Суть заключается в том, чтобы в самом запросе СКД создать «заглушку» (пустое поле), а перед формированием отчета заменить эту заглушку на реальное обращение к реквизиту расширения. Рассмотрим пошагово, как это реализовать.
1. В Конструкторе запроса набора данных создаем поле-пустышку. Например:
0 КАК Оприходование
2. В модуле объекта внешнего отчета находим или создаем предопределенную процедуру ПриКомпоновкеРезультата. Нам нужно перехватить процесс компоновки и заменить текст запроса в схеме.
Разберем пример кода для такой подмены:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
// Получаем текст запроса из основного набора данных
ТекстЗапроса = СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос;
// Формируем реальное выражение, которое использует поле из расширения
РеальноеПоле = "ВЫБОР
| КОГДА ЗаказНаПроизводство2_2Продукция.Отменено = ИСТИНА
| ТОГДА ЗаказНаПроизводство2_2Продукция.Расш1_БезСпецификации
| ИНАЧЕ 0
|КОНЕЦ КАК Оприходование";
// Выполняем замену заглушки на реальный код
НовыйТекстЗапроса = СтрЗаменить(ТекстЗапроса, "0 КАК Оприходование", РеальноеПоле);
// Устанавливаем измененный запрос обратно в схему
СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = НовыйТекстЗапроса;
КонецПроцедуры
Важный момент: если вы используете поле в ресурсах, убедитесь, что имя поля в запросе после замены совпадает с именем поля, которое вы настроили на вкладке «Ресурсы» и «Настройки» СКД.
Этот метод наиболее предпочтителен для сложных отчетов, так как он позволяет избежать ручной правки кода и ошибок при замене строк. Проанализируем последовательность действий:
.xml.Внимание: после загрузки схемы в Конфигураторе категорически нельзя открывать Конструктор запроса. Если вы его откроете, он снова проверит запрос по основной конфигурации и «вырежет» поле расширения. Просто сохраняйте отчет и проверяйте его работу в режиме Предприятия.
Если вам необходимо постоянно использовать Конструктор запроса и вы не хотите работать с XML-файлами, можно прибегнуть к «хитрости» с копией базы:
Выясним еще одну важную деталь, упомянутую опытными разработчиками. Если вы выбираете поле из расширения во временную таблицу (ВТ), обязательно проверьте следующие моменты:
Иногда поле не отображается в отчете даже при правильном запросе. Посмотрим на ситуацию с точки зрения безопасности: при добавлении реквизита в расширение, права на него часто не назначаются автоматически для всех ролей. Проверьте, что в расширении создана роль, дающая право на Чтение и Просмотр этого реквизита, и эта роль назначена пользователям, либо в расширении включен флаг «Использовать основные роли для всех пользователей».
Таким образом, использование реквизитов из расширений во внешних отчетах требует особого подхода: либо через программную модификацию схемы СхемаКомпоновкиДанных.НаборыДанных, либо через разработку в контексте, где эти метаданные уже доступны (Консоль СКД в режиме Предприятия).