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