Коли менеджер закриває угоду в CRM, а логісти вручну переносять дані в TMS, втрачається до 30 хвилин на кожну заявку — а на місяць це сотні годин операційного часу?
Помилки ручного введення (неправильна адреса, невірна вага) призводять до пересортування та повторної доставки, що спричиняє додаткові витрати. Ми розробляємо інтеграцію Бітрікс24 з вашою логістичною системою — від створення заявки до трекінгу та повідомлень. Заявка формується автоматично при зміні стадії угоди, дані отримувача підтягуються з контакту, товари — з угоди. Час на обробку скорочується з годин до секунд, а кількість помилок — до нуля. Під ключ, з гарантією стабільної роботи та значною економією часу відділу доставки. Економія від впровадження може бути значною, особливо при інтеграції з кількома перевізниками. Наше рішення автоматизації доставки охоплює всі ключові процеси: від заявки до повернення.
Які логістичні системи та API ми інтегруємо?
1С:TMS Логістика. HTTP-сервіси 1С, формат даних — JSON або XML. Основні операції: створення заявки на перевезення, отримання статусу, прив'язка документів.
МійСклад. REST API з OAuth 2.0. Багата документація, sandbox. Підтримує управління замовленнями, відвантаженнями, залишками, поверненнями.
СДЭК API v2. REST API, JWT-аутентифікація. Розрахунок вартості, створення замовлення, трекінг, список ПВЗ.
Яндекс.Доставка / DPD / Boxberry / ПЭК. У кожного свій REST API, що відрізняється за структурою даних та механізмами аутентифікації. Для універсальної інтеграції з кількома перевізниками використовуємо патерн «адаптер»: єдиний інтерфейс всередині додатка, під кожного перевізника — своя реалізація.
WMS-системи (Manhattan, SAP Extended Warehouse Management, 1С:WMS). Як правило, SOAP або пропрієтарний API. Інтеграція складніша через застарілі протоколи.
За даними документації СДЭК API, версія v2 обробляє до 100 запитів на хвилину з середнім часом відповіді 1.5 секунди.
Чому асинхронна обробка критична для інтеграції?
Логістичні API нестабільні: ліміти запитів, таймаути, недоступність. Тому ми будуємо асинхронну чергу (Redis + вбудовані агенти Бітрікс). Webhook від Бітрікс24 приймається миттєво, а виклик логістичного API та оновлення статусів виконуються асинхронно. Це в 2-3 рази надійніше синхронного підходу і не блокує роботу менеджерів. Наприклад, при таймауті в 30 секунд синхронний запит заблокує інтерфейс, а асинхронний — просто спробує знову через 30 секунд.
Сценарії інтеграції
Угода → заявка на доставку. Угода в Бітрікс24 переходить на стадію «Передано на відвантаження» — спрацьовує webhook, адаптер створює заявку в логістичній системі. У картку угоди записується номер заявки (UF_LOGISTICS_ORDER_ID) та трек-номер.
Статуси доставки в CRM. Логістична система відправляє webhook при зміні статусу: «Прийнято на склад», «В дорозі», «Доставлено», «Повернення». Адаптер оновлює стадію угоди через crm.deal.update та додає коментар у timeline через crm.timeline.comment.add.
Розрахунок вартості доставки. На етапі оформлення замовлення (в угоді або в інтернет-магазині) — запит до API перевізника для розрахунку вартості за вагою, габаритами та адресою. Результат — у полі угоди або рахунку.
Вибір ПВЗ. Для інтеграцій з СДЭК, Boxberry, Поштою Росії — віджет вибору ПВЗ на карті всередині картки угоди. Реалізується як вбудований додаток Бітрікс24 з картою (Leaflet + дані ПВЗ з API перевізника).
Повернення. Покупець ініціює повернення — в CRM створюється смарт-процес «Повернення», який запускає процедуру в логістичній системі: забір у покупця, приймання на склад, статус перевірки товару.
Архітектура адаптера
Будуємо PHP-додаток, який:
- Слухає webhook Бітрікс24 (подія зміни стадії угоди)
- Мапить дані угоди у формат логістичної системи
- Викликає API логістики
- Записує відповідь назад у Бітрікс24
Бітрікс24 (stale change webhook)
↓
Адаптер (валідація, трансформація даних)
↓
Логістична система API
↓ (async — через callback або polling)
Адаптер (обробка статусу)
↓
Бітрікс24 REST API (crm.deal.update, crm.timeline.comment.add)
Приклад обробки webhook на PHP:
function handleBitrixWebhook($event) {
$dealId = $event['data']['FIELDS']['ID'];
$deal = CRest::call('crm.deal.get', ['id' => $dealId]);
$address = $deal['UF_DELIVERY_ADDRESS'];
$phone = $deal['UF_DELIVERY_PHONE'];
// Call CDEK API
$cdek = new CdekApiClient();
$order = $cdek->createOrder([
'recipient' => ['name' => $deal['CONTACT_NAME'], 'phone' => $phone],
'address' => $address,
'items' => $deal['PRODUCTS']
]);
CRest::call('crm.deal.update', [
'id' => $dealId,
'fields' => ['UF_CDEK_ORDER_ID' => $order['uuid']]
]);
}
Детальніше про обробку помилок
У разі недоступності API перевізника адаптер поміщає задачу в чергу Redis та повторює запит до 5 разів з експоненційною затримкою: 1, 2, 4, 8, 16 хвилин. Якщо після всіх спроб API не відповів, створюється задача в Бітрікс24 для оператора з повним контекстом помилки.
Маппінг полів
Типовий набір полів, який потрібно передати в логістику:
| Поле Бітрікс24 |
Поле логістики |
Коментар |
CONTACT.NAME + CONTACT.LAST_NAME |
recipient.name |
ПІБ отримувача |
UF_DELIVERY_ADDRESS |
recipient.address |
Структурована адреса або рядок |
UF_DELIVERY_PHONE |
recipient.phone |
Телефон отримувача |
Товари угоди (crm.deal.productrows.get) |
cargo.items[] |
Список позицій, вага, габарити |
UF_DELIVERY_TYPE |
service_code |
Тип доставки (кур'єр/ПВЗ) |
UF_PVZ_CODE |
to_location.code |
Код ПВЗ, якщо обрана доставка в ПВЗ |
Вага та габарити — окрема складність. В Бітрікс24 вони зберігаються в картці товару (каталог), але в CRM-угоді вони беруться з crm.product.list по PRODUCT_ID. Якщо інтеграція зі складом або 1С не налаштована, вагові характеристики можуть бути відсутні — потрібен fallback (дефолтні значення за категорією товару або ручне введення). Для обміну з 1С через CommerceML ми додатково налаштовуємо синхронізацію номенклатури.
Трекінг та сповіщення покупцям
Після отримання трек-номера вибудовуємо ланцюжок сповіщень. Робот Бітрікс24 відправляє SMS або email покупцю (через інтеграцію з сервісом розсилок): «Ваше замовлення передано в доставку, трек-номер: XXX». При кожній зміні статусу — аналогічно. Це знижує навантаження на колл-центр в 4 рази та підвищує задоволеність клієнтів. Агент перевірки статусів запускається кожні 15 хвилин, сповіщення відправляються протягом 5 хвилин після зміни статусу.
Для автоматичного отримання статусів доставки використовуємо два підходи:
-
Webhook від перевізника — перевізник сам повідомляє при зміні статусу. Найкращий варіант, але підтримується не всіма.
-
Polling — агент Бітрікс запитує статус кожні N хвилин по трек-номеру. Працює з будь-яким перевізником, створює навантаження на API.
Що робити при збоях логістичного API?
Логістичні API нестабільні та мають специфічні обмеження:
- Ліміти запитів (rate limiting) — витримуємо паузи між запитами, кешуємо довідкові дані (список ПВЗ, тарифи). Наприклад, СДЭК обмежує 100 запитів на хвилину.
- Помилки адреси — перевізник не може визначити зону доставки за адресою. Потрібен UI для ручного коригування з повідомленням менеджера.
- Заблоковані заявки — якщо логістика заблокувала заявку (некоректні дані), менеджер повинен бачити це в CRM, а не дізнаватися від покупця.
Для обробки винятків використовуємо чергу з повторними спробами (експоненційна затримка до 5 разів: 1, 2, 4, 8, 16 хвилин) та повідомлення в CRM. Якщо після всіх ретраїв API недоступний, створюється задача оператору з повним контекстом помилки.
Що входить в роботу
- Аналіз API ваших логістичних систем та вибір сценаріїв
- Розробка адаптера з асинхронною чергою та повторними спробами
- Налаштування полів угоди, смарт-процесів та бізнес-процесів (Bizproc) Бітрікс24 для автоматичної логістики
- Створення віджета вибору ПВЗ (якщо потрібно)
- Автоматичні сповіщення покупців за статусами через SMS та email
- Тестування на реальних заявках в тестовому середовищі
- Технічна документація та навчання співробітників
- Гарантія на інтеграцію — 6 місяців після здачі
Етапи розробки
| Етап |
Зміст |
Термін |
| Аналітика |
Вибір перевізників, сценарії, ТЗ |
3–5 днів |
| Розробка адаптера |
Основні API-конектори |
1–2 тижні |
| Інтеграція в CRM |
Поля, смарт-процеси, автоматизації |
1 тиждень |
| Віджет ПВЗ |
Карта з вибором пункту видачі |
3–5 днів |
| Сповіщення |
SMS/email за статусами |
3–5 днів |
| Тестування |
Реальні заявки в тестовому середовищі |
1 тиждень |
Готова інтеграція скорочує час від оформлення угоди до створення заявки на доставку з кількох годин до секунд — і прибирає помилки ручного введення даних отримувача. Замовте інтеграцію — отримайте працююче рішення з гарантією 6 місяців. Зв'яжіться з нами для оцінки вашого проекту: ми підберемо оптимальне рішення під ключ.
Розробка та налаштування модулів 1С-Бітрікс
Головна пастка Бітрікса — init.php. Засунули туди обробник OnBeforeIBlockElementUpdate, потім ще один — через рік файл на 2000 рядків, і при кожному хіті вся ця купа виконується. Ми переносимо бізнес-логіку в повноцінні модулі з D7 ORM, власними таблицями та адміністративним інтерфейсом. Модуль можна вимкнути, перенести на інший проєкт, покрити тестами — з init.php нічого з цього не вийде. Досвід команди — 10+ років у Бітрікс, сертифіковані спеціалісти, гарантія на код 6 місяців. Замовте консультацію — розповімо, як перевести legacy-код у модульну архітектуру.
Як модульна архітектура підвищує продуктивність?
Чому init.php — найгірше місце для бізнес-логіки?
Init.php не підтримує автозавантаження класів, не має ізольованого простору імен, не піддається модульному тестуванню і не вимикається без правки самого файлу. Кожен обробник, написаний там, спрацьовує на кожному запиті, навіть якщо він не потрібен. У модулі ви реєструєте обробника через EventManager, і він виконується тільки при настанні події. Різниця в продуктивності — до 3 разів при 10+ обробниках.
Стандартні модулі: типові проблеми та рішення
Інформаційні блоки. Архітектура ІБ — перше, що ми рев'юїмо на будь-якому проєкті. Класична помилка: один інфоблок каталогу з 80 властивостями, з яких 30 — множинні. Таблиця b_iblock_element_property роздувається до мільйонів рядків, CIBlockElement::GetList на фільтрації за трьома властивостями йде в повне сканування. Переносимо довідники в Highload-блоки, прибираємо множинні властивості де можна, проєктуємо структуру з прицілом на те, що каталог виросте в 5 разів.
Інтернет-магазин (sale). Бізнес-правила кошика — окрема історія. Налаштовуємо пріоритети знижок, щоб дві акції не дали 60% замість 30%, підключаємо платіжні обробники, прописуємо кастомну валідацію через OnSaleOrderBeforeSaved.
Пошук. Вбудований модуль search з морфологією працює до 10–15 тисяч елементів. Далі — Elasticsearch. Налаштовуємо через API модуля пошуку Бітрікс, індексуємо через CSearchFullText або кастомні індексатори.
Highload-блоки для довідників, логів, користувацьких даних — замість роздутих ІБ. Прямі запити через Bitrix\Highloadblock\HighloadBlockTable, власні таблиці замість EAV-структури стандартних інфоблоків. Мільйон записів — без деградації.
Поштові події. Налаштування — не лише шаблони в b_event_message. Головне — SPF, DKIM, DMARC на DNS, інакше транзакційні листи летять у спам. Перевіряємо доставність, налаштовуємо bounce-обробку.
Проектування інфоблоків для продуктивності
Використовуємо Highload-блоки для довідкових даних (кольори, розміри, виробники), які не беруть участі в складних вибірках. Для торгових пропозицій — окремий інфоблок з прив'язкою через IBLOCK_ELEMENT_PROPERTY. Увімкнемо INDEX_PROPERTY для часто фільтрованих властивостей. Кешування теговане: при зміні елемента скидається лише пов'язаний кеш. Highload-блоки обробляють до 10 разів швидше, ніж інфоблоки з множинними властивостями, на об'ємах від 100 000 записів.
Розробка кастомних модулів
Кожен модуль — за структурою /local/modules/vendor.modulename/:
-
install/index.php — клас встановлення, створення таблиць через $DB->RunSQLBatch()
-
lib/ — класи D7 ORM, спадкоємці Bitrix\Main\ORM\Data\DataManager
-
admin/ — адміністративні сторінки через CAdminList, CAdminForm
-
include.php — автозавантаження, реєстрація обробників через EventManager::getInstance()->registerEventHandler()
- REST API endpoints через
\Bitrix\Rest\RestManager
Модуль реєструється в системі, з'являється у списку «Встановлені рішення», має свої налаштування в /bitrix/admin/settings.php?mid=vendor.modulename. Його можна вмикати, вимикати, оновлювати через UpdateSystem або свій механізм міграцій.
Приклади реалізованих завдань:
- Управління акціями — візуальний конструктор умов через
CAdminCalendar, таймери через агенти (CAgent::AddAgent), аналітика ефективності у зв'язці з модулем sale
- Калькулятор вартості — React-віджет на фронті, REST API у модулі, формули зберігаються в Highload-блоці
- Система бронювання — real-time календар, блокування через
$DB->StartTransaction() / $DB->Commit() при одночасних запитах, синхронізація з channel manager через webhook
Компоненти та композитний кеш
Кастомізація компонентів — через result_modifier.php і component_epilog.php, не через правку template.php стандартного шаблону. Так ядро оновлюється безболісно.
Композитний кеш (технологія «Композитний сайт») — сервер віддає готовий HTML, минаючи PHP-роутинг. Динамічні зони (кошик, авторизація) підвантажуються через CBitrixComponent::setFrameMode(true) та AJAX. TTFB падає до 30–50 мс. Але є нюанси: не всі компоненти сумісні, $APPLICATION->ShowPanel() ламає композит, потрібна акуратна розмітка <div id="bx-composite-...">.
Маркетплейс: аудит перед встановленням
Перед встановленням модуля з маркетплейсу — обов'язковий аудит. Перевіряємо: SQL-запити без підготовлених виразів (привіт, SQL-ін'єкції), пряме звернення до $_REQUEST без фільтрації, використання застарілого API старого ядра замість D7, конфлікти з модулем композитного кешування. Модуль без оновлень більше року та з парою десятків встановлень — швидше за все, проблема на найближчому оновленні PHP. Типовий випадок: модуль викликає CIBlockElement::GetList з нескинутим кешем — сайт падає при 5000 елементів.
Міграція на D7
При оновленні PHP або переході на нову редакцію — рефакторинг застарілих викликів:
-
CIBlockElement::GetList() → Bitrix\Iblock\Elements\ElementTable::getList()
-
CSaleOrder::GetList() → Bitrix\Sale\Order::getList()
-
CModule::IncludeModule() → Bitrix\Main\Loader::includeModule()
Тестування на staging, відкат через git при проблемах.
Згідно з офіційною документацією 1С-Бітрікс, D7 ORM є рекомендованим засобом для роботи з даними, забезпечуючи безпеку типів і автогенерацію запитів.
Порівняння підходів: Init.php vs Модуль
| Критерій |
Init.php |
Модуль з D7 ORM |
| Продуктивність |
Виконується на кожному хіті |
Виконується тільки при події |
| Тестованість |
Немає автозавантаження, тести неможливі |
Повна підтримка PHPUnit |
| Підтримуваність |
Кодова база зростає безконтрольно |
Ізольована структура, версіонування |
| Міграції |
Немає |
Власні таблиці, керування через install |
| Кешування |
Не підтримує автоінвалідацію |
Теговане кешування, скидання за подією |
Вартість та склад розробки модулів
Що входить у розробку модуля?
- Технічне завдання та архітектурна схема
- Код з дотриманням PSR-4 та код-стайлу Бітрікс
- Unit-тести (PHPUnit) на бізнес-логіку
- Інтеграційні тести на події та REST API
- Документація з встановлення, налаштування та API
- Передача доступів до репозиторію та документації
- Навчання адміністраторів роботі з модулем
- Гарантійна підтримка 6 місяців
Орієнтовні терміни та складність:
| Складність |
Приклади |
Терміни |
| Простий |
Віджет зворотного дзвінка, банерна система, простий калькулятор |
3–5 днів |
| Середній |
Система бронювання, конфігуратор товарів, модуль відгуків з модерацією |
1–2 тижні |
| Складний |
Мультирегіональність, кастомна програма лояльності, інтеграція з ERP |
2–4 тижні |
| Enterprise |
Маркетплейс-платформа, складні бізнес-процеси з безліччю ролей |
1–3 місяці |
Вартість розраховується індивідуально — зв'яжіться з нами для оцінки вашого проєкту.
Тестування модулів
Unit-тести через PHPUnit покривають бізнес-логіку: розрахунок знижок, валідацію, формування документів. Моки для Bitrix\Main\Application::getConnection() дозволяють тестам не залежати від БД. Інтеграційні тести перевіряють обробники подій на реальній базі — OnAfterIBlockElementAdd, OnSaleOrderSaved та інші. REST API endpoints тестуємо через curl або PHPUnit HTTP-клієнт. Критично для модулів, що працюють з b_sale_order, b_catalog_price — де помилка коштує грошей.
Сумісність перевіряється на PHP 7.4, 8.0, 8.1, 8.2 та редакціях: Стандарт, Малий бізнес, Бізнес. Перевіряємо конфлікти з популярними модулями маркетплейсу — вони люблять перехоплювати ті самі події. Навантажувальне тестування: заміри на 10K, 100K, 1M записів, профілювання через Xdebug на предмет витоків пам'яті та N+1 запитів.
Приклади з практики
Модуль акцій для мережі електроніки. Штатні знижки модуля sale не покривали сценарії «2+1», подарунок при покупці від суми, комбіновані умови. Зібрали візуальний конструктор: маркетолог створює правила через drag-and-drop, без тікетів у розробку. Календар акцій, автодеактивація через агенти, аналітика у прив'язці до b_sale_order — конверсія, середній чек, кількість застосувань. Час запуску нової акції впав з двох днів до півгодини.
Калькулятор для будівельників. Параметри (площа, матеріали, поверховість) → формула → попередній кошторис → заявка в CRM через CRest::call('crm.lead.add'). Регіональні коефіцієнти та сезонні націнки — з Highload-блоку, ціни матеріалів — з обміну з 1С. Кількість цільових заявок зросла на третину: клієнти бачать розбивку за статтями до дзвінка менеджеру.
Бронювання для мережі готелів. Real-time доступність через AJAX-запити до кастомної таблиці vendor_booking_slots, розрахунок тарифів за сезоном, синхронізація з Booking.com через channel manager API. Блокування номера при одночасному бронюванні — через SELECT ... FOR UPDATE у транзакції. Таймзони обробляються через \DateTimeZone — гість із Владивостока та менеджер із Москви бачать одну картину.
Оцінимо проєкт за 1 день. Пишіть — розповімо, що входить у розробку під ключ. Зв'яжіться з нами для консультації за вашим проєктом. Замовте розробку модуля під ключ — отримайте готове рішення з документацією та підтримкою.