К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как обновить таблицу на форме 1С

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

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

Основные инструменты — методы Обновить() элемента формы, ОбновитьОтображениеДанных() формы, а также свойство АвтоОбновление динамического списка. Ниже разобраны сценарии для управляемых и обычных форм, примеры кода и типичные ошибки, из-за которых таблица «не обновляется» даже при правильном вызове метода.

Как определить тип таблицы на форме

Перед выбором метода нужно понять, какой реквизит формы связан с таблицей. Откройте редактор формы в конфигураторе и посмотрите свойство ПутьКДанным элемента таблицы: там будет указан реквизит формы. Тип реквизита виден в панели реквизитов справа.

Различают три основных случая. Динамический список — основной реквизит формы списка справочника или документа, данные читаются из базы запросом. Таблица значений — реквизит формы типа «ТаблицаЗначений», заполняется программно и живёт только в памяти формы. Табличная часть — данные объекта (документа, справочника), хранятся вместе с объектом и сохраняются при записи.

Обновление динамического списка

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

&НаКлиенте

Процедура ОбновитьСписок(Команда)

Элементы.Список.Обновить();

КонецПроцедуры

Второй вариант — включить автообновление. В свойствах динамического списка (через палитру свойств реквизита формы) установите АвтоОбновление = Истина и укажите период в секундах. Тогда список будет перечитываться сам, без кода. Это удобно для мониторов и рабочих мест, где данные меняют несколько пользователей.

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

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

Программное изменение настроек списка

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

&НаСервере

Процедура УстановитьОтборПоОрганизации(Организация)

ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Организация");

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.ПравоеЗначение = Организация;

ЭлементОтбора.Использование = Истина;

КонецПроцедуры

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

Обновление таблицы значений на форме

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

Проблемы возникают в двух случаях. Первый — изменение выполняется на сервере, а вы пытаетесь увидеть результат до завершения серверного вызова: данные появятся только когда процедура закончится и управление вернётся в клиентский контекст. Второй — таблица изменяется в фоновом задании: фоновое задание работает с копией данных, и на форму результат нужно возвращать явно через ПоместитьВоВременноеХранилище и последующую загрузку.

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

Обновление табличной части объекта

Табличная часть документа или справочника обновляется вместе с объектом. Если данные изменились в базе (документ провёл другой пользователь или регламентное задание), а форма открыта, нужно перечитать объект целиком: вызовите ЭтаФорма.Прочитать() на сервере. Форма загрузит актуальную версию объекта вместе со всеми табличными частями.

Будьте осторожны: Прочитать() затирает несохранённые изменения в открытой форме. Если пользователь мог что-то редактировать, сначала проверьте ЭтаФорма.Модифицированность и предупредите его или сохраните данные.

Для программного перезаполнения табличной части (например, по кнопке «Заполнить») достаточно изменить коллекцию Объект.Товары — отображение обновится автоматически, отдельный вызов не нужен.

Пошаговый порядок действий для типовой задачи

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

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

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

&НаКлиенте

Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)

Если ИмяСобытия = "ЗаписанДокументРеализация" Тогда

Элементы.Список.Обновить();

КонецЕсли;

КонецПроцедуры

Обычные формы: чем отличается подход

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

Принцип тот же: сначала меняются данные, затем табличное поле перечитывает или перерисовывает строки. Если таблица связана с запросом или списком объектов — обновляется источник, если с таблицей значений — достаточно перезаполнить коллекцию и обновить строки.

Сравнение вариантов

Элементы.Список.Обновить()

Подходит для динамических списков. Перечитывает данные из базы. Не работает для таблиц значений.

АвтоОбновление списка

Подходит для мониторов и рабочих мест. Ограничение: постоянная нагрузка запросами на сервер.

ОбновитьОтображениеДанных()

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

ЭтаФорма.Прочитать()

Перечитывает объект с табличными частями. Опасен при несохранённых изменениях пользователя.

Типичные ошибки и их устранение

Самая частая причина «не обновляется» — вызов Обновить() у неправильного элемента. Проверьте, что имя элемента в коде точно совпадает с именем в дереве элементов формы, а таблица связана именно с тем динамическим списком, который вы ожидаете.

Вторая ошибка — изменение данных на сервере в фоновом задании и ожидание, что форма обновится сама. Фоновое задание не имеет доступа к форме: результат нужно вернуть через временное хранилище и загрузить в реквизит формы в обработчике завершения.

Третья ошибка — попытка обновить таблицу значений вызовом Обновить() элемента формы. У таблицы значений нет источника в базе, поэтому метод либо недоступен, либо ничего не делает. Просто перезаполните реквизит.

Типичные ошибки
01
Вызов Обновить() у элемента с опечаткой в имени — код молча не работает или падает с ошибкой
02
Ожидание обновления формы после фонового задания без возврата данных через временное хранилище
03
Включение автообновления с маленьким интервалом на тяжёлом списке — рост нагрузки на сервер у всех пользователей
04
Прочитать() без проверки модифицированности — потеря несохранённых данных пользователя

Как проверить, что обновление сработало

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

Контрольные точки

Как проверить результат

Появление новых строк
Норма

Новая запись видна в таблице сразу после действия

Тревожный признак

Строка появляется только после закрытия и открытия формы

Сохранение позиции
Норма

Текущая строка и сортировка не сбросились после обновления

Тревожный признак

Курсор уходит на первую строку, отбор пропадает

Нагрузка
Норма

Список обновляется по событию или с разумным интервалом

Тревожный признак

В консоли сервера видны частые одинаковые запросы от каждого пользователя

Часто задаваемые вопросы

Почему динамический список не обновляется после вызова Элементы.Список.Обновить()?

Чаще всего элемент с таким именем не связан с нужным списком или данные изменились не в базе, а в локальной копии. Проверьте свойство ПутьКДанным таблицы и убедитесь, что изменения реально записаны в базу — например, откройте ту же запись в другом окне.

Нужно ли вызывать обновление после изменения отбора динамического списка?

Нет. Изменение отбора, параметров или сортировки динамического списка автоматически инициирует повторное выполнение запроса. Дополнительный вызов Обновить() только создаст лишнее обращение к базе.

Как обновить таблицу значений, заполненную в фоновом задании?

Фоновое задание должно поместить результат во временное хранилище. В обработчике завершения задания на клиенте или сервере получите данные из хранилища и загрузите их в реквизит формы через ЗначениеВРеквизитФормы — таблица отобразится автоматически.

Чем опасно частое автообновление динамического списка?

Каждый интервал список выполняет запрос к базе. При десятках открытых сеансов и сложном запросе это создаёт постоянную нагрузку на СУБД и может замедлить работу всех пользователей. Для большинства списков достаточно обновления по событиям записи.

Можно ли обновить только одну строку таблицы, а не весь список?

Штатного метода точечного обновления строки динамического списка нет — он перечитывается целиком. Для таблицы значений можно изменить конкретную строку коллекции, и отобразятся только её изменения. Если список большой и обновления частые, рассмотрите переход на таблицу значений с ручным управлением.

Что делать, если после обновления сбрасывается текущая строка списка?

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

Итог

Что важно запомнить

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