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