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