Здравствуйте.
СКД.
Есть отбор, настроенный руками по умолчанию в конфигураторе:
ВидРасчета НеВСписке ...(пусто)
Отбор включен в быстрые настройки и отображается при входе в отчет
В процедуре ПриКомпоновкеРезультата я программно задаю список значений (правое условие этого отбора)
Далее, при выполнении отчета отбор применяется и самой печ.форме отчета (настройка выводить отбор включена) данный отбор выводиться, все ок.
Но несмотря на то, что к отчету отбор применился, в форме по прежнему, галка не стоит у отбора и список значений пуст
А мне бы хотелось, чтобы он заполнился тем списком, к-й я программно установил и который фактически применился.
То есть, чтобы форма настроек соответствовала фактическому отбору.
Вопрос: как это сделать?
Получить форму отчета и как-то выполнить команду Обновить()?
Так как отбор включен в пользовательские настройки, то заполнять условие отбора нужно в пользовательских настройках компоновщика настроек, а потом с помощью метода ПолучитьНастройки() получать настройки для передачи в компоновщик макета. Как то так:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
УстановитьПараметрПользовательскойНастройки(КомпоновщикНастроек.ПользовательскиеНастройки, "ДатаНачала", '2016-01-01');
УстановитьПользовательскуюНастройку(КомпоновщикНастроек, КомпоновщикНастроек.ПользовательскиеНастройки, "Склад", Справочники.Склады.НайтиПоКоду("000000001"));
НастройкиКомпоновки = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Процедура УстановитьПараметрПользовательскойНастройки(ПользовательскиеНастройки, ИмяНастройки, Значение)
ПолеКомпоновкиПараметр = Новый ПараметрКомпоновкиДанных(ИмяНастройки);
ЭлементОтбора = Неопределено;
Для Каждого Элемент Из ПользовательскиеНастройки.Элементы Цикл
Если Элемент.Параметр = ПолеКомпоновкиПараметр Тогда
Элемент.Значение = Значение;
Элемент.Использование = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура УстановитьПользовательскуюНастройку(КомпоновщикНастроекКомпоновкиДанных, ПользовательскиеНастройки, ИмяНастройки, ПравоеЗначение)
ПолеКомпоновки = Новый ПолеКомпоновкиДанных(ИмяНастройки);
ЭлементОтбора = Неопределено;
Для Каждого Элемент Из КомпоновщикНастроекКомпоновкиДанных.Настройки.Отбор.Элементы Цикл
Если Элемент.ЛевоеЗначение = ПолеКомпоновки Тогда
ЭлементОтбора = Элемент;
Прервать;
КонецЕсли;
КонецЦикла;
Если Элемент = Неопределено Тогда
Возврат;
КонецЕсли;
Элемент = ПользовательскиеНастройки.Элементы.Найти(ЭлементОтбора.ИдентификаторПользовательскойНастройки);
Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Элемент.ПравоеЗначение = ПравоеЗначение;
Элемент.Использование = Истина;
КонецПроцедуры
Все равно в самой форме список значений не заполнился, т.е. в отладке видно, что
Элемент.Использование = Истина;
Элемент.ПравоеЗначение = <Нужный список значений>;
А на форме все равно ничего не поменялось.
И еще: в вашем примере УстановитьПараметрПользовательскойНастройки - лишняя для данной темы, там ведь значение совсем другого параметра устанавливается?
У вас получилось добиться именно обновления самого поля ввода в Форме?
(7) Да, пример про параметр лишний, это так скажем, на всякий случай :)
Обновления поля достичь получилось. Вы и сами можете посмотреть, как это работает, так как отчет сделан на примере демонстрационной конфигурации "Управляемое приложение".
(10) Наверное, именно этот не получиться, т.к. это модификация типового отчета в ЗУП, там подтягиваются еще из типовой конфы истинные тексты запроса.
Если только мне попробовать упрощенный вариант создать и на нем попробовать.
А по коду выше ничего не подскажете, его не достаточно?
(14) Посмотрел конфу, вроде, все также делаю.
Как вы думаете, возможно, дело в БСП.
Т.е. конфа типовая и все формирования происходят через длительные операции (или как их там), т.е. в фоне.
Возможно, поэтому не обновляется сама форма?
(16) А не скажете, если программно каждый раз выполнять этот код при формировании отчета, не будет "плодиться" число элементов отбора?
А то 10 раз нажму - вдруг 10 раз добавиться условие, а потом сохраним вариант и так и останется, нет?
Если мы говорим за БСП, обнаружил странное - если нажать Настройки и закрыть их, добавленные поля пользовательской настройки появляются.
А вот само по себе не обновляется.
Обнаружил, что нужно вызывать специальный метод БСП ОтчетыСервер.ОбновитьЭлементыФормыНастроек, вот пример расширения типовой формы отчета (не до конца допиленный, но нужное видно):
&НаКлиенте
Процедура пно_ПриОткрытииПеред(Отказ)
пно_УстановитьЭлементПользовательскогоОтбораСКД(Отчет.КомпоновщикНастроек, ВидСравненияКомпоновкиДанных.Равно,
"Номенклатура", ПредопределенноеЗначение("Справочник.Номенклатура.ПустаяСсылка"));
пно_ОбновитьПользовательскиеНастройки();
КонецПроцедуры
&НаСервере
Процедура пно_ОбновитьПользовательскиеНастройки()
ОтчетыСервер.ОбновитьЭлементыФормыНастроек(ЭтаФорма, Элементы.КомпоновщикНастроекПользовательскиеНастройки);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура пно_УстановитьЭлементПользовательскогоОтбораСКД(КомпоновщикНастроек, ВидСравнения, ИмяПоля, Значение, GUID = Неопределено)
//Добавляем и в настройки тоже
GUID = Новый УникальныйИдентификатор();
СКДОтбор = КомпоновщикНастроек.Настройки.Отбор;
ЭлементОтбораСКД = Неопределено;
Если ЭлементОтбораСКД = Неопределено Тогда
ЭлементОтбораСКД = СКДОтбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбораСКД.ИдентификаторПользовательскойНастройки = GUID;
ЭлементОтбораСКД.ВидСравнения = ВидСравнения;
ЭлементОтбораСКД.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);
ЭлементОтбораСКД.ПравоеЗначение = Значение;
ЭлементОтбораСКД.Использование = Истина;
ЭлементОтбораСКД.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;
КонецЕсли;
КонецПроцедуры
Показать
Также рекомендую по добавлению пользовательских полей: