Получения реквизита объекта из подписки ПриЗаписи

1. Ujine1313 10 24.12.24 22:23 Сейчас в теме
Коллеги, прощу разъяснить ситуацию:
Есть веб сервис - он изменяет договор контрагента - доп реквизит "МойРеквизит"
При записи объекта в веб сервисе когда внешняя система послала МойРеквизит, ищем договор и меняем в нем МойРеквизит со значения РогаИКопыта на Ромашка. Все тут ок. Но надо что бы при изменении МойРеквизит писался в РС еще. Создаю подписку на событие ПриЗаписи в ДоговораКонтрагента
и тут понеслось!!!!
1.Если МойРевизит менять руками (РогаИКопыта на-> Ромашка) в договорах и записать договор (сработает подписка на ПриЗаписи) в РС попадет Ромашка.
2.Если МойРевизит меняет веб сервис (РогаИКопыта на-> Ромашка) (присваивает новое значение и записывает объект), то опять срабатывает подписка ПриЗаписи и в РС попадет РогаИКопыта т.е. объект записан (Событие ПриЗаписи записало объект), но значение в объекте старое, значение в Объект.ссылка.ДополнительныеРеквизитыто же старое. КАК ТАК?
3. Если отключить подписку и перенести ее П/Ф в веб сервис то после записи объекта мы видим что Объект.ДополнительныеРеквизиты (МойРеквизит -РогаИКопыта) а объект.ссылка.ДополнительныеРеквизиты(МойРеквизит -Ромашка) - тут ка как бы норм но тоже вопрос - объект записан и доп реквизиты что по Объект.ДополнительныеРеквизиты что по Объект.ссылка.ДополнительныеРеквизиты должны быть равны. (тут конечно многие скажут - транзакция не применилась еще и пр...но на то оно ПриЗаписи что бы с объектом работать, иметь ссылку на него и получать записанные реквизиты)
По теме из базы знаний
Найденные решения
27. spacecraft 25.12.24 13:04 Сейчас в теме
(24) получили объект. Отдельно (отдельной транзакцией) снова получили объект, изменили, записали.
Первый полученный объект будет иметь старые значения, так они в часть самого объекта и располагаются в памяти, а не в базе.
Это еще после таких манипуляций не пытаетесь первый объект еще раз записать. В этом случае получили бы ошибку.
Ujine1313; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 33 24.12.24 23:11 Сейчас в теме
3. пользователь 24.12.24 23:53
Сообщение было скрыто модератором.
...
4. -AI- 25.12.24 00:05 Сейчас в теме
(1)
Объект.ссылка.ДополнительныеРеквизиты то же старое
а если заглянуть в Объект.ДополнительныеРеквизиты?

и да...
в какой момент вы смотрите данные через ссылку?
5. Ujine1313 10 25.12.24 07:32 Сейчас в теме
(4) Как такового объекта у нас нет же. Мы находимся в Вар2 в общем модуле (подписка на событие при записи) где параметр Источник содержит объект ДоговорКонтрагента (тип СправочникОбъект ДоговораКонтаргентов)
Вар3 Мы обращаемся к договору через то же как к объекту т.к. получаем его в вебсервисе (Находим в справочнике договоров потом .ПолучитьОбъект()) и записываем его.
На ссылку смотрим в момент Вар2 ПриЗаписи т.е. объект записан уже (смотрим это в общем модуле подписки).
Вар 3 смотрим в модуле веб сервиса
6. -AI- 25.12.24 08:00 Сейчас в теме
(5)
т.е. объект записан уже

но транзакция ещё не завершена, и кеширование никто не отменял....
(видимо не обновились данные через ссылку)

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

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

