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