IE 2016

Программное генерирование кнопочек для удобного управления уровнями группировки в отчетах (версия 2a).

Опубликовал mtv:) в раздел Программирование - Работа с интерфейсом

  В табличных документах 1С 8 имеется отличная возможность использования группировок, но управление уровнями группировок через контекстное меню не очень удобное.
  В своих отчетах для управления уровнями группировок я использую маленькие кнопочки на поле табличного документа - это намного удобнее и быстрее, чем через контекстное меню.

 

Кнопочки для управления уровнями группировки генерируются программно.

Для этого в модуле формы, в самом конце процедуры формирования отчета, нужно вызвать процедуру СгенерироватьКнопкиУправленияГруппировкой().

В модуль формы нужно добавить две процедуры, где "ПолеТабДок" - это поле табличного документа, в которое выводится отчет:

 

Процедура СгенерироватьКнопкиУправленияГруппировкой()

    НачалоВерх = ЭлементыФормы.ПолеТабДок.Верх + 3; // Привязка к верхнему левому углу ПоляТабличногоДокумента
    НачалоЛево = ЭлементыФормы.ПолеТабДок.Лево + 3; // Привязка к верхнему левому углу ПоляТабличногоДокумента

    ШагКнопок      = 13;
    ПрефиксИмениКн = "КнГр_";

    // Удалить старые кнопки
    Сч = 0;
    Пока Сч < ЭлементыФормы.Количество() Цикл
        ТекЭлемент = ЭлементыФормы.Получить(Сч);
        Если Найти(ТекЭлемент.Имя, ПрефиксИмениКн) > 0 Тогда
            ЭлементыФормы.Удалить(ТекЭлемент);
        Иначе
            Сч = Сч + 1;
        КонецЕсли;
    КонецЦикла;

    // Добавить новые кнопки по количеству группировок
    КоличествоГруппировок = ЭлементыФормы.ПолеТабДок.КоличествоУровнейГруппировокСтрок();
    Для Сч = 1 По КоличествоГруппировок Цикл
        НоваяКнопка = ЭлементыФормы.Добавить(Тип("Кнопка"), ПрефиксИмениКн + Сч);
        НоваяКнопка.Верх      = НачалоВерх;
        НоваяКнопка.Лево      = НачалоЛево + (ШагКнопок * (Сч - 1));
        НоваяКнопка.Высота    = 11;
        НоваяКнопка.Ширина    = 11;
        НоваяКнопка.Шрифт     = Новый Шрифт("Шрифт диалогов и меню", 6);
        НоваяКнопка.Заголовок = "" + Сч;
        НоваяКнопка.СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша["_"+сч], Истина, Ложь, Ложь);  
        НоваяКнопка.УстановитьДействие("Нажатие", Новый Действие("СвернутьДоУровня"));
    КонецЦикла;

КонецПроцедуры //СгенерироватьКнопкиУправленияГруппировкой()

// Вызывется при нажатии кнопочек "1", "2" и т.д. (для сворачивания группировок)
Процедура СвернутьДоУровня(Элемент)

    Уровень = Число(Элемент.Заголовок); // здесь записан нужный уровень
    ЭлементыФормы.ПолеТабДок.ПоказатьУровеньГруппировокСтрок(Уровень - 1);

КонецПроцедуры //СвернутьДоУровня()



Примечание:

Как справедливо заметил VladZetRu, вышеприведенный код будет работать правильно, если ПолеТабличногоДокумента, на которое выводится Отчет, расположено на Форме. Если же ПолеТабличногоДокумента расположено на Панели, то строчку кода, в которой создается НоваяКнопка, необходимо чуть дополнить:

НоваяКнопка = ЭлементыФормы.Добавить(Тип("Кнопка"), ПрефиксИмениКн + Сч, Истина, ЭлементыФормы.Панель);

Примечание 2:

 

В комментарии № 58 приведено решение для генерации кнопок в отчетах, построенных на СКД.


Вот собственно и всё. Результат видно на скриншоте ниже.


1. Это вторая версия алгоритма, спасибо Pashkaa за дельное предложение. Алгоритм стал лучше и универсальнее. Не нужно теперь вручную указывать начальные координаты кнопочек, они привязаны к верхнему левому углу ПоляТабличногоДокумента. Кнопочки не требуют дополнительного места на форме т.к. находятся там, где должны быть системные кнопки при отображении заголовков таблицы.

2. Советую заглянуть в комментарии. Там в № (24) alexk-is приводит пример, как прикрутить эту идею в типовой "Универсальный отчет". А так же заглянуть в публикацию http://infostart.ru/public/84642/ от alexk-is, которая содержит дальнейшее развитие идеи (для вертикальных и горизонтальных группировок).

3. (15.12.2011)  Версия 2a. Добавлен код (одна строка) для назначения горячих клавиш для сгенерированных кнопочек.  Теперь можно с помощью комбинаций Alt+[номер кнопки] сворачивать/разворачивать группировки с помошью клавиатуры. Спасибо rumik007 за идею.

