Имя: Пароль:
1C
 
Не могу выполнить отчет с отборами из общей команды
0 zsergey
 
31.08.17
07:27
Всем привет!
Нужна ваша помощь. Суть такая: нужно из документа сформировать
отчет "Анализ субконто" с определенными параметрами и отбором.
Схема у отчета не предопределенная, т.е. компонуется программно, иначе бы не парился и сделал бы по учебнику:
https://its.1c.ru/db/metod8dev#content:3585:hdoc

Делал так:
1. Создал общую команду для нужных документов. Обработчик следующий:

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    //Вставить содержимое обработчика.
    //ПараметрыФормы = Новый Структура("", );
    //ОткрытьФорму("ОбщаяФорма.", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
    
    //Анализ субконто
    Форма = ПараметрыВыполненияКоманды.Источник;
    ДокСсылка = Форма.Объект.Ссылка;
    
    //Получаю форму
    ПараметрыФормы = Новый Структура("СформироватьПриОткрытии", Истина);
    ФормаОтчета = ПолучитьФорму("Отчет.АнализСубконто.ФормаОбъекта", ПараметрыФормы);
    
    //Параметры для отчета
    Параметры = ПодготовитьПараметрыДляОтчета(ДокСсылка);
    
    //Устанавливаем параметры
    ФормаОтчета.Отчет.Организация = Параметры.Организация;
    ФормаОтчета.Отчет.НачалоПериода = Параметры.НачалоПериода;
    ФормаОтчета.Отчет.КонецПериода = Параметры.КонецПериода;
    
    СписокВидовСубконто = Новый СписокЗначений;
    СписокВидовСубконто.Добавить(ПредопределенноеЗначение("ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты"));
    СписокВидовСубконто.Добавить(ПредопределенноеЗначение("ПланВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры"));
    ФормаОтчета.Отчет.СписокВидовСубконто = СписокВидовСубконто;
    
    //Устанавливаем отборы в настройках компоновщика
    //сначало отборы устанавливал здесь, но потом передумал
    //Настройки = ФормаОтчета.Отчет.КомпоновщикНастроек.Настройки;
    //Отборы = Настройки.Отбор;
    //Отборы.Элементы.Очистить();
    //...
    
    //затираем пользовательские настройки
    НовыеПользовательскиеНастройки = Новый ПользовательскиеНастройкиКомпоновкиДанных;
    ФормаОтчета.Отчет.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(НовыеПользовательскиеНастройки);
    
    //Устанавливаем группировки
    ФормаОтчета.Отчет.Группировка.Очистить();
    НоваяГруппировка = ФормаОтчета.Отчет.Группировка.Добавить();
    НоваяГруппировка.Использование=Истина;
    НоваяГруппировка.Поле="Контрагент";
    НоваяГруппировка.Представление="Контрагент";

    
    УстановитьНастройкиВариантаОтчета(ФормаОтчета.Отчет, Параметры);
    
    //
    ОткрытьФорму(ФормаОтчета);
    
КонецПроцедуры

2. Вроде все нормально, отчет открывается с нужными параметры (период, организация, субконто), а вот с отборами (по виду субконто "Контрагент", которого я беру из документа) возникла проблема. Не захотел он устанавливаться. Начал разбираться. Выяснил, что уже в в самом отчете перед формированием происходит инициализация компоновщика настроек и настройки берутся не у отчета, а  из вариантаНастроек схемы !!!. Короче вот типовой код:

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

    Форма.Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Форма.СхемаКомпоновкиДанных));
......

КонецПроцедуры

из этого выходит, что те отборы, которые я устанавливал в команде, тупо игнорируются.

Попробывал записать настройки в ВариантНастройки схемы. Сделал так:

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

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

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

Но как только возвращаюсь на клиента, выходит ошибка "Нельзя изменять поле, содержащее объект данных формы".

Теперь думаю, как решить проблему с отборами. Не париться, и заглушить в отчете загрузку настроек из ВариантаНастроек? Как-то не совсем правильно ...
1 zsergey
 
31.08.17
10:46
Как вне контекста отчета преобразовать "ДанныеФормыСтруктура" в объект, чтобы не было ошибки "Нельзя изменять поле, содержащее объект данных формы"?
Объект отчета мне нужен чтобы получить СхемуКомпоновки.