Имя: Пароль:
1C
1С v8
Как открыть в тонком клиенте 1С отчет СКД, заполнить параметры и сформировать? [решено]
0 romix
 
23.05.15
16:45
Есть структура: контрагент, договор и так далее.
Нужно по кнопке на клиенте вызвать отчет на СКД, где настройки автоматически заполняются по этой структуре и автоматически же выполняется формирование отчета.
1С:Предприятие 8.3 (8.3.5.1517), тонкий клиент.

Пока сочинял вопрос - нашел на него ответ (пусть будет для поиска)
http://v8.1c.ru/metod/faq2/answer.jsp?id=641

На клиенте сделал вот так - все работает, формирует, всё красиво.


    УсловияОтбора=Новый Структура("Контрагент, Договор");
    УсловияОтбора.Контрагент=Контрагент;
    УсловияОтбора.Договор=Договор;
    ПараметрыФормы = Новый Структура("Отбор, СформироватьПриОткрытии", УсловияОтбора, Истина);
    ОткрытьФорму("Отчет.НазваниеМоегоОтчета.Форма", ПараметрыФормы);


Но в поля настроек СКД не передаются значения, и не ставятся галочки - они пустые... Это надо в модуле отчета, что ли, прописывать?
1 romix
 
23.05.15
17:06
Вот еще пишут
http://devtrainingforum.v8.1c.ru/forum/thread.jsp?id=617456&threadtype=0

      ПараметрыФормы = Новый Структура;
      ПараметрыФормы.Вставить("КлючВарианта","КассоваяКнигаПоДокументам");
      ПараметрыФормы.Вставить("СформироватьПриОткрытии",Истина);
      ПараметрыФормы.Вставить("ПользовательскиеНастройки");
2 rphosts
 
23.05.15
17:13
Можно а ПриОткрытии() анализировать параметры... можно создать форму, задать значения реквизитов потом сделать над формой Открыть() или ОткрытьМодально() (последнее не работает на самых последних версиях платформы)
3 rphosts
 
23.05.15
18:45
во, у меня оно вот так:

на форме (контекст клиента):

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

на той-же форме но на сервере:

&НаСервереБезКонтекста
Функция ПолучитьПользовательскиеНастройкиОтчета()
   Возврат Отчеты.КарточкаДоговора.Создать().КомпоновщикНастроек.ПользовательскиеНастройки;
КонецФункции


сам отчёт - голый СКД даже без формы, но у него есть параметр с именем ПараметрДоговор.
4 rphosts
 
23.05.15
18:49
и вот это на форме

&НаСервере
Процедура УстановитьЗначениеПользовательскойНастройки(Настройки, Имя, Значение)
   Для Каждого элемент Из Настройки.Элементы Цикл
       Если ТипЗнч(элемент) = Тип("ЗначениеПараметраНастроекКомпоновкиДанных") Тогда
           Если Строка(элемент.Параметр) = Имя Тогда
               элемент.Значение = Значение;
               элемент.Использование = Истина;
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;
КонецПроцедуры


немного коряво, но я тогда только учился СКД
5 Desna
 
23.05.15
19:23
вот как раз вчерашняя тема
Как правильно передать параметр в запрос через СКД?
Как правильно передать параметр в запрос через СКД?

с параметрами надо сразу по гуиду искать
6 romix
 
23.05.15
20:07
У меня заработало вот так:
На форме, из которой вызываю отчет:


&НаКлиенте
Процедура ОтчетПоСтроке(Команда)
    УсловияОтбора=Новый Структура("Контрагент, Договор");
    УсловияОтбора.Контрагент=Контрагент;
    УсловияОтбора.Договор=Договор;
    ПараметрыФормы = Новый Структура("Отбор1, СформироватьПриОткрытии", УсловияОтбора, Истина);
    ОткрытьФорму("Отчет.ИмяМоегоОтчета.Форма", ПараметрыФормы);
КонецПроцедуры


На форме отчета СКД (там надо создать форму ФормаОтчета):

&НаСервере
Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Настройки)
    Отбор=ЭтаФорма.Параметры.Отбор1;
    ПользНастройки=Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
    Для Каждого эл из ПользНастройки Цикл
        имя=""+эл.Параметр;
        Если Отбор.Свойство(имя) Тогда
            зн=Отбор[имя];
            эл.Использование=ЗначениеЗаполнено(зн);
            эл.Значение=зн;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
7 romix
 
23.05.15
20:09
Находить в отладчике, где чего в СКД, удобно через кнопку на форме.
8 romix
 
24.05.15
02:53
Для вызова не отдельного отчета, а его варианта, схема работы изменяется так:


    УсловияОтбора=Новый Структура("Контрагент, Договор");
    УсловияОтбора.Контрагент=Контрагент;
    УсловияОтбора.Договор=Договор;
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор1", УсловияОтбора);
    ПараметрыФормы.Вставить("СформироватьПриОткрытии1", Истина);
    ПараметрыФормы.Вставить("КлючВарианта","НазваниеМоегоВарианта");    
    ОткрытьФорму("Отчет.НазваниеМоегоОтчета.Форма", ПараметрыФормы);



