Как сохранить значения реквизитов формы при записи нового элемента справочника?

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

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

В этой статье мы подробно разберем, почему платформа ведет себя именно так, и рассмотрим несколько надежных способов «заставить» систему запомнить введенные пользователем данные, даже если они не сохраняются в базу данных напрямую.

Почему происходит «аннулирование» полей?

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

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

Способ №1: Использование структуры ПараметрыЗаписи

Это наиболее «чистый» и рекомендуемый способ сохранения состояния интерфейса. Разберем его по шагам. В управляемой форме существуют два ключевых события: ПередЗаписьюНаСервере и ПослеЗаписиНаСервере. Между ними платформа передает специальную структуру ПараметрыЗаписи, которую мы можем использовать как «транспорт» для наших данных.

Рассмотрим пример кода, который нужно разместить в модуле формы:


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

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
    
    // После того как форма обновилась, возвращаем значение обратно из структуры
    Если ПараметрыЗаписи.Свойство("МойДополнительныйРеквизит") Тогда
        ЭтаФорма.КомментарийДляЛога = ПараметрыЗаписи.МойДополнительныйРеквизит;
    КонецЕсли;
    
КонецПроцедуры

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

Способ №2: Использование ДополнительныхСвойств объекта

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

Проанализируем реализацию:


&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
    
    // Передаем данные прямо в объект справочника
    ТекущийОбъект.ДополнительныеСвойства.Вставить("ВременныйФлаг", ЭтаФорма.НуженЛиСпецАлгоритм);
    
КонецПроцедуры

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
    
    // Читаем данные обратно из ДополнительныхСвойств записанного объекта
    Если ТекущийОбъект.ДополнительныеСвойства.Свойство("ВременныйФлаг") Тогда
        ЭтаФорма.НуженЛиСпецАлгоритм = ТекущийОбъект.ДополнительныеСвойства.ВременныйФлаг;
    КонецЕсли;
    
КонецПроцедуры

Важный нюанс: Коллекция ДополнительныеСвойства доступна во всех подписках на события и в модуле объекта, что делает этот способ более универсальным для сложной бизнес-логики.

Способ №3: Хранилище общих настроек (SystemSettingsStorage)

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

Рассмотрим, как реализовать программное сохранение:

  1. В процедуре ПриЗакрытии или непосредственно в ПередЗаписьюНаСервере сохраняем значение:

ХранилищеОбщихНастроек.Сохранить("НастройкиРабочегоМеста", "ПоследнийВведенныйСклад", ЭтаФорма.ВыбранныйСклад);
  1. В процедуре ПриСозданииНаСервере читаем его:

Значение = ХранилищеОбщихНастроек.Загрузить("НастройкиРабочегоМеста", "ПоследнийВведенныйСклад");
Если Значение <> Неопределено Тогда
    ЭтаФорма.ВыбранныйСклад = Значение;
КонецЕсли;

Почему не сработало стандартное «Сохранять значения»?

Выясним причину неудачи с этим свойством. Галочка «Сохранять значения» в свойствах реквизита формы работает в связке с настройками самой формы (кнопка «Еще» — «Изменить форму»). Она предназначена для того, чтобы 1С запомнила значение между открытиями формы под конкретным пользователем. Однако в процессе записи объекта форма не закрывается и не открывается заново — она лишь обновляет свои данные (совершает «Round-trip» на сервер). В этот момент механизмы автоматического сохранения настроек просто не задействуются.

Итоги и рекомендации

Подводя итог, можно сказать, что выбор метода зависит от вашей конечной цели:

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

← На главную