4. (04.06.2015Коллега unichkin опубликовал решение этой задачи для управляемых формКнопки управления группировками табличного документа для управляемых форм.

 

См. также

Лучшие комментарии

24. alexk-is 19.04.2011 13:10
+23 Изменения для модуля УниверсальногоОтчета с учетом комментария (27)

// ИС КАВ ( 20.04.2011
Перем ФормаДляГруппировок;
Перем
ЭлементовГруппировок;

Процедура
СгенерироватьКнопкиУправленияГруппировкой(ТабличныйДокумент, УдалитьВсеКнопки = Ложь)

    Если
ФормаДляГруппировок = Неопределено Тогда
        Возврат;
    КонецЕсли;

   
ЭлементыФормы = ФормаДляГруппировок.ЭлементыФормы;
   
ИмяТабличногоДокумента = ТабличныйДокумент.Имя;

   
НачалоВерх = ТабличныйДокумент.Верх + 2; // Привязка к верхнему левому углу ПоляТабличногоДокумента
   
НачалоЛево = ТабличныйДокумент.Лево + 2; // Привязка к верхнему левому углу ПоляТабличногоДокумента

    // Удалим лишние кнопки
   
КоличествоГруппировок = ТабличныйДокумент.КоличествоУровнейГруппировокСтрок();
    Для
Индекс = ?(УдалитьВсеКнопки, 1, КоличествоГруппировок + 1) По ЭлементовГруппировок Цикл
       
ИмяКнопки = "КнопкаГруппировки_" + Формат(Индекс, "ЧЦ=3; ЧН=; ЧВН=") + "_" + ИмяТабличногоДокумента;
       
ТекЭлемент = ЭлементыФормы.Найти(ИмяКнопки);
        Если
ТекЭлемент <> Неопределено Тогда
           
ЭлементыФормы.Удалить(ТекЭлемент);
        КонецЕсли;
    КонецЦикла;

   
// Добавим новые кнопки по количеству группировок
   
Для Индекс = 1 По КоличествоГруппировок Цикл
       
ИмяКнопки = "КнопкаГруппировки_" + Формат(Индекс, "ЧЦ=3; ЧН=; ЧВН=") + "_" + ИмяТабличногоДокумента;
        Если
ЭлементыФормы.Найти(ИмяКнопки) = Неопределено Тогда
           
НоваяКнопка = ЭлементыФормы.Добавить(Тип("Кнопка"), ИмяКнопки);
           
НоваяКнопка.Верх      = НачалоВерх;
           
НоваяКнопка.Лево      = НачалоЛево + (13 * (Индекс - 1));
           
НоваяКнопка.Высота    = 12;
           
НоваяКнопка.Ширина    = 12;
           
НоваяКнопка.Шрифт     = Новый Шрифт("Arial", 7);
           
НоваяКнопка.Заголовок = "" + Индекс;
            Если
Индекс = 1 Тогда
               
НоваяКнопка.Подсказка = "Показать группировки верхнего уровня";
            ИначеЕсли
Индекс = КоличествоГруппировок Тогда
               
НоваяКнопка.Подсказка = "Показать все группировки";
            Иначе
               
НоваяКнопка.Подсказка = "Показать группировки до уровня " + Индекс;
            КонецЕсли;
           
НоваяКнопка.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Право;
            Попытка
               
НоваяКнопка.УстановитьДействие("Нажатие", Новый Действие("КоманднаяПанельФормыБыстрыеОтборы"));
            Исключение
            КонецПопытки;
        КонецЕсли;
    КонецЦикла;

   
ЭлементовГруппировок = КоличествоГруппировок;

КонецПроцедуры
//СгенерироватьКнопкиУправленияГруппировкой()
// ИС КАВ )

Процедура СформироватьОтчет(ТабличныйДокумент, Очищать = Истина, ФиксироватьЗаголовок = Истина, Отчет = Неопределено) Экспорт

    ...

   
СгенерироватьКнопкиУправленияГруппировкой(ТабличныйДокумент); // ИС КАВ 20.04.2011

КонецПроцедуры // СформироватьОтчет()

Процедура УправлениеОтображениемЭлементовФормы(Объект, Форма, КнопкаИмя = Неопределено) Экспорт

   
// ИС КАВ ( 20.04.2011
   
Если Лев(КнопкаИмя, 18) = "КнопкаГруппировки_" Тогда
       
ТабличныйДокумент = Форма.ЭлементыФормы[Сред(КнопкаИмя, 23)];
       
Форма.ТекущийЭлемент = ТабличныйДокумент;
       
Уровень = Число(Форма.ЭлементыФормы[КнопкаИмя].Заголовок); // здесь записан нужный уровень
       
ТабличныйДокумент.ПоказатьУровеньГруппировокСтрок(Уровень - 1);
        Возврат;
    КонецЕсли;
   
// ИС КАВ )

   
...

КонецПроцедуры
// УправлениеОтображениемЭлементовФормы()

Процедура УправлениеПанельюБыстрыеОтборы(Объект, Форма) Экспорт

    ...

   
// ИС КАВ ( 25.04.2011
   
Если Форма.ЭлементыФормы.Найти("ПолеТабличногоДокументаРезультат") <> Неопределено Тогда
       
СгенерироватьКнопкиУправленияГруппировкой(Форма.ЭлементыФормы.ПолеТабличногоДокументаРезультат, Истина);
    КонецЕсли;
   
// ИС КАВ )

КонецПроцедуры // УправлениеПанельюБыстрыеОтборы()

Процедура ФормаПриОткрытии(Объект, Отчет, Форма, СоставПанелиДополнительныхЭлементовФормы = Неопределено, ИмяОбъекта = Неопределено) Экспорт

    ...

   
// ИС КАВ ( 20.04.2011
   
ФормаДляГруппировок = Форма;
   
ЭлементовГруппировок = 0;
   
// ИС КАВ )

КонецПроцедуры // ФормаПриОткрытии()
Ответили: (25) (27)
# Ответить
1. Saint 10.04.2011 02:10
И зачем? Если для поля табличного документа отобразить заголовки, то кнопочки волшебным образом появятся сами собой.
Ответили: (58)
+ 2 [ zqzq; Den_D; ]
# Ответить
4. Pashkaa 10.04.2011 13:43
НачалоВерх = ЭлементыФормы.ПолеТабличногоДокументаРезультат.Верх + 3; // Тут установить начальные координаты для кнопок
НачалоЛево = ЭлементыФормы.ПолеТабличногоДокументаРезультат.Лево + 3; // Тут установить начальные координаты для кнопок
....

НоваяКнопка.Лево = НачалоЛево + (ШагКнопок * (Сч - 1));
.......

Испоравь так. Так кнопки сгенерерованные перекроют даже кнопки при включенном заголовке )))
+ 2 [ artbear; mtv:); ]
# Ответить

