Как открыть форму нового документа в 1С и передать в нее параметры?

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

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

Выясним, почему этот подход вызывает ошибки и какие существуют верные способы решения данной задачи в соответствии со стандартами разработки 1С.

Причины возникновения ошибок при попытке вызова ЗначениеВДанныеФормы на клиенте

Проанализируем базовые ограничения платформы при работе с управляемыми формами:

  1. Мутабельные значения на клиенте. Объект типа ДокументОбъект существует только на сервере. При попытке вернуть его из серверной функции на клиент возникнет ошибка передачи мутабельного значения, так как объектные типы не сериализуются для передачи между сервером и клиентом.
  2. Контекст метода ЗначениеВДанныеФормы(). Данная процедура доступна только в серверном контексте (&НаСервере или НаСервереБезКонтекста). Выполнить ее непосредственно в клиентской процедуре невозможно.
  3. Использование устаревшего метода ПолучитьФорму(). В управляемом режиме не рекомендуется применять ПолучитьФорму(). Вместо этого используется функция ОткрытьФорму(), которая корректно инициализирует форму с учетом управляемого контекста.

Способ 1. Использование стандартного параметра ЗначенияЗаполнения (Рекомендуемый)

Рассмотрим основной и наиболее удобный способ передачи данных для нового документа. Платформа 1С предоставляет штатный механизм заполнения объекта через параметр формы ЗначенияЗаполнения.

Разберем по шагам, как это реализовать на клиенте:


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

В этом случае платформа автоматически выполнит следующие действия:

  1. Создаст новый объект документа на сервере.
  2. Вызовет обработчик ОбработкаЗаполнения в модуле объекта документа, где параметр ДанныеЗаполнения будет содержать переданную структуру.
  3. Заполнит соответствующий реквизит и отобразит готовую форму пользователю.

Способ 2. Передача пользовательских параметров в форму

Посмотрим на ситуацию, когда параметры предназначены не для заполнения реквизитов самого документа, а для управления логикой работы самой формы (например, для изменения видимости элементов или режима работы):

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

Способ 3. Передача незаписанных данных через временное хранилище

Разберем случай, когда перед открытием формы на сервере требуется выполнить сложную предварительную подготовку данных (например, расчитать и заполнить несколько табличных частей):

  1. На сервере формируем структуру данных или таблицу и помещаем их во временное хранилище с помощью ПоместитьВоВременноеХранилище().
  2. Возвращаем адрес хранилища на клиент и передаем его в параметрах при вызове ОткрытьФорму().
  3. В открываемой форме в событии ПриСозданииНаСервере извлекаем данные методом ПолучитьИзВременногоХранилища() и заполняем данные формы.

Способ 4. Создание и запись документа на сервере с последующим открытием

Если бизнес-процесс требует, чтобы документ был сохранен в базе данных еще до демонстрации пользователю, проанализируем следующий подход:


&НаСервере
Функция СоздатьИЗаписатьДокументНаСервере()
    
    НовДок = Документы.Начисление.СоздатьДокумент();
    НовДок.Дата = ТекущаяДата();
    // Заполняем необходимые реквизиты объекта
    НовДок.Записать();
    
    Возврат НовДок.Ссылка;
    
КонецФункции

&НаКлиенте
Процедура СоздатьИОткрыть(Команда)
    
    СсылкаНаНовыйДокумент = СоздатьИЗаписатьДокументНаСервере();
    
    ПараметрыФормы = Новый Структура("Ключ", СсылкаНаНовыйДокумент);
    ОткрытьФорму("Документ.Начисление.ФормаОбъекта", ПараметрыФормы);
    
КонецПроцедуры

Подводя итоги, отметим: выбор конкретного способа зависит от задач приложения. Для штатного первичного заполнения нового документа наиболее правильным является использование параметра ЗначенияЗаполнения, а для управления интерфейсом открываемой формы — передача пользовательских параметров в структуру ПараметрыФормы.

← На главную