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