Комментарии

1. Saint 10.04.2011 02:10
И зачем? Если для поля табличного документа отобразить заголовки, то кнопочки волшебным образом появятся сами собой.
Ответили: (58)
+ 2 [ zqzq; Den_D; ]
# Ответить
2. mtv:) 10.04.2011 09:38
Saint,
Да, можно и так...
Но (IMHO) отчет с включенными заголовками смотрится как-то "лохмато", непрофессионально. Заголовки захламляют отчет, представляя собой совершенно лишнюю информацию. А также занимают место, уменьшая полезную площадь для отчета, которой порой так не хватает...
Вобщем я пользуюсь сгенерированными кнопочками. Может кому-то это тоже понравится. Как говорится - "На вкус и цвет...". :D
# Ответить
3. Pashkaa 10.04.2011 13:36
Привяжи начальные координаты к верхнему углу ПоляТабличногоДокумента, будет универсальние. В отчете могут быть отборы как в типовых отчетах. И надо уж тогда менять координаты кнопок при влючении и выключении отборов в отчетах.
# Ответить
4. Pashkaa 10.04.2011 13:43
НачалоВерх = ЭлементыФормы.ПолеТабличногоДокументаРезультат.Верх + 3; // Тут установить начальные координаты для кнопок
НачалоЛево = ЭлементыФормы.ПолеТабличногоДокументаРезультат.Лево + 3; // Тут установить начальные координаты для кнопок
....

НоваяКнопка.Лево = НачалоЛево + (ШагКнопок * (Сч - 1));
.......

