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