Как во внешнем отчете на СКД использовать параметр справочника из расширения

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке внешних отчетов (файлы с расширением .erf) разработчики нередко сталкиваются с ситуацией, когда в качестве параметра или отбора схемы компоновки данных требуется выбрать справочник, добавленный не в основную конфигурацию, а в расширение. При попытке настроить схему стандартным образом в конфигураторе возникает проблема: конструктор СКД не видит типы данных расширения либо сбрасывает их при сохранении отчета.

Выясним причину такого поведения платформы 1С и подробно разберем рабочие варианты решения данной задачи.

Почему возникает сложность с метаданными расширений

Проанализируем архитектурную особенность работы конфигуратора с внешними файлами. Конфигуратор валидирует и компилирует внешние отчеты и обработки исключительно в контексте метаданных основной конфигурации. Метаданные подключенных расширений в этот контекст не входят, поэтому конструктор запросов и палитра типов СКД просто не знают о существовании новых справочников или документов из расширения.

Если тип параметра все же был прописан вручную или перенесен из расширения, то при любом последующем открытии схемы компоновки или редактировании состава полей в конфигураторе платформа выполняет проверку типов. Не найдя объект в основной ветке метаданных, конфигуратор сбрасывает тип параметра в Неопределено либо выдает ошибку о том, что таблица или тип не найдены.

В то же время в режиме «1С:Предприятие» при активном расширении структуры метаданных объединяются динамически, и тип ссылки вида СправочникСсылка.Префикс_ИмяСправочника является полностью рабочим и доступным. Наша цель — обойти ограничения конфигуратора при проектировании схемы и корректно передать нужный тип в пользовательский интерфейс.

Способ 1. Создание отчета внутри расширения с последующим экспортом

Разберем самый быстрый способ создания отчета, который нашел автор обсуждения. Этот подход не требует сложного программного кода, но имеет важные нюансы при повторном редактировании.

  1. Откроем конфигуратор и перейдем в дерево метаданных нужного расширения конфигурации.
  2. Добавим новый отчет непосредственно в ветку Отчеты расширения. В этом контексте отчету доступны абсолютно все объекты: как метаданные основной конфигурации, так и собственные справочники расширения.
  3. Создадим основную схему компоновки данных. На вкладке Параметры выберем требуемый справочник расширения из списка доступных типов без каких-либо ошибок.
  4. Если отчет должен подключаться через подсистему «Дополнительные отчеты и обработки» (БСП), сразу добавим в модуль объекта функцию СведенияОВнешнейОбработке() и пропишем все стандартные параметры регистрации.
  5. Сохраним расширение, затем нажмем правой кнопкой мыши по созданному отчету в дереве расширения и выберем пункт Сохранить как внешний отчет, обработку....

Обратите внимание: полученный файл .erf будет корректно работать в пользовательском режиме. Однако если в дальнейшем вы откроете этот файл в конфигураторе автономно и зайдете в редактор СКД, конфигуратор сотрет тип параметра. Любые дальнейшие доработки схемы рекомендуется выполнять внутри расширения с повторным сохранением отчета в файл.

Способ 2. Ослабление типа в СКД и программное ограничение на форме

Рассмотрим более устойчивый способ, исключающий случайное повреждение схемы в конфигураторе. Мы настраиваем параметр в СКД так, чтобы он не вызывал ошибок валидации, а конкретный тип справочника задаем на управляемой форме в момент ее открытия.

  1. В конструкторе схемы компоновки данных для параметра укажем составной тип, тип ЛюбаяСсылка либо снимем ограничение типа вовсе. Конфигуратор примет такую схему без предупреждений.
  2. Создадим управляемую форму отчета и вынесем параметр на форму (например, в пользовательские настройки или в отдельное поле ввода).
  3. В модуле формы отчета найдем или создадим обработчик события ПриСозданииНаСервере.
  4. Программно назначим реквизиту или элементу формы жесткое ограничение типа, указав полное имя справочника с префиксом расширения:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Ограничиваем выбор типа для элемента формы
    ИмяТипа = "СправочникСсылка.Префикс_НовыйСправочник";
    Элементы.ПараметрНовыйСправочник.ОграничениеТипа = Новый ОписаниеТипов(ИмяТипа);
    
