Как работает механизм записи в УФ?

1. natrix_natrix 25.07.23 15:23 Сейчас в теме
Всем привет. Периодически дописываю что-нибудь в 1С много лет, но для меня до сих пор там полно непонятной магии. Вот пример, объясните, пожалуйста:
У меня в УТ11 у документа Заказ клиента есть 4 доп.реквизита. Мне нужно 4 обычных строковых реквизита заполнить значениями этих доп.реквизитов. Для того, чтобы пользователь на форме заполнял доп.реквизиты, а при сохранении документа их строковые значения копировались в мои реквизиты, о которых пользователь не знает.
Я сделал расширение, в расширении добавил реквизиты. В модуль объекта в расширении добавил:

&После("ПриЗаписи")
Процедура natrTS_ПриЗаписи(Отказ)
	СвойствоНомер = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Номер заказа на сайте");
	СвойствоДата = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Дата заказа на сайте");
	СвойствоТипОтгрузки = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Тип отгрузки");
	СвойствоЭтап = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Этап обработки");
	
	ЭтотОбъект.natrTS_НомерНаСайте = УправлениеСвойствами.ЗначениеСвойства(ЭтотОбъект.Ссылка, СвойствоНомер);
	ЭтотОбъект.natrTS_ДатаНаСайте = УправлениеСвойствами.ЗначениеСвойства(ЭтотОбъект.Ссылка, СвойствоДата);
	ЭтотОбъект.natrTS_ТипОтгрузки = Строка(УправлениеСвойствами.ЗначениеСвойства(ЭтотОбъект.Ссылка, СвойствоТипОтгрузки));
	ЭтотОбъект.natrTS_ЭтапОбработки = Строка(УправлениеСвойствами.ЗначениеСвойства(ЭтотОбъект.Ссылка, СвойствоЭтап));
	
	
КонецПроцедуры
Показать


Точкой останова смотрю: реквизиты заполняются. Но! Потом их значения пропадают. Если я модифицирую форму (Комментарий банально поменяю) - тогда значения сохраняются. Если я создаю новый документ - не сохраняются, остаются пустыми. Вообще не понимаю, как это работает.
По теме из базы знаний
Найденные решения
2. spacecraft 25.07.23 16:06 Сейчас в теме
(1) обработчик ПриЗаписи вызывается уже после фактической записи данных реквизитов документа в базу.
Соответственно изменение реквизитов в этом обработчике не делают изменения в самой базе в этой же транзакции.
Изменять реквизиты нужно в обработчике ПередЗаписью
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spacecraft 25.07.23 16:06 Сейчас в теме
(1) обработчик ПриЗаписи вызывается уже после фактической записи данных реквизитов документа в базу.
Соответственно изменение реквизитов в этом обработчике не делают изменения в самой базе в этой же транзакции.
Изменять реквизиты нужно в обработчике ПередЗаписью
3. natrix_natrix 25.07.23 16:17 Сейчас в теме
Спасибо. Работает. Хотя вот вчера шпаргалку тут на инфостарте читал по всем ПриЗаписи, ПередЗаписью и иже с ними. И по её содержанию складывается впечатление, что в ПриЗаписи всё ещё можно изменить реквизиты.
4. spacecraft 25.07.23 16:23 Сейчас в теме
(3) смотря что подразумевать под изменением реквизитов.
Сами реквизиты объекта (если это модуль объекта) в памяти будут изменены и новые значения будут в последующих обработчиках. В обработчике ОбработкаПроведения уже будут измененные реквизиты, но в базу уже были записаны предыдущие значения реквизитов.
См. СП:
Описание:
Возникает при записи объекта. Процедура-обработчик вызывается после записи объекта в базу данных, но до окончания транзакции записи.
5. natrix_natrix 25.07.23 16:29 Сейчас в теме
(4) Вот да. Тут понятно. И следовательно это будет работать только при перезаписи уже существующего документа. А если я создам новый (да даже если изменю доп.реквизит на форме) - это не сработает. В этом случае надо получать значения доп.реквизитов из данных формы, потому что объект ещё не записан. Верно?
6. spacecraft 25.07.23 16:37 Сейчас в теме
(5)
В этом случае надо получать значения доп.реквизитов из данных формы, потому что объект ещё не записан. Верно?

Да. ЭтотОбъект.Ссылка у еще не записанного документа будет ПустаяСсылка.
Оставьте свое сообщение

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