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

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 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61938    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

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

5000 руб.

14.01.2016    54566    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

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

2400 руб.

29.06.2020    16821    21    4    

35

Новогоднее оформление для 1С

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

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

27.12.2023    10993    756    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

10.04.2023    9792    153    acces969    31    

119

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

05.07.2022    3841    kalyaka    4    

29

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12200    1    5    

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

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