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

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

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

1. Когда требуется обновление табличной части?

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

  • 📄 Изменение данных в базе — пользователь edited другой документ, который влияет на текущую табличную часть (например, изменилась цена номенклатуры в справочнике).
  • 🔄 Динамический пересчет — в форме реализован механизм автоматического пересчета сумм или количеств при изменении других полей.
  • 🖥️ Смена отбора или фильтра — пользователь применил новый отбор, и таблица должна показать актуальный набор данных.
  • 🔧 Программная модификация — разработчик в коде добавил/удалил строки или изменил свойства колонок.
  • 📱 Обновление после внешних событий — например, после получения данных по HTTP-запросу или обработки файла.

Важно отличать визуальное обновление (когда данные в базе не изменились, но нужно обновить отображение) от перезагрузки данных (когда требуется заново получить данные из источника). Например, если пользователь вручную edited строку таблицы, достаточно вызвать ОбновитьФорму(). А если изменились данные в базе (например, другой пользователь провел документ), потребуется ЗагрузитьДанные().

📊 Как часто вам приходится обновлять табличные части в 1С?
Ежедневно
Несколько раз в неделю
Редко, по мере необходимости
Никогда не сталкивался

2. Стандартные методы обновления без программирования

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

2.1. Кнопка «Обновить» на форме

Самый простой способ — использовать стандартную кнопку «Обновить» (если она добавлена на форму). Она вызывает метод ОбновитьФорму(), который:

  • 🔄 Перерисовывает все элементы формы, включая табличные части.
  • 📥 Не перезагружает данные из базы (использует кэшированные значения).
  • ⚡ Работает быстро, так как не выполняет запросы к базе.

Ограничение: если данные в базе изменились (например, другой пользователь edited документ), кнопка «Обновить» не покажет актуальные данные. В этом случае нужно использовать «Обновить данные» (если она есть на форме) или программно вызывать ЗагрузитьДанные().

2.2. Горячие клавиши

Для ускорения работы можно использовать комбинации клавиш:

  • 🔄 F5 или Ctrl+R — обновляет форму (аналог кнопки «Обновить»).
  • 📥 Ctrl+Shift+R — принудительная перезагрузка данных (если поддерживается формой).
💡

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

2.3. Настройки автообновления

В некоторых конфигурациях (например, 1С:ERP или 1С:УТ) табличные части могут обновляться автоматически при:

  • 📝 Изменении связанных документов (если настроена подписка на события).
  • 🕒 Периодическом опросе сервера (настраивается в модуле формы).
  • 🔄 Смене отбора или фильтра (если включен режим динамического списка).

Чтобы проверить, включено ли автообновление:

  1. Откройте форму в конфигураторе.
  2. Перейдите на закладку Реквизиты и найдите табличную часть.
  3. Проверьте свойство АвтоОбновление (если оно доступно для данного типа формы).
Как включить автообновление для динамического списка?

Для динамического списка автообновление настраивается в свойствах элемента формы:

1. Откройте форму в конфигураторе.

2. Выделите динамический список.

3. В палитре свойств найдите параметр ПериодАвтоОбновления и установите значение в секундах (например, 30).

4. Сохраните форму и обновите конфигурацию базы.

3. Программное обновление табличной части: методы и примеры кода

Когда стандартных средств недостаточно, приходится прибегать к программным методам. Ниже рассмотрены основные подходы с примерами кода для разных сценариев.

3.1. Метод ОбновитьФорму()

Самый универсальный способ обновить отображение табличной части без перезагрузки данных:

Процедура ОбновитьТабличнуюЧасть(ЭлементФормы)

ЭлементФормы.ОбновитьФорму();

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

Где ЭлементФормы — это ссылка на табличную часть, например, ЭлементыФормы.Товары.

Особенности метода:

  • ⚡ Быстро выполняется, так как не обращается к базе.
  • 🔄 Обновляет только визуальное представление (не подходит, если изменились данные в базе).
  • 🛠️ Можно вызвать для всей формы или отдельного элемента.

3.2. Метод ЗагрузитьДанные()

Если нужно перезагрузить данные из источника (например, после изменения другого документа), используйте:

Процедура ПерезагрузитьТабличнуюЧасть(ЭлементФормы)

ЭлементФормы.ЗагрузитьДанные();

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

Пример для табличной части документа:

Процедура ОбновитьТовары(Команда)

ЭлементыФормы.Товары.ЗагрузитьДанные();

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

