gifts2017

Отбор в отчете по значению ячейки (как в списке документов, к примеру)

Опубликовал Игорь Sh (elephantor) в раздел Программирование - Практика программирования

В данной статье описано, как реализовать отбор в отчете по значению в выделенной ячейке. Такой вариант отбора очень удобен, так как уменьшает время на установление отбора стандартными способами. Данное решение было реализовано в обычном приложении, отчет СКД.

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

Для того, чтобы пользователь видел, нажимая на ячейки отчета, по значению какой колонки у него установлен отбор (Рисунок 2-3), используется стандартная процедура «ПриАктивизацииОбласти», в которой проверяется, установлен ли по данной колонке отбор, и если он установлен, то кнопка «Отбор по значению в колонке» отображается нажатой. Повторное нажатие снимает отбор и перезапускает отчет.

Для сброса всех отборов используется кнопка «Сброс отборов»(Рисунок 4), при нажатии которой элементы отбора обходятся в цикле, и для каждого элемента отбора параметр «Использование» устанавливается в значение «Ложь».

Ниже предоставлен код с краткими комментариями.

 

Модуль формы

 

//Данная процедура программно устанавливает отбор по значению той ячейки которая выделенная в табличном документе и перезапускает отчет

 Процедура ДействияФормыОтборПоКолонке(Кнопка)

            ОбрабатываемаяОбласть = ЭлементыФормы.Результат.Область(ЭлементыФормы.Результат.ТекущаяОбласть.Имя);

            Расшифровка = ОбрабатываемаяОбласть.Расшифровка; //в этой строке получаем номер расшифровки выделенной области

            Поле = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0];

            Отбор = Поле.Значение; //значение отбора

                 

            //В данном цикле построчно обходим все строки отбора, находим нужную нам строку и устанавливаем в ней отбор(при повторном нажатии этот отбор сбрасывается)

            Для Каждого ИмяОтбор Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл

                           Если Строка(ИмяОтбор.ЛевоеЗначение) = Поле.Поле Тогда

                                           ИмяОтбор.Использование = Не ИмяОтбор.Использование;

                                           ИмяОтбор.ПравоеЗначение = Отбор;

                                           ИмяОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

                                           Прервать;

                           КонецЕсли;     

            КонецЦикла;

            Кнопка.Пометка = Не Кнопка.Пометка;

            ПриКомпоновкеРезультата(ЭлементыФормы.Результат, ДанныеРасшифровки, );

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

 

 //Данная процедура(стандартная), при активизации области проверяет установлен ли по ней отбор и если установлен то устанавливает кнопку отбора в позицию ИСТИНА 

 Процедура РезультатПриАктивизацииОбласти(Элемент)

                 

                 //Через попытку сделано, что бы не выскакивала ошибка при нажатии на область у которой нет расшифровки

                 Попытка

                           ЭлементыФормы.ДействияФормы.Кнопки.ОтборПоКолонке.Пометка = Ложь;

                           ОбрабатываемаяОбласть = ЭлементыФормы.Результат.Область(ЭлементыФормы.Результат.ТекущаяОбласть.Имя);

                           Расшифровка = ОбрабатываемаяОбласть.Расшифровка;

                                

                           Если Расшифровка <> Неопределено Тогда

                                           Поле = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0];

                                           Отбор = Поле.Значение;

                                           Для Каждого ИмяОтбор Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл

                                                           Если Строка(ИмяОтбор.ЛевоеЗначение) = Поле.Поле Тогда

                                                                          Если ИмяОтбор.Использование Тогда

                                                                                          ЭлементыФормы.ДействияФормы.Кнопки.ОтборПоКолонке.Пометка = Истина;

                                                                          Иначе

                                                                                          Прервать;

                                                                          КонецЕсли;

                                                           КонецЕсли;     

                                           КонецЦикла; 

                           КонецЕсли;

            Исключение

            КонецПопытки;

                 

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

 

 //Данная процедура сбрасывает все отборы и перезапускает отчет

 Процедура ДействияФормыСбросОтборов(Кнопка)

                 Для Каждого ИмяОтбор Из КомпоновщикНастроек.Настройки.Отбор.Элементы Цикл

                                ИмяОтбор.Использование = Ложь;  

                 КонецЦикла;

                 ПриКомпоновкеРезультата(ЭлементыФормы.Результат, ДанныеРасшифровки, );

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

 

Единственное, что я не смог сделать – это чтобы при перезапуске отчета, после нажатия на кнопку «Отбор по значению в колонке», выделенной оставалась именно та ячейка, по значением которой был совершен отбор. Если кто-то сможет подсказать, как это сделать – буду благодарен. 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Илья (husky) 23.12.15 11:49
А если выделить в колонке 2 ячейки, то отбор сработает?
2. Илья (husky) 23.12.15 12:43
{Форма.ФормаОтчета.Форма(425,13)}: Процедура или функция с указанным именем не определена (ПриКомпоновкеРезультата)
<<?>>ПриКомпоновкеРезультата(ЭлементыФормы.Результат, ДанныеРасшифровки, ); (Проверка: Толстый клиент (обычное приложение))
3. Игорь Sh (elephantor) 23.12.15 13:13
(1) husky, По первому вопросу - нет, работает только с одной ячейкой, но идея хорошая надо будет такое сделать.
По второму - сделай процедуру ПриКомпоновкеРезультата в модуле объекта Экспортной + СтандартнаяОбработка = Ложь; и руками прописать вывод отчета.
4. Илья (husky) 23.12.15 13:53
(3) elephantor, когда будет готов код для нескольких ячеек?
5. Игорь Sh (elephantor) 23.12.15 14:33
(4) husky, Пока не знаю, как свободное время появится
6. Антонио (Fragster) 25.12.15 12:52
а стандартные обработки расшифровки почему не устраивают?
7. Игорь Sh (elephantor) 25.12.15 13:32
(6) Fragster, Так быстрее и удобней делать отбор как по мне.
8. Марина Чирина (chmv) 12.01.16 14:25
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа