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

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

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

Причины, по которым список не обновляется автоматически

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

  1. У динамического списка в конфигураторе должно быть заполнено свойство «Основная таблица» (например, Документ.ИмяДокумента).
  2. Обновление должно инициироваться на клиенте после фактической записи объекта в базу данных.

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

Способ 1. Использование штатного метода ОповеститьОбИзменении

Проанализируем стандартный подход платформы 1С. Если у динамического списка формы назначена основная таблица, система самостоятельно обрабатывает сигналы об изменении объектов. В модуле формы документа в событии ПослеЗаписи на клиенте достаточно вызвать метод ОповеститьОбИзменении() и передать в него ссылку на измененный объект:


&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    ОповеститьОбИзменении(Объект.Ссылка);
КонецПроцедуры

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

Способ 2. Использование явного оповещения через Оповестить() и ОбработкаОповещения

Рассмотрим ситуацию, когда стандартный метод ОповеститьОбИзменении() не обновляет список (например, если основная таблица для списка не задана или используется сложный произвольный запрос). В этом случае вызов ОповеститьОбИзменении() не вызовет платформенный обработчик ОбработкаОповещения в форме списка.

Чтобы организовать явное обновление списка, выполним следующие шаги:

  1. В модуле формы документа в событии ПослеЗаписи вызовем глобальный метод Оповестить(), передав имя события и необходимые параметры:

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    Оповестить("ОбновлениеФормыСпискаДокументов", Объект.Ссылка, ЭтаФорма);
КонецПроцедуры
  1. В форме списка добавим процедуру-обработчик события ОбработкаОповещения и выполним обновление элемента таблицы:

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

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

Альтернативные варианты обновления

Посмотрим на другие возможности обновления данных, предоставляемые платформой 1С:

  1. Сброс кэша по типу объекта: Если необходимо обновить данные списка после массовых изменений, в метод ОповеститьОбИзменении() передают не конкретную ссылку, а тип объекта: ОповеститьОбИзменении(Тип("ДокументСсылка.ПриходнаяНакладная"));
  2. Периодическое автообновление: Для динамического списка в свойствах элемента таблицы формы можно настроить параметр «Период автообновления» (задается в секундах). В этом случае список будет автоматически перечитывать данные с сервера через заданные интервалы времени.
← На главную