🔹 Убедитесь, что табличная часть привязана к источнику данных (например, к реквизиту документа).

🔹 Проверьте, что у пользователя есть права на чтение данных.

🔹 Если таблица большая, предупредите пользователя о возможной задержке.

🔹 После загрузки данных вызовите ОбновитьФорму() для корректного отображения.-->

3.3. Ручное обновление через запрос

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

Процедура ОбновитьЦеныВТаблице()

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ТоварыСправочник.Ссылка КАК Ссылка,

| ТоварыСправочник.Цена КАК Цена

|ИЗ

| Справочник.Номенклатура КАК ТоварыСправочник

|ГДЕ

| ТоварыСправочник.Ссылка В (&СписокТоваров)";

СписокТоваров = Новый Массив;

Для Каждого Строка Из ЭлементыФормы.Товары Цикл

СписокТоваров.Добавить(Строка.Номенклатура);

КонецЦикла;

Запрос.УстановитьПараметр("СписокТоваров", СписокТоваров);

Результат = Запрос.Выполнить();

Пока Результат.Следующий() Цикл

Для Каждого Строка Из ЭлементыФормы.Товары Цикл

Если Строка.Номенклатура = Результат.Ссылка Тогда

Строка.Цена = Результат.Цена;

КонецЕсли;

КонецЦикла;

КонецЦикла;

ЭлементыФормы.Товары.ОбновитьФорму();

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

Этот метод полезен, когда:

  • 📊 Нужно обновить только часть данных (например, только цены или остатки).
  • 🔧 Требуется применить сложную логику фильтрации или преобразования данных.
  • 🚀 Необходимо оптимизировать производительность (запрос может быть быстрее, чем полная перезагрузка).
💡

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

3.4. Обновление через источник данных

Если табличная часть привязана к динамическому списку или другому источнику, можно обновить его напрямую:

Процедура ОбновитьИсточникДанных()

ИсточникДанных = ЭлементыФормы.Товары.ИсточникДанных;

ИсточникДанных.Обновить();

ЭлементыФормы.Товары.ОбновитьФорму();

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

Этот способ подходит для:

  • 📋 Динамических списков.
  • 🔗 Таблиц, привязанных к запросам или объектам.
  • 🔄 Форм с сложной логикой отображения.

4. Типичные ошибки и как их избежать

При работе с обновлением табличных частей разработчики часто сталкиваются с типичными проблемами. Рассмотрим наиболее распространенные ошибки и способы их решения.

4.1. «Данные не обновляются после изменения»

Если после вызова ОбновитьФорму() или ЗагрузитьДанные() таблица не меняется, проверьте:

  • 🔗 Привязку к источнику данных — убедитесь, что табличная часть связана с правильным реквизитом или запросом.
  • 🔒 Права доступа — у пользователя могут отсутствовать права на чтение данных.
  • 📡 Кэширование — иногда помогает полная перезагрузка формы (Закрыть(); Открыть();).
  • 🐞 Ошибки в коде — проверьте журнал регистрации на наличие исключений.
Как проверить привязку табличной части к источнику данных?

1. Откройте форму в конфигураторе.

2. Выделите табличную часть на закладке «Элементы».

3. В палитре свойств найдите поле ИсточникДанных или Данные.

4. Убедитесь, что указан корректный путь (например, Объект.Товары для табличной части документа).

4.2. «Зависание формы при обновлении»

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

  • 📉 Пагинация — разбейте данные на страницы (например, по 100 строк).
  • 🔍 Отбор — применяйте фильтры, чтобы уменьшить объем загружаемых данных.
  • Асинхронная загрузка — используйте ПоказатьОповещениеПользователя() и фоновые задачи.
  • 📊 Динамический список — если возможно, замените табличную часть на динамический список с отложенной загрузкой.

Пример асинхронного обновления:

Процедура ОбновитьТоварыАсинхронно()

ПоказатьОповещениеПользователя("Идет обновление данных...", 0);

ФоноваяЗадача = ФоновыеЗадачи.Выполнить(

"ОбновитьТоварыФоноваяЗадача",

Новый Структура("Форма, Параметры", ЭтаФорма, Неопределено));

ФоноваяЗадача.ПриОкончании = "ОбновитьТоварыЗавершено";

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

Процедура ОбновитьТоварыФоноваяЗадача(ПараметрыВыполнения) Экспорт

Форма = ПараметрыВыполнения.Параметры.Форма;

Форма.ЭлементыФормы.Товары.ЗагрузитьДанные();

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

