Как обновить данные в форме справочника после закрытия вспомогательного окна в 1С

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

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

Метод 1. Использование описания оповещения о закрытии

Самый правильный и рекомендуемый платформой способ при использовании асинхронных вызовов — это параметр ОписаниеОповещенияОЗакрытии метода ОткрытьФорму. Проанализируем ситуацию, когда мы вызываем форму из модуля команды.

Разберем по шагам, как это реализовать в модуле команды:

  1. Создадим структуру параметров для открываемой формы.
  2. Создадим объект ОписаниеОповещения, указав процедуру, которая выполнится после закрытия.
  3. Вызовем открытие формы, передав описание оповещения.

Рассмотрим пример кода в модуле команды:


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

&НаКлиенте
Процедура ПослеЗакрытияФормы(РезультатЗакрытия, ДополнительныеПараметры) Экспорт
    
    // ДополнительныеПараметры в данном случае — это форма-владелец (Источник)
    // Мы можем вызвать обновление всей формы
    ДополнительныеПараметры.ОбновитьОтображениеДанных();
    
    // Либо, если в форме есть экспортный метод для обновления конкретных данных:
    // ДополнительныеПараметры.ОбновитьМойРегистрНаФорме();
    
КонецПроцедуры

Метод 2. Использование глобального механизма оповещений

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

Шаг 1. Действия в открываемой форме (например, форма списка документов):

В тот момент, когда данные записаны или форма закрывается, мы посылаем сигнал системе. Выясним, где это лучше сделать. Обычно это событие ПослеЗаписи или ПередЗакрытием.


&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    // Посылаем оповещение всем открытым формам
    Оповестить("ОбновитьДанныеСтавок", , ЭтотОбъект);
КонецПроцедуры

Шаг 2. Действия в основной форме (форма справочника):

Нам нужно «поймать» это оповещение. Для этого используем стандартный обработчик события ОбработкаОповещения.


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

Метод 3. Использование ОповеститьОбИзменении

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

ОповеститьОбИзменении(Тип("ДокументСсылка.УстановкаСтавкиКонтрагента"));

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

Важные нюансы работы с модальностью и командами

Разберем ситуацию, когда команда вынесена в Общие команды. Пользователи часто сталкиваются с тем, что форма открывается «где-то во вкладках» и оповещение не срабатывает так, как ожидалось.

1. Режим открытия окна. Если вы хотите, чтобы пользователь обязательно завершил работу во вспомогательном окне перед возвратом к основному, используйте РежимОткрытияОкнаФормы.БлокироватьОкноВладельца. Это создаст эффект «модальности» в рамках одного приложения, и ОписаниеОповещения отработает сразу после закрытия этого блокирующего окна.

2. Контекст выполнения. Помните, что если обработчик оповещения (процедура ПослеЗакрытияФормы) находится в модуле команды, у неё нет прямого доступа к реквизитам формы-владельца. Именно поэтому мы передаем ПараметрыВыполненияКоманды.Источник в качестве дополнительных параметров — чтобы иметь ссылку на форму и иметь возможность вызвать её методы.

3. Размещение команды. Если ваша команда автоматически попадает в группу «Перейти», она может открываться как панель навигации. Чтобы команда отображалась как кнопка на командной панели, проверьте свойство Группа у команды в метаданных (например, выберите «Панель действий.Важное») или вручную добавьте команду в командный интерфейс формы справочника.

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

← На главную