...

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

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

  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