1С 8.3 Выделить текущую строку в отчете - Программист 1С Минск. Автоматизация бизнеса.

Популярные страницы:
Перейти к контенту

1С 8.3 Выделить текущую строку в отчете

Данные > Примеры кода 1С > 1С 8.3 Табличный документ
Перейти в основной раздел:
Программно выделить текущую строку в отчете можно с помощью механизма автоматического выделения текущей строки отчёта (той, на которой установлен курсор).
Пример №1 из модуля формы отчета в 1С 8.3 от Пaтриoт (infostart.ru/public/1535804):




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

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

&НаКлиенте
Процедура ВыделитьТеущиеСтроки()
   // 1. Найдём строки, где выделены ячейки
   ТекВерх = ОтчетТабличныйДокумент.ТекущаяОбласть.Верх;
   ТекНиз = ОтчетТабличныйДокумент.ТекущаяОбласть.Низ;
   ОбластьТекСтроки = ОтчетТабличныйДокумент.Область(ТекНиз,,ТекВерх);

   // 2. Скинем предыдущее обведение в состояние до нашего вмешательства
   Если ДанныеВыделенныхСтрок <> Неопределено Тогда
       //2.1. Если выделенные строки не менялись - ничего не делаем
       Если ТекВерх = ДанныеВыделенныхСтрок.Верх И ТекНиз = ДанныеВыделенныхСтрок.Низ Тогда
           Возврат;
       КонецЕсли;

       // 2.2. Вернём назад верхнюю границу
       // Обнаружена багофича, что если строке целиком вернуть толщину, которая была у неё изначально, то результат будет отличаться от начального.
       // Изначально для колонок идущих правее последней колонки (т.е. с номером больше, чем ШиринаТаблицы) Границы не отображаются.
       // Но после установки новой границы, начнёт отображаться. Поэтому сначала полностью стираем границу, которую мы установили выделением,
       // потом для колонок отчёта (с первой по ШиринаТаблицы) возвращаем сохранённую границу.
       // Альтернативный вариант - можно выделять не всю строку, а только колонки с первой по ШиринаТаблицы - но он кажется менее функциональным и интуитивно понятным.

       НевидимаяЛиния = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии);
       СтрокаВерх = ОтчетТабличныйДокумент.Область(ДанныеВыделенныхСтрок.Верх,, ДанныеВыделенныхСтрок.Верх);
       СтрокаВерх.ГраницаСверху = НевидимаяЛиния;

       ОбластьВерх = ОтчетТабличныйДокумент.Область(ДанныеВыделенныхСтрок.Верх, 1, ДанныеВыделенныхСтрок.Верх, ОтчетТабличныйДокумент.ШиринаТаблицы);
       Если ДанныеВыделенныхСтрок.ГраницаСверху <> Неопределено Тогда
           ОбластьВерх.ГраницаСверху = ДанныеВыделенныхСтрок.ГраницаСверху;
       Иначе
           Для Каждого НастройкиЯчейки Из ДанныеВыделенныхСтрок.УникальныеНастройкиГраницыВерх Цикл
               ТекЯчейкаВерх = ОтчетТабличныйДокумент.Область(ДанныеВыделенныхСтрок.Верх, НастройкиЯчейки.НомерКолонки,
                       ДанныеВыделенныхСтрок.Верх, НастройкиЯчейки.НомерКолонки);
               ТекЯчейкаВерх.ГраницаСверху = НастройкиЯчейки.ГраницаСверху;
           КонецЦикла;
       КонецЕсли;

       // 2.3. Вернём назад нижнюю границу
       СтрокаНиз = ОтчетТабличныйДокумент.Область(ДанныеВыделенныхСтрок.Низ,, ДанныеВыделенныхСтрок.Низ);
       СтрокаНиз.ГраницаСнизу = НевидимаяЛиния;

       ОбластьНиз = ОтчетТабличныйДокумент.Область(ДанныеВыделенныхСтрок.Низ, 1, ДанныеВыделенныхСтрок.Низ, ОтчетТабличныйДокумент.ШиринаТаблицы);
       Если ДанныеВыделенныхСтрок.ГраницаСнизу <> Неопределено Тогда
           ОбластьНиз.ГраницаСнизу = ДанныеВыделенныхСтрок.ГраницаСнизу;
       Иначе
           Для Каждого НастройкиЯчейки Из ДанныеВыделенныхСтрок.УникальныеНастройкиГраницыНиз Цикл
               ТекЯчейкаНиз = ОтчетТабличныйДокумент.Область(ДанныеВыделенныхСтрок.Низ, НастройкиЯчейки.НомерКолонки,
                       ДанныеВыделенныхСтрок.Низ, НастройкиЯчейки.НомерКолонки);
               ТекЯчейкаНиз.ГраницаСнизу = НастройкиЯчейки.ГраницаСнизу;
           КонецЦикла;
       КонецЕсли;
   КонецЕсли;

   // 3. При выделении всего документа, дальнейшие действия не требуются.
   // Более того, если не сделать эту проверку, то дальше упадём с ошибкой, при попытке получения ячейки с координатами (0,х,0,х)
   ВыделенВесьТабДок = ТекВерх = 0 Или ТекНиз = 0;
   Если ВыделенВесьТабДок Тогда
       // обработка выделенных строк на прошлом шаге для случая, когда ВыделенВесьТабДок = Истина, инициирует событие ПриАктивизации.
       // Чтобы не заходить в бесконечный цикл, очистим данные выделенных строк.
       ДанныеВыделенныхСтрок = Неопределено;
       Возврат;
   КонецЕсли;

   // 4. Запомним текущие значения обведённости строк
   ДанныеВыделенныхСтрок = Новый Структура;
   ДанныеВыделенныхСтрок.Вставить("Верх", ТекВерх);
   ДанныеВыделенныхСтрок.Вставить("Низ", ТекНиз);
   ДанныеВыделенныхСтрок.Вставить("ГраницаСверху", ОбластьТекСтроки.ГраницаСверху);
   ДанныеВыделенныхСтрок.Вставить("ГраницаСнизу", ОбластьТекСтроки.ГраницаСнизу);

   // В общем случае у разных ячеек строки могут быть разные настройки Границ (настройки обведения)
   // и чтобы вернуть их назад, их надо запомнить.
   // Свойство ГраницаСверху (и все остальные границы) для области будет иметь значение неопределено,
   // если для разных ячеек области у этой границы будут отличаться толщина или тип границы
   // Отмечу, что ЦветРамки при этом, может отличаться, и на Границы это никак не повлияет,
   // т.к. ЦветРамки является самостоятельным свойством области, как и сама Граница.

   УникальныеНастройкиГраницыВерх = Новый Массив;
   ДанныеВыделенныхСтрок.Вставить("УникальныеНастройкиГраницыВерх", УникальныеНастройкиГраницыВерх);
   Если ОбластьТекСтроки.ГраницаСверху = Неопределено Тогда
       Для НомерКолонки = 1 По ОтчетТабличныйДокумент.ШиринаТаблицы Цикл
           НастройкиЯчейки = Новый Структура("НомерКолонки, ГраницаСверху");
           НастройкиЯчейки.НомерКолонки = НомерКолонки;

           ЯчейкаВерх = ОтчетТабличныйДокумент.Область(ТекВерх, НомерКолонки, ТекВерх, НомерКолонки);
           НастройкиЯчейки.ГраницаСверху = ЯчейкаВерх.ГраницаСверху;

           УникальныеНастройкиГраницыВерх.Добавить(НастройкиЯчейки);
       КонецЦикла;
   КонецЕсли;

   УникальныеНастройкиГраницыНиз = Новый Массив;
   ДанныеВыделенныхСтрок.Вставить("УникальныеНастройкиГраницыНиз", УникальныеНастройкиГраницыНиз);
   Если ОбластьТекСтроки.ГраницаСнизу = Неопределено Тогда
       Для НомерКолонки = 1 По ОтчетТабличныйДокумент.ШиринаТаблицы Цикл
           НастройкиЯчейки = Новый Структура("НомерКолонки, ГраницаСнизу");
           НастройкиЯчейки.НомерКолонки = НомерКолонки;

           ЯчейкаНиз = ОтчетТабличныйДокумент.Область(ТекНиз, НомерКолонки, ТекНиз, НомерКолонки);
           НастройкиЯчейки.ГраницаСнизу = ЯчейкаНиз.ГраницаСнизу;

           УникальныеНастройкиГраницыНиз.Добавить(НастройкиЯчейки);
       КонецЦикла;
   КонецЕсли;

   // 5. Обведём текущие строки сверху и снизу самой толстой линией.
   // Ограничения (встречаются крайне редко): если строка уже обведена самой толстой линией, то при установке курсора на ней, ничего не изменится.
   // Избавиться от этого без побочных эффектов невозможно, потому что,
   // если в таком случае наоборот убирать обведение, то строка перестанет выделяться на фоне остальных строк.
   // Логика подсказывает, что выделенных строк в отчёте должно быть меньшинство, иначе теряется смысл их выделения.
   // Поэтому даже если на практике и встретится такой отчёт (а вероятность этого мала),
   // то выделение текущей строки в нём всё равно будет приносить, тот результат, которого мы и добивались.
   НаибольшаяВозможнаяТолщинаЛинии = 3;//ограничение платформы
   Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Сплошная, НаибольшаяВозможнаяТолщинаЛинии);

   СтрокаВерх = ОтчетТабличныйДокумент.Область(ТекВерх,,ТекВерх);
   СтрокаВерх.ГраницаСверху = Линия;

   СтрокаНиз = ОтчетТабличныйДокумент.Область(ТекНиз,,ТекНиз);
   СтрокаНиз.ГраницаСнизу = Линия;
