GetTypedColumnValue в БП объекта

Добрый день!



Вроде, хотелось сделать совершенно стандартную вещь, но не пошло по стандарту:



необходимо в объекте Contact отлавливать изменение поля MobilePhone на сигнал ContactSaving.



Для этого по сигналу написали скрипт:



    var newMobilePhone = Entity.GetTypedColumnValue("MobilePhone");

    var oldMobilePhone = Entity.GetTypedOldColumnValue("MobilePhone");


    throw new Exception(newMobilePhone + " " + oldMobilePhone);

    return true;



Однако обе переменных newMobilePhone и oldMobilePhone  всегда принимают старое одинаковое значение.



Как получить актуальное новое значение этого поля?

Нравится

7 комментариев

Добрый день, Владимир!

Все работает верно, поскольку Вы используете сигнал ContactSaving, то старое и новое значение это одно и тоже значение, поскольку транзакция еще не прошла. 

Если же использовать сигнал ContactSaved, то новое и старое значения будут разными.

 

В пакете Base вижу такой код на событие ContactSaving:



IsCurrentUserPhoroChanged = (Entity.GetTypedColumnValue<Guid>("PhotoId") !=

    Entity.GetTypedOldColumnValue<Guid>("PhotoId") && Entity.GetTypedColumnValue<Guid>("Id") ==

UserConnection.CurrentUser.ContactId);



И во многих других местах на Saving происходит проверка изменения поля как раз таким способом

Владимир Соколов,

Действительно, если взять и выполнить аналогичный пример для поля Name, то в результате получим сообщение с разными именами:

var newName = Entity.GetTypedColumnValue&lt;string&gt;("Name");
var oldName = Entity.GetTypedOldColumnValue&lt;string&gt;("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.

Для решения задачи можно создать дополнительный процесс, который будет срабатывать при добавлении/изменении записи непосредственно в объекте [Средство связи контакта/контрагента].

Показать все комментарии