|
Как на форме отчета указать сортировку по группировке? | ☑ | ||
---|---|---|---|---|
0
Надежда25
23.11.11
✎
14:04
|
Версия 8.1. Отчет сделан с использованием СКД. На форме отчета есть ТабличноеПолеПорядок. Данные - КомпоновщикНастроек.Настройки.Порядок. В настройках отчета указываю сортировку у некоторой группировки, а не у всего отчета. В режиме 1С:Предприятие на форме отчета поля сортировки вообще не показываются. Как можно дать возможность пользователю изменять сортировку отдельной группировки отчета?
|
|||
1
Надежда25
23.11.11
✎
14:38
|
Ответ ожидается.
|
|||
2
Надежда25
23.11.11
✎
16:08
|
Ну почему никто не реагирует? Нельзя так?
|
|||
3
PVV65
23.11.11
✎
16:16
|
Судя по всему напрямую нельзя расположить на форме настройки порядка группировки. Но выйти из положения, наверное, можно. Сейчас попробую.
|
|||
4
PVV65
23.11.11
✎
16:28
|
Создаем реквизит формы "МойКомпоновщик" тип "КомпоновщикНастроекКомпоновкиДанных".
На форме располагаем ТП - данные "МойКомпоновщик.Настройки.Порядок". Предположим, что нам надо редактировать порядок в первой группировке. Процедура ПриОткрытии() МойКомпоновщик = КомпоновщикНастроек; Для Каждого ЭлементПорядка Из КомпоновщикНастроек.Настройки.Структура[0].Порядок.Элементы Цикл Если ЭлементПорядка.Использование Тогда НовыйЭлементПорядка = МойКомпоновщик.Настройки.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); НовыйЭлементПорядка.Использование = Истина; НовыйЭлементПорядка.Поле = ЭлементПорядка.Поле; НовыйЭлементПорядка.РежимОтображения = ЭлементПорядка.РежимОтображения; НовыйЭлементПорядка.ТипУпорядочивания = ЭлементПорядка.ТипУпорядочивания; КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ТабличноеПоле1ПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) КомпоновщикНастроек.Настройки.Структура[0].Порядок.Элементы.Очистить(); Для Каждого ЭлементПорядка Из МойКомпоновщик.Настройки.Порядок.Элементы Цикл Если ЭлементПорядка.Использование Тогда НовыйЭлементПорядка = КомпоновщикНастроек.Настройки.Структура[0].Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); НовыйЭлементПорядка.Использование = Истина; НовыйЭлементПорядка.Поле = ЭлементПорядка.Поле; НовыйЭлементПорядка.РежимОтображения = ЭлементПорядка.РежимОтображения; НовыйЭлементПорядка.ТипУпорядочивания = ЭлементПорядка.ТипУпорядочивания; КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
5
PVV65
23.11.11
✎
16:36
|
Так более правильно
Процедура ПриОткрытии() МойКомпоновщик = КомпоновщикНастроек; Для Каждого ЭлементПорядка Из КомпоновщикНастроек.Настройки.Структура[0].Порядок.Элементы Цикл Если Тип(ЭлементПорядка) = Тип("АвтоЭлементПорядкаКомпоновкиДанных") Тогда НовыйЭлементПорядка = МойКомпоновщик.Настройки.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных")); НовыйЭлементПорядка.Использование = ЭлементПорядка.Использование; Иначе НовыйЭлементПорядка = МойКомпоновщик.Настройки.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); НовыйЭлементПорядка.Использование = ЭлементПорядка.Использование; НовыйЭлементПорядка.Поле = ЭлементПорядка.Поле; НовыйЭлементПорядка.РежимОтображения = ЭлементПорядка.РежимОтображения; НовыйЭлементПорядка.ТипУпорядочивания = ЭлементПорядка.ТипУпорядочивания; КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ТабличноеПоле1ПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) КомпоновщикНастроек.Настройки.Структура[0].Порядок.Элементы.Очистить(); Для Каждого ЭлементПорядка Из МойКомпоновщик.Настройки.Порядок.Элементы Цикл Если Тип(ЭлементПорядка) = Тип("АвтоЭлементПорядкаКомпоновкиДанных") Тогда НовыйЭлементПорядка = КомпоновщикНастроек.Настройки.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных")); НовыйЭлементПорядка.Использование = ЭлементПорядка.Использование; Иначе НовыйЭлементПорядка = КомпоновщикНастроек.Настройки.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); НовыйЭлементПорядка.Использование = ЭлементПорядка.Использование; НовыйЭлементПорядка.Поле = ЭлементПорядка.Поле; НовыйЭлементПорядка.РежимОтображения = ЭлементПорядка.РежимОтображения; НовыйЭлементПорядка.ТипУпорядочивания = ЭлементПорядка.ТипУпорядочивания; КонецЕсли; КонецЦикла; КонецПроцедуры |
|||
6
PVV65
23.11.11
✎
17:00
|
Во второй процедуре пропустил в строках
НовыйЭлементПорядка = КомпоновщикНастроек.Настройки.Порядок.Элементы.Добавить(Тип( Структура[0] Надо НовыйЭлементПорядка = КомпоновщикНастроек.Настройки.Структура[0].Порядок.Элементы.Добавить(Тип( |
|||
7
Надежда25
24.11.11
✎
09:26
|
Спасибо большое, для группировки первого уровня подходит. Мне надо сортировать группировку третьего уровня. Изменила везде Структура[0] на Структура[2]. Ошибка: "Индекс находится за пределами массива". Для элементов как-то указывала: ПорядокНомер=КомпоновщикНастроек.Настройки.Порядок.Элементы[2]. А как быть со структурой?
|
|||
8
sergeante
24.11.11
✎
10:29
|
(7) а вынести на форму стандартную кнопку "Настройка" СКД никак?
|
|||
9
Надежда25
24.11.11
✎
10:47
|
Кнопка "Настройки" на форме есть. Если указывать нужную сортировку через Настройки - все работает, но для наших пользователей это сложно. Вот и хотелось вывести на экран сортировку по группировке третьего уровня.
|
|||
10
sergeante
24.11.11
✎
10:57
|
(9) ну тогда рули, как (6). Только в этих структурах не продраться. Так что пользуйся отладчиком, и смотри содержимое ветки КомпоновщикНастроек.Настройки.Структура
|
|||
11
sergeante
24.11.11
✎
10:59
|
+(9) лучше на этапе конфигуратора на каждой ветке кгруппировки создай нужные элементы порядков, только просто сними галки "Использование", тогда ты увидешь их в отладчике и их свойства
|
|||
12
Надежда25
24.11.11
✎
11:07
|
Да, сложно получается. Но ведь (6) работает для группировки первого уровня, по-моему там немного осталось - указать какой-то массив для Структуры?
|
|||
13
Надежда25
24.11.11
✎
11:42
|
Вот если бы PVV65 откликнулся!
|
|||
14
PVV65
24.11.11
✎
13:55
|
1. Для доступа к группировки третьего уровня на до писать
Структура[0].Структура[0].Структура[0], а Структура[0].Структура[1] - это вторая группировка второго уровня. 2. Код, который я приводил - всего лишь направление. На самом деле немного сложнее. Принципиальная ошибка сидит в первой строке - МойКомпоновщик = КомпоновщикНастроек; так писать бессмысленно. Т.к. МойКомпоновщик - это не новый объект, а всего лишь ссылка на существующий. Т.е. при изменении Порядка в МойКомпоновщик МойКомпоновщик будеи менятся порядок и в КомпоновщикНастроек. Решений много. Самое простое = это чистить настройки порядка для отчета (если там нет каких то предопределенных). Добавить обработчик ТП ПередНачаломРедактирования, в котором заполнить МойКомпоновщик.Настройки.Порядок, а при окончании редактирования чистить МойКомпоновщик.Настройки.Порядок. |
|||
15
PVV65
24.11.11
✎
15:37
|
Самому стало интересно. Подсмотрел в типовых, как на форме отобразить настройки группировок.
1. Создаем ТП. Имя - "СтруктураКомпоновки". Данные - "КомпоновщикНастроек.Настройки". Для целей этой задачи делаем невидимым. 2. Создаем ТП. Имя - "Сортировка". Данные - "ЭлементыФормы.СтруктураКомпоновки.ТекущиеДанные.Порядок". 3. В процедуре ПриОткрытии() пишем - ЭлементыФормы.СтруктураКомпоновки..ТекущаяСтрока = КомпоновщикНастроек.Настройки.Структура[0].Структура[0].Структура[0]; ВСЕ |
|||
16
Надежда25
25.11.11
✎
12:07
|
PVV65, сразу извиняюсь за беспокойство. Но что-то у меня не получилось. Делаю первый пункт по описанию, перед этим создала реквизит с типом КомпоновщикНастроекКомпоновкиДанных. Все остальное по Вашему описанию. Но после запуска на исполнение ТП "Сортировка" пустое, а в конфигураторе у ТП "СтруктураКомпоновки" имя и данные становятся равными "Структура отчета". Так и должно быть? Почему ТП "Сортировка" пустое? Код:
ЭлементыФормы.СтруктураКомпоновки.ТекущаяСтрока = КомпоновщикНастроек.Настройки.Структура[0].Структура[0].Структура[0]; КомпоновщикМакета=Новый КомпоновщикМакетаКомпоновкиДанных; ДанныеРасшифровки=Новый ДанныеРасшифровкиКомпоновкиДанных; МакетКомпоновки=КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,Настройки,ДанныеРасшифровки); ПроцессорКомпоновкиДанных=Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки); ЭлементыФормы.Результат.Очистить(); ДокументРезультат=ЭлементыФормы.Результат; ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ДокументРезультат); И т.д |
|||
17
PVV65
25.11.11
✎
12:38
|
(16) Создавать новый реквизит не надо. Надо использовать существующий КомпоновщикНастроек.
Почему не отображаются данные? попробуй добавить процедуру обработки события формы "ОбновлениеОтображения" - текст процедуры отсутствует. Скорее всего надо обновить ТП "Сортировка". |
|||
18
PVV65
25.11.11
✎
12:40
|
Что бы установить существующий КомпоновщикНастроек для данных ТП необходимо открыть свойства существующего ТП и войти в выбор данных. Там будет КомпоновщикНастроек.
|
|||
19
Надежда25
25.11.11
✎
12:59
|
То есть я создаю 2 ТабличныхПоля: одно невидимое (пункт 1 из (15)), другое для сортировки (пункт 2 для (15)).
|
|||
20
PVV65
25.11.11
✎
12:59
|
(19) Да
|
|||
21
PVV65
25.11.11
✎
13:00
|
Для целей отладки создай видимое
|
|||
22
Надежда25
25.11.11
✎
14:49
|
К сожалению выдает ошибку при открытии:
Поле объекта не обнаружено (СтруктураКомпоновки) ЭлементыФормы.СтруктураКомпоновки.ТекущаяСтрока = КомпоновщикНастроек.Настройки.Структура[0].Структура[0].Структура[0]; |
|||
23
PVV65
25.11.11
✎
15:08
|
(22) Форма должна иметь ТП с именем "СтруктураКомпоновки". С элементами форма надо как то разобраться.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |