Как программно открыть форму изменения варианта отчета СКД с сохранением текущих настроек

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

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

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

Анализ проблемы: почему настройки не подтягиваются автоматически?

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

Для решения этой задачи нам необходимо выполнить три условия:

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

Шаг 1. Подготовка и открытие формы на клиенте

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

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


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

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

Шаг 2. Инициализация компоновщика в форме варианта

Теперь разберем самое важное — как принять эти данные в самой форме изменения варианта. Основная ошибка заключается в попытке загрузить только пользовательские настройки. На самом деле, компоновщик должен «ожить». Для этого используется объект ИсточникДоступныхНастроекКомпоновкиДанных.

Проанализируем ситуацию в процедуре ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Если параметры не переданы, ничего не делаем
    Если Не Параметры.Свойство("АдресСхемы") Тогда
        Возврат;
    КонецЕсли;
    
    // 1. Инициализируем источник настроек на основе переданной схемы
    ИсточникНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(Параметры.АдресСхемы);
    Отчет.КомпоновщикНастроек.Инициализировать(ИсточникНастроек);
    
    // 2. Загружаем сначала основные настройки варианта
    Если Параметры.Свойство("Вариант") Тогда
        Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Параметры.Вариант);
    КонецЕсли;
    
    // 3. Поверх основных настроек накладываем пользовательские
    Если Параметры.Свойство("ПользовательскиеНастройки") Тогда
        Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(Параметры.ПользовательскиеНастройки);
    КонецЕсли;
    
    // 4. Восстанавливаем связи (это поможет избежать "зачеркнутых" полей)
    Отчет.КомпоновщикНастроек.Восстановить();
    
КонецПроцедуры

Разбор критических нюансов

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

Синхронизация при работе с внешними отчетами

Если вы разрабатываете внешний отчет (файл .erf), следует учитывать, что путь к форме будет выглядеть как ВнешнийОтчет.ИмяОтчета.Форма.ИмяФормы. Также крайне важно передавать УникальныйИдентификатор текущей формы при помещении схемы во временное хранилище. Это гарантирует, что данные будут доступны в течение всего времени жизни формы и не будут удалены сборщиком мусора преждевременно.

Посмотрим на пример того, как избежать появления зачеркнутых полей (состояние Доступность = Ложь). Часто это происходит, когда в ПользовательскиеНастройки передается объект, который ссылается на элементы настроек, не загруженных в компоновщик. Всегда проверяйте, что Отчет.КомпоновщикНастроек.Настройки, которые вы передаете, являются актуальными. Для этого перед вызовом формы на сервере в основной форме можно выполнить:


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

Однако в большинстве случаев достаточно связки Инициализировать() + ЗагрузитьНастройки() + ЗагрузитьПользовательскиеНастройки().

Заключение

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

← На главную