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