Как в отчете на СКД отфильтровать положительные значения, оставив только отрицательные и ноль?

Программист 1С v8.3 (Управляемые формы)
← На главную

Часто перед начинающими разработчиками 1С встает задача по доработке отчетов на Системе Компоновки Данных (СКД). Одна из таких задач — добавить возможность быстро отфильтровать данные, например, убрать из отчета все строки, где значение в определенной колонке больше нуля. Первой мыслью может быть добавление специальной кнопки на форму отчета, но СКД предлагает более гибкие и стандартные механизмы.

Давайте разберем, как правильно подойти к решению этой задачи, начиная от самого простого пользовательского способа и заканчивая программной реализацией.

Решение 1: Настройка отбора в пользовательском режиме (Рекомендуемый способ)

Система Компоновки Данных создана с расчетом на то, чтобы пользователи могли самостоятельно настраивать отчеты под свои нужды без привлечения программистов. Это основной и самый правильный подход для задач фильтрации. Прежде чем писать код, стоит убедиться, что стандартных возможностей недостаточно.

Проанализируем по шагам, как пользователь может настроить нужный отбор:

  1. В сформированном отчете нажмите кнопку "Настройки...".
  2. В открывшемся окне переключитесь на расширенный вид, если он еще не активен. Для этого внизу окна нажмите кнопку "Ещё" и выберите пункт "Настройки для технического специалиста" или аналогичный (в разных версиях платформы название может отличаться).
  3. Перейдите на вкладку "Отбор". Здесь отображаются все поля, по которым можно фильтровать данные отчета.
  4. Найдите в левой колонке "Доступные поля" нужное поле (например, "Сумма" или "КонечныйОстаток") и перенесите его в правую часть "Отборы".
  5. В созданной строке отбора настройте условия:
    • Вид сравнения: установите "Меньше или равно".
    • Значение: укажите 0.
  6. Нажмите "Завершить редактирование", и отчет переформируется с учетом нового условия, показав только строки с отрицательными или нулевыми значениями.

Важный совет: Чтобы пользователю не приходилось настраивать этот отбор каждый раз, он может сохранить его как новый вариант отчета. Для этого в меню "Ещё" формы отчета есть опции "Сохранить вариант" или "Сохранить настройки". Это позволит в будущем выбирать готовый вариант отчета с уже примененным фильтром.

Решение 2: Программная установка отбора по умолчанию

Бывают ситуации, когда отчет по умолчанию всегда должен открываться с определенным фильтром. В этом случае разработчик может программно задать начальные настройки отбора. Это делается в модуле формы отчета, как правило, в обработчике события ПриСозданииНаСервере.

Посмотрим на пример кода, который устанавливает отбор на поле "СуммаОстаток":


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Получаем текущие настройки компоновщика
    НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();

    // Для чистоты эксперимента можно очистить все ранее установленные отборы
    // НастройкиОтчета.Отбор.Элементы.Очистить(); 

    // Добавляем новый элемент отбора в коллекцию
    ЭлементОтбора = НастройкиОтчета.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    
    // Указываем поле, по которому будем фильтровать. 
    // Имя поля должно соответствовать имени в схеме компоновки данных.
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СуммаОстаток");
    
    // Включаем использование этого элемента отбора
    ЭлементОтбора.Использование = Истина;
    
    // Задаем вид сравнения
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
    
    // Указываем значение для сравнения
    ЭлементОтбора.ПравоеЗначение = 0;

    // Загружаем измененные настройки обратно в компоновщик
    КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиОтчета);
    
КонецПроцедуры

После добавления этого кода каждый раз при открытии отчета фильтр "СуммаОстаток <= 0" будет уже установлен. Пользователь при этом сможет его изменить или отключить через стандартное меню настроек.

Решение 3: Добавление собственной кнопки на форму (Не рекомендуется)

Хотя изначальный вопрос был именно про кнопку, такой подход считается избыточным для простых фильтров. Он оправдан, только если логика фильтрации очень сложна и требует выполнения дополнительных действий перед применением. Если все же такая задача стоит, рассмотрим, как ее реализовать.

  1. Создание собственной формы отчета. Вместо автоматически генерируемой формы нужно создать основную форму для объекта "Отчет". На эту форму перетащите основной реквизит отчета (например, Отчет) и разместите на ней поле табличного документа для вывода результата.
  2. Добавление кнопки. Разместите на форме элемент Кнопка, создайте для нее команду и обработчик этой команды на клиенте и на сервере.
  3. Написание кода для обработчика. В серверном обработчике команды нужно будет выполнить действия, аналогичные Решению 2, то есть получить настройки компоновщика, добавить или изменить отбор, загрузить настройки обратно, а затем принудительно переформировать отчет.

Пример обработчика команды:


&НаКлиенте
Процедура ФильтрОтрицательные(Команда)
    УстановитьОтборИПереформировать();
КонецПроцедуры

&НаСервере
Процедура УстановитьОтборИПереформировать()
    НастройкиОтчета = КомпоновщикНастроек.ПолучитьНастройки();

    // Ищем, может такой отбор уже есть
    СуществующийОтбор = НастройкиОтчета.Отбор.Элементы.Найти(Новый ПолеКомпоновкиДанных("СуммаОстаток"));

    Если СуществующийОтбор = Неопределено Тогда
        ЭлементОтбора = НастройкиОтчета.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СуммаОстаток");
    Иначе
        ЭлементОтбора = СуществующийОтбор;
    КонецЕсли;

    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
    ЭлементОтбора.ПравоеЗначение = 0;

    КомпоновщикНастроек.ЗагрузитьНастройки(НастройкиОтчета);

    // Принудительно формируем отчет
    СкомпоноватьРезультат(Элементы.Результат);
КонецПроцедуры

Этот подход требует значительно больше усилий и усложняет поддержку отчета в будущем.

Особенности отбора по итоговым полям (ресурсам)

Важно помнить, что если поле, по которому вы фильтруете, является ресурсом (например, итоговая сумма по группе), то отбор применяется уже к сгруппированным данным. Это значит, что из отчета будут исключены целые группы, у которых итог больше нуля, а не отдельные строки, которые вошли в эту группу.

Если же задача — не фильтровать строки, а, например, обнулять отрицательные подытоги, чтобы они не влияли на общий итог, то это делается не через отбор, а через выражение для ресурса на вкладке "Ресурсы" в схеме компоновки данных. Например:

ВЫБОР КОГДА Сумма(ПолеСуммы) < 0 ТОГДА 0 ИНАЧЕ Сумма(ПолеСуммы) КОНЕЦ

Такое выражение заменит все отрицательные итоговые значения на ноль прямо при расчете.

Подведем итог: для фильтрации данных в отчетах на СКД всегда старайтесь использовать встроенные пользовательские настройки. Это самый гибкий, быстрый и правильный способ, который не требует программирования и дает пользователям полный контроль над отчетом.

← На главную