Испоравь так. Так кнопки сгенерерованные перекроют даже кнопки при включенном заголовке )))
+ 2 [ artbear; mtv:); ]
# Ответить
5. mtv:) 10.04.2011 15:10
Pashkaa,
Спасибо за дельное дополнение, так действительно будет лучше и универсальнее.
Уже поправил.
Ответили: (8)
# Ответить
6. VladZetRu 10.04.2011 21:21
В случае если табличное поле находится на панели, ЭлементыФормы.ПолеТабличногоДокументаРезультат.Верх даст результат расстояния поля от верха панели, а не формы. Для корректного формирования кнопок в этом случае их нужно формировать на панели.
+ 1 [ mtv:); ]
# Ответить
7. mtv:) 10.04.2011 22:36
VladZetRu,
Да, конечно,если ПолеТабличногоДокумента находится на Панели, то в этом случае кнопочки нужно формировать на Панели, а не на Форме.
И код тогда надо будет изменить так:
НоваяКнопка = ЭлементыФормы.Добавить(Тип("Кнопка"), ПрефиксИмениКн + Сч, Истина, ЭлементыФормы.Панель1);
# Ответить
8. artbear 11.04.2011 08:00
(5) Возможно, что для универсальности строку с именем элемента управления "ТабличноеПоле" (т.е. "ТабДок") лучше передавать как параметр в обе процедуры, чтобы не пришлось менять код в случае с другими именами.
Или вариант 2 - сделать спец.шаблон 1С, в котором имя будет запрашиваться и подставляться в код.
Ответили: (9) (22)
+ 1 [ mtv:); ]
# Ответить
9. mtv:) 11.04.2011 11:14
(8)Да, на счет передачи, как параметра, ты прав, так будет лучше.
А про "спец.шаблон 1С" - чёт не понял... (((
Ответили: (10)
# Ответить
10. artbear 11.04.2011 14:24
(9) Ну этот код явно просится быть добавленным в файл шаблонов 1С, при вставке шаблона в код можно юзать подстановку параметров.
Ответили: (12)
# Ответить
11. PRoman 11.04.2011 16:17
Клевая штучка, но не более, нужно быть очень метким чтобы "ткнуть" на эту кнопочку.
Очень удобный вариант сделан в "1с Деньги".
Ответили: (13)
# Ответить
12. mtv:) 11.04.2011 16:21
(10) Теперь понятно, о чем речь. Тоже неплохая идея. Спасибо, artbear.
# Ответить
13. mtv:) 11.04.2011 16:27
(11) На счет: "... нужно быть очень метким ..." - эти кнопочки даже чуть-чуть больше, чем те системные кнопки, которые появляются при отображении заголовков Таблицы.
Интересно, а какой вариант в "1С Деньги"? Я не видел...
# Ответить
14. Rustig 12.04.2011 13:21
здо'рово! спасибо!
# Ответить
15. DrAku1a 13.04.2011 06:43
Респект! Надо будет к универсальному отчету прикрутить...
# Ответить
16. e.kogan 13.04.2011 16:17
Процедура СгенерироватьКнопкиУправленияГруппировкой()

    НачалоВерх = ЭлементыФормы.Результат.Верх + 3; // Привязка к верхнему левому углу ПоляТабличногоДокумента
    НачалоЛево = ЭлементыФормы.Результат.Лево + 3; // Привязка к верхнему левому углу ПоляТабличногоДокумента

    ШагКнопок      = 13;
    ПрефиксИмениКн = "КнГр_";

    // Удалить старые кнопки
    Сч = 0;
    Пока Сч < ЭлементыФормы.Количество() Цикл
        ТекЭлемент = ЭлементыФормы.Получить(Сч);
        Если Найти(ТекЭлемент.Имя, ПрефиксИмениКн) > 0 Тогда
            ЭлементыФормы.Удалить(ТекЭлемент);
        Иначе
            Сч = Сч + 1;
        КонецЕсли;
    КонецЦикла;

    // Добавть новые кнопки по количеству группировок
    КоличествоГруппировок = ЭлементыФормы.Результат.КоличествоУровнейГруппировокСтрок();
    Для Сч = 1 По КоличествоГруппировок Цикл
        НоваяКнопка = ЭлементыФормы.Добавить(Тип("Кнопка"), ПрефиксИмениКн + Сч);
        НоваяКнопка.Верх      = НачалоВерх;
        НоваяКнопка.Лево      = НачалоЛево + (ШагКнопок * (Сч - 1));
        НоваяКнопка.Высота    = 11;
        НоваяКнопка.Ширина    = 11;
        НоваяКнопка.Шрифт     = Новый Шрифт("Шрифт диалогов и меню", 6);
        НоваяКнопка.Заголовок = "" + Сч;
        НоваяКнопка.УстановитьДействие("Нажатие", Новый Действие("СвернутьДоУровня"));
		НоваяКнопка.Подсказка="Свернуть до уровня";
    КонецЦикла;

КонецПроцедуры //СгенерироватьКнопкиУправленияГруппировкой()

// Вызывается при нажатии кнопочек "1", "2" и т.д. (для сворачивания группировок)
Процедура СвернутьДоУровня(Элемент)

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

КонецПроцедуры //СвернутьДоУровня()

Процедура РезультатПриИзмененииСодержимогоОбласти(Элемент, Область) //по-моему, самое оно именно в это событие впихнуть отрисовку
	СгенерироватьКнопкиУправленияГруппировкой();
КонецПроцедуры
...Показать Скрыть


и разворачивает тоже.
Ответили: (17)
# Ответить
17. mtv:) 13.04.2011 19:37
(16) e.kogan,
Твой вариант Процедуры СвернутьДоУровня(Элемент) предпологает другой алгоритм работы кнопок, отличающийся от системного. Наверное кому-то понравится и твой вариант, что-то в нем есть.
Но твой вариант требует проработки. Попробуй сразу после формирования отчета: нажать 1 (сверется до уровня 1), потом нажать 2 (развернется уровень 1 и уровень 2), потом снова нажать 1 (ничего не происходит... а срабатывает только по повторному нажатию).
Ответили: (19)
# Ответить
18. YVolohov 14.04.2011 10:33
Можно передавать ЭлементыФормы и ПолеТабличногоДокумента как параметры процедуры. Тогда не будет привязки к конкретной форме и табличному полю, а сама процедура станет универсальной и ее можно будет вынести в один из общих модулей.
Ответили: (20) (22)
+ 1 [ mtv:); ]
# Ответить
19. e.kogan 14.04.2011 10:51
(17) Да я сама что-то, видимо, под конец рабочего дня перекрутила мысль :) Ну нафиг, оставлю у себя как было.
Ответили: (21)
# Ответить
20. mtv:) 14.04.2011 10:52
(18) Да, можно и так - прописать параметры и вынести в общий модуль. Получится действитель универсально.
В публикации описана сама идея генерации кнопочек, а как ее применить - каждый для себя решит сам, в меру своих знаний и потребностей. :D
# Ответить
21. mtv:) 14.04.2011 10:53
(19) Утро вечера мудренее... :D
# Ответить
22. artbear 14.04.2011 11:24
(18) Я об этом уже говорил в (8)
Есть один минус - у действия "СвернутьДоУровня" может быть только один параметр (Элемент), сюда параметры не передашь, значит, нужно либо где-то отдельно хранить данные либо пользоваться шаблоном, который автоматом развернется в нужный/правильный код.
# Ответить
23. alexk-is 19.04.2011 11:15
Врезал в типовой универсальный отчет. Теперь работает во всех отчетах, сделанных на его основе включая внешние. Спасибо за идею.
# Ответить
24. alexk-is 19.04.2011 13:10
+23 Изменения для модуля УниверсальногоОтчета с учетом комментария (27)

// ИС КАВ ( 20.04.2011
Перем ФормаДляГруппировок;
Перем
ЭлементовГруппировок;

Процедура
СгенерироватьКнопкиУправленияГруппировкой(ТабличныйДокумент, УдалитьВсеКнопки = Ложь)

    Если
ФормаДляГруппировок = Неопределено Тогда
        Возврат;
    КонецЕсли;

   
ЭлементыФормы = ФормаДляГруппировок.ЭлементыФормы;
   
ИмяТабличногоДокумента = ТабличныйДокумент.Имя;

   
НачалоВерх = ТабличныйДокумент.Верх + 2; // Привязка к верхнему левому углу ПоляТабличногоДокумента
   
НачалоЛево = ТабличныйДокумент.Лево + 2; // Привязка к верхнему левому углу ПоляТабличногоДокумента

    // Удалим лишние кнопки
   
КоличествоГруппировок = ТабличныйДокумент.КоличествоУровнейГруппировокСтрок();
    Для
Индекс = ?(УдалитьВсеКнопки, 1, КоличествоГруппировок + 1) По ЭлементовГруппировок Цикл
       
ИмяКнопки = "КнопкаГруппировки_" + Формат(Индекс, "ЧЦ=3; ЧН=; ЧВН=") + "_" + ИмяТабличногоДокумента;
       
ТекЭлемент = ЭлементыФормы.Найти(ИмяКнопки);
        Если
ТекЭлемент <> Неопределено Тогда
           
