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

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

Как удалить все строки из таблицы значений в 1С

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

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

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

Метод Очистить() — основной способ удаления всех строк

Метод Очистить() — штатный и самый быстрый способ удалить все строки из таблицы значений. Он вызывается непосредственно у объекта и не требует перебора строк:

ТЗ = Новый ТаблицаЗначений;

ТЗ.Колонки.Добавить("Номенклатура");

ТЗ.Колонки.Добавить("Количество");

// ... заполнение таблицы ...

ТЗ.Очистить(); // все строки удалены, колонки остались

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

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

bsl
ТЗ.Очистить();
Сообщить("Строк после очистки: " + ТЗ.Количество()); // 0

Удаление строк в цикле: когда это нужно и когда вредно

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

Выборочное удаление с конца таблицы

Если удалять строки в прямом цикле по индексу, нумерация сдвигается и часть строк пропускается. Правильный приём — идти с конца:

Для Инд = 1 По ТЗ.Количество() Цикл

Строка = ТЗ[ТЗ.Количество() - Инд];

Если Строка.Количество = 0 Тогда

ТЗ.Удалить(Строка);

КонецЕсли;

КонецЦикла;

Удаление через индекс

Метод Удалить() принимает либо саму строку, либо её индекс. Вариант ТЗ.Удалить(0) в цикле «пока таблица не пуста» тоже работает, но по сути это медленная имитация Очистить() — используйте его только в учебных целях.

Типичные ошибки
01
Удаление строк в прямом цикле Для Каждого — индексы смещаются, часть строк пропускается или возникает ошибка обращения к несуществующему индексу
02
Использование цикла с Удалить() для полной очистки вместо Очистить() — код длиннее и работает заметно медленнее на больших таблицах
03
Присвоение ТЗ = Неопределено вместо очистки — теряется структура колонок, и следующее обращение к таблице вызывает ошибку

Очистка табличной части документа или справочника

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

ДокОбъект = ДокументСсылка.ПолучитьОбъект();

ДокОбъект.Товары.Очистить();

ДокОбъект.Записать();

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

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

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

Когда таблица значений объявлена как реквизит управляемой формы, обращение к ней идёт через ЭтаФорма.ИмяРеквизита или просто по имени реквизита. Метод Очистить() доступен и в этом случае:

&НаКлиенте

Процедура ОчиститьТаблицу(Команда)

ТоварыТаблица.Очистить();

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

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

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

Очистка дерева значений и связанных таблиц

Дерево значений очищается тем же методом Очистить(), вызванным у корневой коллекции строк: Дерево.Строки.Очистить(). При этом удаляются все ветви вместе с вложенными уровнями.

Если нужно очистить только подчинённые строки конкретной ветви, вызовите Очистить() у коллекции строк этой ветви: СтрокаДерева.Строки.Очистить(). Сама ветвь при этом останется.

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

Сравнение способов

Очистить()

Штатный способ удалить все строки. Быстро, сохраняет колонки. Подходит почти всегда

Цикл с Удалить()

Нужен только при выборочном удалении по условию. Для полной очистки избыточен и медленен

Создание новой таблицы

ТЗ = Новый ТаблицаЗначений — уместно, если структура колонок тоже должна измениться; иначе лишняя работа

ТЗ = Неопределено

Не очищает, а уничтожает объект: структура теряется, последующие обращения дадут ошибку

Проверка результата и производительность

Убедиться, что таблица пуста, можно двумя способами: проверкой ТЗ.Количество() = 0 или просто выводом количества в журнал. Для табличных частей объектов действует то же правило.

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

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

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

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

Количество строк после очистки
Норма

ТЗ.Количество() возвращает 0

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

Строки остались — очищалась копия таблицы или другая переменная

Структура колонок
Норма

ТЗ.Колонки содержит все исходные колонки

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

Колонки пропали — вероятно, таблица была пересоздана или обнулена

Данные на форме
Норма

Табличное поле отображает пустой список

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

На форме строки видны — очищался результат РеквизитФормыВЗначение() без обратного помещения

Данные в базе (табличная часть)
Норма

После Записать() строки удалены из объекта

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

В базе строки остались — объект не был записан

Частые вопросы

Метод Очистить() удаляет колонки таблицы значений?

Нет. Метод удаляет только строки, а структура колонок — имена, типы, заголовки, ширина — полностью сохраняется. Если нужно избавиться и от колонок, вызовите отдельно ТЗ.Колонки.Очистить() или создайте новую таблицу.

Как удалить все строки из табличной части документа, не открывая его?

Получите объект по ссылке (ДокументСсылка.ПолучитьОбъект()), вызовите Объект.ИмяТабличнойЧасти.Очистить() и затем Объект.Записать(). Без вызова Записать() изменения не попадут в базу данных.

Почему после Очистить() на форме строки всё равно видны?

Скорее всего, вы работали с копией: например, преобразовали реквизит формы в значение через РеквизитФормыВЗначение(), очистили полученную таблицу, но не вернули её обратно через ЗначениеВРеквизитФормы(). Очищайте непосредственно реквизит формы.

Можно ли очистить таблицу в цикле Для Каждого?

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

Что быстрее: Очистить() или цикл с Удалить()?

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

Как очистить только вложенные строки дерева значений?

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

Итог

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

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