Имя: Пароль:
1C
1С v8
Как на форме отчета указать сортировку по группировке?
,
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) Форма должна иметь ТП с именем "СтруктураКомпоновки". С элементами форма надо как то разобраться.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.