Как программно применить пользовательские настройки в отчетах СКД на базе БСП

Программист 1С v8.3 (Управляемые формы) Управленческий учет Промышленность, строительство и АПК
← На главную

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

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

Метод 1. Программный вызов формы с передачей параметров

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

Проанализируем пример кода для вызова формы внешнего отчета, подключенного через механизм Дополнительные отчеты и обработки:


&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    
    // Подготавливаем пользовательские настройки на сервере
    ПользовательскиеНастройки = ПолучитьПользовательскиеНастройкиНаСервере(ОбъектыНазначенияМассив[0]);
    
    ПараметрыОтчета = Новый Структура;
    // Ключевой параметр для автоматического формирования
    ПараметрыОтчета.Вставить("СформироватьПриОткрытии", Истина);
    ПараметрыОтчета.Вставить("КлючВарианта", "Основной");
    ПараметрыОтчета.Вставить("ПользовательскиеНастройки", ПользовательскиеНастройки);
    
    // Передача отборов напрямую (опционально, если не через ПользовательскиеНастройки)
    УсловияОтбора = Новый Структура;
    УсловияОтбора.Вставить("Организация", ОбъектыНазначенияМассив[0].Организация);
    ПараметрыОтчета.Вставить("Отбор", УсловияОтбора);

    // Подключаем внешний отчет и открываем форму
    // ИмяОбработкиСлужебное получается через ДополнительныеОтчетыИОбработкиВызовСервера.ПодключитьВнешнююОбработку
    ОткрытьФорму("ВнешнийОтчет." + ИмяОбработкиСлужебное + ".Форма", ПараметрыОтчета, ЭтаФорма);
    
КонецПроцедуры

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

Метод 2. Использование обработчиков событий БСП

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

Во-первых, необходимо разрешить перехват события загрузки настроек в процедуре ОпределитьНастройкиФормы:


Процедура ОпределитьНастройкиФормы(Отчет, КлючВарианта, НастройкиОтчета) Экспорт
    НастройкиОтчета.События.ПриЗагрузкеПользовательскихНастроекНаСервере = Истина;
КонецПроцедуры

Затем в процедуре ПриЗагрузкеПользовательскихНастроекНаСервере мы можем программно «дозаполнить» параметры, которые были переданы в ДополнительныеСвойства настроек:


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

Метод 3. Решение проблемы при StandardProcessing = False

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

Разберем, как гарантировать применение настроек в коде формирования:

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

Пример реализации в модуле отчета:


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

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

Рассмотрим дополнительные нюансы, которые часто становятся причиной ошибок при работе с СКД в БСП:

Отображение параметров на форме: Если вы программно заполнили период или другой параметр, но он не отображается в шапке отчета на форме, проверьте свойство ИдентификаторПользовательскойНастройки. БСП связывает элементы формы именно по этому идентификатору. Если вы программно добавляете элементы в отбор, идентификатор может отсутствовать, и форма не поймет, что нужно обновить визуальное поле.

Использование фиксированных настроек: Если вам нужно передать отборы, которые пользователь не должен иметь возможности изменить, используйте свойство ФиксированныеНастройки в параметрах формы. Они накладываются поверх пользовательских и гарантированно применяются движком СКД.

Особенности типа «СтандартныйПериод»: При программной установке периода убедитесь, что вы передаете объект СтандартныйПериод, а не просто даты начала и конца, если в СКД параметр настроен именно как период. Выясним причину возможной ошибки: если тип параметра в СКД — СтандартныйПериод, а вы передаете Дата, компоновщик может просто проигнорировать такое значение без сообщения об ошибке.

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

← На главную