Получения реквизита объекта из подписки ПриЗаписи
Коллеги, прощу разъяснить ситуацию:
Есть веб сервис - он изменяет договор контрагента - доп реквизит "МойРеквизит"
При записи объекта в веб сервисе когда внешняя система послала МойРеквизит, ищем договор и меняем в нем МойРеквизит со значения РогаИКопыта на Ромашка. Все тут ок. Но надо что бы при изменении МойРеквизит писался в РС еще. Создаю подписку на событие ПриЗаписи в ДоговораКонтрагента
и тут понеслось!!!!
1.Если МойРевизит менять руками (РогаИКопыта на-> Ромашка) в договорах и записать договор (сработает подписка на ПриЗаписи) в РС попадет Ромашка.
2.Если МойРевизит меняет веб сервис (РогаИКопыта на-> Ромашка) (присваивает новое значение и записывает объект), то опять срабатывает подписка ПриЗаписи и в РС попадет РогаИКопыта т.е. объект записан (Событие ПриЗаписи записало объект), но значение в объекте старое, значение в Объект.ссылка.ДополнительныеРеквизитыто же старое. КАК ТАК?
3. Если отключить подписку и перенести ее П/Ф в веб сервис то после записи объекта мы видим что Объект.ДополнительныеРеквизиты (МойРеквизит -РогаИКопыта) а объект.ссылка.ДополнительныеРеквизиты(МойРеквизит -Ромашка) - тут ка как бы норм но тоже вопрос - объект записан и доп реквизиты что по Объект.ДополнительныеРеквизиты что по Объект.ссылка.ДополнительныеРеквизиты должны быть равны. (тут конечно многие скажут - транзакция не применилась еще и пр...но на то оно ПриЗаписи что бы с объектом работать, иметь ссылку на него и получать записанные реквизиты)
Есть веб сервис - он изменяет договор контрагента - доп реквизит "МойРеквизит"
При записи объекта в веб сервисе когда внешняя система послала МойРеквизит, ищем договор и меняем в нем МойРеквизит со значения РогаИКопыта на Ромашка. Все тут ок. Но надо что бы при изменении МойРеквизит писался в РС еще. Создаю подписку на событие ПриЗаписи в ДоговораКонтрагента
и тут понеслось!!!!
1.Если МойРевизит менять руками (РогаИКопыта на-> Ромашка) в договорах и записать договор (сработает подписка на ПриЗаписи) в РС попадет Ромашка.
2.Если МойРевизит меняет веб сервис (РогаИКопыта на-> Ромашка) (присваивает новое значение и записывает объект), то опять срабатывает подписка ПриЗаписи и в РС попадет РогаИКопыта т.е. объект записан (Событие ПриЗаписи записало объект), но значение в объекте старое, значение в Объект.ссылка.ДополнительныеРеквизитыто же старое. КАК ТАК?
3. Если отключить подписку и перенести ее П/Ф в веб сервис то после записи объекта мы видим что Объект.ДополнительныеРеквизиты (МойРеквизит -РогаИКопыта) а объект.ссылка.ДополнительныеРеквизиты(МойРеквизит -Ромашка) - тут ка как бы норм но тоже вопрос - объект записан и доп реквизиты что по Объект.ДополнительныеРеквизиты что по Объект.ссылка.ДополнительныеРеквизиты должны быть равны. (тут конечно многие скажут - транзакция не применилась еще и пр...но на то оно ПриЗаписи что бы с объектом работать, иметь ссылку на него и получать записанные реквизиты)
По теме из базы знаний
- Краткое руководство по внесению изменений в конфигурацию
- Интеграция сервиса проверки идентификационных реквизитов юридических лиц по данным ЕГРН и 1С:Предприятие 8
- Обзор полезных методов БСП 3.1.4. Часть 2
- Версионирование объектов VS История данных
- Шаблоны новых объектов 1С для 1С:Бухгалтерии предприятия
Найденные решения
(24) получили объект. Отдельно (отдельной транзакцией) снова получили объект, изменили, записали.
Первый полученный объект будет иметь старые значения, так они в часть самого объекта и располагаются в памяти, а не в базе.
Это еще после таких манипуляций не пытаетесь первый объект еще раз записать. В этом случае получили бы ошибку.
Первый полученный объект будет иметь старые значения, так они в часть самого объекта и располагаются в памяти, а не в базе.
Это еще после таких манипуляций не пытаетесь первый объект еще раз записать. В этом случае получили бы ошибку.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(4) Как такового объекта у нас нет же. Мы находимся в Вар2 в общем модуле (подписка на событие при записи) где параметр Источник содержит объект ДоговорКонтрагента (тип СправочникОбъект ДоговораКонтаргентов)
Вар3 Мы обращаемся к договору через то же как к объекту т.к. получаем его в вебсервисе (Находим в справочнике договоров потом .ПолучитьОбъект()) и записываем его.
На ссылку смотрим в момент Вар2 ПриЗаписи т.е. объект записан уже (смотрим это в общем модуле подписки).
Вар 3 смотрим в модуле веб сервиса
Вар3 Мы обращаемся к договору через то же как к объекту т.к. получаем его в вебсервисе (Находим в справочнике договоров потом .ПолучитьОбъект()) и записываем его.
На ссылку смотрим в момент Вар2 ПриЗаписи т.е. объект записан уже (смотрим это в общем модуле подписки).
Вар 3 смотрим в модуле веб сервиса
(5)
но транзакция ещё не завершена, и кеширование никто не отменял....
(видимо не обновились данные через ссылку)
короче.... после всех манипуляций, через пару секунд... в базе какие данные?
(смотрите на другом компе или другой копией 1С и т.д.)
т.е. объект записан уже
но транзакция ещё не завершена, и кеширование никто не отменял....
(видимо не обновились данные через ссылку)
короче.... после всех манипуляций, через пару секунд... в базе какие данные?
(смотрите на другом компе или другой копией 1С и т.д.)
(6) в базе в объекте Договора данные правильно встают после записи (какой МойРеквзит записали тот и будет). Но задача в другом- в том что бы когда мы записали объект Договора из этого договора получить МойРеквизит (который присвоили ранее в Договор) и записать его в РС.
тут заметил еще одну странность. Если договор записать руками то в подписку попадает Договор с нужным уже записанным МойРеквизит а если подписка вызывается записью инициализированной веб сервисом то МойРеквизит еще старый (может из кеша тянет ХЗ), но код один и тот же а поведение разное в зависимости от инциализатора записи Договора.
тут заметил еще одну странность. Если договор записать руками то в подписку попадает Договор с нужным уже записанным МойРеквизит а если подписка вызывается записью инициализированной веб сервисом то МойРеквизит еще старый (может из кеша тянет ХЗ), но код один и тот же а поведение разное в зависимости от инциализатора записи Договора.
(7)
когда запись вызвана из формы, там никто, в здравом уме, не обращается к данным через ссылку,
и когда ваш кусок ПриЗаписи() смотрит данные ему читают свежие данные, т.к. в кеше их нет...
а когда вы вызываете запись своим кодом, который уже прочитал неоднократно все эти данные,
то данные ПриЗаписи() подсовываются из кеша, т.к. транзакция ещё не завершена, и данные из кеша не отмечены как "устаревшие"
Если договор записать руками то в подписку попадает Договор с нужным уже записанным МойРеквизит а если подписка вызывается записью инициализированной веб сервисом то МойРеквизит еще старый
всё ж понятно....
когда запись вызвана из формы, там никто, в здравом уме, не обращается к данным через ссылку,
и когда ваш кусок ПриЗаписи() смотрит данные ему читают свежие данные, т.к. в кеше их нет...
а когда вы вызываете запись своим кодом, который уже прочитал неоднократно все эти данные,
то данные ПриЗаписи() подсовываются из кеша, т.к. транзакция ещё не завершена, и данные из кеша не отмечены как "устаревшие"
(8) с этим Ок.
Но Получается разная логика работы объекта при нахождении в событии при записи.
1. Если при записи в подписке то объект полностью старый пока не завершится транзакция
2. Если записать объект в веб сервисе (пришли данные в веб сервис ->нашли договор ->подставили туда МойРеквизит->Записать() -> получить данные из Договора МойРеквизит то в Договор.МойРеквизит данные старые а в Договор.ссылка.МойРеквизит они уже новые) ведь объект записан и МойРеквизит должен быть везде новый.
Но Получается разная логика работы объекта при нахождении в событии при записи.
1. Если при записи в подписке то объект полностью старый пока не завершится транзакция
2. Если записать объект в веб сервисе (пришли данные в веб сервис ->нашли договор ->подставили туда МойРеквизит->Записать() -> получить данные из Договора МойРеквизит то в Договор.МойРеквизит данные старые а в Договор.ссылка.МойРеквизит они уже новые) ведь объект записан и МойРеквизит должен быть везде новый.
Судя по всему что-то не то напрограммиздили. Какая-то искривленная логика. Из того я понял - подозреваю, что в разных местах используются разные экземпляры прикладных объектов. И в каком-то из звеньев в этой цепочке с веб-сервисом появляется совсем другой экземпляр объекта.
И - да, веб сервис работает в отдельной своей собственной транзакции.
И - да, веб сервис работает в отдельной своей собственной транзакции.
(10) Возможно, но объект везде один и тот же, в подписке он передается как источник и другого быть не может но данные в нем почему то не записанные а старые - пришли к выводу что это кеш.
Но вот почему в записанном объекте разные данные по самому объекту и его ссылке это пока не ясно.
Но вот почему в записанном объекте разные данные по самому объекту и его ссылке это пока не ясно.
(11) Есть две стороны: Тот кто инициирует веб-сервис (сеанс с запросом), и тот кто его исполняет (сеанс с самим сервисом).
Вот это вот на какой стороне исполняется?
Расчерти лист на две половины и напиши что где исполняется. И поймешь, что на каждой стороне своя транзакция, свои объекты. И они не обязаны синхронизироваться.
Вот это вот на какой стороне исполняется?
пришли данные в веб сервис ->нашли договор ->подставили туда МойРеквизит->Записать() -> получить данные из Договора МойРеквизит то в Договор.МойРеквизит данные старые а в Договор.ссылка.МойРеквизит они уже новые
Расчерти лист на две половины и напиши что где исполняется. И поймешь, что на каждой стороне своя транзакция, свои объекты. И они не обязаны синхронизироваться.
(13) у нас прилетел ХМЛ в веб сервис. в нем Договор с МойРеквизит. В модуле Веб сервиса мы находим Договор в базе. Получаем Объект договора и присваиваем в МойРеквизит значение. После этого мы Договор (тип объект) записываем (Записать()) следовательно неявная транзакция ПередЗаписью, ПриЗаписи завершилась - объект в базе записан. Далее мы к записанному Договор обращаемся и читаем МойРеквизит и этот Мойреквизит в объекте старый а в Объекте.Ссылка МойРеквизит новый.
(20) (21)
Вы оба правы, не заметил что свойства доп реквизитов меняются после записи основного объекта и проваливаясь в подписку мы видим Договор записанный нормальный а допреквизиты еще не присвоены.
С этим по подписке вопрос закрыт.
Но вопрос (Скрины) остается мной не понятый.
У нас Есть запись договора, после этого идет присвоение допреквизитов в ЗаписатьСвойстваУОбъекта (и там повторно записывается Договор)
В конце всего алгоритма
ЗапистьИсториюАккаунтМенеджера(Источник, Отказ)
Где источник - уже дважды записанный договор. и там разные значения в доп реквизите А объекте старые в объекте.ссылка новые.
Вы оба правы, не заметил что свойства доп реквизитов меняются после записи основного объекта и проваливаясь в подписку мы видим Договор записанный нормальный а допреквизиты еще не присвоены.
С этим по подписке вопрос закрыт.
Но вопрос (Скрины) остается мной не понятый.
У нас Есть запись договора, после этого идет присвоение допреквизитов в ЗаписатьСвойстваУОбъекта (и там повторно записывается Договор)
В конце всего алгоритма
ЗапистьИсториюАккаунтМенеджера(Источник, Отказ)
Где источник - уже дважды записанный договор. и там разные значения в доп реквизите А объекте старые в объекте.ссылка новые.
(22)
Сколько раз объяснять???
Ссылка - это данные в базе данных. Даже так - это ВСЕГДА чтение ЗАПИСАННЫХ данных из СУБД.
Объект - это данные в оперативной памяти.
И Объект.Ссылка - это тоже данные в базе данных. И даже Объект.Ссылка.Ссылка - это тоже данные в базе данных. И Объект.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка.Ссы....
Потому что Ссылка! А не Структура.
Где источник - уже дважды записанный договор. и там разные значения в доп реквизите А объекте старые в объекте.ссылка новые.
Сколько раз объяснять???
Ссылка - это данные в базе данных. Даже так - это ВСЕГДА чтение ЗАПИСАННЫХ данных из СУБД.
Объект - это данные в оперативной памяти.
И Объект.Ссылка - это тоже данные в базе данных. И даже Объект.Ссылка.Ссылка - это тоже данные в базе данных. И Объект.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка.Ссы....
Потому что Ссылка! А не Структура.
(23) По этой логике если я в объекте получу реквизит любой (не доп реквизит) и присвою ему новое значение, запишу объект то в объекте будет старый а в объекте.ссылка новый? потому что по ссылки мы получили объект из БД а по объекту объект из ОЗУ и не важно что мы в него то то записали новое?
(24)
Тогда в объекте будет новый. А в Объект.Ссылка - старый. А после Объект.Записать() - будет новый и там и там.
если я в объекте получу
В объекте нельзя ничего получить.
и присвою ему новое значение
Присвоишь как? Объект.Реквизит = НовоеЗначение?
Тогда в объекте будет новый. А в Объект.Ссылка - старый. А после Объект.Записать() - будет новый и там и там.
а по объекту объект из ОЗУ
Сам понял что сказал?
(26)
Еще раз по буквам:
ССЫЛКА. НИКОГДА. НЕ. СОДЕРЖИТ. НИКАКИХ.ЗНАЧЕНИЙ.
Ссылка - это УКАЗАТЕЛЬ на запись в БД. Каждый раз при обращении к Ссылке (хоть в объекте, хоть где) происходит ЧТЕНИЕ актуальных данных в БД.
Это не Структура, мать её!!! Это 32 цифробуковки и 4 дефиса!!! Всё!!!
Вот именно они (и только они) и содержатся в "Объект.Ссылка".
И нет никаких "Объект.Ссылка.Реквизит". Нигде нет. Вообще.
ДоОбъкет.ссылка - объект в БД
Нет в БД никакого объекта!!!
Еще раз по буквам:
ССЫЛКА. НИКОГДА. НЕ. СОДЕРЖИТ. НИКАКИХ.ЗНАЧЕНИЙ.
Ссылка - это УКАЗАТЕЛЬ на запись в БД. Каждый раз при обращении к Ссылке (хоть в объекте, хоть где) происходит ЧТЕНИЕ актуальных данных в БД.
Это не Структура, мать её!!! Это 32 цифробуковки и 4 дефиса!!! Всё!!!
Вот именно они (и только они) и содержатся в "Объект.Ссылка".
И нет никаких "Объект.Ссылка.Реквизит". Нигде нет. Вообще.
(24) получили объект. Отдельно (отдельной транзакцией) снова получили объект, изменили, записали.
Первый полученный объект будет иметь старые значения, так они в часть самого объекта и располагаются в памяти, а не в базе.
Это еще после таких манипуляций не пытаетесь первый объект еще раз записать. В этом случае получили бы ошибку.
Первый полученный объект будет иметь старые значения, так они в часть самого объекта и располагаются в памяти, а не в базе.
Это еще после таких манипуляций не пытаетесь первый объект еще раз записать. В этом случае получили бы ошибку.
(19) 1. Нет уверенности, что между первым и вторым скриншотом с обДоговор ничего не происходит.
2. Нет никаких изменений допреквизитов в объекте ДО его записи. В объекте обДоговор остаются старые допреквизиты.
3. Как правильно заметил (20) - изменение допреквизитов происходит отдельно по ссылке в другой транзакции, без изменения самого объекта обДоговор, и уже ПОСЛЕ записи самого объекта.
Итого - объект не изменяется, а данные в базе по ссылке изменяются в другой транзакции.
Вуаля.
2. Нет никаких изменений допреквизитов в объекте ДО его записи. В объекте обДоговор остаются старые допреквизиты.
3. Как правильно заметил (20) - изменение допреквизитов происходит отдельно по ссылке в другой транзакции, без изменения самого объекта обДоговор, и уже ПОСЛЕ записи самого объекта.
Итого - объект не изменяется, а данные в базе по ссылке изменяются в другой транзакции.
Вуаля.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот