Принцип данного решения довольно прост. Создается две кнопки: первая – отбор по значению колонки, вторая – сброс всех отборов. При нажатии на кнопку «Отбор по значению в колонке» (Рисунок 1) выполняется код, в котором сначала определяется номер расшифровки ячейки, потом по этому номеру находится имя отбора и значение отбора, затем элементы отбора обходятся в цикле, где устанавливается соответственный отбор и перезапускается отчет.
Для того, чтобы пользователь видел, нажимая на ячейки отчета, по значению какой колонки у него установлен отбор (Рисунок 2-3), используется стандартная процедура «ПриАктивизацииОбласти», в которой проверяется, установлен ли по данной колонке отбор, и если он установлен, то кнопка «Отбор по значению в колонке» отображается нажатой. Повторное нажатие снимает отбор и перезапускает отчет.
Для сброса всех отборов используется кнопка «Сброс отборов»(Рисунок 4), при нажатии которой элементы отбора обходятся в цикле, и для каждого элемента отбора параметр «Использование» устанавливается в значение «Ложь».
Ниже предоставлен код с краткими комментариями.
Модуль формы
//Данная процедура программно устанавливает отбор по значению той ячейки которая выделенная в табличном документе и перезапускает отчет
Процедура ДействияФормыОтборПоКолонке(Кнопка)
ОбрабатываемаяОбласть = ЭлементыФормы.Результат.Область(ЭлементыФормы.Результат.ТекущаяОбласть.Имя);
Расшифровка = ОбрабатываемаяОбласть.Расшифровка; //в этой строке получаем номер расшифровки выделенной области
Поле = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0];
Отбор = Поле.Значение; //значение отбора
//В данном цикле построчно обходим все строки отбора, находим нужную нам строку и устанавливаем в ней отбор(при повторном нажатии этот отбор сбрасывается)
Для Каждого ИмяОтбор Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
Если Строка(ИмяОтбор.ЛевоеЗначение) = Поле.Поле Тогда
ИмяОтбор.Использование = Не ИмяОтбор.Использование;
ИмяОтбор.ПравоеЗначение = Отбор;
ИмяОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Прервать;
КонецЕсли;
КонецЦикла;
Кнопка.Пометка = Не Кнопка.Пометка;
ПриКомпоновкеРезультата(ЭлементыФормы.Результат, ДанныеРасшифровки, );
КонецПроцедуры
//Данная процедура(стандартная), при активизации области проверяет установлен ли по ней отбор и если установлен то устанавливает кнопку отбора в позицию ИСТИНА
Процедура РезультатПриАктивизацииОбласти(Элемент)
//Через попытку сделано, что бы не выскакивала ошибка при нажатии на область у которой нет расшифровки
Попытка
ЭлементыФормы.ДействияФормы.Кнопки.ОтборПоКолонке.Пометка = Ложь;
ОбрабатываемаяОбласть = ЭлементыФормы.Результат.Область(ЭлементыФормы.Результат.ТекущаяОбласть.Имя);
Расшифровка = ОбрабатываемаяОбласть.Расшифровка;
Если Расшифровка <> Неопределено Тогда
Поле = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0];
Отбор = Поле.Значение;
Для Каждого ИмяОтбор Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
Если Строка(ИмяОтбор.ЛевоеЗначение) = Поле.Поле Тогда
Если ИмяОтбор.Использование Тогда
ЭлементыФормы.ДействияФормы.Кнопки.ОтборПоКолонке.Пометка = Истина;
Иначе
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Исключение
КонецПопытки;
КонецПроцедуры
//Данная процедура сбрасывает все отборы и перезапускает отчет
Процедура ДействияФормыСбросОтборов(Кнопка)
Для Каждого ИмяОтбор Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл
ИмяОтбор.Использование = Ложь;
КонецЦикла;
ПриКомпоновкеРезультата(ЭлементыФормы.Результат, ДанныеРасшифровки, );
КонецПроцедуры
Единственное, что я не смог сделать – это чтобы при перезапуске отчета, после нажатия на кнопку «Отбор по значению в колонке», выделенной оставалась именно та ячейка, по значением которой был совершен отбор. Если кто-то сможет подсказать, как это сделать – буду благодарен.