ЭлементыФормы.Удалить(ТекЭлемент);
        КонецЕсли;
    КонецЦикла;

   
// Добавим новые кнопки по количеству группировок
   
Для Индекс = 1 По КоличествоГруппировок Цикл
       
ИмяКнопки = "КнопкаГруппировки_" + Формат(Индекс, "ЧЦ=3; ЧН=; ЧВН=") + "_" + ИмяТабличногоДокумента;
        Если
ЭлементыФормы.Найти(ИмяКнопки) = Неопределено Тогда
           
НоваяКнопка = ЭлементыФормы.Добавить(Тип("Кнопка"), ИмяКнопки);
           
НоваяКнопка.Верх      = НачалоВерх;
           
НоваяКнопка.Лево      = НачалоЛево + (13 * (Индекс - 1));
           
НоваяКнопка.Высота    = 12;
           
НоваяКнопка.Ширина    = 12;
           
НоваяКнопка.Шрифт     = Новый Шрифт("Arial", 7);
           
НоваяКнопка.Заголовок = "" + Индекс;
            Если
Индекс = 1 Тогда
               
НоваяКнопка.Подсказка = "Показать группировки верхнего уровня";
            ИначеЕсли
Индекс = КоличествоГруппировок Тогда
               
НоваяКнопка.Подсказка = "Показать все группировки";
            Иначе
               
НоваяКнопка.Подсказка = "Показать группировки до уровня " + Индекс;
            КонецЕсли;
           
НоваяКнопка.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Право;
            Попытка
               
НоваяКнопка.УстановитьДействие("Нажатие", Новый Действие("КоманднаяПанельФормыБыстрыеОтборы"));
            Исключение
            КонецПопытки;
        КонецЕсли;
    КонецЦикла;

   
ЭлементовГруппировок = КоличествоГруппировок;

КонецПроцедуры
//СгенерироватьКнопкиУправленияГруппировкой()
// ИС КАВ )

Процедура СформироватьОтчет(ТабличныйДокумент, Очищать = Истина, ФиксироватьЗаголовок = Истина, Отчет = Неопределено) Экспорт

    ...

   
СгенерироватьКнопкиУправленияГруппировкой(ТабличныйДокумент); // ИС КАВ 20.04.2011

КонецПроцедуры // СформироватьОтчет()

Процедура УправлениеОтображениемЭлементовФормы(Объект, Форма, КнопкаИмя = Неопределено) Экспорт

   
// ИС КАВ ( 20.04.2011
   
Если Лев(КнопкаИмя, 18) = "КнопкаГруппировки_" Тогда
       
ТабличныйДокумент = Форма.ЭлементыФормы[Сред(КнопкаИмя, 23)];
       
Форма.ТекущийЭлемент = ТабличныйДокумент;
       
Уровень = Число(Форма.ЭлементыФормы[КнопкаИмя].Заголовок); // здесь записан нужный уровень
       
ТабличныйДокумент.ПоказатьУровеньГруппировокСтрок(Уровень - 1);
        Возврат;
    КонецЕсли;
   
// ИС КАВ )

   
...

КонецПроцедуры
// УправлениеОтображениемЭлементовФормы()

Процедура УправлениеПанельюБыстрыеОтборы(Объект, Форма) Экспорт

    ...

   
// ИС КАВ ( 25.04.2011
   
Если Форма.ЭлементыФормы.Найти("ПолеТабличногоДокументаРезультат") <> Неопределено Тогда
       
СгенерироватьКнопкиУправленияГруппировкой(Форма.ЭлементыФормы.ПолеТабличногоДокументаРезультат, Истина);
    КонецЕсли;
   
// ИС КАВ )

КонецПроцедуры // УправлениеПанельюБыстрыеОтборы()

Процедура ФормаПриОткрытии(Объект, Отчет, Форма, СоставПанелиДополнительныхЭлементовФормы = Неопределено, ИмяОбъекта = Неопределено) Экспорт

    ...

   
// ИС КАВ ( 20.04.2011
   
ФормаДляГруппировок = Форма;
   
ЭлементовГруппировок = 0;
   
// ИС КАВ )

КонецПроцедуры // ФормаПриОткрытии()
Ответили: (25) (27)

Прикрепленные файлы:

002.PNG
# Ответить
25. mtv:) 19.04.2011 20:11
(24) Спасибо alexk-is. Твоё сообщение тянет на отдельную публикацию. :D
Отличное применение идеи.
Только в коде (в двух местах), наверное, лучше заменить: текст "КнопкаГруппировки_" на переменную ПрефиксКнопки.
Добавил в публикацию ссылку на твоё сообщение.
+ 1 [ artbear; ]
# Ответить
26. mafia 20.04.2011 13:22
А как быть если группировки расположены не по вертикали а по горизонтали? Или и то и другое вместе?
Ответили: (28)
+ 1 [ artbear; ]
# Ответить
27. mosAdm 25.04.2011 17:44
(24) Малость пришлось дописать, т.к. при нажатии кнопки "Быстрые отборы" "КнопкиГруппировки_" оставались на месте

Процедура УправлениеПанельюБыстрыеОтборы(Объект, Форма) Экспорт
	
	...

	Если Форма.ЭлементыФормы.Найти("ПолеТабличногоДокументаРезультат") <> Неопределено Тогда 
		СгенерироватьКнопкиУправленияГруппировкой(Форма.ЭлементыФормы.ПолеТабличногоДокументаРезультат) 
	КонецЕсли;

	
КонецПроцедуры // УправлениеПанельюБыстрыеОтборы()
...Показать Скрыть


Ну и в процедуре "СгенерироватьКнопкиУправленияГруппировкой" добавил удаление кнопок

    Для Индекс = 1 По КоличествоГруппировок Цикл 
        ИмяКнопки = "КнопкаГруппировки_" + Формат(Индекс, "ЧЦ=3; ЧН=; ЧВН=") + "_" + ИмяТабличногоДокумента; 
		//..........................
		ЭлементКнопка = ЭлементыФормы.Найти(ИмяКнопки);
		Если ЭлементКнопка <> Неопределено Тогда
			ЭлементыФормы.Удалить(ЭлементКнопка);
		КонецЕсли;
               //..........................

        Если ЭлементыФормы.Найти(ИмяКнопки) = Неопределено Тогда 
...Показать Скрыть
+ 1 [ alexk-is; ]
# Ответить
28. mtv:) 28.04.2011 19:23
(26)
mafia пишет:
А как быть если группировки расположены не по вертикали а по горизонтали? Или и то и другое вместе?

Ответом на этот вопрос служит публикация http://infostart.ru/public/84642/ от alexk-is, которая содержит дальнейшее развитие идеи.
# Ответить
29. v.a.ryag 08.09.2011 12:58
очень удобно)
# Ответить
30. UncleVader 31.10.2011 11:41
А как быть с управляемыми формами?
# Ответить
31. vovche 28.11.2011 10:55
я не по делу, спасибо за обработку и возможность ее откомментировать
# Ответить
32. nissal 02.12.2011 14:45
Не получилось наскоком прикрутить к управляемой форме :)
Нет свойств Верх-Низ... Надо что-то думать. Идея - суперская!!
Ответили: (33)
# Ответить
33. mtv:) 05.12.2011 05:39
(32)Спасибо за комментарий, очень приятно!
Я не использую в своей работе управляемые формы, поэтому не могу ни чем помочь, к сожалению... :(
Но если у тебя получится прикрутить эту фичу в управляемых формах, будет очень здорово. Не забудь только сообщить об этом в этой теме. Я думаю, что это бы потянуло на отдельную публикацию.
Успехов в исследованиях.
Ответили: (34) (35)
+ 1 [ nissal; ]
# Ответить
34. nissal 05.12.2011 13:36
(33) mtv:)

Спасибо за напутсвтвия, пошел пробовать.
# Ответить
35. nissal 05.12.2011 19:46
(33) mtv:),


прикрутил тестово к отчету на СКД, получилось несколько уродливо (времени мало, а желания - много):
  • при нажатии "кнопочек" вылазят рамки рисунков, надо додумать, как этого избавиться
  • кнопки нельзя(?) "засунуть" в пространство над группировками(оно вроде как системное), пришлось совать в .Область(1,1,1,1)

Основная задача была - портировать :)

Вышло так:



Дополняем модуль формы:

// Вызывется при нажатии кнопочек "1", "2" и т.д. (для сворачивания группировок)
 &НаКлиенте
Процедура СвернутьДоУровня(Уровень)

    Результат.ПоказатьУровеньГруппировокСтрок(Уровень - 1);

КонецПроцедуры //СвернутьДоУровня()

&НаКлиенте
Процедура РезультатПриАктивизацииОбласти(Элемент)
	
	Если Не ТипЗнч(Элемент.ТекущаяОбласть) = Тип("РисунокТабличногоДокумента") Тогда
		Возврат;
	КонецЕсли; 
	Уровней = Результат.КоличествоУровнейГруппировокСтрок();
	
	Попытка
		Уровень = Число(Элемент.ТекущаяОбласть.Текст);
	Исключение
		Уровень = 0;
	КонецПопытки;
	
	Если Уровень > 0 И Уровень  <= Уровней  Тогда
		СвернутьДоУровня(Уровень);
	КонецЕсли;  
	
КонецПроцедуры
...Показать Скрыть


Модуль объекта:

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

	СтандартнаяОбработка = Ложь;
	
	МассивЗаголовковРесурсов = Новый Массив;
	НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);

	//Создадим и инициализируем процессор компоновки
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);

	//Создадим и инициализируем процессор вывода результата
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

	//Обозначим начало вывода
	ПроцессорВывода.НачатьВывод();
	ТаблицаЗафиксирована = Ложь;

	ДокументРезультат.ФиксацияСверху = 0;
	//Основной цикл вывода отчета
	Пока Истина Цикл
		//Получим следующий элемент результата компоновки
		ЭлементРезультата = ПроцессорКомпоновки.Следующий();

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

				ТаблицаЗафиксирована = Истина;
				ДокументРезультат.ФиксацияСверху = ДокументРезультат.ВысотаТаблицы;

			КонецЕсли;
			//Элемент получен - выведем его при помощи процессора вывода
			ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
		КонецЕсли;
	КонецЦикла;

	ПроцессорВывода.ЗакончитьВывод();
	СгенерироватьКнопкиУправленияГруппировкой(ДокументРезультат);

КонецПроцедуры


Процедура СгенерироватьКнопкиУправленияГруппировкой(Документ)

	НачалоВерх = 5; // Привязка к верхнему левому углу ПоляТабличногоДокумента
	НачалоЛево = 1; // Привязка к верхнему левому углу ПоляТабличногоДокумента

	ШагКнопок = 4;

	// Удалить старые кнопки
	Для каждого Рис Из Документ.Рисунки Цикл
		Если Рис.ТипРисунка = ТипРисункаТабличногоДокумента.Текст Тогда
			Документ.Рисунки.Удалить(Рис);
		КонецЕсли; 
	КонецЦикла; 

	// Добавить новые кнопки по количеству группировок
	КоличествоГруппировок = Документ.КоличествоУровнейГруппировокСтрок();
	Для Сч = 1 По КоличествоГруппировок Цикл
		НоваяКнопка = Документ.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
		НоваяКнопка.Верх      = НачалоВерх;
		НоваяКнопка.Лево      = НачалоЛево + (ШагКнопок * (Сч - 1));
		НоваяКнопка.Высота    = 3;
		НоваяКнопка.Ширина    = 3;
		НоваяКнопка.Шрифт     = Новый Шрифт("Шрифт диалогов и меню", 6);
		НоваяКнопка.Текст = "" + Сч;
		НоваяКнопка.Защита = Истина;
	КонецЦикла;

