Как передать данные из обработки в новый документ на управляемых формах 1С?

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

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

Метод 1: Использование параметров формы и события ПриСозданииНаСервере

Это наиболее прямой и понятный способ, который часто выбирают начинающие разработчики. Суть метода заключается в том, что мы помещаем нужные данные в структуру и передаем её при открытии формы. Затем в самой форме документа мы «ловим» эти параметры и записываем их в реквизиты объекта.

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


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

Теперь разберем, что происходит на стороне документа. Когда вызывается ОткрытьФорму, платформа инициализирует создание формы на сервере. В этот момент срабатывает событие ПриСозданииНаСервере. Именно здесь мы должны проверить наличие наших параметров и присвоить их значения реквизитам объекта 1С.


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

Важный момент: использование этого метода привязывает логику заполнения именно к форме. Если документ будет создаваться программно без открытия формы, этот код не сработает.

Метод 2: Универсальный механизм через ОбработкуЗаполнения

Более профессиональным и «правильным» с точки зрения архитектуры 1С считается использование события ОбработкаЗаполнения, которое находится в модуле объекта документа. Рассмотрим, почему это так. Этот механизм позволяет заполнять документ не только при интерактивном открытии формы, но и при вызове метода Заполнить() в коде.

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


// Модуль объекта документа НарядНаРаботы
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    
    // Если данные переданы в виде структуры
    Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
        
        Если ДанныеЗаполнения.Свойство("Монтажник") Тогда
            Монтажник = ДанныеЗаполнения.Монтажник;
        КонецЕсли;
        
        Если ДанныеЗаполнения.Свойство("ДатаР") Тогда
            Дата = ДанныеЗаполнения.ДатаР;
        КонецЕсли;
        
    КонецЕсли;

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

Преимущество этого метода в том, что платформа автоматически вызывает ОбработкаЗаполнения при создании нового объекта через форму, если в ОткрытьФорму переданы параметры, не являющиеся системными ключами. Это обеспечивает чистоту кода и разделение логики интерфейса и логики данных.

Метод 3: Прямое заполнение данных формы (продвинутый уровень)

Иногда возникают ситуации, когда нужно заполнить не только простые реквизиты, но и сложные табличные части, или выполнить расчеты перед тем, как пользователь увидит форму. В сообщении 14 на форуме предложен интересный вариант работы с типом ДанныеФормыСтруктура.

Разберем этот алгоритм по шагам:

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

Посмотрим на пример реализации такого подхода:


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

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

Хотя этот метод кажется более громоздким, он незаменим, когда логика заполнения слишком сложна для простой передачи параметров или когда требуется предварительная визуальная настройка формы в зависимости от результата заполнения.

Резюме и рекомендации

Подводя итог, проанализируем, какой метод выбрать в конкретной ситуации:

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

← На главную