Программное генерирование кнопочек для удобного управления уровнями группировки в отчетах (версия 2a).
Разработка - Работа с интерфейсом
Кнопочки для управления уровнями группировки генерируются программно.
Для этого в модуле формы, в самом конце процедуры формирования отчета, нужно вызвать процедуру СгенерироватьКнопкиУправленияГруппировкой().
В модуль формы нужно добавить две процедуры, где "ПолеТабДок" - это поле табличного документа, в которое выводится отчет:
Процедура СгенерироватьКнопкиУправленияГруппировкой()
НачалоВерх = ЭлементыФормы.ПолеТабДок.Верх + 3; // Привязка к верхнему левому углу ПоляТабличногоДокумента
НачалоЛево = ЭлементыФормы.ПолеТабДок.Лево + 3; // Привязка к верхнему левому углу ПоляТабличногоДокумента
ШагКнопок = 13;
ПрефиксИмениКн = "КнГр_";
// Удалить старые кнопки
Сч = 0;
Пока Сч < ЭлементыФормы.Количество() Цикл
ТекЭлемент = ЭлементыФормы.Получить(Сч);
Если Найти(ТекЭлемент.Имя, ПрефиксИмениКн) > 0 Тогда
ЭлементыФормы.Удалить(ТекЭлемент);
Иначе
Сч = Сч + 1;
КонецЕсли;
КонецЦикла;
// Добавить новые кнопки по количеству группировок
КоличествоГруппировок = ЭлементыФормы.ПолеТабДок.КоличествоУровнейГруппировокСтрок();
Для Сч = 1 По КоличествоГруппировок Цикл
НоваяКнопка = ЭлементыФормы.Добавить(Тип("Кнопка"), ПрефиксИмениКн + Сч);
НоваяКнопка.Верх = НачалоВерх;
НоваяКнопка.Лево = НачалоЛево + (ШагКнопок * (Сч - 1));
НоваяКнопка.Высота = 11;
НоваяКнопка.Ширина = 11;
НоваяКнопка.Шрифт = Новый Шрифт("Шрифт диалогов и меню", 6);
НоваяКнопка.Заголовок = "" + Сч;
НоваяКнопка.СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша["_"+сч], Истина, Ложь, Ложь);
НоваяКнопка.УстановитьДействие("Нажатие", Новый Действие("СвернутьДоУровня"));
КонецЦикла;
КонецПроцедуры //СгенерироватьКнопкиУправленияГруппировкой()
// Вызывется при нажатии кнопочек "1", "2" и т.д. (для сворачивания группировок)
Процедура СвернутьДоУровня(Элемент)
Уровень = Число(Элемент.Заголовок); // здесь записан нужный уровень
ЭлементыФормы.ПолеТабДок.ПоказатьУровеньГруппировокСтрок(Уровень - 1);
КонецПроцедуры //СвернутьДоУровня()
Примечание:
Как справедливо заметил VladZetRu, вышеприведенный код будет работать правильно, если ПолеТабличногоДокумента, на которое выводится Отчет, расположено на Форме. Если же ПолеТабличногоДокумента расположено на Панели, то строчку кода, в которой создается НоваяКнопка, необходимо чуть дополнить:
НоваяКнопка = ЭлементыФормы.Добавить(Тип("Кнопка"), ПрефиксИмениКн + Сч, Истина, ЭлементыФормы.Панель);
Примечание 2:
В комментарии № 58 приведено решение для генерации кнопок в отчетах, построенных на СКД.
Вот собственно и всё. Результат видно на скриншоте ниже.
1. Это вторая версия алгоритма, спасибо Pashkaa за дельное предложение. Алгоритм стал лучше и универсальнее. Не нужно теперь вручную указывать начальные координаты кнопочек, они привязаны к верхнему левому углу ПоляТабличногоДокумента. Кнопочки не требуют дополнительного места на форме т.к. находятся там, где должны быть системные кнопки при отображении заголовков таблицы.
2. Советую заглянуть в комментарии. Там в № (24) alexk-is приводит пример, как прикрутить эту идею в типовой "Универсальный отчет". А так же заглянуть в публикацию //infostart.ru/public/84642/ от alexk-is, которая содержит дальнейшее развитие идеи (для вертикальных и горизонтальных группировок).
3. (15.12.2011) Версия 2a. Добавлен код (одна строка) для назначения горячих клавиш для сгенерированных кнопочек. Теперь можно с помощью комбинаций Alt+[номер кнопки] сворачивать/разворачивать группировки с помошью клавиатуры. Спасибо rumik007 за идею.
4. (04.06.2015) Коллега unichkin опубликовал решение этой задачи для управляемых форм: Кнопки управления группировками табличного документа для управляемых форм.
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Работа с интерфейсом Анализ учета Мониторинг 1С:Предприятие 8 1С 8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)
Создайте свой функциональный интерфейс в любой конфигурации 1С с помощью расширения Infostart Dashboard. Настраивайте панели виджетов с метриками, индикаторами и показателями на начальном экране. Узнайте возможность внедрения подсистемы у себя в конфигурации с помощью бесплатной обработки "Анализ внедрения подсистемы 1С Infostart Dashboard"!
31720 руб.
27.03.2025 92195 69 44
Консолидация данных Работа с интерфейсом Разработчик Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 1C:ERP Узбекистан Беларусь Кыргызстан Россия Казахстан Платные (руб)
Знакомая ситуация? Пользователи, особенно менеджеры, уверены: отборов много не бывает. Идут пожелания добавить в форму списка еще один быстрый фильтр, еще два, еще пять... В итоге интерфейс превращается в нагромождение полей отбора, а потребность в «самом главном» отборе, который «вот прямо сейчас нужен», все равно не закрыта. Универсальное расширение, которое решает эту проблему элегантно и технологично. С его помощью в любую форму списка можно легко добавить панель настраиваемых кнопок-закладок, каждая из которых применяет сложный фильтр-запрос, а так же показывает актуальное количество элементов в реальном времени.
6088 руб.
17.10.2025 3625 3 0
Разработка Инструментарий разработчика Работа с интерфейсом Адаптация типовых решений Нейросети 1C:Бухгалтерия 1C:ERP 1С:ЗУП 1С:КА 1С:УНФ 1С:УТ 1С:Розница 1С:ДО 1С:ERP Управление предприятием 2 Платные (руб)
Разработка "Дизайнер форм 1С" реализована в виде расширения 1С и является универсальным инструментом для разработки прототипа форм с целью демонстраций, технических заданий и т.д. Без участия разработчика с возможностью экспорта в файл внешней обработки и генерации формы используя искусственный интеллект.
36600 руб.
28.08.2025 10292 2 2
Работа с интерфейсом Разработчик Стажер 1С:Предприятие 8 Бесплатно (free)
Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна
20.08.2024 57292 mrXoxot 44
Работа с интерфейсом Разработчик 1С:Предприятие 8 Бесплатно (free)
Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.
27.05.2024 29955 smielka 39
Инструментарий разработчика Работа с интерфейсом Разработчик 1С 8.3 Абонемент ($m)
Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.
1 стартмани
10.04.2023 19411 190 acces969 31
Работа с интерфейсом Разработчик 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)
Питничная фантазия на возможности в разработке интерфейсов формы с помощью Платформы 1С - делаем свою подсказку. Публикация содержит готовую библиотеку программного формирования данной подсказки.
12.08.2022 16901 top_1c 39
Работа с интерфейсом Разработчик 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)
"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.
1 стартмани
05.07.2022 17923 kalyaka 8
В своих отчетах для управления уровнями группировок я использую маленькие кнопочки на поле табличного документа - это намного удобнее и быстрее, чем через контекстное меню.
Да, можно и так...
Но (IMHO) отчет с включенными заголовками смотрится как-то "лохмато", непрофессионально. Заголовки захламляют отчет, представляя собой совершенно лишнюю информацию. А также занимают место, уменьшая полезную площадь для отчета, которой порой так не хватает...
Вобщем я пользуюсь сгенерированными кнопочками. Может кому-то это тоже понравится. Как говорится - "На вкус и цвет...". :D
НачалоЛево = ЭлементыФормы.ПолеТабличногоДокументаРезультат.Лево + 3; // Тут установить начальные координаты для кнопок
....
НоваяКнопка.Лево = НачалоЛево + (ШагКнопок * (Сч - 1));
.......
Испоравь так. Так кнопки сгенерерованные перекроют даже кнопки при включенном заголовке )))
Или вариант 2 - сделать спец.шаблон 1С, в котором имя будет запрашиваться и подставляться в код.
Да, конечно,если ПолеТабличногоДокумента находится на Панели, то в этом случае кнопочки нужно формировать на Панели, а не на Форме.
И код тогда надо будет изменить так:
НоваяКнопка = ЭлементыФормы.Добавить(Тип("Кнопка"), ПрефиксИмениКн + Сч, Истина, ЭлементыФормы.Панель1);
Процедура СгенерироватьКнопкиУправленияГруппировкой()
НачалоВерх = ЭлементыФормы.Результат.Верх + 3; // Привязка к верхнему левому углу ПоляТабличногоДокумента
НачалоЛево = ЭлементыФормы.Результат.Лево + 3; // Привязка к верхнему левому углу ПоляТабличногоДокумента
ШагКнопок = 13;
ПрефиксИмениКн = "КнГр_";
// Удалить старые кнопки
Сч = 0;
Пока Сч < ЭлементыФормы.Количество() Цикл
ТекЭлемент = ЭлементыФормы.Получить(Сч);
Если Найти(ТекЭлемент.Имя, ПрефиксИмениКн) > 0 Тогда
ЭлементыФормы.Удалить(ТекЭлемент);
Иначе
Сч = Сч + 1;
КонецЕсли;
КонецЦикла;
// Добавть новые кнопки по количеству группировок
КоличествоГруппировок = ЭлементыФормы.Результат.КоличествоУровнейГруппировокСтрок();
Для Сч = 1 По КоличествоГруппировок Цикл
НоваяКнопка = ЭлементыФормы.Добавить(Тип("Кнопка"), ПрефиксИмениКн + Сч);
НоваяКнопка.Верх = НачалоВерх;
НоваяКнопка.Лево = НачалоЛево + (ШагКнопок * (Сч - 1));
НоваяКнопка.Высота = 11;
НоваяКнопка.Ширина = 11;
НоваяКнопка.Шрифт = Новый Шрифт("Шрифт диалогов и меню", 6);
НоваяКнопка.Заголовок = "" + Сч;
НоваяКнопка.УстановитьДействие("Нажатие", Новый Действие("СвернутьДоУровня"));
НоваяКнопка.Подсказка="Свернуть до уровня";
КонецЦикла;
КонецПроцедуры //СгенерироватьКнопкиУправленияГруппировкой()
// Вызывается при нажатии кнопочек "1", "2" и т.д. (для сворачивания группировок)
Процедура СвернутьДоУровня(Элемент)
Уровень = Число(Элемент.Заголовок); // здесь записан нужный уровень
Если Элемент.Подсказка="Свернуть до уровня" Тогда
ЭлементыФормы.Результат.ПоказатьУровеньГруппировокСтрок(Уровень - 1);
Элемент.Подсказка="Развернуть до уровня";
Иначе
ЭлементыФормы.Результат.ПоказатьУровеньГруппировокСтрок(Уровень + 1);
Элемент.Подсказка="Свернуть до уровня";
КонецЕсли;
//чтобы нижележащие кнопки группировки вели себя соответственно
КоличествоГруппировок = ЭлементыФормы.Результат.КоличествоУровнейГруппировокСтрок();
ПрефиксИмениКн = "КнГр_";
Для й=Уровень+1 по КоличествоГруппировок Цикл
ЭлементыФормы[ПрефиксИмениКн+й].Подсказка=Элемент.Подсказка;
КонецЦикла;
КонецПроцедуры //СвернутьДоУровня()
Процедура РезультатПриИзмененииСодержимогоОбласти(Элемент, Область) //по-моему, самое оно именно в это событие впихнуть отрисовку
СгенерироватьКнопкиУправленияГруппировкой();
КонецПроцедуры
Показатьи разворачивает тоже.
Твой вариант Процедуры СвернутьДоУровня(Элемент) предпологает другой алгоритм работы кнопок, отличающийся от системного. Наверное кому-то понравится и твой вариант, что-то в нем есть.
Но твой вариант требует проработки. Попробуй сразу после формирования отчета: нажать 1 (сверется до уровня 1), потом нажать 2 (развернется уровень 1 и уровень 2), потом снова нажать 1 (ничего не происходит... а срабатывает только по повторному нажатию).
В публикации описана сама идея генерации кнопочек, а как ее применить - каждый для себя решит сам, в меру своих знаний и потребностей. :D
Есть один минус - у действия "СвернутьДоУровня" может быть только один параметр (Элемент), сюда параметры не передашь, значит, нужно либо где-то отдельно хранить данные либо пользоваться шаблоном, который автоматом развернется в нужный/правильный код.
// ИС КАВ ( 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;
// ИС КАВ )
КонецПроцедуры // ФормаПриОткрытии()
Отличное применение идеи.
Только в коде (в двух местах), наверное, лучше заменить: текст "КнопкаГруппировки_" на переменную ПрефиксКнопки.
Добавил в публикацию ссылку на твоё сообщение.
Процедура УправлениеПанельюБыстрыеОтборы(Объект, Форма) Экспорт
...
Если Форма.ЭлементыФормы.Найти("ПолеТабличногоДокументаРезультат") <> Неопределено Тогда
СгенерироватьКнопкиУправленияГруппировкой(Форма.ЭлементыФормы.ПолеТабличногоДокументаРезультат)
КонецЕсли;
КонецПроцедуры // УправлениеПанельюБыстрыеОтборы()
ПоказатьНу и в процедуре "СгенерироватьКнопкиУправленияГруппировкой" добавил удаление кнопок
Для Индекс = 1 По КоличествоГруппировок Цикл
ИмяКнопки = "КнопкаГруппировки_" + Формат(Индекс, "ЧЦ=3; ЧН=; ЧВН=") + "_" + ИмяТабличногоДокумента;
//..........................
ЭлементКнопка = ЭлементыФормы.Найти(ИмяКнопки);
Если ЭлементКнопка <> Неопределено Тогда
ЭлементыФормы.Удалить(ЭлементКнопка);
КонецЕсли;
//..........................
Если ЭлементыФормы.Найти(ИмяКнопки) = Неопределено Тогда ПоказатьЯ не использую в своей работе управляемые формы, поэтому не могу ни чем помочь, к сожалению... :(
Но если у тебя получится прикрутить эту фичу в управляемых формах, будет очень здорово. Не забудь только сообщить об этом в этой теме. Я думаю, что это бы потянуло на отдельную публикацию.
Успехов в исследованиях.
прикрутил тестово к отчету на СКД, получилось несколько уродливо (времени мало, а желания - много):
- при нажатии "кнопочек" вылазят рамки рисунков, надо додумать, как этого избавиться
- кнопки нельзя(?) "засунуть" в пространство над группировками(оно вроде как системное), пришлось совать в .Область(1,1,1,1)
Основная задача была - портировать :)
Вышло так:
Дополняем модуль формы:
// Вызывется при нажатии кнопочек "1", "2" и т.д. (для сворачивания группировок)
&НаКлиенте
Процедура СвернутьДоУровня(Уровень)
Результат.ПоказатьУровеньГруппировокСтрок(Уровень - 1);
КонецПроцедуры //СвернутьДоУровня()
&НаКлиенте
Процедура РезультатПриАктивизацииОбласти(Элемент)
Если Не ТипЗнч(Элемент.ТекущаяОбласть) = Тип("РисунокТабличногоДокумента") Тогда
Возврат;
КонецЕсли;
Уровней = Результат.КоличествоУровнейГруппировокСтрок();
Попытка
Уровень = Число(Элемент.ТекущаяОбласть.Текст);
Исключение
Уровень = 0;
КонецПопытки;
Если Уровень > 0 И Уровень <= Уровней Тогда
СвернутьДоУровня(Уровень);
КонецЕсли;
КонецПроцедуры ПоказатьМодуль объекта:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
МассивЗаголовковРесурсов = Новый Массив;
НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);
//Создадим и инициализируем процессор компоновки
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
//Создадим и инициализируем процессор вывода результата
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
//Обозначим начало вывода
ПроцессорВывода.НачатьВывод();
ТаблицаЗафиксирована = Ложь;
ДокументРезультат.ФиксацияСверху = 0;
//Основной цикл вывода отчета
Пока Истина Цикл
//Получим следующий элемент результата компоновки
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Если ЭлементРезультата = Неопределено Тогда
//Следующий элемент не получен - заканчиваем цикл вывода
Прервать;
Иначе
// Зафиксируем шапку
Если Не ТаблицаЗафиксирована
И ЭлементРезультата.ЗначенияПараметров.Количество() > 0
И ТипЗнч(КомпоновщикНастроек.Настройки.Структура[0]) <> Тип("ДиаграммаКомпоновкиДанных") Тогда
ТаблицаЗафиксирована = Истина;
ДокументРезультат.ФиксацияСверху = ДокументРезультат.ВысотаТаблицы;
КонецЕсли;
//Элемент получен - выведем его при помощи процессора вывода
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
КонецЕсли;
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
СгенерироватьКнопкиУправленияГруппировкой(ДокументРезультат);
КонецПроцедуры
Процедура СгенерироватьКнопкиУправленияГруппировкой(Документ)
НачалоВерх = 5; // Привязка к верхнему левому углу ПоляТабличногоДокумента
НачалоЛево = 1; // Привязка к верхнему левому углу ПоляТабличногоДокумента
ШагКнопок = 4;
// Удалить старые кнопки
Для каждого Рис Из Документ.Рисунки Цикл
Если Рис.ТипРисунка = ТипРисункаТабличногоДокумента.Текст Тогда
Документ.Рисунки.Удалить(Рис);
КонецЕсли;
КонецЦикла;
// Добавить новые кнопки по количеству группировок
КоличествоГруппировок = Документ.КоличествоУровнейГруппировокСтрок();
Для Сч = 1 По КоличествоГруппировок Цикл
НоваяКнопка = Документ.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
НоваяКнопка.Верх = НачалоВерх;
НоваяКнопка.Лево = НачалоЛево + (ШагКнопок * (Сч - 1));
НоваяКнопка.Высота = 3;
НоваяКнопка.Ширина = 3;
НоваяКнопка.Шрифт = Новый Шрифт("Шрифт диалогов и меню", 6);
НоваяКнопка.Текст = "" + Сч;
НоваяКнопка.Защита = Истина;
КонецЦикла;
КонецПроцедуры //СгенерироватьКнопкиУправленияГруппировкой()
ПоказатьЕще раз спасибо автору за идею, извините, если что не так! :)
[CODE 1с]// Вызывется при нажатии кнопочек "1", "2" и т.д. (для сворачивания группировок)
&НаКлиенте
Процедура СвернутьДоУровня(Уровень)
Результат.ПоказатьУровеньГруппировокСтрок(Уровень - 1);
Массив = Новый Массив();
Массив.Добавить(Результат.Область(1,1,1,1));
Элементы.Результат.УстановитьВыделенныеОбласти(Массив);
КонецПроцедуры[/1C-CODE]
Теперь все довольно мило.
Однако, в веб-клиенте FF8, IE8 не работает. Кнопки рисуются не тогда и не там, где определено и не реагируют на нажатия. Так что пока только для тонкого клиента (8.2.13.219).
До этого получал только вопросы типа: "А как быть с управляемыми формами?"...
И вот нашелся человек, который решил исследовать эту проблему.
В моей публикации только рабочая идея. А развить ее под свои задачи может каждый для себя сам. Примеры имеются. Правда все только (до текущего момента) под обычное приложение.
Успехов вам.
"{Отчет.Отчет2.Форма.ФормаОтчета.Форма(38,57)}: Тип не определен (Действие)
НоваяКнопка.УстановитьДействие("Нажатие", Новый <<?>>Действие("СвернутьДоУровня")); (Проверка: Сервер)"
Да и я как понимаю, код не для управляемых форм, т.к. просто вызвать функцию Добавить() для 8.2 не пройдет.
Для управляемых форм смотри выше сообщения от nissal, он экспериментировал с управляемыми формами, и у него есть определенные результаты.
Я не работаю с управляемыми формами, т.к. нет пока необходимости, поэтому помочь ни чем, к сожалению, не смогу.
Решение там одно, делать кнопки 1,2,3 и т.д. - т.к. они видны в веб-клиенте и написать свою кнопку "Сформировать" вместо штатной.
Спасибо! За идею! :)
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиОтчета, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.НачатьВывод();
Пока Истина Цикл
ЭлементРезультата = ПроцессорКомпоновки.Следующий();
Если ЭлементРезультата = Неопределено Тогда
Прервать;
Иначе
Для Каждого Параметр Из ЭлементРезультата.ЗначенияПараметров Цикл
Если ТипЗнч(Параметр.Значение)=Тип("ИдентификаторРасшифровкиКомпоновкиДанных")Тогда
Продолжить;
КонецЕсли;
КонецЦикла;
ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
КонецЕсли;
КонецЦикла;
ПроцессорВывода.ЗакончитьВывод();
Оповестить("ОтчетСформирован");
КонецПроцедуры
Показатьи в форме отчета
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ОтчетСформирован" Тогда
СгенерироватьКнопкиУправленияГруппировкой();
КонецЕсли;
КонецПроцедуры
По-идее должно без проблем работать в тонком клиенте.
Вешаешь на кнопку "Сформировать" следующую процедуру
Процедура кнСформировать_Нажатие(Кнопка)
ЭлементыФормы.Результат.Очистить();
ОтчетОбъект.СкомпоноватьРезультат(ЭлементыФормы.Результат, ДанныеРасшифровки);
// Если необходимо указать Уровень, до которого необходимо раскрыть группировки строк,
// то можно добавить
ЭлементыФормы.Результат.ПоказатьУровеньГруппировокСтрок(1);
// Вызов процедуры генерации кнопок управления группировкой
СгенерироватьКнопкиУправленияГруппировкой();
КонецПроцедуры //кнСформировать_Нажатие()
// где ЭлементыФормы.Результат, это Поле табличного документа, в которое выводится отчет СКД. ПоказатьИ твоя задача решена... :)
Нет лишних добавлений и удалений кнопок, быстрые отборы не мешают.
Перем Доп_мФормаОтчета;
Перем Доп_КоличествоГруппировокСтрок;
Перем Доп_КоличествоГруппировокКолонок;
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////
Процедура СформироватьОтчет(ТабличныйДокумент, Очищать = Истина, ФиксироватьЗаголовок = Истина, Отчет = Неопределено) Экспорт
//.......
Доп_СгенерироватьКнопкиУправленияГруппировками(ТабличныйДокумент);
КонецПроцедуры
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////
Процедура УправлениеОтображениемЭлементовФормы(Объект, Форма, КнопкаИмя = Неопределено) Экспорт
Если Лев(КнопкаИмя, 8) = "КнГрСтр_" Тогда
ТабличныйДокумент = Форма.ЭлементыФормы[Сред(КнопкаИмя, 13)];
Форма.ТекущийЭлемент = ТабличныйДокумент;
Уровень = Число(Форма.ЭлементыФормы[КнопкаИмя].Заголовок);
ТабличныйДокумент.ПоказатьУровеньГруппировокСтрок(Уровень - 1);
Возврат;
ИначеЕсли Лев(КнопкаИмя, 8) = "КнГрКол_" Тогда
ТабличныйДокумент = Форма.ЭлементыФормы[Сред(КнопкаИмя, 13)];
Форма.ТекущийЭлемент = ТабличныйДокумент;
Уровень = Число(Форма.ЭлементыФормы[КнопкаИмя].Заголовок);
ТабличныйДокумент.ПоказатьУровеньГруппировокКолонок(Уровень - 1);
Возврат;
КонецЕсли;
//.......
КонецПроцедуры
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////
Процедура ФормаПриОткрытии(Объект, Отчет, Форма, СоставПанелиДополнительныхЭлементовФормы = Неопределено, ИмяОбъекта = Неопределено) Экспорт
//.......
Доп_мФормаОтчета = Форма;
Доп_КоличествоГруппировокСтрок = 0;
Доп_КоличествоГруппировокКолонок = 0;
КонецПроцедуры
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////
Процедура Доп_СгенерироватьКнопкиУправленияГруппировками(ТабличныйДокумент)
Если Доп_мФормаОтчета = Неопределено Тогда
Возврат;
КонецЕсли;
ЭлементыФормы = Доп_мФормаОтчета.ЭлементыФормы;
ИмяТабличногоДокумента = ТабличныйДокумент.Имя;
КоличествоГруппировокСтрок = ТабличныйДокумент.КоличествоУровнейГруппировокСтрок();
КоличествоГруппировокКолонок = ТабличныйДокумент.КоличествоУровнейГруппировокКолонок();
НачалоВерх = ТабличныйДокумент.Верх + 2;
НачалоЛево = ТабличныйДокумент.Лево + 2;
ШагКнопок = 13;
Если КоличествоГруппировокСтрок < Доп_КоличествоГруппировокСтрок Тогда
Для Индекс = КоличествоГруппировокСтрок + 1 По Доп_КоличествоГруппировокСтрок Цикл
ТекЭлемент = ЭлементыФормы.Найти("КнГрСтр_" + Формат(Индекс, "ЧЦ=3; ЧН=; ЧВН=") + "_" + ИмяТабличногоДокумента);
Если ТекЭлемент <> Неопределено Тогда
ЭлементыФормы.Удалить(ТекЭлемент);
КонецЕсли;
КонецЦикла;
Иначе
Для Индекс = Доп_КоличествоГруппировокСтрок + 1 По КоличествоГруппировокСтрок Цикл
ИмяКнопки = "КнГрСтр_" + Формат(Индекс, "ЧЦ=3; ЧН=; ЧВН=") + "_" + ИмяТабличногоДокумента;
Если ЭлементыФормы.Найти(ИмяКнопки) = Неопределено Тогда
НоваяКнопка = ЭлементыФормы.Добавить(Тип("Кнопка"), ИмяКнопки);
НоваяКнопка.Верх = НачалоВерх;
НоваяКнопка.Лево = НачалоЛево + (ШагКнопок * (Индекс - 1));
НоваяКнопка.Высота = 12;
НоваяКнопка.Ширина = 12;
НоваяКнопка.Шрифт = Новый Шрифт("Шрифт диалогов и меню", 7);
НоваяКнопка.Заголовок = "" + Индекс;
Если Индекс = 1 Тогда
НоваяКнопка.Подсказка = "Показать группировки верхнего уровня";
ИначеЕсли Индекс = КоличествоГруппировокСтрок Тогда
НоваяКнопка.Подсказка = "Показать все группировки";
Иначе
НоваяКнопка.Подсказка = "Показать группировки до уровня " + Индекс;
КонецЕсли;
НоваяКнопка.СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша["_"+Индекс], Истина, Ложь, Ложь);
НоваяКнопка.УстановитьДействие("Нажатие", Новый Действие("КоманднаяПанельФормыБыстрыеОтборы"));
НоваяКнопка.УстановитьПривязку(ГраницаЭлементаУправления.Лево , ЭлементыФормы[ИмяТабличногоДокумента] , ГраницаЭлементаУправления.Лево);
НоваяКнопка.УстановитьПривязку(ГраницаЭлементаУправления.Право , ЭлементыФормы[ИмяТабличногоДокумента] , ГраницаЭлементаУправления.Лево);
НоваяКнопка.УстановитьПривязку(ГраницаЭлементаУправления.Верх , ЭлементыФормы[ИмяТабличногоДокумента] , ГраницаЭлементаУправления.Верх);
НоваяКнопка.УстановитьПривязку(ГраницаЭлементаУправления.Низ , ЭлементыФормы[ИмяТабличногоДокумента] , ГраницаЭлементаУправления.Верх);
КонецЕсли;
КонецЦикла;
КонецЕсли;
НачалоЛево = ТабличныйДокумент.Лево + ?(КоличествоГруппировокСтрок, 6 + КоличествоГруппировокСтрок * 13, 2);
Если КоличествоГруппировокКолонок < Доп_КоличествоГруппировокКолонок Тогда
Для Индекс = КоличествоГруппировокКолонок + 1 По Доп_КоличествоГруппировокКолонок Цикл
ТекЭлемент = ЭлементыФормы.Найти("КнГрКол_" + Формат(Индекс, "ЧЦ=3; ЧН=; ЧВН=") + "_" + ИмяТабличногоДокумента);
Если ТекЭлемент <> Неопределено Тогда
ЭлементыФормы.Удалить(ТекЭлемент);
КонецЕсли;
КонецЦикла;
Иначе
Для Индекс = Доп_КоличествоГруппировокКолонок + 1 По КоличествоГруппировокКолонок Цикл
ИмяКнопки = "КнГрКол_" + Формат(Индекс, "ЧЦ=3; ЧН=; ЧВН=") + "_" + ИмяТабличногоДокумента;
Если ЭлементыФормы.Найти(ИмяКнопки) = Неопределено Тогда
НоваяКнопка = ЭлементыФормы.Добавить(Тип("Кнопка"), ИмяКнопки);
НоваяКнопка.Верх = НачалоВерх + (ШагКнопок * (Индекс - 1));
НоваяКнопка.Лево = НачалоЛево;
НоваяКнопка.Высота = 12;
НоваяКнопка.Ширина = 12;
НоваяКнопка.Шрифт = Новый Шрифт("Шрифт диалогов и меню", 7);
НоваяКнопка.Заголовок = "" + Индекс;
Если Индекс = 1 Тогда
НоваяКнопка.Подсказка = "Показать группировки верхнего уровня";
ИначеЕсли Индекс = КоличествоГруппировокСтрок Тогда
НоваяКнопка.Подсказка = "Показать все группировки";
Иначе
НоваяКнопка.Подсказка = "Показать группировки до уровня " + Индекс;
КонецЕсли;
НоваяКнопка.СочетаниеКлавиш = Новый СочетаниеКлавиш(Клавиша["_"+Индекс], Ложь, Ложь, Истина);
НоваяКнопка.УстановитьДействие("Нажатие", Новый Действие("КоманднаяПанельФормыБыстрыеОтборы"));
НоваяКнопка.УстановитьПривязку(ГраницаЭлементаУправления.Лево , ЭлементыФормы[ИмяТабличногоДокумента] , ГраницаЭлементаУправления.Лево);
НоваяКнопка.УстановитьПривязку(ГраницаЭлементаУправления.Право , ЭлементыФормы[ИмяТабличногоДокумента] , ГраницаЭлементаУправления.Лево);
НоваяКнопка.УстановитьПривязку(ГраницаЭлементаУправления.Верх , ЭлементыФормы[ИмяТабличногоДокумента] , ГраницаЭлементаУправления.Верх);
НоваяКнопка.УстановитьПривязку(ГраницаЭлементаУправления.Низ , ЭлементыФормы[ИмяТабличногоДокумента] , ГраницаЭлементаУправления.Верх);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Доп_КоличествоГруппировокСтрок = КоличествоГруппировокСтрок;
Доп_КоличествоГруппировокКолонок = КоличествоГруппировокКолонок;
КонецПроцедуры
ПоказатьВыглядит вот так:
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 83915
Создание 09.04.11 23:57
Обновление 04.06.15 07:53
Просмотры 53894
Загрузки 0
Рейтинг
302
Комментарии 75
Код открыт Не указано
Рубрики Работа с интерфейсом
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Россия
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)