&НаСервере
Процедура ПриЗагрузкеПользовательскихНастроекНаСервере(Настройки)
    Если ЭтаФорма.Параметры.Свойство("Отбор1") Тогда
        Отбор=ЭтаФорма.Параметры.Отбор1;
        ПользНастройки=Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
        Для Каждого эл из ПользНастройки Цикл
            имя=""+эл.Параметр;
            Если Отбор.Свойство(имя) Тогда
                зн=Отбор[имя];
                эл.Использование=ЗначениеЗаполнено(зн);
                эл.Значение=зн;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры
9 romix
 
28.05.15
13:53
Сергей milanse рекомендует такой способ вызова (иначе на клиенте могут не выставляться галочки при не созданных настройках, также тут есть вызов вложенной схемы:


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

    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор1", УсловияОтбора);
    ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
    ПараметрыФормы.Вставить("КлючВарианта", "НазваниеМоегоВариантаОтчета");
    ПараметрыФормы.Вставить("КлючНазначенияИспользования", "НазваниеМоегоВариантаОтчета");
    ПараметрыФормы.Вставить("ПользовательскиеНастройки", Новый ПользовательскиеНастройкиКомпоновкиДанных);    
    ОткрытьФорму("Отчет.НазваниеМоегоОтчета.Форма", ПараметрыФормы,,Истина);
КонецПроцедуры
10 romix
 
28.05.15
18:09
Соответственно, в отчете (надо создать форму под названием ФормаОтчета):


&НаСервере
Процедура ПриЗагрузкеВариантаНаСервере(Настройки)
    Если ЭтаФорма.Параметры.Свойство("Отбор1") Тогда
        Отбор=ЭтаФорма.Параметры.Отбор1;
        Отборы=Отчет.КомпоновщикНастроек.Настройки.Структура[0].Настройки.Отбор;
        ПараметрыДанных = Отчет.КомпоновщикНастроек.Настройки.Структура[0].Настройки.ПараметрыДанных;
        Для Каждого эл из Отбор Цикл
            Имя = эл.Ключ;
            Параметр = ПараметрыДанных.НайтиЗначениеПараметра(НОвый ПараметрКомпоновкиДанных(Имя));
            Если Параметр = Неопределено Тогда
                ОбщегоНазначенияКлиентСервер.УстановитьОтборУСпискаНаРавенство(Отборы,Имя,эл.Значение,,,,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ);
            Иначе
                 Параметр.Значение = эл.Значение;
                 Параметр.Использование = Истина;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры
11 ssh2006
 
28.05.15
18:28
Вроде бы расширение отчета поставляет в параметры упр формы такие параметры.

Вариант и Отбор

Отбор:
Расширение управляемой формы для отчета (Managed form extension for reports)
Отбор (Filter)
Описание:

Тип: Структура.
Используется для установки отбора и параметров данных в форме отчета.
Ключ элемента структуры содержит имя поля или параметра, на которое нужно наложить отбор.
Значение элемента структуры содержит значение отбора.
Если имеется параметр системы компоновки данных с именем, соответствующим имени ключа структуры, то значение будет установлено ему. Если параметра нет, но есть поле, то будет добавлен отбор на это поле.
Если значение является массивом или списком значений с не одним элементом, то отбор будет применяться с видом сравнения ВСписке.

Думается, достаточно просто передать эти параметры.
12 romix
 
28.05.15
18:37
(11) А тогда получаются пустые параметры (такие как период, контрагент и договор). Я хочу, чтобы пользователь мог их менять или снимать галочки для построения более широкого отчета.
13 romix
 
08.06.15
17:31
Если нет вложенных схем, то на форме отчета обработка выглядит так:

&НаСервере
Процедура ПриЗагрузкеВариантаНаСервере(Настройки)
    Если ЭтаФорма.Параметры.Свойство("Отбор1") Тогда
        Отбор=ЭтаФорма.Параметры.Отбор1;
        Отборы=Отчет.КомпоновщикНастроек.Настройки.Отбор;
        ПараметрыДанных = Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных;
        Для Каждого эл из Отбор Цикл
            Имя = эл.Ключ;
            Параметр = ПараметрыДанных.НайтиЗначениеПараметра(НОвый ПараметрКомпоновкиДанных(Имя));
            Если Параметр = Неопределено Тогда
                ОбщегоНазначенияКлиентСервер.УстановитьОтборУСпискаНаРавенство(Отборы,Имя,эл.Значение,,,,РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ);
            Иначе
                 Параметр.Значение = эл.Значение;
                 Параметр.Использование = Истина;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

14 DexterMorgan
 
08.06.15
17:35
(0) Ты это, че, развязался что ли?
15 romix
 
08.06.15
17:45
(14) Решил улучшить отчеты.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан