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