КонецПроцедуры //СгенерироватьКнопкиУправленияГруппировкой()
...Показать Скрыть


Еще раз спасибо автору за идею, извините, если что не так! :)
# Ответить
36. nissal 06.12.2011 13:52
Для избавления от рамок рисунков изменил функцию СвернутьДоУровня() молуля формы так:

[CODE 1с]// Вызывется при нажатии кнопочек "1", "2" и т.д. (для сворачивания группировок)
&НаКлиенте
Процедура СвернутьДоУровня(Уровень)


Результат.ПоказатьУровеньГруппировокСтрок(Уровень - 1);
Массив = Новый Массив();
Массив.Добавить(Результат.Область(1,1,1,1));

Элементы.Результат.УстановитьВыделенныеОбласти(Массив);

КонецПроцедуры[/1C-CODE]

Теперь все довольно мило.
Однако, в веб-клиенте FF8, IE8 не работает. Кнопки рисуются не тогда и не там, где определено и не реагируют на нажатия. Так что пока только для тонкого клиента (8.2.13.219).
Ответили: (37) (38)
+ 1 [ UncleVader; ]
# Ответить
37. mtv:) 07.12.2011 06:14
(36)Приветствую ваше любопытство и упорство. Вот и первые результаты появились.
До этого получал только вопросы типа: "А как быть с управляемыми формами?"...
И вот нашелся человек, который решил исследовать эту проблему.
В моей публикации только рабочая идея. А развить ее под свои задачи может каждый для себя сам. Примеры имеются. Правда все только (до текущего момента) под обычное приложение.
Успехов вам.
# Ответить
38. UncleVader 14.12.2011 22:52
(36) Отлично, спасибо за труд - все получилось как надо! Вынес функции формирования кнопок и реакцию на их нажатие во внешний клиентский модуль и в любом отчете теперь все что нужно добавить 2 строчки!
+ 1 [ mtv:); ]
# Ответить
39. rumik007 15.12.2011 17:22
А если добавить в формировании кнопок: НоваяКнопка.СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша["_"+сч],Истина,Ложь,Ложь), тогда мона будет с помощью комбинаций alt+[номер кнопки] сворачивать/разворачивать клавой.
Ответили: (40) (41) (43)
+ 1 [ mtv:); ]
# Ответить
40. UncleVader 15.12.2011 17:42
(39) Похоже у объекта НоваяКнопка нет свойства СочетаниеКлавиш, вы сами пробовали, работает?
# Ответить
41. rumik007 15.12.2011 18:02
UncleVader пишет:

(39) Похоже у объекта НоваяКнопка нет свойства СочетаниеКлавиш , вы сами пробовали, работает?


ДА, пробовал, все работает на ура.
Ответили: (42)
# Ответить
42. UncleVader 15.12.2011 18:47
(41) А, я кажется понял - я вынес процедуру создания кнопок во внешний модуль, а СочетаниеКлавиш относится к контексту формы
# Ответить
43. mtv:) 15.12.2011 20:05
(39) rumik007, спасибо за дельное дополнение.
Добавил в код публикации твою идею (горячие клавиши для кнопок управления уровнем группировок), с сылкой на тебя.
Еще раз, спасибо.
# Ответить
44. EvgeniuXP 21.12.2011 21:53
Добавил в модуль формы (1С 8.2.14.540) код программы, то что на главной указано при проверке модуля на ошибки выдает сообщение:

"{Отчет.Отчет2.Форма.ФормаОтчета.Форма(38,57)}: Тип не определен (Действие)
НоваяКнопка.УстановитьДействие("Нажатие", Новый <<?>>Действие("СвернутьДоУровня")); (Проверка: Сервер)"

Да и я как понимаю, код не для управляемых форм, т.к. просто вызвать функцию Добавить() для 8.2 не пройдет.
Ответили: (45) (46)
# Ответить
45. EvgeniuXP 21.12.2011 21:54
(44) на клиенте тоже самое, поэтому просто попробовал на сервере выполнить данную процедуру, но всё-равно не прошло.
Ответили: (46)
# Ответить
46. mtv:) 21.12.2011 22:06
(44)(45) EvgeniuXP, да, код, который в публикации, работает только в обычных (неуправляемых формах).
Для управляемых форм смотри выше сообщения от nissal, он экспериментировал с управляемыми формами, и у него есть определенные результаты.
Я не работаю с управляемыми формами, т.к. нет пока необходимости, поэтому помочь ни чем, к сожалению, не смогу.
Ответили: (47)
# Ответить
47. EvgeniuXP 22.12.2011 20:44
(46) Спасибо, нашел, прочитал комментарии. Но минусы есть в решениях, в веб-клиенте кнопочки не видны - это одна беда, а вторая - то, что эти кнопки не всегда нормально отображаются в зависимости от уровней в отчете... нет такого события обновить форму после нажатия кнопки "Сформировать", а при чтении - не всегда срабатывает :(

Решение там одно, делать кнопки 1,2,3 и т.д. - т.к. они видны в веб-клиенте и написать свою кнопку "Сформировать" вместо штатной.
Спасибо! За идею! :)
+ 1 [ mtv:); ]
# Ответить
48. xaker1C 23.12.2011 05:32
Спасибо
# Ответить
50. demiurg.08 13.03.2012 10:48
И ведь работает. :) Теперь буду втыкать во все свои отчеты, а автору - огромное спасибо, действительно нужные кнопочки.
# Ответить
51. MrVesna 05.04.2012 07:40
По мне так самый лучший вариант сворачивания открытых группировок сделан в Windows в редакторе реестра. Так в очень больших группировках снизу бывает долго подниматься на самый верх,а так кликнул по вертикальной полосе и группировка свернулась. На мой взгляд так гораздо удобнее.
Ответили: (52)
# Ответить
52. nissal 09.04.2012 18:29
(51) MrVesna, Ctrl+"стрелка лево" гораздо эффективнее.
# Ответить
53. andy_zhav 17.04.2012 09:48
В СКД сделал немного по-другому:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; 

    НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки(); 
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; 
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки); 

    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; 
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина); 

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; 
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат); 

    ПроцессорВывода.НачатьВывод(); 
 
    Пока Истина Цикл

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

    ПроцессорВывода.ЗакончитьВывод(); 

