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

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

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

Метод 1. Использование структуры параметров при открытии формы

Самый простой и правильный с точки зрения архитектуры способ — передача данных через второй параметр метода ОткрытьФорму(). Этот метод принимает структуру, ключи которой становятся доступными в открываемой форме через свойство Параметры.

Рассмотрим ситуацию, когда нам нужно передать дату из обработчика клика по табличному документу. Сначала мы подготавливаем данные, а затем вызываем открытие формы:


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

В этом примере мы создали структуру ПараметрыПерехода, добавили в неё необходимые значения и передали в форму выбора действий. Теперь проанализируем, как получить эти данные в открываемой форме.

Метод 2. Получение параметров в целевой форме

Когда форма инициализируется на сервере, платформа заполняет системное свойство Параметры. Чтобы использовать переданные данные, нам необходимо обратиться к ним в обработчике ПриСозданииНаСервере.

Разберем пример кода для принимающей стороны:


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

Важный нюанс: при доработке типовых конфигураций в процедуре ПриСозданииНаСервере уже может существовать логика вендора. Не стоит переживать — ваши параметры будут дополнены типовыми. Главное — использовать уникальные имена ключей в структуре, чтобы не "перетереть" системные параметры платформы.

Метод 3. Передача данных через промежуточную форму («Транзит»)

Если в вашей цепочке действий есть промежуточное окно (например, меню выбора: «Создать заявку» или «Забронировать»), данные нужно протащить сквозь него. Рассмотрим эффективный алгоритм «эстафеты»:

  1. В промежуточной форме: создаем реквизит формы с типом Произвольный (назовем его ДанныеДляПередачи).
  2. При создании промежуточной формы: сохраняем полученную структуру во временный реквизит.
  3. При нажатии кнопки в промежуточной форме: извлекаем структуру из реквизита и передаем её дальше в метод ОткрытьФорму().

Посмотрим на программную реализацию этого подхода в модуле промежуточной формы:


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

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

Метод 4. Использование стандартного параметра «ЗначенияЗаполнения»

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

Рассмотрим, как это упрощает код:


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

При таком подходе вам даже не обязательно писать код в ПриСозданииНаСервере целевой формы. Платформа сама найдет реквизиты Дата и Склад в новом документе и подставит туда значения. Кроме того, это инициирует событие ОбработкаЗаполнения в модуле объекта, что позволяет соблюсти бизнес-логику системы.

Дополнительные возможности и лучшие практики

Для повышения устойчивости кода и удобства поддержки рекомендуем обратить внимание на следующие технические нюансы:

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

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

← На главную