В процессе разработки на платформе 1С:Предприятие часто возникают задачи по программному изменению состава дополнительных реквизитов или их значений в момент записи объекта. Нередко разработчики сталкиваются с ситуацией, когда данные, переданные в табличную часть ДополнительныеРеквизиты, успешно обрабатываются в памяти, но после выполнения процедуры записи в базе данных изменения не отображаются. Давайте разберем, почему это происходит и как исправить подобную ошибку.
Основная причина, по которой изменения могут «исчезать», заключается в разнице между контекстом формы и контекстом самого объекта, участвующего в записи. Когда вы находитесь в обработчиках событий формы, например, в ПередЗаписьюНаСервере, вы работаете с данными, которые отображаются на экране. Однако процесс записи объекта — это сложный механизм, который может использовать другой экземпляр объекта.
Если вы модифицируете только переменную Объект, доступную в контексте формы, вы изменяете лишь «копию», которая не всегда синхронизируется с тем экземпляром, который реально отправляется на запись в СУБД. В типовых конфигурациях, использующих механизмы БСП, важно работать с тем экземпляром, который передается в процедуру записи.
В обработчиках событий, связанных с записью, платформенный механизм предоставляет доступ к параметру, который содержит данные, подготовленные к записи. Чтобы гарантированно внести изменения в данные, которые попадут в базу, необходимо обращаться к ТекущийОбъект. Рассмотрим на примере, как правильно выполнить загрузку измененной табличной части:
Предположим, у нас есть подготовленная табличная часть, которую мы хотим поместить в дополнительные реквизиты объекта:
// Неверный подход:
// Объект.ДополнительныеРеквизиты.Загрузить(НашаТЧ);
// Правильный подход:
// Обращаемся к объекту, который непосредственно участвует в записи
ТекущийОбъект.ДополнительныеРеквизиты.Загрузить(НашаТЧ);
Использование ТекущийОбъект гарантирует, что механизм БСП «увидит» внесенные вами правки в момент вызова метода Записать(). Если вы продолжите использовать просто Объект, изменения останутся в «виртуальной» области формы, а в базу уйдут данные из основного объекта.
Чтобы избежать подобных ошибок в будущем, проанализируем лучшие практики работы с дополнительными реквизитами:
ТекущийОбъект, а не ссылайтесь на глобальный контекст формы.Загрузить() полностью переписывает табличную часть. Если вам нужно изменить лишь один конкретный реквизит, лучше использовать поиск строки по коллекции:
СтрокаСвойства = ТекущийОбъект.ДополнительныеРеквизиты.Найти(НужноеСвойство, "Свойство");
Если СтрокаСвойства <> Неопределено Тогда
СтрокаСвойства.Значение = НовоеЗначение;
КонецЕсли;
ПередЗаписью). В этом случае вы гарантированно работаете с объектом ЭтотОбъект, что исключает путаницу с контекстом формы.ТекущийОбъект.ДополнительныеРеквизиты те данные, которые вы туда передавали. Если табличная часть пуста, значит, ваш код либо не сработал, либо был перекрыт последующими процедурами (например, типовыми обработчиками БСП, которые могут затирать данные).Мы выяснили, что ошибка при записи доп. реквизитов часто кроется в обращении к неверному экземпляру объекта. Замена Объект на ТекущийОбъект в обработчиках записи позволяет корректно передать измененные данные в механизм БСП. Помните, что платформа 1С при записи выполняет сложные манипуляции с регистрами сведений, поэтому целостность данных в объекте к моменту вызова Записать() является критически важной.
Работая внимательно с контекстами данных и проверяя состояние объекта в отладчике, вы сможете избежать потери данных и сделать ваш код надежным и предсказуемым.