Имя: Пароль:
1C
1С v8
Несоответствие типов СхемаКомпоновкиДанных
0 corben1979
 
09.06.16
11:38
Здравствуйте! Нужно изменить стандартный отчет Карточка количественно-суммового учета МЦ. Сохранил его во внешний, добился, чтобы запускалась форма. Но вот при формировании отчета постоянно ошибка. Конфигурация БГУ 2.0, платформа 8.3.8.1675. Управляемое приложение. Третий день бьюсь. Помогите пожалуйста!

Ошибка при вызове метода контекста (Выполнить)
        

МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиДляКомпоновкиМакета, ДанныеРасшифровкиОбъект);
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиДляКомпоновкиМакета, ДанныеРасшифровкиОбъект);
по причине:
Несоответствие типов (параметр номер '1')

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

СхемаКомпоновкиДанных = ПолучитьИзВременногоХранилища(ПараметрыОтчета.Схема);
Вот вся процедура

Процедура СформироватьОтчет(Знач ПараметрыОтчета, Результат, ДанныеРасшифровки, СтандартнаяОбработка) Экспорт
  
   Результат.Очистить();
  
   Если ПараметрыОтчета.Свойство("Схема") тогда
       Если ЭтоАдресВременногоХранилища(ПараметрыОтчета.Схема) Тогда
           //ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
           //СхемаКомпоновкиДанных = ОтчетОбъект.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");

           СхемаКомпоновкиДанных = ПолучитьИзВременногоХранилища(ПараметрыОтчета.Схема);
           //СхемаКомпоновкиДанных = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
       КонецЕсли;
   КонецЕсли;                                                                                
  
   ПередКомпоновкойМакета(ПараметрыОтчета.КомпоновщикНастроек, ПараметрыОтчета);
  
   ОтборыДляВложеннойСхемы(ПараметрыОтчета.КомпоновщикНастроек);
  
   НастройкиДляКомпоновкиМакета = ПараметрыОтчета.КомпоновщикНастроек.ПолучитьНастройки();
  
   ДанныеРасшифровкиОбъект = Неопределено;
  
   //Сгенерируем макет компоновки данных при помощи компоновщика макета
   КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
  
   //Попытка
      
       МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиДляКомпоновкиМакета, ДанныеРасшифровкиОбъект);
       //МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиДляКомпоновкиМакета);
      
       //Создадим и инициализируем процессор компоновки
       ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
       ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровкиОбъект, Истина);
      
       ДанныеРасшифровки = ПоместитьВоВременноеХранилище(ДанныеРасшифровкиОбъект, ПараметрыОтчета.УникальныйИдентификатор);
      
       //Создадим и инициализируем процессор вывода результата
       ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
       ПроцессорВывода.УстановитьДокумент(Результат);
      
       //Обозначим начало вывода
       ПроцессорВывода.НачатьВывод();
      
       Массив = Новый Массив;
       //ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);        
       Пока Истина Цикл
                  
           //ОбработкаПрерыванияПользователя();
           //Получим следующий элемент результата компоновки
           ЭлементРезультата = ПроцессорКомпоновки.Следующий();
                  
           Если ЭлементРезультата = Неопределено Тогда
               //Следующий элемент не получен - заканчиваем цикл вывода
               Прервать;
           Иначе
              
               //Элемент получен - выведем его при помощи процессора вывода
               ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
              
               Если ЭлементРезультата.Макет = "Макет3" Тогда                
                   Массив.Добавить(Результат.ВысотаТаблицы);                                
               КонецЕсли;
              
           КонецЕсли;
       КонецЦикла;
       //вставка разрыва страниц
       ЭтоПервый = Истина;
       КонечнаяОбласть = Неопределено;
       ОбластьСтрок = Неопределено;
       Пока Истина Цикл
           Если ЭтоПервый Тогда
               НайденнаяОбласть = Результат.НайтиТекст("Карточку заполнил");
               ЭтоПервый = Ложь;
           Иначе
               НайденнаяОбласть = Результат.НайтиТекст("Карточку заполнил",КонечнаяОбласть);
           КонецЕсли;
           Если НайденнаяОбласть = Неопределено Тогда
               Прервать;
           КонецЕсли;
            КонечнаяОбласть = Результат.НайтиТекст("Дата",НайденнаяОбласть);
           Если КонечнаяОбласть<>Неопределено Тогда
               ОбластьСтрок = Результат.Область(Лев(КонечнаяОбласть.Имя,Найти(КонечнаяОбласть.Имя,"C")-1));
               ОбластьСтрок.КонецСтраницы = Истина;
           КонецЕсли;
       КонецЦикла;
       //убираем последний разрыв страницы
       Если НЕ ОбластьСтрок = Неопределено Тогда
           ОбластьСтрок.КонецСтраницы = Ложь;
       КонецЕсли;
      
       КолСтрок = Массив.Количество() - 1;
       Для инд = 0 По КолСтрок Цикл
          
           Ном = КолСтрок - инд;
          
           Результат.Область("R"+Формат(Массив[Ном],"ЧГ=0")).Видимость = Ложь;
              
       КонецЦикла;
              
   //Исключение
   //    ИнформацияОбОшибке = ИнформацияОбОшибке();
   //    Пока ИнформацияОбОшибке.Причина <> Неопределено Цикл
   //        ИнформацияОбОшибке = ИнформацияОбОшибке.Причина;
   //    КонецЦикла;
   //    ТекстСообщения = НСтр("ru = 'Отчет не сформирован!'") + Символы.ПС + ИнформацияОбОшибке.Описание;
   //    ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения);
   //    Отказ = Истина;
   //КонецПопытки;
  
  
