Имя: Пароль:
1C
1С v8
Программная установка отбора в СКД
0 red14_88
 
28.11.11
19:55
Сабж. В управляемых формых. Порывшись на форуме нашёл такой способ:
в команде открытия формы пишем:

&НаКлиенте
Процедура ОтчетОтгрузок(Команда)
   СтруктураНастроек = ОткрытьОтчет("RedСостоянияОтгрузок",Элементы.Список.ТекущиеДанные.Грузополучатель);
   ОткрытьФорму("Отчет.RedСостоянияОтгрузок.Форма.ФормаОтчета",СтруктураНастроек);
КонецПроцедуры

&НаСервере
Функция ОткрытьОтчет(ТипОтчета,Грузополучатель)
   СтруктураНастроек = Новый Структура;
   ОтчетОбъект = Отчеты[ТипОтчета].Создать();
   КомпоновщикНастроек = ОтчетОбъект.КомпоновщикНастроек;
   КомпоновщикНастроек.Настройки.Отбор.Элементы[0].ПравоеЗначение = Грузополучатель;
   КомпоновщикНастроек.Настройки.Отбор.Элементы[0].Использование = Истина;    
   СтруктураНастроек.Вставить("Настройки",КомпоновщикНастроек.Настройки);
   Возврат СтруктураНастроек;
КонецФункции

В модуле формы отчета пишем:

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

В модуле объекта отчета соответственно:

Процедура СформироватьОтчет(Настройки, Результат, ДанныеРасшифровки) Экспорт
   ЭтотОбъект.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
   ЭтотОбъект.СкомпоноватьРезультат(Результат, ДанныеРасшифровки);    
КонецПроцедуры

В результате отчет формируется с моим отбором. Верно, собака, фомируется. Но в форме отчета отбор не устанавливается (вынесен как таблица с источником данных Отчет.КомпоновщикНастроек.Настройки.Отбор.
И поле результата неактивно, висит сплешка "нажмите сформировать чтобы тря-ля-ля". А надо мне не формировать отчет, мне надо отбор установить и фрому открыть.

Помогите, люди добрые, спасибо.
1 QLgKR
 
28.11.11
20:12
А не проще ли использовать параметры формы отчета Отбор и СформироватьПриОткрытии и не лепить все это?
2 red14_88
 
28.11.11
20:17
у формы нет параметра Отбор. Отбор это настройки компоновщика настроек. И как в СформироватьПриОткрытии передать значения отбора? Возможно, способ который я применил не самый лучший, но другого не знаю(
Изначально задача такая - форма списка документов, нажимем кнопку, открывается отчет с отбором по контрагенту, который в документе из активной строки. Как то так. Причем не обязательно сразу формировать отчет, надо именно установить отбор. Ибо форма под шибко умных юзверей. Выбрать из дерева контрагента задача непосильная.
3 QLgKR
 
28.11.11
20:28
(2)
Допустим есть отчет, у которого есть поле доступное для отбора Контрагент.

Контрагент = Элементы.Список.ТекущиеДанные.Грузополучатель;
Отбор = Новый Структура("Контрагент", Контрагент);
ПараметрыОтчета = Новый Структура("Отбор,СформироватьПриОткрытии", Отбор, Истина);
ОткрытьФорму("Отчет.RedСостоянияОтгрузок.Форма.ФормаОтчета", ПараметрыОтчета);
4 red14_88
 
28.11.11
20:40
Попробовал сделать так. Только у меня поле для отбора это "Заказ.Грузополучатель", соответственно ругается на

Отбор = Новый Структура("Заказ.Грузополучатель", Элементы.Список.ТекущиеДанные.Грузополучатель);

говорит "Параметр №1 недопустимое значение". Надо обязательно отдельным полем выносить в запросе?
5 QLgKR
 
28.11.11
20:49
(4) это конструктор структуры ругается.
Да надо делать отдельным полем или идти другим путем.
6 red14_88
 
28.11.11
21:04
Добавил поле. Отчет формируется, причем с верным отбором. Но, в форме отчета отбор по-прежнему не заполнен. Как и в случае, когда отбор накладывался моим способом. Мб надо как-то именно к элементу формы обратиться? Хотя врядли, он связан с отчетом, а отчет сформирован по нужному отбору...
7 teapot123
 
28.11.11
21:50
пользовательские настройки
идОтбор = КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки;
ЭлементОтбора = КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(идОтбор).Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение     = Новый ПолеКомпоновкиДанных("Организация");
ЭлементОтбора.ВидСравнения         = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование     = Истина;
ЭлементОтбора.ПравоеЗначение     = Значение;
8 red14_88
 
29.11.11
15:31
(7) не совсем понял, в каком месте этот код должен быть выполнен? И под "ИдентификаторПользовательскойНастройки" подразумевается идентификатор поля отбора, который в СКД назначен? В Вашем коде написано Добавить "(Тип("ЭлементОтбораКомпоновкиДанных")", а у меня поле отбора уже настроено в СКД, надо только значение установить.