Как передать значения из одной формы в другую: детальное руководство

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

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

Способ 1: Механизм выбора через владельца формы (ОповеститьОВыборе)

Этот метод считается стандартным для ситуаций, когда одна форма (выбора) открывается из другой (основной) специально для того, чтобы вернуть результат. Основная идея заключается в установлении связи «владелец — подчиненный» между формами. Проанализируем, как это работает на практике.

Во-первых, при открытии второй формы мы должны явно указать, кто является её владельцем. В коде ФормыДокумента это будет выглядеть следующим образом:


&НаКлиенте
Процедура ОткрытьФормуВыбораДат(Команда)
    // Передаем "ЭтаФорма" в качестве владельца
    ОткрытьФорму("Документ.НазваниеДокумента.Форма.ФормаВыбораДат", , ЭтаФорма);
КонецПроцедуры

Во-вторых, в самой ФормеВыбораДат, когда пользователь нажал кнопку «Заполнить», мы должны собрать данные и отправить их владельцу. Поскольку нам нужно передать две даты (начало и конец), удобнее всего упаковать их в Структура. Разберем пример кода для кнопки «Заполнить»:


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

В-третьих, в основной форме (владельце) необходимо создать обработчик события ОбработкаВыбора. Именно сюда платформа «пришлет» структуру с датами. Посмотрим на реализацию:


&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
    Если ТипЗнч(ВыбранноеЗначение) = Тип("Структура") Тогда
        Объект.ДатаНачала = ВыбранноеЗначение.ДатаНачала;
        Объект.ДатаОкончания = ВыбранноеЗначение.ДатаОкончания;
    КонецЕсли;
КонецПроцедуры

Способ 2: Использование параметров закрытия и ОписанияОповещения (Асинхронный подход)

Современные стандарты разработки 1С (особенно для веб-клиента) требуют отказа от модальных окон. В связи с этим рекомендуется использовать объект ОписаниеОповещения. Этот метод позволяет не привязываться жестко к событию ОбработкаВыбора, а явно указать процедуру, которая должна выполниться после закрытия формы.

Проанализируем шаги реализации. В основной форме мы создаем описание оповещения и передаем его в метод открытия формы:


&НаКлиенте
Процедура ОткрытьФормуВыбораАсинхронно(Команда)
    Оповещение = Новый ОписаниеОповещения("ПослеЗакрытияФормыВыбора", ЭтаФорма);
    ОткрытьФорму("ОбщаяФорма.ФормаВыбораПериода", , ЭтаФорма, , , , Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗакрытияФормыВыбора(Результат, ДополнительныеПараметры) Экспорт
    Если Результат <> Неопределено Тогда
        Объект.ДатаНачала = Результат.ДатаНачала;
        Объект.ДатаОкончания = Результат.ДатаОкончания;
    КонецЕсли;
КонецПроцедуры

В форме выбора дат нам достаточно просто закрыть форму, передав структуру в качестве параметра метода Закрыть():


&НаКлиенте
Процедура КомандаОК(Команда)
    ПараметрыВыбора = Новый Структура("ДатаНачала, ДатаОкончания", ДатаНач, ДатаКон);
    Закрыть(ПараметрыВыбора);
КонецПроцедуры

Способ 3: Глобальное оповещение всех открытых форм

Иногда формы не связаны отношениями владения. Например, при изменении настроек в одной форме нужно обновить данные сразу в нескольких открытых окнах. Для этого используется метод Оповестить(). Выясним, как настроить такую связь.

В форме-отправителе (где выбираются даты) вызываем глобальный метод:

Оповестить("Событие_ДатыВыбраны", СтруктураСДатами, ЭтаФорма);

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


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

Важные рекомендации и нюансы

При выборе метода передачи данных стоит учитывать следующие моменты:

  1. Тип данных: Для передачи нескольких значений всегда используйте Структура или Соответствие. Это делает код читаемым и позволяет легко добавлять новые поля в будущем без изменения интерфейсов функций.
  2. Владелец формы: Если вы используете ОповеститьОВыборе, обязательно убедитесь, что при открытии формы передан параметр ЭтаФорма. Без этого механизм «услышать» выбор не сработает.
  3. Экспортные методы: Теоретически можно вызвать экспортную процедуру основной формы напрямую из вспомогательной через ВладелецФормы.ИмяПроцедуры(). Однако это плохой тон программирования, так как создает жесткую зависимость (зацепление) между формами. Лучше использовать механизмы оповещений.
  4. Передача данных «туда»: Если вам нужно передать текущие даты из документа в форму выбора, чтобы она открылась с уже заполненными значениями, используйте структуру Параметры в методе ОткрытьФорму. В принимающей форме обработайте их в событии ПриСозданииНаСервере.
  5. Временное хранилище: Для передачи больших объемов данных (например, длинных списков или таблиц) используйте ПоместитьВоВременноеХранилище(). Передавайте между формами только текстовый адрес (ссылку), чтобы не нагружать сетевой трафик между клиентом и сервером.

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

← На главную