Имя: Пароль:
1C
Админ
СКД
0 Iceman_1982
 
27.11.12
15:07
Добрый день, уважаемые знатоки 1С. Пытаюсь реализовать следующий механизм. Создал в УТ 10.3 отчет. У отчета основная форма управляемая. В форме отчета сделал ссылку на справочник "Внешние обработки". У отчета в конфигурации создал пустую компоновку данных. Методика работы такая. В форме отчет выбираю отчет из внешних обработок. При выборе отчета из выбранного отчета должна браться схема компоновки и компоновщик настроек и копироваться в аналогичные объекты конфигурации. Делается это все для того чтобы можно было сформировать внешний отчет в управляемой форме. В итоге возникла следующая проблема. Настройки копируются нормально, а вот с компоновкой проблемы, при формировании отчета ругается на первую же группировку. Кто-нибудь реализовывал такую операцию или может кто знает как сделать по другому
1 lxndr
 
27.11.12
15:09
текст ошибки
2 Iceman_1982
 
27.11.12
15:10
по причине:
Ошибка исполнения отчета
по причине:
Поле не найдено "ЭкспедиторПеревозчик"
3 Iceman_1982
 
27.11.12
15:11
экспедиторперевозчик это первая группировка
4 lxndr
 
27.11.12
15:16
код, которым СКД собираешь и выводишь?
5 Iceman_1982
 
27.11.12
15:25
НаСервере
Процедура ЗагрузитьСКДНаСервере()
   ИмяФайла = ПолучитьИмяВременногоФайла();
   ДвоичныеДанные = Отчет.ВнешнийОтчет.ХранилищеВнешнейОбработки.Получить();
   ДвоичныеДанные.Записать(ИмяФайла);
   Форма = ВнешниеОтчеты.ПолучитьФорму(ИмяФайла);
   Макет = Отчеты.УниверсальныйУправляемыйОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
   Макет = Форма.СхемаКомпоновкиДанных;
   Отчет.КомпоновщикНастроек = Форма.КомпоновщикНастроек;    
КонецПроцедуры    

&НаКлиенте
Процедура ОтчетПриИзменении(Элемент)
   Если ЗначениеЗаполнено(Отчет.ВнешнийОтчет) Тогда
       ЗагрузитьСКДНаСервере();
   КонецЕсли;    
КонецПроцедуры
6 lxndr
 
27.11.12
15:28
Макет = Отчеты.УниверсальныйУправляемыйОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
   Макет = Форма.СхемаКомпоновкиДанных;

Что это? Сначала получил СКД отчета, потом СКД внешнего отчета.
Надо всю СКД вручную (программно) собирать.
7 Iceman_1982
 
27.11.12
15:30
у меня вся нужная СКД собрана во внешнем отчете, ее нужно динамически загрузить в СКД встроенного отчета
8 Iceman_1982
 
27.11.12
15:31
если подскажите каким образом ее пересобрать на основании СКД встроенного отчета, то буду благодарен
9 lxndr
 
27.11.12
15:32
возможно пересобирать и не потребуется. Попробуй так:
СхемаКомпоновкиДанных = Форма.СхемаКомпоновкиДанных;
10 Iceman_1982
 
27.11.12
15:40
не прокатывает, такая переменная не определена
11 lxndr
 
27.11.12
15:41
ОтчетОбъект.<Имя отчета>.СхемаКомпоновкиДанных (ReportObject.<Имя отчета>.DataCompositionSchema)
ОтчетОбъект.<Имя отчета> (ReportObject.<Имя отчета>)
СхемаКомпоновкиДанных (DataCompositionSchema)
Использование:

Чтение и запись.
Описание:

Тип: СхемаКомпоновкиДанных.
Схема компоновки, на основании которой будет выполняться отчет.

Доступность:

Сервер, толстый клиент, внешнее соединение.
12 lxndr
 
27.11.12
15:42
В модуле формы бращайся через ОтчетОбъект
13 Iceman_1982
 
27.11.12
15:49
Процедура ЗагрузитьСКДНаСервере()
   ИмяФайла = ПолучитьИмяВременногоФайла();
   ДвоичныеДанные = Отчет.ВнешнийОтчет.ХранилищеВнешнейОбработки.Получить();
   ДвоичныеДанные.Записать(ИмяФайла);
   Форма = ВнешниеОтчеты.ПолучитьФорму(ИмяФайла);
   //Отчеты.УниверсальныйУправляемыйОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
   //Макет = Форма.СхемаКомпоновкиДанных;
   Отчеты.УниверсальныйУправляемыйОтчет.СхемаКомпоновкиДанных = Форма.СхемаКомпоновкиДанных;
   Отчет.КомпоновщикНастроек = Форма.КомпоновщикНастроек;    
КонецПроцедуры    

&НаКлиенте
Процедура ОтчетПриИзменении(Элемент)
   Если ЗначениеЗаполнено(Отчет.ВнешнийОтчет) Тогда
       ЗагрузитьСКДНаСервере();
   КонецЕсли;    
КонецПроцедуры

Так ошибку выдает
14 Iceman_1982
 
27.11.12
15:50
ОтчетОбъект, также не обнаружен, если через него
15 lxndr
 
27.11.12
15:55
(14)
Блиин:
ОтчетОбъект = ДанныеФормыВЗначение(Отчет, Тип("ОтчетОбъект.УниверсальныйУправляемыйОтчет"));
16 Iceman_1982
 
27.11.12
16:02
написал вот так
ИмяФайла = ПолучитьИмяВременногоФайла();
   ДвоичныеДанные = Отчет.ВнешнийОтчет.ХранилищеВнешнейОбработки.Получить();
   ДвоичныеДанные.Записать(ИмяФайла);
   Форма = ВнешниеОтчеты.ПолучитьФорму(ИмяФайла);
   //Отчеты.УниверсальныйУправляемыйОтчет.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
   //Макет = Форма.СхемаКомпоновкиДанных;
   ОтчетОбъект = ДанныеФормыВЗначение(Отчет, Тип("ОтчетОбъект.УниверсальныйУправляемыйОтчет"));
   ОтчетОбъект.СхемаКомпоновкиДанных = Форма.СхемаКомпоновкиДанных;
   Отчет.КомпоновщикНастроек = Форма.КомпоновщикНастроек;    

Ошибка про поле ЭкспедиторПеревозчик
17 Iceman_1982
 
27.11.12
16:23
Есть еще какие-то варианты?
18 lxndr
 
27.11.12
16:57
ВОт чего раскопал. По всей видимости, схему компоновки можно подменить только в обработчике ПриКомпоновкеРезультата():
http://partners.v8.1c.ru/forum/thread.jsp?id=805283#805498

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
   
   СхемаКомпоновкиДанных = Отчеты.Отчет1.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
   
КонецПроцедуры
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн