Как правильно использовать ОповеститьОВыборе() для передачи данных между формами в 1С?

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

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

Понятие владельца формы

Прежде чем переходить к коду, давайте выясним принципиально важный момент: метод ОповеститьОВыборе() всегда работает в связке «подчиненная форма — владелец». О выборе оповещается именно владелец формы. Владельцем может выступать либо вся форма целиком, либо конкретный элемент управления (например, поле ввода), свойства которого можно изучить через редактор форм в режиме предприятия. Если при открытии формы владелец не был указан, метод может не сработать, так как системе будет некого оповещать.

Рассмотрим два основных сценария получения данных: использование асинхронного вызова с описанием оповещения и использование стандартного события формы ОбработкаВыбора.

Сценарий 1: Использование ОписанияОповещения (современный подход)

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

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


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

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

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


&НаКлиенте
Процедура КомандаВыбрать(Команда)
    Результат = "Важные данные"; // Это может быть ссылка, структура или массив
    ОповеститьОВыборе(Результат);
КонецПроцедуры

Важный нюанс: метод ОповеститьОВыборе() не только передает данные, но и автоматически инициирует закрытие формы, если она была открыта в режиме выбора. Это поведение удобно тем, что нам не нужно отдельно прописывать ЭтаФорма.Закрыть().

Сценарий 2: Использование события ОбработкаВыбора

В некоторых случаях (особенно при работе со стандартными формами выбора справочников) удобнее использовать предопределенное событие формы ОбработкаВыбора. Это событие срабатывает в форме-владельце, когда подчиненная форма вызывает ОповеститьОВыборе().

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


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

Этот способ особенно полезен, если форма открывает несколько разных окон выбора. Используя параметр ИсточникВыбора, мы можем определить, откуда пришли данные, и обработать их по-разному.

Автоматическая подстановка данных в элементы управления

Выясним причину, по которой иногда код в ОбработкаВыбора писать вовсе не обязательно. Если владельцем формы выбора является конкретный ЭлементФормы (например, поле ввода), и тип значения, которое мы передаем через ОповеститьОВыборе(), совпадает с типом этого поля, платформа 1С выполнит подстановку автоматически.

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

Однако, если типы не совпадают или вам нужна сложная логика (например, при выборе товара нужно сразу заполнить цену и единицу измерения), необходимо вмешаться в процесс. В обработчике ОбработкаВыбора следует установить параметр СтандартнаяОбработка = Ложь, чтобы отменить автоматические действия платформы и выполнить свои.

Передача сложных структур данных

Метод ОповеститьОВыборе() позволяет передавать не только примитивные типы или ссылки. Вы можете передавать структуры или массивы. Это крайне полезно, когда вспомогательная форма — это сложный инструмент подбора.

Посмотрим на пример передачи структуры:


// В форме подбора
&НаКлиенте
Процедура ПодборЗавершен(Команда)
    ДанныеВыбора = Новый Структура;
    ДанныеВыбора.Вставить("Номенклатура", ТекущаяСтрока.Ссылка);
    ДанныеВыбора.Вставить("Количество", 10);
    ДанныеВыбора.Вставить("Цена", 1500);
    
    ОповеститьОВыборе(ДанныеВыбора);
КонецПроцедуры

В форме-владельце мы получим эту структуру в параметре ВыбранноеЗначение и сможем легко разобрать ее свойства.

Сравнение методов Оповестить() и ОповеститьОВыборе()

Важно не путать эти два метода, так как они имеют разную логику «адресации»:

  1. ОповеститьОВыборе() — это направленное сообщение. Оно идет строго от подчиненной формы к ее конкретному владельцу. Чаще всего этот вызов приводит к закрытию формы.
  2. Оповестить() — это широковещательное сообщение. Оно рассылается всем открытым окнам приложения. Его ловят через обработчик ОбработкаОповещения. Этот метод используется, когда нужно обновить данные в нескольких формах одновременно без их закрытия.

Подведем итоги

Для успешной работы с ОповеститьОВыборе() придерживайтесь следующих правил:

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

← На главную