Процедура ОбновитьТоварыЗавершено(Результат, Параметры) Экспорт

ЗакрытьОповещениеПользователя();

Сообщить("Данные обновлены!");

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

4.3. «Потеря фокуса после обновления»

После обновления табличной части пользователь может потерять текущую строку или выделение. Чтобы сохранить контекст:

  • 📍 Сохраните текущую строку перед обновлением:
ТекущаяСтрока = ЭлементыФормы.Товары.ТекущаяСтрока;

ЭлементыФормы.Товары.ЗагрузитьДанные();

ЭлементыФормы.Товары.ТекущаяСтрока = ТекущаяСтрока;

  • 🔄 Используйте события — обрабатывайте ПриАктивизацииСтроки, чтобы восстановить выделение.

4.4. «Ошибки блокировок при многопользовательской работе»

Если несколько пользователей одновременно работают с одним документом, могут возникать блокировки. Решения:

  • 🔒 Транзакции — оберните обновление в транзакцию:
НачатьТранзакцию();

Попытка

ЭлементыФормы.Товары.ЗагрузитьДанные();

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

Сообщить(ОписаниеОшибки());

КонецПопытки;

  • 🕒 Повторные попытки — реализуйте механизм повторного выполнения через Подождать().
  • 📋 Уведомления — оповещайте пользователя о блокировках:
Если Не ЭлементыФормы.Товары.ЗагрузитьДанные() Тогда

Сообщить("Данные заблокированы другим пользователем. Повторите попытку позже.");

КонецЕсли;

💡

Для отладки блокировок используйте журнал регистрации (меню «Администрирование» → «Журнал регистрации») с фильтром по событиям блокировок.

5. Оптимизация производительности при обновлении

Обновление табличных частей с большим количеством данных может значительно замедлять работу программы. Рассмотрим способы оптимизации.

5.1. Использование динамических списков

Динамические списки загружают данные порциями, что ускоряет работу с большими таблицами. Чтобы заменить стандартную табличную часть на динамический список:

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

Преимущества динамических списков:

  • Быстрая загрузка — данные подгружаются по мере прокрутки.
  • 🔍 Гибкий отбор — можно легко добавлять фильтры.
  • 📊 Сортировка — поддерживается на уровне сервера.

5.2. Отложенная загрузка данных

Если табличная часть не критична для начальной загрузки формы, можно отложить ее загрузку:

Процедура ПриОткрытии()

ЭлементыФормы.Товары.Видимость = Ложь; // Скрываем таблицу

ФоновыеЗадачи.Выполнить("ЗагрузитьТоварыОтложенно", ЭтаФорма);

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

Процедура ЗагрузитьТоварыОтложенно(Параметры) Экспорт

Форма = Параметры.Параметры;

Форма.ЭлементыФормы.Товары.ЗагрузитьДанные();

Форма.ЭлементыФормы.Товары.Видимость = Истина;

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

5.3. Кэширование данных

Если данные в табличной части редко меняются, можно кэшировать их в памяти:

Перем мКэшТоваров;

Процедура ОбновитьТоварыСКэшем()

Если мКэшТоваров = Неопределено Тогда

мКэшТоваров = ПолучитьДанныеТоваров(); // Ваша функция загрузки

КонецЕсли;

ЭлементыФормы.Товары.ИсточникДанных = мКэшТоваров;

ЭлементыФормы.Товары.ОбновитьФорму();

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

Процедура ОчиститьКэшТоваров()

мКэшТоваров = Неопределено;

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

Кэширование целесообразно использовать, если:

  • 📊 Данные изменяются редко (например, справочная информация).
  • 👥 Форма открывается часто (например, в рабочем месте менеджера).
  • ⚡ Загрузка данных занимает много времени.
💡

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

5.4. Оптимизация запросов

Если табличная часть заполняется данными через запрос, оптимизируйте его:

  • 🎯 Индексы — убедитесь, что запрос использует индексированные поля.
  • 📉 Лишние поля — выбирайте только необходимые колонки.
  • 🔗 Объединения — избегайте ЛЕВОЕ СОЕДИНЕНИЕ, если оно не нужно.
  • 🕒 Периодичность — если возможно, ограничьте период данных.

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

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 100

| Товары.Ссылка КАК Ссылка,

| Товары.Наименование КАК Наименование,

| Товары.Артикул КАК Артикул

|ИЗ

| Справочник.Номенклатура КАК Товары

|ГДЕ