КонецПроцедуры

При таком подходе отчет можно спокойно дорабатывать в конфигураторе в автономном режиме. Пользователь же на форме сможет выбрать исключительно элементы справочника из расширения.

Способ 3. Программная инициализация типа в схеме компоновки

Проанализируем вариант, когда требуется жестко задать тип значения непосредственно в объекте СхемаКомпоновкиДанных без изменения макета вручную. Это особенно полезно, если отчет формируется программно или параметр выбирается через стандартную панель настроек СКД.

Переопределить описание типа параметра можно в модуле объекта отчета перед компоновкой данных:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    ПараметрСКД = СхемаКомпоновкиДанных.Параметры.Найти("ИмяПараметра");
    Если ПараметрСКД <> Неопределено Тогда
        ИмяТипа = "СправочникСсылка.Префикс_НовыйСправочник";
        ПараметрСКД.ТипЗначения = Новый ОписаниеТипов(ИмяТипа);
    КонецЕсли;
    
КонецПроцедуры

В этом случае при вызове компоновки платформа в среде предприятия уже будет оперировать точным типом значения из расширения.

Способ 4. Хранение схемы в двоичных данных (XML)

Разберем продвинутый способ, который полностью изолирует схему от проверок конфигуратора при разработке внешнего отчета. Этот вариант применяется в сложных отчетах, где много зависимостей от метаданных расширения (полей, таблиц запроса, параметров).

  1. Настроим схему в расширении или с помощью консоли СКД в режиме предприятия, где доступны все таблицы.
  2. Выгрузим готовую схему компоновки данных в XML-файл.
  3. В автономном внешнем отчете добавим макет с типом Двоичные данные (назовем его, например, СхемаXML) и загрузим туда полученный файл.
  4. В модуле объекта перехватим процесс компоновки и заменим пустую или базовую схему на десериализованную из макета:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    МакетДвоичныеДанные = ПолучитьМакет("СхемаXML");
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
    МакетДвоичныеДанные.Записать(ИмяВременногоФайла);
    
    ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл(ИмяВременногоФайла);
    СхемаИзXML = СериализаторXDTO.ПрочитатьXML(ЧтениеXML, Тип("СхемаКомпоновкиДанных"));
    ЧтениеXML.Закрыть();
    УдалитьФайлы(ИмяВременногоФайла);
    
    // Заменяем схему компоновщика настроек на прочитанную из XML
    КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаИзXML));
    КомпоновщикНастроек.ЗагрузитьНастройки(СхемаИзXML.НастройкиПоУмолчанию);
    
КонецПроцедуры

Конфигуратор при открытии такого .erf файла видит только двоичные данные и не проводит синтаксический анализ структуры СКД, благодаря чему схему невозможно случайно повредить.

Важные рекомендации при работе с метаданными расширений

В процессе обсуждения участники затронули важную архитектурную проблему: создание собственных объектов учета (справочников и документов) в расширениях несет серьезные риски для целостности базы данных.

  1. Префиксы объектов: При обращении к объектам расширения в коде всегда указывайте полное имя с префиксом расширения (например, СправочникСсылка.МойПрефикс_Справочник1). Без префикса платформа выдаст исключение о неизвестном типе.
  2. Риски обновления СУБД: Справочники и документы из расширений создают в СУБД отдельные таблицы с суффиксами вида _DocumentX1. При удалении расширения эти таблицы не всегда очищаются корректно, а при обновлении конфигурации возможны коллизии неуникальных индексов в общих журналах. Если предполагается хранение критически важных учетных данных, создавайте структуры в основной конфигурации.
  3. Размещение в расширении: Если отчет разрабатывается под конкретную конфигурацию, в которой уже активно расширение, зачастую надежнее оставить отчет внутри самого расширения в дереве метаданных, не выгружая его в отдельный файл. Это избавит от необходимости обходить ограничения валидации типов.
← На главную