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