| Товары.ПометкаУдаления = ЛОЖЬ

| И Товары.ЭтотГод

|УПОРЯДОЧИТЬ ПО

| Наименование

|ИТОГИ ПО

| Ссылка";

6. Работа с табличными частями в управляемых формах

Управляемые формы в 1С:Предприятие 8.3 имеют свои особенности при работе с табличными частями. Рассмотрим ключевые моменты.

6.1. Особенности управляемых форм

В управляемых формах табличные части могут быть:

  • 📋 Привязаны к реквизиту объекта (например, ДокументОбъект.Товары).
  • 🔗 Динамическими списками — загружают данные по запросу.
  • 📊 Таблицами значений — для временных данных.

Основные методы для работы:

Метод Описание Пример использования
ОбновитьФорму() Обновляет отображение всех элементов формы ЭтаФорма.ОбновитьФорму();
Обновить(Элемент) Обновляет конкретный элемент (включая табличную часть) ЭтаФорма.Обновить(ЭтаФорма.ЭлементыФормы.Товары);
ЗагрузитьДанные() Перезагружает данные табличной части из источника ЭлементыФормы.Товары.ЗагрузитьДанные();
Очистить() Очищает табличную часть ЭлементыФормы.Товары.Очистить();
Добавить() Добавляет новую строку в табличную часть ЭлементыФормы.Товары.Добавить();

6.2. Работа с таблицей значений

Если табличная часть не привязана к объекту метаданных, а является таблицей значений, для ее обновления используйте:

Процедура ОбновитьТаблицуЗначений()

// Получаем таблицу значений из элемента формы

ТЗ = ЭлементыФормы.Товары.Значение;

// Обновляем данные (пример: добавляем новую строку)

НоваяСтрока = ТЗ.Добавить();

НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию("Товар 1");

НоваяСтрока.Количество = 10;

// Обновляем форму

ЭлементыФормы.Товары.ОбновитьФорму();

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

6.3. Динамические списки в управляемых формах

Для динамических списков доступны дополнительные методы:

  • 🔍 УстановитьОтбор(ИмяПоля, Значение) — применяет фильтр.
  • 📊 УстановитьПорядок(Поля) — сортирует данные.
  • 📥 ПрочитатьДанные() — принудительно загружает данные.

Пример применения отбора:

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

ЭлементыФормы.Товары.УстановитьОтбор(

"Поставщик",

Новый ЗначениеЗаполнения(Поставщик, Тип("СправочникСсылка.Контрагенты")));

ЭлементыФормы.Товары.ПрочитатьДанные();

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

6.4. Обработка событий

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

  • 📝 ПриИзменении — срабатывает при изменении данных в строке.
  • 🔄 ПриАктивизацииСтроки — при выборе строки.
  • ПриДобавленииСтроки — при добавлении новой строки.

Пример обработки изменения:

Процедура ТоварыПриИзменении(Элемент, Строка, Колонка, СтандартнаяОбработка)

Если Колонка.Имя = "Количество" Тогда

Строка.Сумма = Строка.Цена * Строка.Количество;

ЭлементыФормы.Товары.ОбновитьФорму();

КонецЕсли;

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

7. Примеры реальных задач и их решения

Рассмотрим несколько практических сценариев, с которыми часто сталкиваются разработчики.

7.1. Обновление цен в табличной части документа

Задача: При изменении валюты документа нужно пересчитать цены в табличной части «Товары» по текущему курсу.

Решение:

Процедура ПриИзмененииВалюты(Элемент)

КурсВалюты = ПолучаемТекущийКурсВалюты(Объект.Валюта);

Для Каждого Строка Из ЭлементыФормы.Товары Цикл

Если ЗначениеЗаполнено(Строка.Цена) Тогда

Строка.Цена = Строка.Цена * КурсВалюты;

Строка.Сумма = Строка.Цена * Строка.Количество;

КонецЕсли;

КонецЦикла;

ЭлементыФормы.Товары.ОбновитьФорму();

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

7.2. Динамическое добавление колонок

Задача: В зависимости от типа документа нужно показывать разные колонки в табличной части.

Решение:

Процедура НастроитьКолонкиТаблицы()

Если Объект.ВидДокумента = Перечисления.ВидыДокументов.Реализация Тогда

ЭлементыФормы.Товары.Колонки.Добавить("Скидка", Новый ОписаниеТипов("Число"));

ЭлементыФормы.Товары.Колонки.Найти("Скидка").Заголовок = "Скидка (%)";

К