Инициализация реквизитов при создании нового объекта

Один из методов упрощения работы пользователя - это заполнение реквизитов нового объекта (элемент справочник, документ) значениями по умолчанию. Реализовать заполнение реквизитов можно двумя способами:
  1. в обработчике события формы элемента - ПриСозданииНаСервере;
  2. в обработчике события объекта - ОбработкаЗаполнения.
Первый способ не рекомендуется использовать, но все-равно его рассмотрим. Создадим в модуле формы обработчик события ПриСозданииНаСервере. В обработчике проверим факт создания нового объекта, если объект новый, то произведем заполнение реквизитов.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

// Если ссылка у объекта пустая, значит он еще не записан,
// а следовательно он является новым объектом.
ЭтоНовыйОбъект = Объект.Ссылка.Пустая();

// Если объект новый, то выполняем заполнение реквизитов.
Если ЭтоНовыйОбъект Тогда
Объект.Ответственный = Пользователи.ТекущийПользователь();
Объект.Комментарий = "Документ создан " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
КонецЕсли;

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


Второй способ намного проще, т.к. он предусмотрен платформой и рекомендован к использованию. Создадим в модуле объекта обработчик события ОбработкаЗаполнения и напишем программный код по заполнению реквизитов объекта без каких-либо проверок, потому что данное событие возникает при интерактивном вводе нового объекта. Более подробное описание обработчика события см. в синтакс-помощнике.

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

ЭтотОбъект.Ответственный = Пользователи.ТекущийПользователь();
ЭтотОбъект.Комментарий = "Документ создан " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");

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


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

Комментарии

  1. Второй способ не годится, так как событие "ОбработкаЗаполнения" не возникает, например, при копировании объекта. И в этом случае вы получите новый объект со "старым" пользователем и датой, а не текущими.

    ОтветитьУдалить
    Ответы
    1. Да, при втором способе нужно учитывать, что при копировании (как интерактивном, так и средствами встроенного языка), обработчик "ОбработкаЗаполнения" не вызывается, следовательно нужно в обработчике "ПриКопировании" дополнительно прописать логику заполнения. Спасибо за замечание!

      Удалить

Отправить комментарий