КонецПроцедуры
Буду благодарен за любые идеи и подсказки.
1 segn
 
09.06.16
12:03
(0) Ну так проверь какой тип у:
СхемаКомпоновкиДанных = ПолучитьИзВременногоХранилища(ПараметрыОтчета.Схема);
2 corben1979
 
09.06.16
12:36
Строка она и есть строка. Вот такого вида: "e1cib/tempstorage/49c4a68d-80eb-43e8-970e-1cf8562e6315"
3 segn
 
09.06.16
12:42
(2) Строка, которую указал это адрес в хранилище значений. Первый параметр метода Выполнить() должен иметь тип "СхемаКомпоновкиДанных", а у тебя строка. Поэтому и ошибка.
4 corben1979
 
09.06.16
12:44
Я это понимаю, что поэтому ошибка. Этот код из стандартного отчета, там все работает без ошибок. Поэтому я и спрашиваю, что не могу разобраться сам в чем дело.
5 corben1979
 
09.06.16
12:47
Как получить это значение нужного типа, чтобы не было строкой?
6 segn
 
09.06.16
13:09
(5) Приведи фрагемент кода, которым помещаешь схему в хранилище. Ошибка сокрее всего там.
7 corben1979
 
09.06.16
13:14
Вот этот код

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

    ОтчетОбъект = Форма.РеквизитФормыВЗначение("Отчет");
    Если Не ЗначениеЗаполнено(Форма.СхемаКомпоновкиДанных) Тогда
        Форма.СхемаКомпоновкиДанных = ПоместитьВоВременноеХранилище(ОтчетОбъект.СхемаКомпоновкиДанных, Форма.УникальныйИдентификатор);
    КонецЕсли;
    Форма.ДанныеРасшифровки = ПоместитьВоВременноеХранилище(Форма.ДанныеРасшифровки          , Форма.УникальныйИдентификатор);
    
    
    Форма.Элементы.ПанельНастроек.Пометка = Форма.Элементы.ГруппаПанельНастроек.Видимость;
    
    // Для управления варинтами настроки СКД
    ВариантНастройки = Форма.Элементы.Найти("ВариантНастройки");
    Если ВариантНастройки <> Неопределено тогда
        Для каждого ВариантНастройкиСКД из ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек цикл
            ВариантНастройки.СписокВыбора.Добавить(ВариантНастройкиСКД.Имя,НСтр("ru='"+ВариантНастройкиСКД.Представление+"'"));
        КонецЦикла;
        Форма.ПользовательскийВариантНастроек = "Пользовательский";
        ВариантНастройки.СписокВыбора.Добавить(Форма.ПользовательскийВариантНастроек,НСтр("ru='Пользовательский'"));
    КонецЕсли;    
    // Конец для управления варинтами настроки СКД
    
    
    // Определяем перечень сохраняемых и загружаемых реквизитов перед любыми действиями с отчетом:
    Попытка
        Форма.ОпределитьИменаСохраняемыхРеквизитов();
    Исключение
    КонецПопытки;
    
    Если Форма.Отчет.РежимРасшифровки Тогда
        СтандартнаяОбработка = Ложь;
        Попытка
            Форма.ИзменениеСхемыКомпоновкиДанных();
        Исключение
        КонецПопытки;
        Если Форма.Параметры.Свойство("ЗаполняемыеНастройки") Тогда
            Попытка
                Форма.ЗаполнитьНастройкамиПоУмолчанию(Параметры.ЗаполняемыеНастройки);
            Исключение
            КонецПопытки;
        КонецЕсли;
        Форма.СформироватьОтчетСервер();
    Иначе
        // Общие настройки по умолчанию:
        ТекДата = ТекущаяДатаСеанса();
        Форма.Отчет.НачалоПериода = НачалоГода(ТекДата);
        Форма.Отчет.КонецПериода  = КонецМесяца(ТекДата);
        // Настройки по умолчанию для конкретного отчета:
        Попытка
            Форма.ЗаполнитьНастройкамиПоУмолчанию();
        Исключение
        КонецПопытки;
    КонецЕсли;
    
    Если Форма.Элементы.Найти("МакетОформления") <> неопределено тогда         
        Форма.Элементы.МакетОформления.СписокВыбора.Очистить();
        Для каждого ЦветОформления из БиблиотекаМакетовОформленияКомпоновкиДанных цикл
            Форма.Элементы.МакетОформления.СписокВыбора.Добавить(ЦветОформления.Имя, ЦветОформления.Представление);
        КонецЦикла;
    КонецЕсли;
    
    ПриСозданииНаСервере2(Форма);
        