а когда вы вызываете запись своим кодом, который уже прочитал неоднократно все эти данные,
то данные ПриЗаписи() подсовываются из кеша, т.к. транзакция ещё не завершена, и данные из кеша не отмечены как "устаревшие"
9. Ujine1313 10 25.12.24 10:11 Сейчас в теме
(8) с этим Ок.
Но Получается разная логика работы объекта при нахождении в событии при записи.
1. Если при записи в подписке то объект полностью старый пока не завершится транзакция
2. Если записать объект в веб сервисе (пришли данные в веб сервис ->нашли договор ->подставили туда МойРеквизит->Записать() -> получить данные из Договора МойРеквизит то в Договор.МойРеквизит данные старые а в Договор.ссылка.МойРеквизит они уже новые) ведь объект записан и МойРеквизит должен быть везде новый.
12. spacecraft 25.12.24 10:28 Сейчас в теме
(9)
МойРеквизит должен быть везде новый

В объекте источника хранится всего лишь ссылка. Она одна. А то что объект изменен по этой ссылке, так он скорее всего в другой транзакции изменен и она еще не закончилась.
14. user2107191 25.12.24 10:30 Сейчас в теме
(12) Вот и я говорю - это разные транзакции и разные объекты.
10. user2107191 25.12.24 10:18 Сейчас в теме
Судя по всему что-то не то напрограммиздили. Какая-то искривленная логика. Из того я понял - подозреваю, что в разных местах используются разные экземпляры прикладных объектов. И в каком-то из звеньев в этой цепочке с веб-сервисом появляется совсем другой экземпляр объекта.

И - да, веб сервис работает в отдельной своей собственной транзакции.
11. Ujine1313 10 25.12.24 10:22 Сейчас в теме
(10) Возможно, но объект везде один и тот же, в подписке он передается как источник и другого быть не может но данные в нем почему то не записанные а старые - пришли к выводу что это кеш.
Но вот почему в записанном объекте разные данные по самому объекту и его ссылке это пока не ясно.
13. user2107191 25.12.24 10:29 Сейчас в теме
(11) Есть две стороны: Тот кто инициирует веб-сервис (сеанс с запросом), и тот кто его исполняет (сеанс с самим сервисом).
Вот это вот на какой стороне исполняется?
пришли данные в веб сервис ->нашли договор ->подставили туда МойРеквизит->Записать() -> получить данные из Договора МойРеквизит то в Договор.МойРеквизит данные старые а в Договор.ссылка.МойРеквизит они уже новые

