Уявіть: менеджеру потрібно побачити угоди, де сума оплат за останні 30 днів менша за 50% від суми угоди. Або компанії, у яких є хоча б одна угода на стадії «Переговори» із сумою > 1 000 000. Стандартний фільтр Бітрікс24 не вміє агрегувати дані з пов'язаних сутностей і виконувати підзапити. Ми розробляємо кастомні фільтри, які вирішують такі завдання — від фільтрації за агрегатами до інтеграції з 1С. Оцінимо ваш проєкт за 1 день, напишіть нам.
Як влаштований стандартний фільтр у Бітрікс24?
У Бітрікс24 за фільтрацію відповідає JS-компонент BX.Main.Filter. Він рендерить панель, збирає користувацький ввід і передає його в backend-обробник. У коробковій версії фільтр оперує ORM-класами: \Bitrix\Crm\DealTable, \Bitrix\Crm\ContactTable. Кожне поле маппіться на колонку ORM-сутності. У хмарній версії фільтрація відбувається через REST API — параметр filter у методах crm.deal.list, crm.item.list. Підтримуються оператори: =, !, <, >, <=, >=, %, масив значень (IN). Не підтримуються: групування умов AND/OR на рівні фільтра, агрегатні функції, підзапити.
Чому стандартного фільтра недостатньо?
Бізнес-процеси вимагають відбору за метриками: «прострочені більше 7 днів», «клієнти без активності за місяць», «угоди з дебіторською заборгованістю в 1С». Без кастомного фільтра менеджери вручну вивантажують дані в Excel або витрачають години на batch-запити. Кастомний фільтр автоматизує цю роботу і скорочує час пошуку до секунд.
Архітектура кастомного фільтра
Кастомний фільтр — це REST-застосунок із трьох шарів:
-
UI фільтра — ваш інтерфейс в iframe (placement
LEFT_MENUабоCRM_*_LIST_TOOLBAR). Користувач задає параметри: період, поріг суми, тип сутності. -
Backend-обробник — ваш сервер, який приймає параметри, виконує складну вибірку та повертає список ID відповідних елементів.
-
Відображення результатів — відфільтровані дані показуються в кастомному списку або передаються назад у стандартний список через попередньо встановлений фільтр.
Порівняння підходів до фільтрації
| Критерій | Стандартний фільтр | Кастомний фільтр |
|---|---|---|
| Агрегація за пов'язаними сутностями | Ні | Так (на бекенді) |
| Підзапити | Ні | Так (SQL або REST-ланцюжок) |
| Кешування | Тільки на рівні бази | Redis / серверний з TTL |
| Інтеграція з зовнішніми системами | Ні | Через REST API або прямий SQL |
| Продуктивність на 10 000 записів | ~100 сек (batch) | <1 сек (з кешем) |
Кастомний фільтр кращий за стандартний у 50 разів за швидкістю виконання при великих обсягах.
Глибоке занурення: фільтрація за агрегатами
Завдання: відібрати угоди, за якими сума оплат за останні 30 днів менша за 50% від суми угоди.
Крок 1. Збір даних. Backend запитує активні угоди через crm.deal.list з фільтром STAGE_SEMANTIC_ID=P. Для кожної — товарні позиції та історію оплат через crm.timeline.list або кастомне поле з сумою оплат.
Крок 2. Агрегація на бекенді. Обчислення на вашому сервері:
відсоток_оплати = сума_оплат_30днів / сума_угоди * 100 якщо відсоток_оплати < 50 → включити в результат Крок 3. Кешування. Результат кешується (Redis, TTL 15–30 хвилин). Повторне відкриття фільтра не викликає перерахунок.
Крок 4. Відображення. Список ID відфільтрованих угод передається в UI або формується попередньо встановлений фільтр ID у стандартному списку:
BX24.openPath('/crm/deal/list/?apply_filter=Y&ID[]=' + filteredIds.join('&ID[]=')); Фільтрація за пов'язаними сутностями
Сценарій: знайти компанії, у яких є хоча б одна угода на стадії «Переговори» із сумою > 1 000 000. У стандартному фільтрі компаній немає полів угод. Рішення: 1) запит crm.deal.list з фільтром по стадії та сумі → отримуємо COMPANY_ID; 2) унікальні ID → масив для фільтра компаній; 3) запит crm.company.list з filter: {ID: uniqueCompanyIds}. На бекенді це один SQL-запит з JOIN, через REST — ланцюжок із 2–3 запитів.
Кастомні пресети фільтрів
Пресети зберігають часто використовувані умови: «Прострочені > 7 днів», «VIP-клієнти без активності», «Угоди без завдань». У REST API немає методу для програмного створення пресетів стандартного фільтра, тому реалізуємо кастомний UI з кнопками:
var presets = { overdue_7: {'>DATE_CLOSE': formatDate(-7), 'STAGE_SEMANTIC_ID': 'P'}, vip_inactive: {'UF_CRM_VIP': 1, '<DATE_MODIFY': formatDate(-30)}, no_tasks: {} // серверна логіка }; function applyPreset(name) { loadFilteredData(presets[name]); } Пресет «Угоди без завдань» вимагає batch-запиту tasks.task.list з фільтром UF_CRM_TASK для кожної угоди — вирішується серверною агрегацією.
Продуктивність та ліміти
REST API обмежує: 2 запити в секунду, 50 команд у batch. Для фільтра на 10 000 угод:
| Підхід | Запитів | Час |
|---|---|---|
| Послідовні запити по 50 | 200 | ~100 сек |
| Batch по 50 команд | 4 batch-запити | ~8 сек |
| Серверний кеш + інкрементальне оновлення | 1–2 запити | <1 сек |
Деталі серверного кешу
Серверний кеш із періодичною синхронізацією через вебхуки (`onCrmDealUpdate`) або за розкладом — єдиний робочий підхід для production. Дані оновлюються інкрементально: при зміні угоди вебхук інвалідує кеш, і наступний запит перераховує лише змінені записи. Це знижує навантаження на API та прискорює фільтрацію.Коробкова версія: фільтри через ORM
У коробковій Б24 кастомний фільтр реалізується на рівні PHP — розширення стандартного фільтра новими полями через подію onBuildFilterFields. Обробник onBuildFilterQuery модифікує SQL-запит. Це продуктивніше REST, але вимагає доступу до сервера.
Що входить у роботу
- Аналітика: вивчення бізнес-логіки та вимог до фільтрації.
- Проєктування: архітектура UI/backend, схема кешування.
- Розробка: серверна логіка, інтеграція з REST API / ORM, реалізація пресетів.
- Тестування: навантажувальне тестування на ваших даних, перевірка точності відбору.
- Документація: опис фільтрів, інструкція для адміністраторів.
- Підтримка: 1 місяць після здачі — доопрацювання та консультації.
Терміни — від 5 до 20 днів залежно від складності. У нас 10+ років досвіду в Бітрікс24 та сертифіковані спеціалісти — гарантуємо якість та дотримання термінів. Без кастомного фільтра ви втрачаєте значний час на ручній обробці — розробка окупається протягом кількох місяців. Це дозволяє будувати складні звіти Бітрікс24, недоступні стандартними засобами. Зв'яжіться з нами для оцінки вашого проєкту. Отримайте консультацію.







