Выделение текущей строки в отчете

ChOP 228 3 8 7

Выделяет текущие строки в отчете. Добавляется в форму отчета.

&НаКлиенте
Перем ДанныеВыделенныхСтрок;

&НаКлиенте
Процедура ОтчетТабличныйДокументПриАктивизации(Элемент)
    // Делаем через обработчик ожидания, чтобы дать возможность выделить несколько строк,
    // т.к. событие срабатывает сразу при выделении первой ячейки.
    ПодключитьОбработчикОжидания("ВыделитьТеущиеСтроки", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ВыделитьТеущиеСтроки()
    // 1. Найдём строки, где выделены ячейки
    ТекВерх = ОтчетТабличныйДокумент.ТекущаяОбласть.Верх;
    ТекНиз = ОтчетТабличныйДокумент.ТекущаяОбласть.Низ;
    ОбластьТекСтроки = ОтчетТабличныйДокумент.Область(ТекНиз,,ТекВерх);
    
    // 2. Скинем предыдущее обведение в состояние до нашего вмешательства
    Если ДанныеВыделенныхСтрок <> Неопределено Тогда
        //2.1. Если выделенные строки не менялись - ничего не делаем
        Если ТекВерх = ДанныеВыделенныхСтрок.Верх И ТекНиз = ДанныеВыделенныхСтрок.Низ Тогда
            Возврат;
        КонецЕсли;
        
        // 2.2. Вернём назад верхнюю границу
        // Обнаружена багофича, что если строке целиком вернуть толщину, которая была у неё изначально, то результат будет отличаться от начального.
        // Изначально для колонок идущих правее последней колонки (т.е. с номером больше, чем ШиринаТаблицы) Границы не отображаются.
        // Но после установки новой границы, начнёт отображаться. Поэтому сначала полностью стираем границу, которую мы установили выделением,
        // потом для колонок отчёта (с первой по ШиринаТаблицы) возвращаем сохранённую границу.
        // Альтернативный вариант - можно выделять не всю строку, а только колонки с первой по ШиринаТаблицы - но он кажется менее функциональным и интуитивно понятным.
        
        НевидимаяЛиния = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии);
        СтрокаВерх = ОтчетТабличныйДокумент.Область(ДанныеВыделенныхСтрок.Верх,, ДанныеВыделенныхСтрок.Верх);
        СтрокаВерх.ГраницаСверху = НевидимаяЛиния;
        
        ОбластьВерх = ОтчетТабличныйДокумент.Область(ДанныеВыделенныхСтрок.Верх, 1, ДанныеВыделенныхСтрок.Верх, ОтчетТабличныйДокумент.ШиринаТаблицы);
        Если ДанныеВыделенныхСтрок.ГраницаСверху <> Неопределено Тогда
            ОбластьВерх.ГраницаСверху = ДанныеВыделенныхСтрок.ГраницаСверху;
        Иначе
            Для Каждого НастройкиЯчейки Из ДанныеВыделенныхСтрок.УникальныеНастройкиГраницыВерх Цикл
                ТекЯчейкаВерх = ОтчетТабличныйДокумент.Область(ДанныеВыделенныхСтрок.Верх, НастройкиЯчейки.НомерКолонки,
                        ДанныеВыделенныхСтрок.Верх, НастройкиЯчейки.НомерКолонки);
                ТекЯчейкаВерх.ГраницаСверху = НастройкиЯчейки.ГраницаСверху;
            КонецЦикла;
        КонецЕсли;
        
        // 2.3. Вернём назад нижнюю границу
        СтрокаНиз = ОтчетТабличныйДокумент.Область(ДанныеВыделенныхСтрок.Низ,, ДанныеВыделенныхСтрок.Низ);
        СтрокаНиз.ГраницаСнизу = НевидимаяЛиния;
        
        ОбластьНиз = ОтчетТабличныйДокумент.Область(ДанныеВыделенныхСтрок.Низ, 1, ДанныеВыделенныхСтрок.Низ, ОтчетТабличныйДокумент.ШиринаТаблицы);
        Если ДанныеВыделенныхСтрок.ГраницаСнизу <> Неопределено Тогда
            ОбластьНиз.ГраницаСнизу = ДанныеВыделенныхСтрок.ГраницаСнизу;
        Иначе
            Для Каждого НастройкиЯчейки Из ДанныеВыделенныхСтрок.УникальныеНастройкиГраницыНиз Цикл
                ТекЯчейкаНиз = ОтчетТабличныйДокумент.Область(ДанныеВыделенныхСтрок.Низ, НастройкиЯчейки.НомерКолонки,
                        ДанныеВыделенныхСтрок.Низ, НастройкиЯчейки.НомерКолонки);
                ТекЯчейкаНиз.ГраницаСнизу = НастройкиЯчейки.ГраницаСнизу;
            КонецЦикла;
        КонецЕсли;
    КонецЕсли;
        
    // 3. При выделении всего документа, дальнейшие действия не требуются.
    // Более того, если не сделать эту проверку, то дальше упадём с ошибкой, при попытке получения ячейки с координатами (0,х,0,х)
    ВыделенВесьТабДок = ТекВерх = 0 Или ТекНиз = 0;
    Если ВыделенВесьТабДок Тогда
        // обработка выделенных строк на прошлом шаге для случая, когда ВыделенВесьТабДок = Истина, инициирует событие ПриАктивизации.
        // Чтобы не заходить в бесконечный цикл, очистим данные выделенных строк.
        ДанныеВыделенныхСтрок = Неопределено;
        Возврат;
    КонецЕсли;
    
    // 4. Запомним текущие значения обведённости строк
    ДанныеВыделенныхСтрок = Новый Структура;
    ДанныеВыделенныхСтрок.Вставить("Верх", ТекВерх);
    ДанныеВыделенныхСтрок.Вставить("Низ", ТекНиз);
    ДанныеВыделенныхСтрок.Вставить("ГраницаСверху", ОбластьТекСтроки.ГраницаСверху);
    ДанныеВыделенныхСтрок.Вставить("ГраницаСнизу", ОбластьТекСтроки.ГраницаСнизу);
    
    // В общем случае у разных ячеек строки могут быть разные настройки Границ (настройки обведения)
    // и чтобы вернуть их назад, их надо запомнить.
    // Свойство ГраницаСверху (и все остальные границы) для области будет иметь значение неопределено,
    // если для разных ячеек области у этой границы будут отличаться толщина или тип границы
    // Отмечу, что ЦветРамки при этом, может отличаться, и на Границы это никак не повлияет,
    // т.к. ЦветРамки является самостоятельным свойством области, как и сама Граница.
    
    УникальныеНастройкиГраницыВерх = Новый Массив;
    ДанныеВыделенныхСтрок.Вставить("УникальныеНастройкиГраницыВерх", УникальныеНастройкиГраницыВерх);
    Если ОбластьТекСтроки.ГраницаСверху = Неопределено Тогда
        Для НомерКолонки = 1 По ОтчетТабличныйДокумент.ШиринаТаблицы Цикл
            НастройкиЯчейки = Новый Структура("НомерКолонки, ГраницаСверху");
            НастройкиЯчейки.НомерКолонки = НомерКолонки;
            
            ЯчейкаВерх = ОтчетТабличныйДокумент.Область(ТекВерх, НомерКолонки, ТекВерх, НомерКолонки);
            НастройкиЯчейки.ГраницаСверху = ЯчейкаВерх.ГраницаСверху;
            
            УникальныеНастройкиГраницыВерх.Добавить(НастройкиЯчейки);
        КонецЦикла;
    КонецЕсли;
    
    УникальныеНастройкиГраницыНиз = Новый Массив;
    ДанныеВыделенныхСтрок.Вставить("УникальныеНастройкиГраницыНиз", УникальныеНастройкиГраницыНиз);
    Если ОбластьТекСтроки.ГраницаСнизу = Неопределено Тогда
        Для НомерКолонки = 1 По ОтчетТабличныйДокумент.ШиринаТаблицы Цикл
            НастройкиЯчейки = Новый Структура("НомерКолонки, ГраницаСнизу");
            НастройкиЯчейки.НомерКолонки = НомерКолонки;
            
            ЯчейкаНиз = ОтчетТабличныйДокумент.Область(ТекНиз, НомерКолонки, ТекНиз, НомерКолонки);
            НастройкиЯчейки.ГраницаСнизу = ЯчейкаНиз.ГраницаСнизу;
            
            УникальныеНастройкиГраницыНиз.Добавить(НастройкиЯчейки);
        КонецЦикла;
    КонецЕсли;
    
    // 5. Обведём текущие строки сверху и снизу самой толстой линией.
    // Ограничения (встречаются крайне редко): если строка уже обведена самой толстой линией, то при установке курсора на ней, ничего не изменится.
    // Избавиться от этого без побочных эффектов невозможно, потому что,
    // если в таком случае наоборот убирать обведение, то строка перестанет выделяться на фоне остальных строк.
    // Логика подсказывает, что выделенных строк в отчёте должно быть меньшинство, иначе теряется смысл их выделения.
    // Поэтому даже если на практике и встретится такой отчёт (а вероятность этого мала),
    // то выделение текущей строки в нём всё равно будет приносить, тот результат, которого мы и добивались.
    НаибольшаяВозможнаяТолщинаЛинии = 3;//ограничение платформы
    Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, НаибольшаяВозможнаяТолщинаЛинии);
    
    СтрокаВерх = ОтчетТабличныйДокумент.Область(ТекВерх,,ТекВерх);
    СтрокаВерх.ГраницаСверху = Линия;
    
    СтрокаНиз = ОтчетТабличныйДокумент.Область(ТекНиз,,ТекНиз);
    СтрокаНиз.ГраницаСнизу = Линия;
КонецПроцедуры

Источник

0

См. также

Выделенные строки

ВосстановитьВыделенныеСтроки (БСП)

Получить выделенные строки списка (с сохранением выделения)

ЗапомнитьВыделенныеСтроки (БСП)

Строка выделенная оформлением

СкопироватьСтрокиВБуферОбмена (БСП)

ОтчетыТекущегоПользователя (БСП)

ТипОтчетаСтрокой (БСП)

ПриДобавленииДополнительныхОтчетовДоступныхТекущемуПользователю (БСП)

Модератору