...

Пишем функцию для формирования списка фильтров в where() для search()

Тема в разделе "Примеры сценариев", создана пользователем ksannikov, 30 июн 2025.

  1. ksannikov

    ksannikov Участник

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

    Допустим, вы работаете в CRM ELMA365 и хотите построить отчёт по переговорам. В отчёте обычно есть фильтры, например:

    Статус (В работе, Закрыто, Отменено)
    Контрагент (с каким клиентом работаете)
    Дата начала или окончания переговоров

    Пользователь может заполнить все фильтры, может только один или вообще ни один. А разработчикам, важно сделать так, чтобы отчёт подстраивался под введённые условия, и не приходилось для каждой комбинации писать свой запрос или скрипт.

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


    Код:
    
        let tasks await Namespace.app.conversations.search().where(function (fg) {
            
    let filtersFilter[] = [];
            
    filters.push(f.__deletedAt.eq(null));

            if (
    Context.data.status) {
                
    let status = Namespace.app.conversations.fields.__status.variants[Context.data.status!.code]
                if (
    statusfilters.push(f.__status.eq(status));
            }

            if (
    Context.data.conterparty?.length) {
                
    filters.push(f.contractor.link(Context.data.conterparty));
            }

            if (
    Context.data.start_date && Context.data.end_date) {
                
    filters.push(f.date.gte(Context.data.start_date))
                
    filters.push(f.date.lte(Context.data.end_date))
            }
            else if (!
    Context.data.start_date && Context.data.end_date) {
                
    filters.push(f.date.lte(Context.data.end_date))
            }
            else if (
    Context.data.start_date && !Context.data.end_date) {
                
    filters.push(f.date.gte(Context.data.start_date))
            }
           
            return 
    g.and(...filters);
        }).
    sort('__startAt'true).size(100).all()
    Еще больше полезной информации в ТГ канале WhatDaELMA365