Коллеги, прощу разъяснить ситуацию:
Есть веб сервис - он изменяет договор контрагента - доп реквизит "МойРеквизит"
При записи объекта в веб сервисе когда внешняя система послала МойРеквизит, ищем договор и меняем в нем МойРеквизит со значения РогаИКопыта на Ромашка. Все тут ок. Но надо что бы при изменении МойРеквизит писался в РС еще. Создаю подписку на событие ПриЗаписи в ДоговораКонтрагента
и тут понеслось!!!!
1.Если МойРевизит менять руками (РогаИКопыта на-> Ромашка) в договорах и записать договор (сработает подписка на ПриЗаписи) в РС попадет Ромашка.
2.Если МойРевизит меняет веб сервис (РогаИКопыта на-> Ромашка) (присваивает новое значение и записывает объект), то опять срабатывает подписка ПриЗаписи и в РС попадет РогаИКопыта т.е. объект записан (Событие ПриЗаписи записало объект), но значение в объекте старое, значение в Объект.ссылка.ДополнительныеРеквизитыто же старое. КАК ТАК?
3. Если отключить подписку и перенести ее П/Ф в веб сервис то после записи объекта мы видим что Объект.ДополнительныеРеквизиты (МойРеквизит -РогаИКопыта) а объект.ссылка.ДополнительныеРеквизиты(МойРеквизит -Ромашка) - тут ка как бы норм но тоже вопрос - объект записан и доп реквизиты что по Объект.ДополнительныеРеквизиты что по Объект.ссылка.ДополнительныеРеквизиты должны быть равны. (тут конечно многие скажут - транзакция не применилась еще и пр...но на то оно ПриЗаписи что бы с объектом работать, иметь ссылку на него и получать записанные реквизиты)
---
получили объект. Отдельно (отдельной транзакцией) снова получили объект, изменили, записали.
Первый полученный объект будет иметь старые значения, так они в часть самого объекта и располагаются в памяти, а не в базе.
Это еще после таких манипуляций не пытаетесь первый объект еще раз записать. В этом случае получили бы ошибку.
---
Ничего не понял.
---
Сообщение было скрыто модератором.
---
Объект.ссылка.ДополнительныеРеквизиты то же староеа если заглянуть в Объект.ДополнительныеРеквизиты?

и да...
в какой момент вы смотрите данные через ссылку?
---
Как такового объекта у нас нет же. Мы находимся в Вар2 в общем модуле (подписка на событие при записи) где параметр Источник содержит объект ДоговорКонтрагента (тип СправочникОбъект ДоговораКонтаргентов)
Вар3 Мы обращаемся к договору через то же как к объекту т.к. получаем его в вебсервисе (Находим в справочнике договоров потом .ПолучитьОбъект()) и записываем его.
На ссылку смотрим в момент Вар2 ПриЗаписи т.е. объект записан уже (смотрим это в общем модуле подписки).
Вар 3 смотрим в модуле веб сервиса
---
т.е. объект записан уже
но транзакция ещё не завершена, и кеширование никто не отменял....
(видимо не обновились данные через ссылку)

короче.... после всех манипуляций, через пару секунд... в базе какие данные?
(смотрите на другом компе или другой копией 1С и т.д.)
---
в базе в объекте Договора данные правильно встают после записи (какой МойРеквзит записали тот и будет). Но задача в другом- в том что бы когда мы записали объект Договора из этого договора получить МойРеквизит (который присвоили ранее в Договор) и записать его в РС.
тут заметил еще одну странность. Если договор записать руками то в подписку попадает Договор с нужным уже записанным МойРеквизит а если подписка вызывается записью инициализированной веб сервисом то МойРеквизит еще старый (может из кеша тянет ХЗ), но код один и тот же а поведение разное в зависимости от инциализатора записи Договора.
---
Если договор записать руками то в подписку попадает Договор с нужным уже записанным МойРеквизит а если подписка вызывается записью инициализированной веб сервисом то МойРеквизит еще старыйвсё ж понятно....

когда запись вызвана из формы, там никто, в здравом уме, не обращается к данным через ссылку,
и когда ваш кусок ПриЗаписи() смотрит данные ему читают свежие данные, т.к. в кеше их нет...

а когда вы вызываете запись своим кодом, который уже прочитал неоднократно все эти данные,
то данные ПриЗаписи() подсовываются из кеша, т.к. транзакция ещё не завершена, и данные из кеша не отмечены как "устаревшие"
---
с этим Ок.
Но Получается разная логика работы объекта при нахождении в событии при записи.
1. Если при записи в подписке то объект полностью старый пока не завершится транзакция
2. Если записать объект в веб сервисе (пришли данные в веб сервис ->нашли договор ->подставили туда МойРеквизит->Записать() -> получить данные из Договора МойРеквизит то в Договор.МойРеквизит данные старые а в Договор.ссылка.МойРеквизит они уже новые) ведь объект записан и МойРеквизит должен быть везде новый.
---
МойРеквизит должен быть везде новый
В объекте источника хранится всего лишь ссылка. Она одна. А то что объект изменен по этой ссылке, так он скорее всего в другой транзакции изменен и она еще не закончилась.
---
Вот и я говорю - это разные транзакции и разные объекты.
---
Судя по всему что-то не то напрограммиздили. Какая-то искривленная логика. Из того я понял - подозреваю, что в разных местах используются разные экземпляры прикладных объектов. И в каком-то из звеньев в этой цепочке с веб-сервисом появляется совсем другой экземпляр объекта.

