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

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

    ЭтотОбъект.natrTS_НомерНаСайте = УправлениеСвойствами.ЗначениеСвойства(ЭтотОбъект.Ссылка, СвойствоНомер);
    ЭтотОбъект.natrTS_ДатаНаСайте = УправлениеСвойствами.ЗначениеСвойства(ЭтотОбъект.Ссылка, СвойствоДата);
    ЭтотОбъект.natrTS_ТипОтгрузки = Строка(УправлениеСвойствами.ЗначениеСвойства(ЭтотОбъект.Ссылка, СвойствоТипОтгрузки));
    ЭтотОбъект.natrTS_ЭтапОбработки = Строка(УправлениеСвойствами.ЗначениеСвойства(ЭтотОбъект.Ссылка, СвойствоЭтап));

    КонецПроцедуры
```

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