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

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

При разработке управляемых форм часто возникает задача открытия вспомогательной формы для выбора данных или ввода дополнительной информации. Типичный сценарий: на форме документа есть реквизит, значение которого нужно заполнить, вызвав отдельную обработку. Давайте разберем, как правильно реализовать передачу введенных данных обратно в основную форму, следуя современным стандартам разработки 1С.

Почему не стоит использовать прямую запись в реквизиты владельца?

Начинающие разработчики часто пытаются обращаться к форме-владельцу напрямую через ВладелецФормы.МойРеквизит = Значение. Хотя этот метод технически работает, он считается плохой практикой по нескольким причинам:

Использование механизма ОписаниеОповещения

Самый правильный и надежный способ возврата данных — использование объекта ОписаниеОповещения. Этот механизм позволяет форме-владельцу «подписаться» на событие закрытия дочерней формы и безопасно получить результат.

Рассмотрим пошагово, как это реализовать.

Шаг 1: Открытие формы с заданным оповещением

В родительской форме, в процедуре открытия (например, при нажатии на кнопку выбора), мы создаем ОписаниеОповещения. В нем указываем имя процедуры, которая должна выполниться в родительской форме после того, как дочерняя форма будет закрыта.


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

Шаг 2: Обработка результата в родительской форме

После того как дочерняя форма будет закрыта, платформа вызовет процедуру ВыполнитьПослеЗакрытияФормыВводАдреса. В параметре РезультатЗакрытия будет находиться значение, которое мы передали из формы выбора.


&НаКлиенте
Процедура ВыполнитьПослеЗакрытияФормыВводАдреса(РезультатЗакрытия, ПараметрыОповещения) Экспорт
    // Всегда проверяем результат на Неопределено, так как пользователь мог закрыть окно без выбора
    Если РезультатЗакрытия = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // Присваиваем полученные данные в реквизит объекта
    Объект.неоАдресПодачи = РезультатЗакрытия.Представление;
КонецПроцедуры

Шаг 3: Передача данных из дочерней формы

В дочерней форме, при нажатии на кнопку «ОК» или «Выбрать», нам нужно закрыть форму с передачей результата. Для этого используется метод Закрыть(ПараметрЗакрытия).


&НаКлиенте
Процедура НажатиеКнопкиОК(Команда)
    // Формируем структуру с данными
    Результат = Новый Структура("Представление", ПолученноеЗначениеАдреса);
    
    // Закрываем форму с передачей структуры
    Закрыть(Результат);
КонецПроцедуры

Важные рекомендации при разработке

1. Всегда проверяйте результат. Если пользователь нажал «Отмена» или закрыл окно крестиком, РезультатЗакрытия будет равен Неопределено. Попытка обратиться к свойствам такого результата приведет к ошибке.

2. Используйте уникальные имена обработчиков. Если ваша форма открывает несколько различных окон, лучше иметь для каждого из них свой уникальный обработчик завершения. Это исключит путаницу в том, какие именно данные пришли.

3. Передача данных при открытии. Если вам нужно передать данные в открываемую форму, используйте структуру ПараметрыФормы, как показано в примере. Внутри формы получателя вы сможете считать их в процедуре ПриСозданииНаСервере через коллекцию Параметры.

4. Использование XDTO. Если вы работаете со сложными типами данных (как контактная информация), используйте готовые методы БСП, такие как КонтактнаяИнформацияXDTOПоПредставлению. Это гарантирует, что данные будут иметь правильный формат, понятный остальной системе.

Следуя этим простым правилам, вы сделаете свой код чище, надежнее и легче в поддержке!

← На главную