Имя: Пароль:
1C
 
Расшифровка отчета на СКД и открытие другого отчета с заданными параметрами
0 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
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа 'ЗначенияПолейРасшифровкиКомпоновкиДанных'
1 LivingStar
 
11.06.19
14:30
(0+) То есть ПоляРасшифровки в функцию ПолучитьРекурсивноСтруктуруОтбора

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

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

оншибка

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

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


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

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

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

http://catalog.mista.ru/public/383839/
18 LivingStar
 
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].Идентификатор;
                ВывестиЗначениеГруппировки(РасшифровкиВыше);
            КонецЦикла;    
        КонецЕсли;        
    КонецЦикла;
КонецПроцедуры
//
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ОтчетОбъект     = РеквизитФормыВЗначение("Отчет");
    ОтчетМетаданные = ОтчетОбъект.Метаданные();
    НастройкиОтчета = Новый Структура;
    НастройкиОтчета.Вставить("ПолноеИмя",    ОтчетМетаданные.ПолноеИмя());
КонецПроцедуры
////
19 LivingStar
 
12.06.19
09:48
(18) ВывестиЗначениеГруппировки() - лишняя
20 LivingStar
 
12.06.19
10:08
Почему я вот тут ничего не получаю? Как нужно?

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


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