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