Разработка и Конфигурация · 9 мин
Как обновить таблицу формы в 1С: способы и примеры кода
Как обновить таблицу формы в 1С: методы Обновить() для динамических списков и табличных частей, обновление из кода, типичные ошибки и проверка результата.
Таблица на форме 1С — это динамический список, табличная часть документа или таблица значений. Когда данные в базе меняются извне (другой пользователь провёл документ, фоновое задание записало результат, обработка изменила регистр), форма не всегда показывает актуальное состояние автоматически. Чтобы пользователь увидел свежие данные, таблицу нужно обновить программно или вручную.
Способ обновления зависит от типа формы (обычная или управляемая) и от источника данных таблицы. Для динамического списка в управляемой форме используется метод Обновить() элемента формы, для обычных форм — метод Обновить() табличного поля, а таблицы значений перезаполняются запросом или процедурой загрузки. Ниже разобраны все основные сценарии с примерами кода.
Как определить тип таблицы на форме
Прежде чем писать код, выясните, что именно лежит в основе таблицы. Откройте форму в конфигураторе и посмотрите свойства элемента: если таблица связана с реквизитом формы типа «ДинамическийСписок» — это динамический список (типично для форм списков справочников и документов). Если источник — табличная часть объекта или реквизит типа «ТаблицаЗначений» — подход будет другим.
Ещё один признак: динамический список читает данные напрямую из базы и обновляется методом Обновить(), а таблица значений хранится в памяти формы и меняется только кодом. Смешивание подходов — главная причина, почему «обновление не срабатывает».
Обновление динамического списка в управляемой форме
Самый частый сценарий — обновить список документов или справочника после изменения данных. В модуле формы вызовите метод Обновить() у элемента таблицы:
&НаКлиенте
Процедура ОбновитьСписок(Команда)
Элементы.Список.Обновить();
КонецПроцедуры
Тот же вызов работает и в серверном контексте — например, после записи объекта или выполнения пакетной операции:
&НаСервере
Процедура ПослеЗаписиНаСервере()
// изменили данные программно
Элементы.Список.Обновить();
КонецПроцедуры
Метод заставляет динамический список повторно выполнить запрос к базе. Текущая позиция курсора при этом обычно сохраняется, если запись ещё существует. Если нужно не просто обновить, а перейти к конкретной строке, используйте Элементы.Список.ТекущаяСтрока = НужнаяСсылка; после обновления.
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "Запись_Документ" Тогда
Элементы.Список.Обновить();
КонецЕсли;
КонецПроцедурыОбновление таблицы в обычной форме (8.2 и ранее)
В обычных формах (режим совместимости, старые конфигурации) у табличного поля тоже есть метод Обновить(), но обращение идёт через коллекцию ЭлементыФормы:
Процедура КнопкаОбновитьНажатие(Элемент)
ЭлементыФормы.Список.Обновить();
КонецПроцедуры
Для табличной части документа в обычной форме часто достаточно вызвать Обновить() у табличного поля либо перечитать объект целиком методом Прочитать(), если данные менялись вне формы. Учтите: перечитывание объекта с несохранёнными изменениями приведёт к потере этих изменений, поэтому сначала уточните у пользователя, готов ли он отменить правки.
Обновление табличной части и таблицы значений
Табличная часть документа привязана к данным объекта, а не к запросу. Метод Обновить() у такого элемента формы есть, но он лишь перерисовывает таблицу — реальное обновление данных происходит при записи или перечитывании объекта. Если другой процесс изменил документ в базе, а форма открыта, вы столкнётесь с конфликтом блокировок: платформа не даст молча перезаписать чужие изменения.
Таблица значений на форме (реквизит типа «ТаблицаЗначений») обновляется только программно: очистите её и заполните заново результатом запроса или обработки:
&НаСервере
Процедура ПерезаполнитьТаблицу()
ТаблицаДанных.Очистить();
Запрос = Новый Запрос("ВЫБРАТЬ Номенклатура, Остаток ИЗ РегистрСведений.Остатки");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Строка = ТаблицаДанных.Добавить();
Строка.Номенклатура = Выборка.Номенклатура;
Строка.Остаток = Выборка.Остаток;
КонецЦикла;
КонецПроцедуры
После перезаполнения форма отобразит новые данные автоматически — дополнительный вызов обновления элемента не требуется, так как таблица значений связана с реквизитом формы напрямую.
Автоматическое обновление через оповещения
Вручную нажимать «Обновить» (F5) неудобно, когда формы связаны: пользователь записал документ в одном окне, а список в другом должен отреагировать сам. Для этого в 1С есть механизм оповещений. В форме, где данные меняются, вызовите Оповестить("Запись_МойДокумент"), а в форме списка обработайте событие:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "Запись_МойДокумент" Тогда
Элементы.Список.Обновить();
КонецЕсли;
КонецПроцедуры
Стандартные события записи объектов многие формы списков обрабатывают автоматически — динамический список с основной таблицей часто обновляется без дополнительного кода. Если этого не происходит, проверьте свойство списка «Автоматическое обновление» и наличие собственного обработчика оповещений.
- 1Определите тип таблицы: динамический список, табличная часть или таблица значений
- 2Для динамического списка вызовите Элементы.ИмяТаблицы.Обновить()
- 3Для таблицы значений перезаполните её запросом на сервере
- 4Для автоматической реакции настройте Оповестить() и ОбработкаОповещения
- 5Проверьте, что курсор и отборы после обновления ведут себя как ожидается
Типичные ошибки и их устранение
Ошибка «Метод объекта не обнаружен (Обновить)» означает, что вы вызвали метод у реквизита формы, а не у элемента формы. Правильно: Элементы.Список.Обновить(). Неправильно: Список.Обновить() — у самого динамического списка такого метода нет.
Вторая частая проблема — обновление «съедает» текущую строку или сбрасывает отбор. Это происходит, если вместе с обновлением код пересоздаёт настройки списка. Сохраняйте отбор и текущую ссылку перед обновлением и восстанавливайте после.
Третья ситуация: обновление вызывается в цикле или при каждом событии активизации, из-за чего форма «подвисает» — каждый вызов выполняет запрос к базе. Обновляйте список только по реальному событию изменения данных, а не по таймеру с малым интервалом.
Проверка результата и ограничения
После внедрения обновления проверьте три вещи: данные в таблице действительно свежие (сравните с записью в базе через консоль запросов), текущая строка не теряется без причины, а форма не тормозит при частых срабатываниях. Если список большой, частые обновления заметно нагружают сервер СУБД.
Учтите ограничение клиент-серверного режима: вызов Элементы.Список.Обновить() с клиента инициирует обращение к серверу, поэтому в толстом и тонком клиенте поведение одинаково, но в веб-клиенте лишние обновления ощутимее из-за задержек сети. Минимизируйте количество вызовов.
Как проверить результат
После обновления видны свежие записи из базы
Данные старые — обновляли элемент, а не источник данных
Курсор остался на той же записи
Позиция сбрасывается на первую строку
Форма реагирует без задержек
Форма подвисает — слишком частые вызовы Обновить()
FAQ
Как обновить таблицу формы клавишей без программирования?
В большинстве форм списков работает клавиша F5 или кнопка «Обновить» в меню «Ещё». Это стандартная команда платформы, она перечитывает динамический список из базы.
Почему после Обновить() пропадает установленный отбор?
Отбор сбрасывается, если код заново создаёт настройки динамического списка или меняет произвольный запрос. Сам метод Обновить() отбор не трогает — ищите в модуле место, где перезаписываются параметры списка.
Как обновить таблицу на форме из другой формы?
Напрямую обращаться к элементам чужой формы не нужно. Используйте Оповестить() с именем события, а в форме со списком обработайте это событие в ОбработкаОповещения и вызовите Обновить() у своего элемента.
Можно ли обновить только одну строку динамического списка?
Штатного метода обновления отдельной строки нет — динамический список перечитывается целиком. Если нагрузка критична, замените список на таблицу значений и управляйте строками вручную.
Почему в тонком клиенте обновление работает, а в веб-клиенте с задержкой?
Каждый вызов Обновить() — это обращение к серверу, а в веб-клиенте добавляется сетевая задержка. Сократите число вызовов и обновляйте список только по факту изменения данных, а не по таймеру.
Что важно запомнить
Обновление таблицы формы в 1С зависит от её типа: динамический список обновляется методом Элементы.ИмяТаблицы.Обновить(), таблица значений — повторным заполнением, табличная часть — записью или перечитыванием объекта. Для автоматической реакции между формами используйте оповещения. Не вызывайте обновление слишком часто — каждый вызов выполняет запрос к базе.