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