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