Вход | Регистрация
 

Расшифровка отчета на СКД и открытие другого отчета с заданными параметрами

Расшифровка отчета на СКД и открытие другого отчета с заданными параметрами
Я
   LivingStar
 
11.06.19 - 14:28
УТ 11 (11.4.7.150). Отчет "Отличия товары организаций и товары на складах 1.1".
Необходимо по двойному клику на ответе открывать отчет "Ведомость по товарам организации" и "Ведомость по товарам на складах".

Пока задача в определении правильной обработке расшифровки.

Формирую отчет. Двойное нажатие по полю. Попадаю в процедуру,

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


Но происходит ошибка

{ВнешнийОтчет.ОтличияТоварыОрганизацийИТоварыНаСкладах_1_1.Форма.ФормаОтчета.Форма(8)}: Ошибка при вызове метода контекста (ПолучитьРекурсивноСтруктуруОтбора)
    СтруктураОтбора                = ПолучитьРекурсивноСтруктуруОтбора(ПоляРасшифровки);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
    форма: Элемент
    имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ЗначенияПолейРасшифровкиКомпоновкиДанных'
 
 
   LivingStar
 
1 - 11.06.19 - 14:30
(0+) То есть ПоляРасшифровки в функцию ПолучитьРекурсивноСтруктуруОтбора

я должен передавать как элемент массива структур?
   LivingStar
 
2 - 11.06.19 - 14:55
Не могу создать массив на клиенте

//

&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
    ДанныеРасшифровкиКомпоновки = ПолучитьИзВременногоХранилища(ДанныеРасшифровки); 
    ПоляРасшифровки             = ДанныеРасшифровкиКомпоновки.Элементы.Получить(Расшифровка).ПолучитьПоля();
    //

    МАС = Новый Массив;

оншибка

{ВнешнийОтчет.ОтличияТоварыОрганизацийИТоварыНаСкладах_1_1.Форма.ФормаОтчета.Форма(8)}: Ошибка при вызове метода контекста (ПолучитьРекурсивноСтруктуруОтбора)
    СтруктураОтбора                = ПолучитьРекурсивноСтруктуруОтбора(ПоляРасшифровки);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
    форма: Элемент
    имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ЗначенияПолейРасшифровкиКомпоновкиДанных'
   LivingStar
 
3 - 11.06.19 - 14:59
(2) Эта ошибка отпадает.
С этим все норм. Перезапустил 1с.
Почему то читался старый код даже после сохранения.
   LivingStar
 
4 - 11.06.19 - 15:01
Почему не могу передать массив?
//

&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
    ДанныеРасшифровкиКомпоновки = ПолучитьИзВременногоХранилища(ДанныеРасшифровки); 
    ПоляРасшифровки             = ДанныеРасшифровкиКомпоновки.Элементы.Получить(Расшифровка).ПолучитьПоля();
    //

    МАС = Новый Массив;
    СТР = Новый Структура;
    СТР.Вставить("ПоляРасшифровки", ПоляРасшифровки);
    МАС.Добавить(СТР);
    //

    //СтруктураОтбора                = ПолучитьРекурсивноСтруктуруОтбора(ПоляРасшифровки);

    СтруктураОтбора                = ПолучитьРекурсивноСтруктуруОтбора(МАС);
    СтруктураОтбора                = ПолучитьДанныеРасшифровкиЯчеекСтроки(Элемент, СтруктураОтбора);
КонецПроцедуры