КонецПроцедуры
Пример №2 с использованием рисунка ТД типа "Прямая" в 1С 8.3 от Тimiс:


#Область ОписаниеПеременных
//&НаКлиенте
//Перем ПолеФормы;

&НаКлиенте
Перем ГраницаСлева;

&НаКлиенте
Перем ГраницаСправа;

&НаКлиенте
Перем ГраницаСверху;

&НаКлиенте
Перем ГраницаСнизу;

#КонецОбласти

&НаКлиенте
Процедура РезультатПриАктивизации(Элемент)

   Если ТипЗнч(ПолеФормы.ТекущаяОбласть) <> Тип("ОбластьЯчеекТабличногоДокумента") Тогда
       Возврат;
   КонецЕсли;

   Лево  = Мин(Макс(ПолеФормы.ТекущаяОбласть.Лево, 1), ПолеФормы.ШиринаТаблицы);
   Право = Мин(ПолеФормы.ТекущаяОбласть.Право, ПолеФормы.ШиринаТаблицы);
   Верх  = Мин(Макс(ПолеФормы.ТекущаяОбласть.Верх, 1), ПолеФормы.ВысотаТаблицы);
   Низ   = Мин(ПолеФормы.ТекущаяОбласть.Низ, ПолеФормы.ВысотаТаблицы);

   Если Право > ПолеФормы.ФиксацияСлева Тогда
       ИнициализироватьГраницу(ГраницаСлева);
       ГраницаСлева.Расположить(ПолеФормы.Область(1, Лево, ПолеФормы.ВысотаТаблицы, Лево));
       ГраницаСлева.Ширина = 0;

       ИнициализироватьГраницу(ГраницаСправа);
       ГраницаСправа.Расположить(ПолеФормы.Область(1, Право, ПолеФормы.ВысотаТаблицы, Право));
       Ширина               = ГраницаСправа.Ширина;
       ГраницаСправа.Ширина = 0;
       ГраницаСправа.Лево   = ГраницаСправа.Лево + Ширина + ?(Право = ПолеФормы.ШиринаТаблицы, 0.2, 0.6);
   КонецЕсли;

   Если Низ > ПолеФормы.ФиксацияСверху Тогда
       ИнициализироватьГраницу(ГраницаСверху);
       ГраницаСверху.Расположить(ПолеФормы.Область(Верх, 1, Верх, ПолеФормы.ШиринаТаблицы));
       ГраницаСверху.Высота = 0;

       ИнициализироватьГраницу(ГраницаСнизу);
       ГраницаСнизу.Расположить(ПолеФормы.Область(Низ, 1, Низ, ПолеФормы.ШиринаТаблицы));
       Высота               = ГраницаСнизу.Высота;
       ГраницаСнизу.Высота = 0;
       ГраницаСнизу.Верх   = ГраницаСнизу.Верх + Высота + ?(Низ = ПолеФормы.ВысотаТаблицы, 0.2, 0.6);
  КонецЕсли;

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

&НаКлиенте
Процедура ИнициализироватьГраницу(Граница)

   Если Граница <> Неопределено Тогда
       Возврат;
   КонецЕсли;

   Граница           = ПолеФормы.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Прямая);
   Граница.ЦветЛинии = Новый Цвет(50, 50, 50);
   Граница.Линия     = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Сплошная, 2);

КонецПроцедуры
Поиск кода
0
Комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 20.10.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Назад к содержимому