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