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