Оповестить("ОтчетСформирован");
КонецПроцедуры

...Показать Скрыть


и в форме отчета

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	Если ИмяСобытия = "ОтчетСформирован" Тогда
		СгенерироватьКнопкиУправленияГруппировкой();
	КонецЕсли;
КонецПроцедуры
...Показать Скрыть


По-идее должно без проблем работать в тонком клиенте.
Ответили: (54)
+ 1 [ mtv:); ]
# Ответить
54. mtv:) 17.04.2012 10:40
(53) andy_zhav,
если твой код будет работать в тонком клиенте, то это замечательно. К сожалению проверить не могу, не на чем.
Отпишись здесь, пожалуйста, если действительно нормально заработает в тонком клиенте.
Ответили: (55)
# Ответить
55. andy_zhav 17.04.2012 11:15
(54)Отбой тонкого клиента. Только толстый. На сервере нет команды "Оповестить"
Хотя, по моему мнению, все равно красивее смотрится через обработку оповещения...
# Ответить
56. alekseies 09.06.2012 10:03
Нужные кнопочки, можно использовать в отчетах - удобно и просто....
# Ответить
57. mybracho 16.07.2012 10:56
Подскажите, а в какой предопределенной процедуре вызывать процедуру генерации, если отчет строишь на СКД ?
Ответили: (58)
+ 1 [ mtv:); ]
# Ответить
58. mtv:) 16.07.2012 19:00
(57) mybracho, в твоем случае проще всего сделать так:
Вешаешь на кнопку "Сформировать" следующую процедуру
Процедура кнСформировать_Нажатие(Кнопка)
   
   ЭлементыФормы.Результат.Очистить();
   ОтчетОбъект.СкомпоноватьРезультат(ЭлементыФормы.Результат, ДанныеРасшифровки);
   
   // Если необходимо указать Уровень, до которого необходимо раскрыть группировки строк,
   // то можно добавить
   ЭлементыФормы.Результат.ПоказатьУровеньГруппировокСтрок(1);
   
   // Вызов процедуры генерации кнопок управления группировкой
   СгенерироватьКнопкиУправленияГруппировкой();
   
КонецПроцедуры //кнСформировать_Нажатие()

// где ЭлементыФормы.Результат, это Поле табличного документа, в которое выводится отчет СКД.
...Показать Скрыть

И твоя задача решена... :)
Ответили: (59)
+ 1 [ mybracho; ]
# Ответить
59. mybracho 17.07.2012 01:27
(58)
Круто. Спасибо

Повыносил эти процедуры в общий модуль. Повставлял их вызов в свои отчеты. Получилось компактно. Счастлив
# Ответить
61. galinka1c8 25.09.2012 11:34
Понравилась идея, очень удобно, если вынести в общий модуль. Совсем несложно и доработка для группировки колонок.
# Ответить
62. Azatikn 26.09.2012 06:56
Ай, молодцы, всё ведь возможно
понравилось
+ 1 [ mtv:); ]
# Ответить
63. AlexO 21.11.2012 10:01
И почему народу так трудно выбрать уровень из контекстного меню? Причем доступно в любом месте показа уровней, и не надо крутить туда-сюда отчет.
# Ответить
64. psa247 24.11.2012 15:24
Спасибо, пригодилось !!!
# Ответить
65. zba 29.01.2013 19:38
Вот это как раз и надо. Спасибо!
# Ответить
66. KroVladS 21.03.2013 09:08
Замечательный механизм, как я раньше о нём не узнал.
А главное это позитив от довольных пользователей которым добавили удобняшку :)
+ 1 [ mtv:); ]
# Ответить
67. MsDjuice 09.07.2013 17:54
Можно как-то использовать данную разработку, чтобы развертывать/свертывать группировки по условию? Например, поле группировки равно 0 и т.д.
# Ответить
68. mary61 30.08.2013 11:14
Спасибо! Как просто и удобно.
# Ответить
69. anfisa86 06.12.2013 11:41
Супер! Очень удобно! Спасибо!
# Ответить
70. EugenLiquor 06.03.2014 15:15
Интересно попробовать, возьму на вооружение для своих целей!
# Ответить
71. sekatskaya-e 22.10.2014 17:50
Процедуру СвернутьДоУровня(Элемент) можно только в модуле формы отчета размещать - получается что каждый отчет нужно корректировать?
# Ответить
72. mtv:) 04.06.2015 07:34
Коллега unichkin опубликовал решение этой задачи для управляемых форм:
Кнопки управления группировками табличного документа для управляемых форм
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл






IE 2016