Задача выполнения произвольного кода при изменении данных встречается сплошь и рядом. Это и разноообразные оповещения, и синхронизация таблиц, и сброс кеша - все, что угодно. При наличии событий, вызываемых после успешного обновления, задача решается достаточно тривиально. Все хорошо ровно до того момента, когда требуется выполнить код только тогда, когда данные ДЕЙСТВИТЕЛЬНО изменились (значения полей элемента таблицы до и после записи различаются). Этот момент почему-то порождает массу вопросов на форуме, не говоря уж об идеях перед обновлением записи подымать из базы старые значения внутри api ядра. Постараюсь закрыть эту тему.
Имеем достаточно распространенную задачу - при изменении элемента инфоблока модифицировать другой. Кейс может быть какой угодно - это и логирование, и деактивация основного товара, когда нет активных предложений, и изменение даты активности связаного элемента. Никаких проблем, скажете вы. За 10 минут пишется обработчик, использующий метод CIBlockElement::Update, вешается на событие OnBeforeIBlockElementUpdate / OnAfterIBlockElementUpdate, вызывается тестовый пример, сервер падает... Epic fail в чистом виде...