Добрый день!
Вроде, хотелось сделать совершенно стандартную вещь, но не пошло по стандарту:
необходимо в объекте Contact отлавливать изменение поля MobilePhone на сигнал ContactSaving.
Для этого по сигналу написали скрипт:
var newMobilePhone = Entity.GetTypedColumnValue("MobilePhone");
var oldMobilePhone = Entity.GetTypedOldColumnValue("MobilePhone");
throw new Exception(newMobilePhone + " " + oldMobilePhone);
return true;
Однако обе переменных newMobilePhone и oldMobilePhone всегда принимают старое одинаковое значение.
Как получить актуальное новое значение этого поля?
Нравится
В пакете Base вижу такой код на событие ContactSaving:
IsCurrentUserPhoroChanged = (Entity.GetTypedColumnValue<Guid>("PhotoId") !=
Entity.GetTypedOldColumnValue<Guid>("PhotoId") && Entity.GetTypedColumnValue<Guid>("Id") ==
UserConnection.CurrentUser.ContactId);
И во многих других местах на Saving происходит проверка изменения поля как раз таким способом
Владимир Соколов,
Действительно, если взять и выполнить аналогичный пример для поля Name, то в результате получим сообщение с разными именами:
var newName = Entity.GetTypedColumnValue<string>("Name"); var oldName = Entity.GetTypedOldColumnValue<string>("Name");throw new Exception(newName + " " + oldName );
Решила посмотреть что происходит на самом деле, изменила поле Name и поле MobilePhone и отловила запросы профайлером и получила следующее:
изначально происходит изменения имени,
после изменяется телефон в таблице ContactCommunication,
и только потом изменяться телефон в контакте.
И потому, на этапе Saving значения старое и новое одинаковые, поскольку изменения телефона происходит в рамках процесcа ContactSaved (пакет Base).
с ContactSaved получается еще интереснее...
Во-первых, когда сообщение выдается, то оба номера (старый и новый) идентичны
А во-вторых, теперь это сообщение выдается далеко не на каждое сохранение, то есть, ощущение, что ContactSaved срабатывает не всегда
Владимир Соколов,
Вы можете перейти в конфигурации в к процессу на объекте Contact пакета Base, и ознакомиться с логикой ContactSaved.
Поле MobilePhone изменяется не в рамках сохранения контакта, а в рамках метода SynchronizeCommunication(), который вызывается после сохранения контакта.
Ещё довольно странное поведение из-за такой синхронизации. В бизнес-процессе совсем не отлавливается событие изменения поля MobilePhone.
С другой стороны, количество Communication options с таким типом может быть больше 1, потому непонятно, какое из них синхронизировано с главным полем в карточке, и изменение какого из них отслеживать
Добрый день,
Стартовый сигнал действительно не реагирует на изменение в контакте/контрагенте полей Email/Мобильный телефон. Это связано с базовой логикой синхронизации этих полей с деталью средства связи контакта/контрагента. Вы можете ознакомиться с логикой в конфигурации, если открыть процесс элемента Contact и ContactCommunication.
Для решения задачи можно создать дополнительный процесс, который будет срабатывать при добавлении/изменении записи непосредственно в объекте [Средство связи контакта/контрагента].