Управление группировками в Универсальном отчёте

27.04.15

Разработка - Работа с интерфейсом

Надоело сворачивать группировки строк через контекстное меню. Можно, конечно, включить заголовки, и тогда появятся системные кнопки управления группировками, но с включёнными заголовками отчёт выглядит как-то не комильфо. В итоге слегка допилил Универсальный Отчет, чтобы в отчётах на его основе даже без включенных заголовков всегда были кнопки для управления группировками.

Идею мне подсказала публикация //infostart.ru/public/84642/

Судя по описанию, там много чего интересного, но скачивать не стал - несколько напрягали сообщения об ошибках в комментариях, да и реально привлекли внимание всего две фичи: суммирование по выделенным ячейкам и кнопки управления группировками. Суммирование сразу отпало, потому что этого никак не сделать без правки формы, а моей целью было облагородить отчёты УПП с минимальным вмешательством в конфигурацию.

В итоге оказалось достаточным дописать кое-что в пяти местах модуля отчёта УниверсальныйОтчет (на самом деле достаточно в четырёх, но об этом ниже):

1. В блок определения переменных модуля дописываем две переменных:

Перем мФормаОтчета;
Перем мПрефиксИмениКнопкиГруппировок;

2. В конец процедуры СформироватьОтчет дописываем создание кнопок. Кнопки создаём точно там, где будут системные, если включить заголовки, чтобы при включении ничего не двоилось и системные кнопки оказывались под нашими. И не забываем, что кроме группировок строк бывают ещё группировки колонок:

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

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

3. Для размещения кнопок на форме нам нужна сама форма, а в процедуру СформироватьОтчет она не передаётся, поэтому надо запомнить её в переменной, созданной на этапе 1. Для этого размещаем одну строку в начале процедуры ФормаПриОткрытии:

мФормаОтчета=Форма;

4. Кнопки могут работать только тогда, когда процедура-обработчик находится в модуле формы, но я не хотел менять все 100500 форм отчётов, поэтому оставалось воспользовался той процедурой, которая уже есть в этих формах и которая подходит по прототипу. Я взял ЗначениеПриИзменении. В самое начало этой процедуры надо добавить обработку нажатия наших кнопок:

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

5. В раздел инициализации модуля добавляем строчку, инициализирующую переменную мПрефиксИмениКнопкиГруппировок. Можно, конечно, обойтись и без этой переменной, всюду подставив её значение, но так меньше шансов сделать алгоритм неработоспособным одной опечаткой, плюс гораздо легче устранить конфликт, если вдруг случится чудо и 1С добавит в типовую конфигурацию кнопку с таким же названием:

мПрефиксИмениКнопкиГруппировок="ГМ_КнопкаГруппировок";

Не спрашивайте, почему "ГМ_..." - так надо Smile

UPD от 27.04.2015: Появляется занятный глюк, который может стоить зря потраченных нервов: если открыть в 1С:Предприятии внешний отчёт на основе Универсального отчёта, закрыть, открыть его же в Конфигураторе и что-то поменять в его коде, то эффекта от изменений вы не увидите, пока не перезайдёте в 1С:Предприятие.

Я решил, что дело в том, что форма этого отчёта запоминается в переменной модуля Универсального отчёта. Что именно приводит к тому, что при каждом последующем открытии файла внешнего отчёта 1С вызывает к жизни тот старый фантом, я ещё не продедуктил, да это и неважно, ибо всё вылечивается, если добавить в конец процедуры ФормаПриЗакрытии модуля Универсального отчёта строку:


мФормаОтчета=Неопределено;

УниверсальныйОтчет

См. также

Работа с интерфейсом Системный администратор Программист Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    55456    17    23    

43

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    19740    28    6    

44

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    21994    mrXoxot    44    

128

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    11076    smielka    37    

105

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    17983    1225    elcoan    53    

125

Инструментарий разработчика Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

3 стартмани

10.04.2023    12674    167    acces969    31    

126

Работа с интерфейсом Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    7441    kalyaka    6    

32
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. DrAku1a 1749 19.03.15 15:18 Сейчас в теме
А зря скачивать не стал! Тот самый отчет - намного универсальней* и удобней** встроенного в УПП отчета. Я заменял им универсальный отчет в УТ 10.3, в КА и УПП - нигде проблем не возникало.
* - работает со справочниками, документами, регистрами накопления и сведений, но не работает с регистрами расчетов и бухгалтерии почему-то (обычный универсальный отчет работает только с регистрами накопления)...
** - есть кнопки управления группировками, автоматический подсчёт итогов в выделенных ячейках. Значительно быстрее рассчитывает ширину колонок результата!

и ещё - на ИС отдельная публикация тоже уже очень давно была: Программное генерирование кнопочек для удобного управления уровнями группировки в отчетах (версия 2a), создана 09.04.11
2. vasyak319 152 19.03.15 16:24 Сейчас в теме
(1) DrAku1a, Потому я и написал "Судя по описанию, там много чего интересного". Просто не нужно. А с регистрами бухгалтерии тот отчёт не работает, скорее всего, потому, что построитель как-то плохо к этим регистрам относится. Посмотрите типовые бухгалтерские отчёты - они не на построителе сделаны. В своё время я не придал этому факту значения и попробовал сделать такой отчёт, так всю дорогу плевался.
Оставьте свое сообщение