В отчете , где присутствуют группировки по строкам и по колонкам , у большинства пользователей вызывает затруднение вопрос :
"Как найти поля всех родителей выбранной ячейки по строкам и по столбцам ?".
Например для того ,чтобы построить отбор для подчиненного отчета.
Было бы полезно , если бы Вы в следующей статье раскрыли бы этот вопрос.
>> 2
Применительно к примеру примерно так
Массив = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьРодителей()
Массив[0] - родитель по горизонтали
Массив[1] - родитель по вертикали
а во как получить настройки СКД при наличии нескольких СКД в отчете (обработке)
СхемаКомпоновкиДанных = ПолучитьМакет("СтоимостнаяОценкаСклада");
ИсточникДоступныхНастроек = Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных);
КомпоновщикНастроек.Инициализировать(ИсточникДоступныхНастроек);
Теперь в настройках только отборы
Группировки подобным образом получить не удалось :(
Отбор загружается, группировок нет.
ФормаНастройки - стандартная форма настройки СКД.
Основная схема компоновки данных отчета не указана. При указании основной СКД отчета группировки остаются от основной СКД, а отбор от загружаемой
(6) Организовать рекурсивную процедуру обхода родителей
(3) Ответ безусловно верный . Если бы вопрос был о родителях при одноуровневой группировке. Если речь идет ПОЛЯХ ВСЕХ родителей ,то
1.Предполагаются многоуровневые группировки неизвестного уровня.
2.Значения массива , полученного методом НайтиРодителей() могут иметь различные типы и на определенных уровнях могут не иметь полей (неприменим метод ПолучитьПоля()).
Таким образом , предполагается процедура.
Я предположил , что это не частный (узкий) вопрос , и его можно рассмотреть в задаче № 4.
(13) также обратил внимание, что при заполненном свойству основная СКД отчета все работает нормально, а при программной обработке остается только отбор и выбранные поля
Вообще, есть в СКД некоторые глюки... В частности, заметил, что может "отваливаться" как сама схема, так и форма настроек. В таком случае помогает только пересоздание отчета.
А кто-нибудь смотрел реализацию универсальных отчетов и шаблонов для них на базе СКД в последних версиях БП и ЗУП ?
Сделано очень красиво и удобно для пользователя.
Очень легко портируется в другие конфигурации.
Я где-то минут за 20 перенес универсальный отчет + шаблон + все необходимое в самописную конфу для 8.1
(19) Да, молодцы. Обратил внимание на реализацию формы настроек, штатная - очень уж мудреная для пользователя. Да и запросы в ЗУП, которые были на несколько страниц, на порядок легче читать стало!...
3 пример некорректен. По крайней мере у меня получается : если выбирается действие из произвольного списка, то ОбработкаРасшифровки.Выполнить() возвращает "Непределено"... Т.е. уже не заходит в условие вывода отчета...
(21) В примере, дополнительное действие - это не изменение настроек и (или) вывод отчета, а какое-то другое действие не связанное с выводом, например открытие какой-либо формы, обработки.
Так что всё корректно, опять же в пределах примера )
Люди, спасите! Ну никак не могу настроить отбор вложенной схемы, чтобы детализировать общий отчет... У меня процедурка, которая данные для отбора выглядит так:
&НаКлиенте
Функция ПолучитьРекурсивноСтруктуруОтбора(ТекущееПоле, СтруктураОтбора = Неопределено)
Если СтруктураОтбора = Неопределено Тогда
СтруктураОтбора = Новый Структура;
КонецЕсли;
Для каждого ТекЭл Из ТекущееПоле.ПолучитьПоля() Цикл
СтруктураОтбора.Вставить(ТекЭл.Поле, ТекЭл.Значение);
КонецЦикла;
Для каждого ТекЭл Из ТекущееПоле.ПолучитьРодителей() Цикл
Если ТипЗнч(ТекЭл) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
ПолучитьРекурсивноСтруктуруОтбора(ТекЭл, СтруктураОтбора);
ИначеЕсли ТипЗнч(ТекЭл) = Тип("ЭлементРасшифровкиКомпоновкиДанныхГруппировка") Тогда
Сообщить("Группировка: " + ТекЭл.Группировка);
Иначе
Сообщить("Неизвестный элемент: " + ТекЭл);
КонецЕсли;
КонецЦикла;
В итоге значения полей (строк и колонок) получаю спокойно, а из группировок не могу никак вытащить ни название группировки (мне нужно именно получить путь к данным, а не ничего не значащее "ГруппировкаN"), ни значения, которые потом надо установить в отбор во вложенной схеме... Может я что не так делаю? Я только-только начал программить под СКД, 100 грамм не помогли, а тяжелые наркотики я не хочу употреблять, чтобы в этом разобраться:(
Привет! Прикольная функция, тоже думал об этом вопросе, мне кажется так должно работать. Не пробовал на сложных группировках, скажи если проверишь и что не так.
Функция ПолучитьРекурсивноСтруктуруОтбора(ТекущееПоле, СтруктураОтбора = Неопределено)
Если СтруктураОтбора = Неопределено Тогда
СтруктураОтбора = Новый Структура;
КонецЕсли;
Если ТипЗнч(ТекущееПоле) = Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля") Тогда
Для Каждого ТекЭл Из ТекущееПоле.ПолучитьПоля() Цикл
СтруктураОтбора.Вставить(ТекЭл.Поле, ТекЭл.Значение);
КонецЦикла;
КонецЕсли;
Для Каждого ТекЭл Из ТекущееПоле.ПолучитьРодителей() Цикл
ПолучитьРекурсивноСтруктуруОтбора(ТекЭл, СтруктураОтбора);
КонецЦикла;
Возврат СтруктураОтбора;
КонецФункции
(28) Не совсем понятен вопрос... По-моему "ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Поле" - это и есть путь к данным, т.е. имя поля в компоновке.
(31) Нет-нет, не имя того поля, ПО которому я щёлкнула, а имя того поля, которое я выбрала для расшифровки текущего!
Т.е. "Расшифровать", и нужно то поле, которое было выбрано в диалоге "Выбор поля"!
Привет! Подскажите, пожалуйста. Формирую отчет в СКД программно, и расшифровка совсем не работает. То есть привязанная к табличному полю функция на действие "Обработки расшифровки" просто не срабатывает.
Вот так формирую отчет:
ЭлементыФормы.Результат.Очистить();
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, ,Расшифровка);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.Результат);
ПроцессорВывода.НачатьВывод();
Пока Истина Цикл
ЭлементРезультатаКомпоновкиДанных = ПроцессорКомпоновкиДанных.Следующий();
Если ЭлементРезультатаКомпоновкиДанных = Неопределено Тогда
Прервать;
КонецЕсли;
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультатаКомпоновкиДанных);
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
ЭлементыФормы.Результат.ПоказатьУровеньГруппировокСтрок(0);
При инициации процессора компоновки данных можно задать переменную, в которую "будут выводиться результаты компоновки данных" (это по синтакс-помощнику). Я написал - Расшифровка, не работает.
А что там надо написать, какую переменную создать, чтобы расшифровка срабатывала, кто-нибудь знает?
Нашел ответ. Надо было добавить третий параметр ДанныеРасшифровки в КомпоновщикМакета.Выполнить() и в ПроцессорКомпоновкиДанных.Инициализировать(). После этого можно менять расшифровку как угодно.
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
СтандартнаяОбработка=Ложь;
ОбработкаРасшифровки=Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки,Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
текПоле=ДанныеРасшифровки.Элементы[Расшифровка]; //здесь вылетает
//тут ещё много кода
КонецПроцедуры
При повторном щелчке по исходной таблице (после выполнения расшифровки) процедура вылетает на указанной строке с ошибкой:
{Форма.ФормаОтчета(178)}: Значение, соответствующее ключу, не задано
текПоле=ДанныеРасшифровки.Элементы[Расшифровка];
В отладчике значение переменной Расшифровка в обоих случаях одинаково, а вот ДанныеРасшифровки - разные, хотя клик по одному и тому же полю в одной и той же ячейке. Чем бороть?
А у меня следующая ситуация и разобраться в ней пока не получается.
Создаю отчет по результативности звонков. Пример выводимых данных в приклепленном файле.
И мне нужно по нажатию на ячейку с цифрой выводить следующую расшифровку: список событий, по которым был зарегистрирован такой результат. Если пишу
ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьРодителей()[0].ПолучитьПоля().Найти("Мероприятие")
то значение мероприятия известно, когда выбранная ячейка находится в строчке "Семинар УТ", если же нажимаю на любую другую ячейку, привязку к данной группировке по семинару не могу найти.
Если кто-нибудь сталкивался с подобной ситуацией, подскажите:)
(37) Поддерживаю - как расшифровку распространить на всю строку? Мне надо как то при клике на любое поле в строке получить значение в конкретной ячейке в этой строке.
Статья - именно то, что нужно. Но вот какая у меня проблема: при сохранении конфигурации системы выдает следующую ошибку:
{Отчет.ОСВ1.Форма.ФормаОтчета.Форма(15,49)}: Слишком много фактических параметров (СкомпоноватьРезультат)
СкомпоноватьРезультат(ЭлементыФормы.Результат,<<?>>ДанныеРасшифровки); // выводим результат (Проверка: Тонкий клиент)
Всем здравствуйте.
Такой вопрос: настроены две вложенные схемы к основной СКД (схемы идентичные основной, но добавлен параметр для отбора в виртуальной таблице) . Выводятся в отчет последовательно, как 3 отдельных отчета. Так вот как понять к какой СКД относится элемент расшифровки? Т.е., в зависимости от ячейки, расшифровку которой нужно получить, необходимо определить в какой СКД эта ячейка выведена.
На упр формах никак не могу подобраться к ДанныеРасшифровки.
Пытаюсь получить через ПолучитьИзВременногоХранилища(ОтчетДанныеРасшифровки) - пишит "Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа".
На стороне сервера ПолучитьИзВременногоХранилища(ОтчетДанныеРасшифровки) работает, но надо на стороне клиента.
Хелп!
(46) sokir, Надо на стороне сервера вытаскивать все что нужно из данных расшифровки.
Помещать полученные данные скажем в фиксированный массив или в фиксированную структуру,
и возвращать на клиент.
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(<<?>>СхемаКомпоновкиДанных)); (Проверка: Тонкий клиент)
почему, кто подскажет...
Я "на клиенте." Но и в примере "на клиенте"!
А как ограничить вывод (показ) или удалить, на худой конец, некоторые доступные поля, которые есть в диалоге выбора поля при расшифровке ячейки?
Команда "Расшифровать...", вызываемая или двойным кликом по ячейке или через контекстное меню. В открывшейся форме диалога "Выбор поля" необходимо скрыть некоторые поля.
(53) Тоже ищу методы удаления ненужных пунктов контекстного меню.
Двойной клик стандартной обработкой убирается (и настраивается тоже).
А как изменить состав меню, которое вылетает по правой кнопке ?
Кто знает - направьте почитать.
Открывается новое окно и в нем расшифрованное вывелось, но сбиваются настройки первой (главной) формы.
Конечно можно через отч = отчеты.ххх.создать, но это может быть и внешняя.
Как правильнее всего отрыть расшифровку в новом окне?
И еще для расшифровки я хочу применить другой вариант (другая структура вывода). Как в этом случае быть?
Скажите, а при выполнении какого действия "Настройки" будут не равны "Неопределено"??? что-то не совсем пойму, почему-то у меня они всегда равны "Неопределено".