Как оповестить форму об изменениях в регистре сведений?

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

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

Понимание архитектурных ограничений

Важно понимать, что в 1С:Предприятии 8.3 реализована клиент-серверная модель. Серверная часть не имеет прямой «обратной связи» с клиентами — она не знает, какие формы открыты у конкретного пользователя и какие данные на них отображаются. Поэтому «push-уведомление» от сервера к клиенту — это механизм, который по умолчанию отсутствует. Изменения, внесенные в регистр в одном сеансе, не передаются автоматически в другие запущенные окна 1С.

Решение 1: Автообновление динамического списка

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

  1. Откройте форму в конфигураторе.
  2. Выберите элемент формы, являющийся ДинамическийСписок.
  3. В палитре свойств найдите поле Период автообновления.
  4. Установите значение в секундах (например, 60 для обновления раз в минуту).

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

Решение 2: Обработчик ожидания (AttachIdleHandler)

Если встроенного автообновления недостаточно, вы можете реализовать обновление программно. Этот метод позволяет чаще «опрашивать» сервер на наличие новых данных. Рассмотри пример реализации:


// В модуле формы при создании
&НаКлиенте
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ПодключитьОбработчикОжидания("ОбновитьДанныеСписка", 10); // Обновление каждые 10 секунд
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьДанныеСписка()
    // Принудительное обновление списка
    Элементы.МойДинамическийСписок.Обновить();
КонецПроцедуры

Этот подход создает дополнительную нагрузку на сервер, поэтому старайтесь не выставлять слишком малые интервалы.

Решение 3: Оповещение в рамках одного сеанса

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

В форме, где выполняется запись:


&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    // Оповещаем систему о событии
    Оповестить("ЗаписьРегистраИзменена");
КонецПроцедуры

В форме, которая должна получить сигнал, добавьте процедуру обработки:


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

Почему ОповеститьОбИзменении не всегда помогает?

Функция ОповеститьОбИзменении(Тип("РегистрСведенийКлючЗаписи...")) работает только внутри текущего сеанса. Она удобна тем, что если форма использует регистр в качестве основной таблицы, платформа сама поймет, что список нужно обновить. Однако, если вы открыли вторую копию 1С, этот метод не передаст сигнал «соседу». Именно поэтому для глобальной синхронизации между разными пользователями рекомендуется использовать Период автообновления или периодический Обработчик ожидания.

Анализируя ситуацию, мы видим, что «реальное время» в 1С достигается путем разумного компромисса между актуальностью данных и производительностью системы. Выбирайте инструмент в зависимости от того, нужно ли вам оповестить только текущее окно или всех пользователей системы.

← На главную