Прежде всего следует различать три вида настроек:
- Фиксированные настройки, сделанные программным путем, помещаются в свойство динамического списка КомпоновщикНастроек.ФиксированныеНастройки;
- Настройки, сделанные в конфигураторе, помещаются в свойство динамического списка КомпоновщикНастроек.Настройки;
- Пользовательские настройки, сделанные в режиме 1С:Предприятие, помещаются в свойство динамического списка КомпоновщикНастроек.ПользовательскиеНастройки.
Пользовательские настройки загружаются из системного хранилища и накладываются на настройки, сделанные в конфигураторе. В случае пересечения этих настроек пользовательские настройки имеют больший приоритет, то есть «затирают» настройки конфигуратора.
Затем к полученным настройкам применяются фиксированные настройки. Но в случае пересечения этих настроек будет выдаваться ошибка. Например, при передачи отбора в параметрах формы отчета, этот отбор помещается в фиксированные настройки. Поэтому пользователь уже не сможет установить отбор по тому же полю.
Если у отчет сформирована форма, то параметры отчета можно установить в процедурах модуля формы:
- ПередЗагрузкойВариантаНаСервере() - если нет пользовательских настроек или если отчет формируется в первых раз и пользовательские настройки ещё не были автоматически созранены
- ПередЗагрузкойПользовательскихНастроекНаСервере() - так как эта процедура выполняется после ПередЗагрузкойВариантаНаСервере(), и, если пользовательские настройки есть, то они перезапишут настройки варианта отчета.
Если форма не создана и надо установить параметры независимо от пользовательских настроек, например заполнение обязательного поля, то в настройки можно установить в модуле объекта отчета в процедуре ПриКомпоновкеРезультата().
Предварительно надо получить настройки отчета с учетом установленных пользовательских настроек:
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
Надо иметь ввиду, что это не ссылка на настройки отчета, а копия настроек с учетом примененных пользовательских настроек. После внесения изменений в настройки надо их передать в компоновщик макета (МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки))
Если учитывать пользовательские настройки не обязательно, то можно обратиться к настройкам как
Настройки = КомпоновщикНастроек.Настройки;
Здесь идет прямое обращение к настройкам отчета, а не копия настроек и можно напрямую вносит изменения, не передавая их потом в компоновщик макета.
Можно конечно использовать метод КомпоновщикНастроек.ПользовательскиеНастройки для прямого обращения к пользовательским настройкам, но проще работать через КомпоновщикНастроек.ПолучитьНастройки().
После того, как обратились к настройкам, надо найти нужный параметр или отбор или сортировку, в зависимости от того, что хотим изменить.
Изменение параметров
Если получили настройки через КомпоновщикНастроек.Настройки или КомпоновщикНастроек.ПолучитьНастройки(), то получить параметр можно следующим образом:
НужныйПараметр = Настройки.ПараметрыДанных.Элементы.Найти("Подразделение");
здесь "Подразделение" - это название параметра.
Если надо прочитать значение то:
Если НужныйПараметр.Использование Тогда
Подразделение = пПодразделение.Значение;
Иначе
Подразделение = Неопределено;
КонецЕсли;
Если надо установить значение то
НужныйПараметр.Использование = Истина;
НужныйПараметр.Значение = Подразделение;
Так же можно обращаться к параметрам по индексу, но надо иметь ввиду, что при изменении параметров, надо проверять, не поменялись ли индексы тех параметров, к которым обращались программно.
Есть метод установки значения параметра по имени с одновременной установкой признака "Использование" = Истина:
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода",'20111201');
При установки параметра в Пользовательских настройках значение параметра не будет отображаться на форме.
Чтобы значение обновилось надо явно указать его в пользовательских настройках:
// Получаем текущие настройки, включая пользовательские и находим нужный параметр
ТекущиеНастройки = Отчет.КомпоновщикНастроек.ПолучитьНастройки();
ПараметрСКД = ТекущиеНастройки.ПараметрыДанных.Элементы.Найти("ТипЗвонка");
//Используем идентификатор параметра, для поиска его в пользовательских настройках.
Если ЗначениеЗаполнено(ПараметрСКД.ИдентификаторПользовательскойНастройки) Тогда
ПользовательскийПараметр = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ПараметрСКД.ИдентификаторПользовательскойНастройки);
//Задаем значение и использование
Если ТипЗнч(ПользовательскийПараметр) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
ПользовательскийПараметр.Значение = НужноеЗначениеПараметра;
ПользовательскийПараметр.Использование = Истина;
КонецЕсли;
КонецЕсли;
Надо иметь ввиду, что КомпоновщикНастроек.ПолучитьНастройки() и КомпоновщикНастроек.Настройки - это разные вещи:
- Первые являются слепком всех настроек включая пользовательские и сами по себе не передаются в отчет. Если установить параметр из полученных настроек, то в событии ПриКомпоновкеРезультата надо писать код по формированию отчета и передавать полученные настройки.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();
// меняем настройки
// ...
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить( СхемаКомпоновкиДанных, НастройкиКомпоновки, ДанныеРасшифровки );
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки); //количество аргументов различается в разных релизах платформы. Как правило обязателен только первый папаметр
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры
- Вторые содержат параметры отчета, которые используются при формировании отчета. Из можно менять в процедуре ПриКомпоновкеРезультата().
Кроме изменения параметров можно менять пользовательские настройки. Важно, чтобы параметр был указан в пользовательских настройках (в макете СКД, в настройках варианта у параметра должна стоять галка "Включать в пользовательские настройки"). Если параметра в пользовательских настройка нет, то создать его принудительно не получиться, надо искать и менять основной параметр.
Пример изменения параметров:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
УстановитьЗначениеПараметра(Настройки, "Организация", ПолучитьОрганизациюГРО());
УстановитьПараметрПользовательскихНастроек(Настройки, "ВидыДоговоров", ПолучитьВидыДоговоров());
КонецПроцедуры
Процедура УстановитьЗначениеПараметра(Настройки, НазваниеПараметра, Значение)
НужныйПараметр = Новый ПараметрКомпоновкиДанных(НазваниеПараметра);
ПараметрНастройки = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти(НужныйПараметр);
Если ПараметрНастройки = Неопределено Тогда // не нашли такого параметра. Надо разбираться почему...
Возврат;
КонецЕсли;
Если Не ЗначениеЗаполнено(ПараметрНастройки.Значение) Тогда
ПараметрНастройки.Значение = Значение;
КонецЕсли;
КонецПроцедуры
Процедура УстановитьПараметрПользовательскихНастроек(Настройки, НазваниеПараметра, Значение)
ПараметрСКД = Настройки.ПараметрыДанных.Элементы.Найти(НазваниеПараметра);
Если ЗначениеЗаполнено(ПараметрСКД.ИдентификаторПользовательскойНастройки) Тогда //Если идентификатор не заполнен, то он не выведен в пользовательские настройки
ПользовательскийПараметр = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ПараметрСКД.ИдентификаторПользовательскойНастройки);
//Задаем значение и использование
Если ТипЗнч(ПользовательскийПараметр) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
ПользовательскийПараметр.Значение = ПараметрСКД.Значение;
ПользовательскийПараметр.Использование = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
|