При разработке внешних отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с неприятной ситуацией: в расширении добавлены новые реквизиты к типовым справочникам или документам, в режиме 1С:Предприятие они прекрасно видны и заполняются, но при попытке выбрать их в конструкторе запроса внешнего отчета (файл .erf) эти поля просто отсутствуют в списке. Рассмотрим, почему так происходит, и разберем проверенные способы решения этой задачи.
Для начала проанализируем ситуацию с точки зрения архитектуры платформы. Основная причина, по которой конструктор запросов «не видит» реквизиты расширения, заключается в особенностях работы конфигуратора с метаданными. Когда мы открываем внешний отчет через меню «Файл — Открыть», конфигуратор обращается исключительно к основной конфигурации базы данных.
Расширение — это динамический слой, который накладывается на основную конфигурацию только в момент запуска сеанса в режиме предприятия. Конфигуратор же в статике «знает» только о тех полях, которые жестко прописаны в корневом дереве метаданных. Поэтому, даже если реквизиты добавлены в расширение, для внешнего файла отчета, открытого отдельно, их не существует.
Рассмотрим подробнее четыре способа, как обойти это ограничение и успешно создать отчет.
Это самый логичный и «чистый» способ с точки зрения платформенных механизмов. Если нам нужно, чтобы конструктор запросов видел поля расширения, мы должны поместить сам отчет в это же расширение.
Отчеты новый объект или перенесем туда наш внешний отчет..erf), если политика разработки запрещает хранить отчеты внутри конфигурации.Важное замечание: При сохранении из расширения во внешний файл, схема СКД может содержать ссылки на уникальные идентификаторы объектов расширения. В некоторых версиях платформы это может привести к ошибкам при запуске в базах, где данное расширение отсутствует или имеет другое имя.
Если мы не хотим вносить изменения в структуру расширения или основной конфигурации, воспользуемся инструментами режима 1С:Предприятие. В пользовательском режиме расширения уже подключены и активны, а значит, метаданные доступны в полном объеме.
Рассмотрим алгоритм действий:
.xml).Этот метод позволяет избежать «ошибок валидации» в конфигураторе, так как запрос будет сформирован корректно в той среде, где поля физически существуют.
Этот способ часто используют опытные разработчики для быстрой отладки сложных отчетов, когда нужно многократно менять запрос в конструкторе. Суть заключается в обмане конфигуратора.
Разберем по шагам:
МестаХранения). Тип данных можно поставить самый простой, например, Строка(10).Внимание: Будьте осторожны при использовании этого метода в рабочей базе. Лучше выполнять такие манипуляции в копии для разработки, чтобы случайно не заблокировать работу пользователей обновлением конфигурации БД.
Если вы предпочитаете полный контроль над процессом, можно использовать программную подмену текста запроса непосредственно перед выполнением отчета. Это позволяет хранить в схеме СКД «валидный» для конфигуратора запрос, а в рантайме превращать его в полноценный запрос с полями расширения.
Проанализируем пример кода в модуле объекта отчета, в событии ПриКомпоновкеРезультата:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Получаем схему из макета
СхемаКД = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
// Находим нужный набор данных (обычно это НаборДанных1)
НаборДанных = СхемаКД.НаборыДанных.Найти("НаборДанных1");
Если НаборДанных <> Неопределено Тогда
// Заменяем текст запроса на тот, который содержит реквизиты расширения
// Конфигуратор его не пропустил бы, но платформа в режиме предприятия выполнит
НаборДанных.Запрос =
"ВЫБРАТЬ
| МестаХранения.Ссылка КАК Ссылка,
| МестаХранения.ДополнительныйРеквизитИзРасширения КАК СпецПоле
|ИЗ
| Справочник.МестаХранения КАК МестаХранения";
КонецЕсли;
// Далее стандартный вывод отчета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКД, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Особое внимание стоит уделить регистрам накопления и сведений, добавленным через расширения. Существует известная особенность платформы (особенно ярко выраженная в версиях ниже 8.3.15): виртуальные таблицы (такие как Остатки или Обороты) для регистров из расширений могут быть недоступны во внешних отчетах.
Если вы столкнулись с тем, что поле КоличествоОстаток не обнаруживается, хотя сам регистр в расширении есть, попробуйте следующие шаги:
Подводя итог, можно сказать, что наиболее стабильным и рекомендуемым подходом является временное добавление отчета в состав расширения на период разработки. Это гарантирует корректную работу конструктора и минимизирует количество ошибок при обращении к новым типам данных.