Как правильно реализовать пользовательские настройки и подменить СКД через общие макеты в 1С

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

При разработке сложных отчетов в системе «1С:Предприятие 8.3» часто возникает необходимость использовать одну и ту же схему компоновки данных (СКД) в нескольких местах: во внешнем отчете, в составе конфигурации или как источник данных для других механизмов. Логичным решением кажется вынос схемы в Общие макеты. Однако при попытке программно подменить основную схему отчета разработчики часто сталкиваются с тем, что пользовательские настройки (быстрые отборы, параметры в шапке) исчезают, а сам отчет отказывается формироваться в фоновом режиме. Разберем детально, как решить эти проблемы.

Причина потери пользовательских настроек при программной подмене схемы

Для начала проанализируем ситуацию: почему при назначении ОтчетОбъект.СхемаКомпоновкиДанных из общего макета форма отчета становится «пустой»? Проблема заключается в том, что интерфейс (GUI) формы отчета в 1С жестко связан с Компоновщиком настроек, который, в свою очередь, инициализируется на основании конкретной схемы.

Рассмотрим ключевой нюанс: форма отчета создается в конфигураторе с определенными метаданными. Если в свойствах формы или самого отчета не указано использование системы компоновки данных, механизмы автоматического построения интерфейса настроек просто не включаются. Как отмечают опытные разработчики, форма, созданная «под СКД», и «обычная» форма отчета внутри представляют собой разные структуры (даже на уровне XML-описания), и программно изменить это поведение в рантайме невозможно.

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

Правильная инициализация компоновщика настроек

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

  1. Получаем схему из общего макета.
  2. Помещаем её во временное хранилище (это критично для работы компоновщика).
  3. Инициализируем источник доступных настроек.
  4. Загружаем настройки по умолчанию.
  5. Восстанавливаем состояние настроек для формы.

Посмотрим на пример кода, который необходимо разместить в модуле формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
    
    // Получаем схему из общих макетов
    НоваяСхема = ПолучитьОбщийМакет("СКД_ОбщийИсточник");
    ОтчетОбъект.СхемаКомпоновкиДанных = НоваяСхема;
    
    // Помещаем схему во временное хранилище, чтобы компоновщик имел к ней доступ
    АдресСхемы = ПоместитьВоВременноеХранилище(НоваяСхема, УникальныйИдентификатор);
    
    // Инициализируем компоновщик настроек новым источником данных
    ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы);
    Отчет.КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
    
    // Загружаем настройки из схемы (это создаст структуру пользовательских настроек)
    Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(НоваяСхема.НастройкиПоУмолчанию);
    
    // Восстанавливаем настройки (важно для корректного отображения элементов формы)
    Отчет.КомпоновщикНастроек.Восстановить();
    
    ЗначениеВРеквизитФормы(ОтчетОбъект, "Отчет");
    
КонецПроцедуры

Использование метода Восстановить() является обязательным, так как именно он синхронизирует внутреннее состояние компоновщика с визуальными элементами, которые пользователь видит на экране.

Проблема фонового формирования: почему схема «теряется»?

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

Объект фонового задания инициализируется заново из метаданных. Если в метаданных отчета основная схема отсутствует, фоновый процесс получит пустую схему и закономерно выдаст ошибку. Чтобы решить эту проблему, проанализируем ситуацию с событием ПриКомпоновкеРезультата в модуле объекта.

Для корректной работы в фоне необходимо переопределить схему непосредственно в момент компоновки:


// В модуле объекта отчета
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    // Если схема не установлена (например, при запуске из фона), подменяем её
    Если СхемаКомпоновкиДанных = Неопределено Тогда
        СхемаКомпоновкиДанных = ПолучитьОбщийМакет("СКД_ОбщийИсточник");
    КонецЕсли;
    
    // Если вы используете программный вывод, не забудьте установить СтандартнаяОбработка = Ложь
КонецПроцедуры

Особенности работы с БСП и дополнительными отчетами

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

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

Резюме и рекомендации

Подводя итог, выделим основные правила работы с общими макетами СКД:

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

← На главную