Кастомні ORM-обробники для 1С-Бітрікс: розробка та аудит

ORM-події в 1С-Бітрікс: кастомні обробники Уявіть проєкт з каталогом на 50 000 товарів в інфоблоці. Кожне збереження елемента запускає старі події `OnBeforeIBlockElementUpdate` та `OnAfterIBlockElementUpdate`. Вони спрацьовують при будь-якій зміні через API, адмінка гальмує вдвічі. Вихід — ORM-по
Послуги, які ми пропонуємо
Показано 1 з 1Усі 1626 послуг
Кастомні ORM-обробники для 1С-Бітрікс: розробка та аудит
Середній
~1-2 тижні

Наші компетенції:

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1454
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    1018
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    760
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    879
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    803
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    1162

ORM-події в 1С-Бітрікс: кастомні обробники

Уявіть проєкт з каталогом на 50 000 товарів в інфоблоці. Кожне збереження елемента запускає старі події OnBeforeIBlockElementUpdate та OnAfterIBlockElementUpdate. Вони спрацьовують при будь-якій зміні через API, адмінка гальмує вдвічі. Вихід — ORM-події, прив'язані до конкретного DataManager. Вони спрацьовують тільки при викликах add(), update(), delete(). Такий підхід точково реагує на зміни та знижує навантаження на 40%. Ми розробляємо такі обробники під ключ: від простого аудиту до каскадних операцій з десятками сутностей. Працюємо з інфоблоками, HL-блоками, замовленнями, користувачами. Сертифіковані спеціалісти з семирічним стажем. Напишіть нам — оцінимо ваш проєкт і запропонуємо реалістичні терміни.

Кастомний обробник нагадує тригер у базі даних, але з можливістю гнучкої модифікації полів. ORM (object-relational mapping) у Бітрікс реалізовано через класи-нащадки DataManager. Кожна операція із записом породжує події до та після дії.

Як влаштовані події ORM?

У кожного DataManager-класу чотири точки життєвого циклу: додавання, оновлення, видалення. Для кожної — before і after. Подія формується за шаблоном {ClassName}::On{Action}. Наприклад, для Bitrix\Sale\Internals\OrderTable подія перед додаванням — Bitrix\Sale\Internals\OrderTable::OnBeforeAdd.

Реєстрація стандартна:

use Bitrix\Main\EventManager; EventManager::getInstance()->addEventHandler( 'sale', '\Bitrix\Sale\Internals\OrderTable::OnAfterAdd', [\MyProject\Handlers\OrderOrmHandler::class, 'onAfterAdd'] ); 

Покрокова реєстрація ORM-обробника

  1. Створіть клас-обробник з публічними статичними методами.
  2. У методі OnBeforeAdd або OnAfterAdd обробіть подію.
  3. Для before-подій повертайте EventResult з модифікованими полями.
  4. Для after-подій повернення не потрібне, але можна логувати.
  5. Зареєструйте обробник через EventManager::addEventHandler.
  6. Переконайтеся, що операція викликається через ORM (DataManager::add()), а не старий API.

При реєстрації важливо вказати точне повне ім'я класу з неймспейсом.

Об'єкт події та доступні дані

В обробник передається об'єкт \Bitrix\Main\Entity\Event. З нього витягуються параметри:

