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

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

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

Метод первый: использование глобального оповещения Оповестить

Механизм Оповестить — это инструмент для широковещательной рассылки. Когда вы вызываете этот метод, система отправляет сообщение во все открытые в данный момент формы. Этот метод идеально подходит для ситуаций, когда нужно обновить данные в интерфейсе, например, после записи документа, чтобы все открытые списки «увидели» изменения.

Рассмотрим структуру вызова и генерацию кода:


// В форме-отправителе:
Оповестить("ИмяВашегоСобытия", ДанныеКоторыеПередаем, ЭтаФорма);

Важные нюансы использования Оповестить:

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

Пример реализации принимающей стороны:


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

Почему этот метод часто не срабатывает у новичков? Во-первых, из-за опечаток в строках событий. Во-вторых, из-за неверной передачи параметров. Помните, что Оповестить не гарантирует, что данные будут получены только конкретной формой — их получат все активные окна.

Метод второй: передача данных через ОписаниеОповещения (Рекомендуемый способ)

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

Этот метод контекстный: данные возвращаются именно в ту форму, которая открыла диалоговое окно.

Шаг 1. Открытие формы с обработчиком

В форме-владельце мы описываем процедуру, которая примет результат работы второй формы:


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

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

Шаг 2. Передача данных из подчиненной формы

В форме при нажатии на кнопку «ОК» мы используем метод Закрыть:


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

Как выбрать подходящий способ?

Проанализируем ситуации:

Всегда используйте Отладчик для проверки параметров в ОбработкаОповещения — для этого пригодится инструмент пошаговой отладки кода в Предприятии. Если вы видите, что код не срабатывает, первым делом проверьте, совпадают ли строки события в обеих формах, и не передали ли вы в Источник лишний параметр, который мешает условию Если корректно выполниться.

← На главную