Расчерти лист на две половины и напиши что где исполняется. И поймешь, что на каждой стороне своя транзакция, свои объекты. И они не обязаны синхронизироваться.
15. Ujine1313 10 25.12.24 10:43 Сейчас в теме
(13) у нас прилетел ХМЛ в веб сервис. в нем Договор с МойРеквизит. В модуле Веб сервиса мы находим Договор в базе. Получаем Объект договора и присваиваем в МойРеквизит значение. После этого мы Договор (тип объект) записываем (Записать()) следовательно неявная транзакция ПередЗаписью, ПриЗаписи завершилась - объект в базе записан. Далее мы к записанному Договор обращаемся и читаем МойРеквизит и этот Мойреквизит в объекте старый а в Объекте.Ссылка МойРеквизит новый.
16. Sashares 33 25.12.24 10:45 Сейчас в теме
(15) Код покажи уже и скрины, которые демонстрируют эту проблему.
17. user2107191 25.12.24 10:46 Сейчас в теме
(15)
Далее мы к записанному Договор обращаемся и читаем МойРеквизит и этот Мойреквизит в объекте старый а в Объекте.Ссылка МойРеквизит новый.
В КАКОМ ОБЪЕКТЕ??? ГДЕ? Все в том же модуле веб-сервиса? И в том же объекте, в котором ты нажал Записать()???
18. -AI- 25.12.24 11:26 Сейчас в теме
а потом кому то разбираться во всём этом...
19. Ujine1313 10 25.12.24 11:50 Сейчас в теме
и так скрины
Прикрепленные файлы:
20. spacecraft 25.12.24 12:02 Сейчас в теме
(19) на втором скрине:
УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(ОбДоговор.Ссылка....
Получаем разные значения у объекта и ссылки.
user2107191; +1 Ответить
22. Ujine1313 10 25.12.24 12:26 Сейчас в теме
(20) (21)
Вы оба правы, не заметил что свойства доп реквизитов меняются после записи основного объекта и проваливаясь в подписку мы видим Договор записанный нормальный а допреквизиты еще не присвоены.
С этим по подписке вопрос закрыт.
Но вопрос (Скрины) остается мной не понятый.
У нас Есть запись договора, после этого идет присвоение допреквизитов в ЗаписатьСвойстваУОбъекта (и там повторно записывается Договор)
В конце всего алгоритма
ЗапистьИсториюАккаунтМенеджера(Источник, Отказ)
Где источник - уже дважды записанный договор. и там разные значения в доп реквизите А объекте старые в объекте.ссылка новые.
23. user2107191 25.12.24 12:31 Сейчас в теме
(22)
Где источник - уже дважды записанный договор. и там разные значения в доп реквизите А объекте старые в объекте.ссылка новые.

Сколько раз объяснять???
Ссылка - это данные в базе данных. Даже так - это ВСЕГДА чтение ЗАПИСАННЫХ данных из СУБД.
Объект - это данные в оперативной памяти.
И Объект.Ссылка - это тоже данные в базе данных. И даже Объект.Ссылка.Ссылка - это тоже данные в базе данных. И Объект.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка.Ссы....

Потому что Ссылка! А не Структура.
24. Ujine1313 10 25.12.24 12:48 Сейчас в теме
(23) По этой логике если я в объекте получу реквизит любой (не доп реквизит) и присвою ему новое значение, запишу объект то в объекте будет старый а в объекте.ссылка новый? потому что по ссылки мы получили объект из БД а по объекту объект из ОЗУ и не важно что мы в него то то записали новое?
25. user2107191 25.12.24 12:55 Сейчас в теме
(24)
если я в объекте получу
В объекте нельзя ничего получить.
и присвою ему новое значение
Присвоишь как? Объект.Реквизит = НовоеЗначение?
Тогда в объекте будет новый. А в Объект.Ссылка - старый. А после Объект.Записать() - будет новый и там и там.
а по объекту объект из ОЗУ
Сам понял что сказал?
26. Ujine1313 10 25.12.24 13:02 Сейчас в теме
(25) ДоОбъкет = Договор.ПолучитьОбъект()
ДоОбъкет.Реквизит = НовоеЗначение
ДоОбъкет.Записать()

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

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

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

И нет никаких "Объект.Ссылка.Реквизит". Нигде нет. Вообще.
29. Ujine1313 10 25.12.24 13:12 Сейчас в теме
27. spacecraft 25.12.24 13:04 Сейчас в теме
(24) получили объект. Отдельно (отдельной транзакцией) снова получили объект, изменили, записали.
Первый полученный объект будет иметь старые значения, так они в часть самого объекта и располагаются в памяти, а не в базе.
Это еще после таких манипуляций не пытаетесь первый объект еще раз записать. В этом случае получили бы ошибку.
Ujine1313; +1 Ответить
30. Ujine1313 10 25.12.24 13:13 Сейчас в теме
(27) Окончательно разобрался. респект!
21. user2107191 25.12.24 12:07 Сейчас в теме
(19) 1. Нет уверенности, что между первым и вторым скриншотом с обДоговор ничего не происходит.
2. Нет никаких изменений допреквизитов в объекте ДО его записи. В объекте обДоговор остаются старые допреквизиты.
3. Как правильно заметил (20) - изменение допреквизитов происходит отдельно по ссылке в другой транзакции, без изменения самого объекта обДоговор, и уже ПОСЛЕ записи самого объекта.

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

Вуаля.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот