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

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

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

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

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

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

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

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

Типовой пример использования:

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

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

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

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

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

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

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

Удаление строк в цикле: когда нужна выборочная очистка

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

Правильный вариант удаления строк по условию:

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

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

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

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

КонецЕсли;

КонецЦикла;

Альтернатива — сначала собрать строки в отдельный массив через НайтиСтроки() с отбором, а затем удалить их. Такой подход читается проще и безопаснее, потому что не требует ручного управления индексами:

Отбор = Новый Структура("Количество", 0);

СтрокиКУдалению = ТЗ.НайтиСтроки(Отбор);

Для Каждого СтрокаТЗ Из СтрокиКУдалению Цикл

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

КонецЦикла;

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

Полное освобождение памяти: сброс ссылки на таблицу

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

ТЗ.Очистить();

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

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

Учтите: если та же таблица передана в другую переменную, параметр процедуры или привязана к реквизиту формы, присвоение Неопределено одной переменной не уничтожит объект — он останется доступен по другим ссылкам.

Маршрут решения

Как выбрать действие

Нужно переиспользовать таблицу с той же структурой колонокВызовите ТЗ.Очистить() — строки удалятся, колонки сохранятся
Таблица больше не нужна вообще, важно освободить памятьВыполните ТЗ.Очистить() и присвойте переменной Неопределено
Нужно удалить только часть строк по условиюИспользуйте НайтиСтроки() с отбором и Удалить() для найденных строк
Очищается таблица, связанная с реквизитом формыПроверьте тип реквизита: для ДанныеФормыКоллекция работает Очистить(), но присваивать Неопределено нельзя

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

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

&НаКлиенте

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

ТаблицаДанных.Очистить();

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

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

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

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

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

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

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

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

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

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

Безопасная очистка табличной части документа
  1. 1
    Убедитесь, что работаете с тестовой копией базы или имеете актуальную резервную копию
  2. 2
    Получите объект документа через ПолучитьОбъект(), а не работайте со ссылкой напрямую
  3. 3
    Выгрузите табличную часть в таблицу значений методом Выгрузить() — это резервная копия строк
  4. 4
    Вызовите Очистить() для табличной части и проверьте, что Количество() вернуло 0
  5. 5
    Запишите объект и проверьте результат в пользовательском режиме

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

После очистки проверить результат просто: метод Количество() должен вернуть 0. Дополнительно можно убедиться, что структура колонок сохранилась — обратиться к ТЗ.Колонки.Количество() и сравнить с ожидаемым числом. Если колонки тоже пропали, значит, где-то таблица была пересоздана, а не очищена.

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

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

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

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

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

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

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

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

Колонки на месте, добавление строк работает без ошибок

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

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

Отображение на форме
Норма

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

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

На форме остались старые строки — очищена копия, а не реквизит формы

Частые вопросы об очистке таблиц значений

Чем Очистить() отличается от присвоения ТЗ = Новый ТаблицаЗначений?

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

Можно ли очистить только значения в одной колонке, оставив строки?

Да. Для этого используют метод ЗаполнитьЗначения(): например, ТЗ.ЗаполнитьЗначения(0, "Сумма") обнулит колонку «Сумма» во всех строках. Чтобы установить пустое значение, передайте Неопределено вместо конкретного значения.

Почему после Очистить() таблица на форме не обновилась?

Скорее всего, вы очистили локальную таблицу значений, а не реквизит формы. Таблица, полученная через РеквизитФормыВЗначение(), — это копия. После изменений её нужно вернуть обратно через ЗначениеВРеквизитФормы(), либо очищать непосредственно реквизит формы.

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

Используйте метод Свернуть(): он группирует строки по указанным колонкам и суммирует числовые. Если суммировать нечего, вызовите Свернуть("Колонка1,Колонка2") без второго параметра — останутся только уникальные комбинации значений.

Освобождает ли Очистить() оперативную память сразу?

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

Можно ли отменить очистку таблицы значений?

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

Итог

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

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