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