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

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

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

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

Выясним причину: почему не работает метод ОбновитьОтображениеДанных()

Распространенная ошибка разработчиков — вызов метода формы ОбновитьОтображениеДанных() в обработчике события. Этот метод обновляет только визуальные связи и вычисляемые элементы управления на клиенте, но не отправляет повторный запрос к базе данных.

Если данные документа изменились в БД, динамический список или табличное поле просто не узнают об этих изменениях при вызове ОбновитьОтображениеДанных(). Для перезапроса строк таблицы требуется использовать специализированные методы платформы.

Способ 1. Штатный метод ОповеститьОбИзменении() для динамических списков

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

Этот способ работает при соблюдении ключевого условия: у реквизита формы списка с типом ДинамическийСписок должно быть заполнено свойство ОсновнаяТаблица (например, Документ.ПриходнаяНакладная).

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


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

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

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

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

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

    
    &НаКлиенте
    Процедура ПослеЗаписи(ПараметрыЗаписи)
        Оповестить("ОбновитьСписокДокументов", Объект.Ссылка, ЭтотОбъект);
    КонецПроцедуры
    
  2. Привязка обработчика в форме списка. Переходим в форму списка документов, открываем палитру свойств самой формы и в строке события ОбработкаОповещения назначаем процедуру-обработчик. Это обязательный шаг, без назначения события в свойствах формы код выполняться не будет.

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

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

Метод Элементы.ИмяТаблицы.Обновить() заставляет динамический список выполнить повторный запрос к базе данных и отобразить актуальное состояние строк.

Способ 3. Прямое обновление через владельца формы

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

Если форма редактирования или обработки была открыта из формы списка, можно обратиться к форме-владельцу через свойство ВладелецФормы:


&НаКлиенте
Процедура ПослеИзмененияДанных()
    // Перечитываем данные в форме-владельце
    ВладелецФормы.Прочитать();
КонецПроцедуры

Для обычных форм (в режиме обычного приложения) при прямом обращении к владельцу используется аналогичный подпуть к элементам управления:

ВладелецФормы.ЭлементыФормы.СписокДокументов.Обновить();

Подведем итоги

Для корректного обновления открытой формы списка документов в 1С соблюдайте следующие правила:

  1. Если используется стандартный динамический список с указанной Основной таблицей, применяйте ОповеститьОбИзменении(Ссылка).
  2. Если список построен на сложном произвольном запросе без основной таблицы, отправляйте Оповестить() и в событии ОбработкаОповещения формы списка вызывайте Элементы.ТаблицаСписка.Обновить().
  3. Избегайте использования ОбновитьОтображениеДанных() для задач перезапроса информации из базы данных.
← На главную