public static function onAfterAdd(\Bitrix\Main\Entity\Event $event): void { $result = $event->getParameter('result'); // об'єкт Result з ID $fields = $event->getParameter('fields'); // масив збережених полів $newId = $result->getId(); $userId = $fields['USER_ID'] ?? null; } 

Для Before-подій можна модифікувати поля через EventResult:

public static function onBeforeAdd(\Bitrix\Main\Entity\Event $event): \Bitrix\Main\Entity\EventResult { $result = new \Bitrix\Main\Entity\EventResult(); $result->modifyFields(['CREATED_BY' => \CUser::GetID()]); return $result; } 

Типові помилки при реєстрації ORM-подій

Найчастіша — неправильне ім'я класу або опечатка в операції. Друга — реєстрація на подію, яка не спрацює через використання старого API. Перевіряйте: якщо дані вставляються через CIBlockElement::Add, ORM-подія не викличеться. Завжди тестуйте обробник на реальних даних, імітуючи навантаження в 10 000 записів. Третя помилка — забувають повертати EventResult у before-подіях. Без цього операція виконається без змін.

Практичні сценарії

Аудит змін. Логуємо, хто і коли змінив запис у кастомній HL-таблиці. Замість коду — просто факт: записуємо в таблицю аудиту з ідентифікатором сутності, користувачем та серіалізованими змінами. Це допомагає відстежити, хто зіпсував дані.

Автоматичне заповнення полів. При додаванні запису автоматично проставляємо поля: дата створення, статус, хеш.

public static function onBeforeAdd(\Bitrix\Main\Entity\Event $event): \Bitrix\Main\Entity\EventResult { $result = new \Bitrix\Main\Entity\EventResult(); $result->modifyFields([ 'CREATED_AT' => new \Bitrix\Main\Type\DateTime(), 'STATUS' => 'DRAFT', 'HASH' => md5(uniqid('', true)), ]); return $result; } 

Каскадне видалення. Перед видаленням основного запису чистимо пов'язані дані. Наприклад, при видаленні замовлення видаляємо його позиції. ORM не робить це автоматично, обробник підтримує цілісність.

Чому ORM-події кращі за старі?

Параметр ORM-події (D7) Старі події (CMain)
Прив'язка Конкретний DataManager-клас Будь-який код, що викликає API
Об'єкт події \Bitrix\Main\Entity\Event Масив $arParams
Модифікація полів Через EventResult::modifyFields() За посиланням
Скасування операції EventResult::addError() Повернення false
Читабельність реєстрації Ім'я класу + операція Рядок-ідентифікатор

Важливий нюанс: якщо запис створюється через прямий SQL або старий API, ORM-події не спрацьовують. Вони працюють тільки при викликах DataManager::add(), update(), delete().

Чому ORM-події критичні для високонавантажених проєктів?

На сайтах з мільйонами записів кожне зайве спрацьовування збільшує час відгуку. ORM-події реагують тільки на потрібні зміни, знижуючи навантаження. Ми оптимізуємо кожен обробник: теговане кешування, мінімізація запитів до БД, індекси. На одному проєкті після міграції на ORM-події час збереження товару скоротився на 40%. Окупність — за 2 місяці скорочення часу завантаження.

Highload-блоки та ORM-події

Для HL-блоків клас DataManager генерується динамічно. Знайдіть клас:

$hlblock = \Bitrix\Highloadblock\HighloadBlockTable::getById($hlId)->fetch(); $entity = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlblock); $className = $entity->getDataClass(); 

Потім зареєструйте обробник на цей клас. Для кількох HL-блоків створіть універсальний маршрутизатор.

Що входить у розробку обробників?

  • Аналіз поточної подійної моделі та схеми даних
  • Проєктування структури обробників з урахуванням бізнес-логіки
  • Реалізація на ORM D7 з навантажувальним тестуванням (10 000 подій за хвилину)
  • Документація щодо кожного обробника: схема, параметри, приклади
  • Гарантія 6 місяців на код та підтримка після здачі

Терміни

Задача Термін
2–4 обробники для однієї ORM-сутності (аудит, автозаповнення, валідація) 2–4 дні
Система аудиту для 5–10 ORM-таблиць зі зберіганням історії 1–1,5 тижні
Міграція «старих» обробників на ORM-події з тестуванням 1–2 тижні

Приклади засновані на офіційній документації 1С-Бітрікс: ORM D7.

Замовте розробку під ключ

Ми реалізували понад 50 проєктів по 1С-Бітрікс. Використовуємо ORM D7, теговане кешування, подійну модель. Зв'яжіться з нами — отримайте консультацію та точну оцінку вашого проєкту. Пишіть прямо зараз.