{ВнешнийОтчет.ОтличияТоварыОрганизацийИТоварыНаСкладах_1_1.Форма.ФормаОтчета.Форма(14)}: Ошибка при вызове метода контекста (ПолучитьРекурсивноСтруктуруОтбора)
    СтруктураОтбора                = ПолучитьРекурсивноСтруктуруОтбора(МАС);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
    форма: Элемент
    имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'Value':
    форма: Элемент
    имя: {http://v8.1c.ru/8.1/data/core}Value
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ЗначенияПолейРасшифровкиКомпоновкиДанных'
   hhhh
 
5 - 11.06.19 - 15:04
(4) ну в ПолучитьПоля() смотрите, что там? похоже не совсем массивы.
   LivingStar
 
6 - 11.06.19 - 15:15
(5) В ДанныеРасшифровкиКомпоновки.Элементы.Получить(Расшифровка).ПолучитьПоля()
- ЗначенияПолейРасшифровкиКомпоновкиДанных
   LivingStar
 
7 - 11.06.19 - 15:16
(6+) Я же их потом ложу в структуру, потом в массив, потом передаю дальше.
   LivingStar
 
8 - 11.06.19 - 15:17
   LivingStar
 
9 - 11.06.19 - 15:26
Сейчас ломается на строке ТекущееПоле.ПолучитьРодителей()
Подскажите пожалуйста, как быть?

{ВнешнийОтчет.ОтличияТоварыОрганизацийИТоварыНаСкладах_1_1.Форма.ФормаОтчета.Форма(28)}: Метод объекта не обнаружен (ПолучитьРодителей)
    Для Каждого ТекЭл Из ТекущееПоле.ПолучитьРодителей() Цикл


//

&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
    ДанныеРасшифровкиКомпоновки = ПолучитьИзВременногоХранилища(ДанныеРасшифровки); 
    ПоляРасшифровки             = ДанныеРасшифровкиКомпоновки.Элементы.Получить(Расшифровка).ПолучитьПоля()[0];
    //

    МАС = Новый Массив;
    СТР = Новый Структура;
    СТР.Вставить("ПоляРасшифровки", ПоляРасшифровки);
    МАС.Добавить(СТР);
    //

    //СтруктураОтбора                = ПолучитьРекурсивноСтруктуруОтбора(ПоляРасшифровки);

    СтруктураОтбора                = ПолучитьРекурсивноСтруктуруОтбора(МАС);
    СтруктураОтбора                = ПолучитьДанныеРасшифровкиЯчеекСтроки(Элемент, СтруктураОтбора);
КонецПроцедуры
//

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

Как получается там будет на месте .ПолучитьРодителей() ?
   LivingStar
 
11 - 11.06.19 - 15:47
Никому не знакома проблема?
   LivingStar
 
12 - 11.06.19 - 17:26
Подскажите пожалуйста для управляемых форм как получить данные строки по двойному клику?
   hhhh
 
13 - 11.06.19 - 21:06
(12) там и так прекрасно всё выводится по двойному клику, без всякого кода, понятно, что вы фанат, вы любите херней страдать.
   LivingStar
 
14 - 12.06.19 - 00:46
(13) Мне нужно расшифровать строку отчета СКД другим отчетом. Передав в него параметры строки на которой производится щелчек. Как это сделать?
   hhhh
 
15 - 12.06.19 - 05:06
(14) ну не передавайте значения типа ЗначенияПолейРасшифровкиКомпоновкиДанных

пнондавайте туда обфчные типы. Массивы там, или структуры.
   LivingStar
 
16 - 12.06.19 - 06:05
(15) Можно поподробнее? Не совсем понятно.
Мне нужно по щелчке на ячейке открыть другой отчет и передать туда параметры строки текущего отчета.
Накачал наработок, только что то ничего не подошло. (
   LivingStar
 
17 - 12.06.19 - 06:16
Как под усправляемыми формами использовать этот пример?

http://catalog.mista.ru/public/383839/
   LivingStar
 
18 - 12.06.19 - 09:47
Получилось сделать вот такое решение.
Но это все типовыми механизмами.

Как это сделать самому?

При двойном клике на ячейку, получать её название. И передавать параметры строки и отчета
в другой отчет, открывая его?


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

    ПараметрыОтчета_1 = Новый Структура;
    ПараметрыОтчета_1.Вставить("Имя",       "ВедомостьПоТоварамОрганизаций");
    ПараметрыОтчета_1.Вставить("Заголовок", НСтр("ru = 'Ведомость По Товарам Организаций'"));
    ПараметрыОтчета_1.Вставить("ИмяОтчета", "Отчет.ВедомостьПоТоварамОрганизаций");
    //

    ПараметрыОтчета_2 = Новый Структура;
    ПараметрыОтчета_2.Вставить("Имя",       "ВедомостьПоТоварамНаСкладах");
    ПараметрыОтчета_2.Вставить("Заголовок", НСтр("ru = 'Ведомость По Товарам На Складах'"));
    ПараметрыОтчета_2.Вставить("ИмяОтчета", "Отчет.ВедомостьПоТоварамНаСкладах");
    //

    ПоляРасшифровки  = Новый Массив;
    ПоляРасшифровки.Добавить("Номенклатура");
    ПоляРасшифровки.Добавить("Характеристика");
    ПоляРасшифровки.Добавить("Склад");
    ПоляРасшифровки.Добавить("ДатаДоступности");
    //

    ПараметрыОтчета_1.Вставить("ПоляРасшифровки", ПоляРасшифровки);
    ПараметрыОтчета_2.Вставить("ПоляРасшифровки", ПоляРасшифровки);
    //

    СписокПараметров = Новый Массив;
    СписокПараметров.Добавить("ЕдиницыКоличества");
    //

    ПараметрыОтчета_1.Вставить("СписокПараметров", СписокПараметров);
    ПараметрыОтчета_2.Вставить("СписокПараметров", СписокПараметров);
    //

    МенюОтчетов.Добавить(ПараметрыОтчета_1);
    МенюОтчетов.Добавить(ПараметрыОтчета_2);
    //

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

Процедура ВывестиЗначениеГруппировки(ТекРасшифровка)
    МассивРодителей = ОтчетДанныеРасшифровки.Элементы[ТекРасшифровка].ПолучитьРодителей();
    Для СчРодителей = 1 По МассивРодителей.Количество() Цикл
        ПолеРодитель = МассивРодителей[СчРодителей-1];
        Если Число(ПолеРодитель.Идентификатор) > 0 Тогда
            //Получим текущее поле

            Если ТипЗнч(ПолеРодитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
               МассивПолей = ПолеРодитель.ПолучитьПоля();
            ИначеЕсли ТипЗнч(ПолеРодитель) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда
               МассивПолей = ПолеРодитель.ПолучитьРодителей()[0].ПолучитьПоля();
            КонецЕсли; 
            Для СчПолей = 1 По МассивПолей.Количество() Цикл
                Поле = МассивПолей[СчПолей-1];
                //Выведем значения текущей расшифровки

                Сообщить("Поле: " + Поле.Поле + ", значение: " + Поле.Значение);
                //Рекурсивный вызов процедуры. 

                РасшифровкиВыше = ПолеРодитель.ПолучитьРодителей()[0].Идентификатор;
                ВывестиЗначениеГруппировки(РасшифровкиВыше);
            КонецЦикла;    
        КонецЕсли;        
    КонецЦикла;
КонецПроцедуры
//

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ОтчетОбъект     = РеквизитФормыВЗначение("Отчет");
    ОтчетМетаданные = ОтчетОбъект.Метаданные();
    НастройкиОтчета = Новый Структура;
    НастройкиОтчета.Вставить("ПолноеИмя",    ОтчетМетаданные.ПолноеИмя());
КонецПроцедуры
////
   LivingStar
 
19 - 12.06.19 - 09:48
(18) ВывестиЗначениеГруппировки() - лишняя
   LivingStar
 
20 - 12.06.19 - 10:08
Почему я вот тут ничего не получаю? Как нужно?

&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
    //

    РасшифровкаЗначение = ПолучитьЗначениеРасшифровки(Результат.ТекущаяОбласть.Расшифровка);
    //



//

&НаСервере
Функция ПолучитьЗначениеРасшифровки(КодРасшифровки)
    Если КодРасшифровки = Неопределено тогда
        Возврат Неопределено;
    КонецЕсли;
    ДР             = ПолучитьИзВременногоХранилища(ОтчетДанныеРасшифровки);
    КоллекцияПолей = ДР.Элементы[КодРасшифровки].ПолучитьПоля();
    Если КоллекцияПолей.Количество() = 0 тогда
        Возврат Неопределено
    Иначе
        Возврат КоллекцияПолей[0].Значение;
    КонецЕсли;
КонецФункции
//

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.