Как программно заменить вариант отчета СКД при открытии формы?

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

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

Почему настройки не применяются в ПриСозданииНаСервере?

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

Способ 1: Использование параметров при открытии формы

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

Рассмотрим пример кода для открытия отчета с конкретным вариантом:


ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("КлючВарианта", "Основной"); // Имя варианта из конфигуратора или GUID из хранилища
ОткрытьФорму("Отчет.МойОтчет.Форма", ПараметрыОткрытия);

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

Способ 2: Загрузка варианта из ХранилищаВариантовОтчетов

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


ИмяОтчета = "Отчет.НовыйОтчет";
СписокВариантов = ХранилищеВариантовОтчетов.ПолучитьСписок(ИмяОтчета);

Для Каждого ЭлементСписка Из СписокВариантов Цикл
    Если ЭлементСписка.Представление = "НужныйВариант" Тогда
        КлючВарианта = ЭлементСписка.Значение;
        Настройки = ХранилищеВариантовОтчетов.Загрузить(ИмяОтчета, КлючВарианта);
        
        // Загружаем настройки в компоновщик
        Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
        Прервать;
    КонецЕсли;
КонецЦикла;

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

Способ 3: Работа с событиями формы отчета

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

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

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

Способ 4: Изменение варианта через встроенные возможности СКД

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


// Получаем схему
Схема = Отчет.ПолучитьМакет("ОсновнаяСКД");
// Ищем нужный вариант по имени, заданному в конфигураторе
Вариант = Схема.ВариантыНастроек.Найти("Дополнительный");

Если Вариант <> Неопределено Тогда 
    // Загружаем настройки варианта в компоновщик
    Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Вариант.Настройки);
КонецЕсли;

После этого не забудьте обновить пользовательские настройки, иначе визуально в форме отчета ничего не изменится:


Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(Отчет.КомпоновщикНастроек.Настройки.ПользовательскиеНастройки);

Подведем итоги

Для того чтобы программная смена варианта отчета СКД работала стабильно, придерживайтесь следующих правил:

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

← На главную