Почему очищаются реквизиты формы при проведении документа и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке на управляемых формах 1С часто возникает ситуация, когда разработчик добавляет новый реквизит на форму (например, в табличную часть), но замечает, что после нажатия кнопки «Провести» или «Записать» значение этого реквизита бесследно исчезает. Давайте разберем, почему это происходит и как правильно работать с данными формы.

Разберемся в причинах проблемы

Первое, что необходимо понять — это разница между реквизитами объекта и реквизитами формы. Когда мы добавляем реквизит в структуру Объект (в конфигураторе, в табличную часть документа), платформа знает, как сохранять эти данные в базу данных. Однако, если мы добавляем реквизит только в «Реквизиты» формы, платформа воспринимает его как временный буфер.

Жизненный цикл этого процесса выглядит следующим образом:

  1. Пользователь заполняет данные в форме.
  2. При нажатии кнопки «Провести» платформа переносит данные из формы в объект Объект и записывает его в базу данных.
  3. После успешной записи платформа выполняет обратную операцию: она считывает актуальные данные из базы данных и обновляет состояние формы.
  4. Так как наш добавленный реквизит существует только в памяти формы и никак не связан с базой данных, при этом обновлении он просто «затирается» или сбрасывается в исходное состояние, так как в базе данных для него нет соответствующего поля для хранения.

Как сохранить данные реквизита формы?

Если нам нужно, чтобы введенная пользователем информация сохранялась даже после проведения документа, у нас есть несколько стратегий действий. Рассмотрим основные из них.

Решение 1: Перезаполнение данных в обработчиках событий

Если данные не должны физически храниться в базе (например, это справочная информация, которую можно вычислить или получить из другого места), нам нужно принудительно восстанавливать значение реквизита после того, как форма обновилась после записи. Для этого воспользуемся обработчиком ПослеЗаписиНаСервере.

Давайте посмотрим на пример реализации такого подхода:


&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
    // Здесь мы можем восстановить наши данные формы, 
    // основываясь на данных, которые только что записали в базу
    ВосстановитьЗначениеНашегоРеквизита(ТекущийОбъект);
КонецПроцедуры

Этот метод позволяет гарантировать, что сразу после того, как платформа обновит объект, мы вмешаемся в процесс и вернем нашим реквизитам нужные значения.

Решение 2: Использование структуры метаданных (Правильный путь)

Если информация, которую вы добавляете, действительно важна и должна быть доступна в любых отчетах или при последующем открытии документа, то единственно верным архитектурным решением будет добавление реквизита непосредственно в структуру метаданных документа в конфигураторе.

Когда реквизит становится частью табличной части документа (в Метаданные), платформа автоматически берет на себя все заботы по его сохранению и считыванию. В этом случае никаких дополнительных манипуляций в коде делать не потребуется.

Решение 3: Хранилище значений

Если данных много или они имеют сложную структуру, но не должны раздувать основной документ, можно воспользоваться механизмом ХранилищеЗначений. Мы можем записывать такие данные в отдельный регистр сведений, где в качестве измерения будет выступать ссылка на документ.

При открытии формы или после записи мы будем считывать данные из этого регистра и помещать их в наши реквизиты формы. Этот способ идеален, если вы не хотите менять структуру конфигурации, но при этом данные должны быть постоянными.

Подведем итоги

При работе с управляемыми формами всегда помните:

Проанализировав ситуацию, можно сказать, что «очищение» реквизита — это не ошибка платформы, а стандартный механизм её функционирования. Понимание этого жизненного цикла позволит вам проектировать надежные и удобные интерфейсы для ваших пользователей.

← На главную