Разработка и Конфигурация · 7 мин
Как очистить таблицу формы в 1С
Как очистить таблицу формы в 1С: метод Очистить() для табличных частей, таблиц значений и динамических списков. Примеры кода, типичные ошибки и проверка результата.
Под «очисткой таблицы формы» в 1С обычно понимают удаление всех строк из табличной части документа, из реквизита формы типа «ТаблицаЗначений» или из динамического списка. Во всех трёх случаях применяется метод Очистить(), но контекст вызова и побочные эффекты различаются.
Основная ошибка начинающих разработчиков — попытка очистить таблицу через присваивание новой пустой таблицы или через цикл удаления строк. Такой подход ломает связь элемента формы с данными, вызывает ошибки обращения к объектам и приводит к лишним обходам коллекции. Встроенный метод Очистить() решает задачу одной строкой и безопасно.
Ниже разобраны все типовые сценарии: очистка табличной части объекта, таблицы значений на форме, дерева значений, а также особые случаи — динамические списки и динамическое считывание данных. Отдельно рассмотрены проверка результата и типичные ошибки.
Очистка табличной части документа или справочника
Табличная часть — это коллекция строк, хранящаяся внутри объекта (документа, справочника). Чтобы удалить все строки, вызовите метод Очистить() у табличной части объекта:
Объект.Товары.Очистить();
// или через переменную
ТЧ = Объект.Товары;
ТЧ.Очистить();Если код выполняется в модуле формы документа, обращение идёт через реквизит Объект. Если код находится в модуле объекта или в обработчике проведения, табличная часть доступна напрямую по имени: Товары.Очистить().
Важно понимать: очистка табличной части на форме не сохраняет изменения в базе данных. Пользователь должен записать объект, иначе при закрытии формы изменения будут потеряны (или 1С предложит записать). Если нужно очистить табличную часть непосредственно в базе без открытия формы, получите объект методом ПолучитьОбъект(), очистите и вызовите Записать().
Очистка таблицы значений на форме
Реквизит формы типа «ТаблицаЗначений» очищается тем же методом. Если таблица отображается элементом формы, после вызова Очистить() интерфейс обновится автоматически — дополнительных действий не требуется:
&НаКлиенте
Процедура ОчиститьТаблицу(Команда)
ТаблицаДанных.Очистить();
КонецПроцедурыНе присваивайте реквизиту новую пустую таблицу через ТаблицаДанных = Новый ТаблицаЗначений — на клиенте такой код вообще недоступен, а на сервере он разорвёт связь элемента формы с данными, и таблица на экране перестанет обновляться корректно.
Если таблица значений передана на форму как параметр или создана программно через РеквизитФормыВЗначение, после очистки и заполнения нужно вернуть её обратно через ЗначениеВРеквизитФормы, чтобы изменения отобразились.
Очистка дерева значений и вложенных структур
Дерево значений очищается через коллекцию строк корневого уровня: ДеревоДанных.Строки.Очистить(). Если требуется очистить только вложенные строки конкретной ветки, вызовите Очистить() у коллекции строк нужного родителя:
// Очистить всё дерево
ДеревоДанных.Строки.Очистить();
// Очистить подчинённые строки одной ветки
НайденнаяСтрока.Строки.Очистить();Для частичной очистки табличной части по условию (например, удалить только строки с нулевым количеством) сначала найдите строки методом НайтиСтроки(), затем удаляйте их в цикле методом Удалить(). Полный Очистить() здесь не подойдёт — он удалит всё безусловно.
Динамический список и динамическое считывание
Динамический список (таблица формы с типом «ДинамическийСписок») нельзя очистить методом Очистить() — он отображает данные из базы по запросу, а не хранит строки. Чтобы «очистить» такой список, нужно либо удалить сами записи из базы, либо изменить запрос или отбор списка так, чтобы он не возвращал строк.
То же относится к таблицам с динамическим считыванием данных из регистров сведений: содержимое определяется источником данных, и программная очистка элемента формы невозможна.
Как выбрать действие
Типичные ошибки при очистке таблиц
Самая распространённая ошибка — удаление строк в цикле перебора по индексу от нуля вверх: при удалении строки индексы сдвигаются, и часть строк пропускается. Если цикл всё же нужен, перебирайте коллекцию с конца или используйте НайтиСтроки().
Вторая частая проблема — попытка очистить таблицу на клиенте методами, доступными только на сервере, например создать новую таблицу значений. Тонкий клиент не поддерживает конструктор Новый ТаблицаЗначений — переносите такую логику в серверную процедуру.
Проверка результата после очистки
После вызова Очистить() убедитесь, что количество строк равно нулю: Количество() для таблицы значений или табличной части должно вернуть 0. Для таблицы на форме дополнительно проверьте визуально, что элемент формы пуст.
Если табличная часть очищалась в базе через объект, перечитайте данные запросом или откройте форму заново — форма могла кэшировать старое состояние. Признаком успешной очистки в базе является отсутствие строк в табличной части при повторном чтении объекта.
Как проверить результат
Метод Количество() возвращает 0
Строки остались — очистка вызвана не у той коллекции
Таблица на экране пустая
Строки видны — нарушена связь элемента с реквизитом
Повторное чтение объекта показывает пустую табличную часть
Строки вернулись — объект не был записан
Частые вопросы
Чем Очистить() отличается от Удалить()?
Очистить() удаляет все строки коллекции за один вызов. Удалить() удаляет одну конкретную строку по объекту или индексу и применяется для точечного удаления, в том числе в цикле по результатам НайтиСтроки().
Можно ли очистить таблицу на клиенте без вызова сервера?
Да, метод Очистить() доступен на клиенте для реквизитов формы типа «ДанныеФормыКоллекция». Ограничение касается только создания новых таблиц значений — конструктор недоступен на тонком клиенте.
Почему после очистки таблица на форме не обновилась?
Скорее всего, реквизиту присвоили новую таблицу вместо вызова Очистить(), и элемент формы потерял связь с данными. Верните использование метода Очистить() у существующего реквизита формы.
Как очистить только часть строк по условию?
Вызовите НайтиСтроки() с отбором, затем в цикле удаляйте найденные строки методом Удалить(). Полный Очистить() для этой задачи не подходит.
Нужно ли записывать документ после очистки табличной части?
Да. Очистка меняет данные только в памяти (на форме или в объекте). Чтобы изменения сохранились в базе, вызовите Записать() у объекта или дождитесь записи пользователем.
Как очистить динамический список на форме?
Напрямую — никак. Динамический список отражает данные базы по запросу. Измените текст запроса, установите отбор, не возвращающий строк, либо удалите сами записи из базы данных.
Что важно запомнить
Таблицы формы в 1С очищаются методом Очистить(): у табличной части — через Объект.ИмяТЧ, у таблицы значений — через реквизит формы, у дерева — через коллекцию Строки. Динамический список очищается изменением запроса или отбора. После очистки табличной части запишите объект и проверьте, что Количество() равно нулю.