КонецПроцедуры
8 segn
 
09.06.16
13:19
(7) В процедуре СформироватьОтчет() адрес схемы получаешь из структуры ПараметрыОтчета. В приведенном коде не увидел каким образом помещаешь схему в структуру.
9 corben1979
 
09.06.16
13:25
Это в другой процедуре делается, вот:

Процедура СформироватьОтчетСервер() Экспорт
    
    Если Не ПроверитьЗаполнение() Тогда
        Возврат;
    КонецЕсли;
    
    Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ВыводитьЗаголовок", Ложь);
    Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить("ВыводитьПодвал"   , Ложь);
    
    ПараметрыОтчета = Новый Структура;
    ПараметрыОтчета.Вставить("НачалоПериода",        Отчет.НачалоПериода);
    ПараметрыОтчета.Вставить("КонецПериода",        Отчет.КонецПериода);
    ПараметрыОтчета.Вставить("ДатаЗаполнения",        Отчет.ДатаЗаполнения);
    
    ПараметрыОтчета.Вставить("Счет",                Отчет.Счет);
    ПараметрыОтчета.Вставить("ОрганизацияПечать",    Отчет.ОрганизацияПечать);
    ПараметрыОтчета.Вставить("Подразделение",        Отчет.Подразделение);
    ПараметрыОтчета.Вставить("Исполнитель",            Отчет.Исполнитель);
    
    ПараметрыОтчета.Вставить("КомпоновщикНастроек",    Отчет.КомпоновщикНастроек);
    ПараметрыОтчета.Вставить("Схема",                СхемаКомпоновкиДанных);
    ПараметрыОтчета.Вставить("УникальныйИдентификатор",                ЭтаФорма.УникальныйИдентификатор);
    
    СформироватьОтчетТут(ПараметрыОтчета, Результат, ДанныеРасшифровкиФормы, Ложь);
    
    СтандартныеОтчеты.УстановитьКолонтитулыПоУмолчанию(Результат, РеквизитФормыВЗначение("Отчет").Метаданные().Синоним, Строка(ПараметрыСеанса.ТекущийПользователь), Отчет.Организация);
    СтандартныеОтчетыКлиентСервер.УстановитьСостояние(ЭтаФорма, Истина);
    
КонецПроцедуры
10 segn
 
09.06.16
13:56
(9) В этом месте:
ПараметрыОтчета.Вставить("Схема",                СхемаКомпоновкиДанных);

поставь точку останова и посмотри какой тип имеет "СхемаКомпоновкиДанных".
11 corben1979
 
09.06.16
14:50
Поставил. Раз ошибка, то тип естественно здесь тоже строка: "e1cib/tempstorage/198d1881-ebf0-4c9d-9c0c-acc29770a934"

Как же передать эту схему с нужным типом?
12 corben1979
 
09.06.16
16:35
СхемаКомпоновкиДанных11 =
ПолучитьИзВременногоХранилища(ПараметрыОтчета.Схема);

получить нужный объект удалось. Только дальше пошло что-то не так. В этой же строке ошибка, только уже синтаксическая.

ВнешнийОтчет.КарточкаКоличественноСуммовогоУчетаМЦ0504041.Форма.ФормаОтчета.Форма(552)}: Ошибка при вызове метода контекста (Выполнить)
        МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных11, НастройкиДляКомпоновкиМакета, ДанныеРасшифровкиОбъект);
по причине:
Ошибка компоновки макета
по причине:
Ошибка в выражении
по причине:
Синтаксическая ошибка