И - да, веб сервис работает в отдельной своей собственной транзакции.
---
Возможно, но объект везде один и тот же, в подписке он передается как источник и другого быть не может но данные в нем почему то не записанные а старые - пришли к выводу что это кеш.
Но вот почему в записанном объекте разные данные по самому объекту и его ссылке это пока не ясно.
---
Есть две стороны: Тот кто инициирует веб-сервис (сеанс с запросом), и тот кто его исполняет (сеанс с самим сервисом).
Вот это вот на какой стороне исполняется?
пришли данные в веб сервис ->нашли договор ->подставили туда МойРеквизит->Записать() -> получить данные из Договора МойРеквизит то в Договор.МойРеквизит данные старые а в Договор.ссылка.МойРеквизит они уже новые
Расчерти лист на две половины и напиши что где исполняется. И поймешь, что на каждой стороне своя транзакция, свои объекты. И они не обязаны синхронизироваться.
---
у нас прилетел ХМЛ в веб сервис. в нем Договор с МойРеквизит. В модуле Веб сервиса мы находим Договор в базе. Получаем Объект договора и присваиваем в МойРеквизит значение. После этого мы Договор (тип объект) записываем (Записать()) следовательно неявная транзакция ПередЗаписью, ПриЗаписи завершилась - объект в базе записан. Далее мы к записанному Договор обращаемся и читаем МойРеквизит и этот Мойреквизит в объекте старый а в Объекте.Ссылка МойРеквизит новый.
---
Код покажи уже и скрины, которые демонстрируют эту проблему.
---
Далее мы к записанному Договор обращаемся и читаем МойРеквизит и этот Мойреквизит в объекте старый а в Объекте.Ссылка МойРеквизит новый. В КАКОМ ОБЪЕКТЕ??? ГДЕ? Все в том же модуле веб-сервиса? И в том же объекте, в котором ты нажал Записать()???
---
а потом кому то разбираться во всём этом...
---
и так скрины
---
на втором скрине:
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ОбДоговор.Ссылка....
Получаем разные значения у объекта и ссылки.
---
(21)
Вы оба правы, не заметил что свойства доп реквизитов меняются после записи основного объекта и проваливаясь в подписку мы видим Договор записанный нормальный а допреквизиты еще не присвоены.
С этим по подписке вопрос закрыт.
Но вопрос (Скрины) остается мной не понятый.
У нас Есть запись договора, после этого идет присвоение допреквизитов в ЗаписатьСвойстваУОбъекта (и там повторно записывается Договор)
В конце всего алгоритма
ЗапистьИсториюАккаунтМенеджера(Источник, Отказ)
Где источник - уже дважды записанный договор. и там разные значения в доп реквизите А объекте старые в объекте.ссылка новые.
---
Где источник - уже дважды записанный договор. и там разные значения в доп реквизите А объекте старые в объекте.ссылка новые.
Сколько раз объяснять???
Ссылка - это данные в базе данных. Даже так - это ВСЕГДА чтение ЗАПИСАННЫХ данных из СУБД.
Объект - это данные в оперативной памяти.
И Объект.Ссылка - это тоже данные в базе данных. И даже Объект.Ссылка.Ссылка - это тоже данные в базе данных. И Объект.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка.Ссы....

Потому что Ссылка! А не Структура.
---
По этой логике если я в объекте получу реквизит любой (не доп реквизит) и присвою ему новое значение, запишу объект то в объекте будет старый а в объекте.ссылка новый? потому что по ссылки мы получили объект из БД а по объекту объект из ОЗУ и не важно что мы в него то то записали новое?
---
если я в объекте получу В объекте нельзя ничего получить.
 и присвою ему новое значение Присвоишь как? Объект.Реквизит = НовоеЗначение?
Тогда в объекте будет новый. А в Объект.Ссылка - старый. А после Объект.Записать() - будет новый и там и там.
 а по объекту объект из ОЗУ Сам понял что сказал?
---
ДоОбъкет = Договор.ПолучитьОбъект()
ДоОбъкет.Реквизит = НовоеЗначение
ДоОбъкет.Записать()

ДоОбъкет - объект в ОЗУ
ДоОбъкет.ссылка - объект в БД

и у нас получается что
ДоОбъкет.Реквизит <> ДоОбъкет.ссылка .Реквизит
---
ДоОбъкет.ссылка - объект в БД Нет в БД никакого объекта!!!
Еще раз по буквам:
ССЫЛКА. НИКОГДА. НЕ. СОДЕРЖИТ. НИКАКИХ.ЗНАЧЕНИЙ.

Ссылка - это УКАЗАТЕЛЬ на запись в БД. Каждый раз при обращении к Ссылке (хоть в объекте, хоть где) происходит ЧТЕНИЕ актуальных данных в БД.
Это не Структура, мать её!!! Это 32 цифробуковки и 4 дефиса!!! Всё!!!
Вот именно они (и только они) и содержатся в "Объект.Ссылка".

И нет никаких "Объект.Ссылка.Реквизит". Нигде нет. Вообще.
---
я понял, спасибо.
---
получили объект. Отдельно (отдельной транзакцией) снова получили объект, изменили, записали.
Первый полученный объект будет иметь старые значения, так они в часть самого объекта и располагаются в памяти, а не в базе.
Это еще после таких манипуляций не пытаетесь первый объект еще раз записать. В этом случае получили бы ошибку.
---
Окончательно разобрался. респект!
---
1. Нет уверенности, что между первым и вторым скриншотом с обДоговор ничего не происходит.
2. Нет никаких изменений допреквизитов в объекте ДО его записи. В объекте обДоговор остаются старые допреквизиты.
3. Как правильно заметил (20) - изменение допреквизитов происходит отдельно по ссылке в другой транзакции, без изменения самого объекта обДоговор, и уже ПОСЛЕ записи самого объекта.

Итого - объект не изменяется, а данные в базе по ссылке изменяются в другой транзакции.

Вуаля.