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

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

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

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

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

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

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

Очистка всех строк таблицы значений методом Очистить()

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

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

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

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

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

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

Сообщить(ТЗ.Количество()); // выведет 0

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

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

Удаление отдельных строк и строк по условию

Когда нужно удалить не всё, а только часть данных, применяются методы Удалить() и НайтиСтроки(). Метод Удалить() принимает либо конкретную строку, либо её индекс:

// Удаление первой строки по индексу

ТЗ.Удалить(0);

// Удаление конкретной строки-объекта

Строка = ТЗ[5];

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

Для удаления строк по условию сначала отбирают их через НайтиСтроки(), а затем удаляют в цикле:

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

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

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

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

КонецЦикла;

Здесь есть важная ловушка: нельзя удалять строки, перебирая саму таблицу в цикле Для Каждого — индексы сдвигаются, и часть строк будет пропущена. Безопасные варианты — удалять через массив, полученный из НайтиСтроки(), либо идти по таблице с конца к началу по индексам.

Удаление строк циклом с конца

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

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

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

Если Строка.Сумма < 0 Тогда

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

КонецЕсли;

КонецЦикла;

При движении с конца удаление текущей строки не влияет на позиции ещё не проверенных строк, поэтому пропусков не возникает.

Удаление колонок таблицы значений

Структуру таблицы изменяет коллекция Колонки. Удалить колонку можно по объекту колонки или по индексу:

// По имени через поиск объекта колонки

Колонка = ТЗ.Колонки.Найти("ВременнаяКолонка");

Если Колонка <> Неопределено Тогда

ТЗ.Колонки.Удалить(Колонка);

КонецЕсли;

// По индексу

ТЗ.Колонки.Удалить(0);

Удаление колонки уничтожает и все данные в ней по каждой строке — восстановить их нельзя. Если колонка с таким именем не существует, метод Найти() вернёт Неопределено, поэтому перед удалением по объекту стоит делать проверку, как в примере выше. Попытка удалить колонку по несуществующему имени напрямую через ТЗ.Колонки.Удалить(ТЗ.Колонки.ИмяКолонки) приведёт к ошибке обращения к свойству Неопределено.

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

Если таблица значений больше не нужна вообще, достаточно присвоить переменной значение Неопределено:

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

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

Отдельный случай — таблица значений, хранящаяся в реквизите формы. Такая таблица живёт, пока открыта форма. Чтобы «удалить» её данные, используют тот же Очистить(), обращаясь к реквизиту: Объект.ТаблицаНаФорме.Очистить() или через ЭтаФорма["ИмяРеквизита"]. Полностью удалить сам реквизит программно можно только через ИзменитьРеквизиты() формы, но это требуется редко.

Порядок действий
  1. 1
    Определите цель: очистить данные, удалить часть строк, убрать колонку или уничтожить объект целиком.
  2. 2
    Для очистки данных вызовите ТЗ.Очистить().
  3. 3
    Для удаления по условию соберите строки через НайтиСтроки() и удалите в цикле.
  4. 4
    Для удаления колонки найдите её через Колонки.Найти() и вызовите Колонки.Удалить().
  5. 5
    Для полного удаления присвойте переменной Неопределено.
  6. 6
    Проверьте результат: ТЗ.Количество() для строк и ТЗ.Колонки.Найти() для структуры.

Не путайте: таблица значений и табличная часть объекта

Частая причина путаницы у начинающих — попытка «удалить таблицу значений» там, где на самом деле работа идёт с табличной частью документа или справочника. Табличная часть хранится в базе данных вместе с объектом, и её очистка означает реальное изменение данных:

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

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

ДокументОбъект.Записать(); // только теперь изменения попадут в базу

Здесь критичны две вещи. Во-первых, без вызова Записать() очистка останется только в памяти и не затронет базу. Во-вторых, очистка табличной части с записью — необратимая операция над реальными данными: удалённые строки документа восстановить штатными средствами нельзя, только из резервной копии. Перед массовой обработкой документов убедитесь, что копия базы существует.

Проверка результата и типичные ошибки

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

Типичные ошибки
01
Удаление строк в цикле перебора самой таблицы — часть строк пропускается из-за сдвига индексов.
02
Ожидание, что Очистить() удалит колонки — метод удаляет только строки, структура сохраняется.
03
Обращение к удалённой колонке по имени — возникает ошибка «Поле объекта не обнаружено».
04
Очистка табличной части без Записать() — данные в базе не меняются, разработчик считает операцию выполненной.
05
Удаление колонки без проверки Найти() — ошибка при отсутствии колонки с таким именем.
Контрольные точки

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

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

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

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

Возвращает прежнее число — метод не вызван или вызван у другой переменной

Наличие удалённой колонки
Норма

ТЗ.Колонки.Найти("Имя") возвращает Неопределено

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

Возвращает объект колонки — удаление не выполнено

Табличная часть документа в базе
Норма

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

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

Строки на месте — забыт вызов Записать()

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

Итог

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

Таблица значений существует только в памяти. Очистить строки — ТЗ.Очистить(), удалить по условию — НайтиСтроки() плюс цикл Удалить(), убрать колонку — Колонки.Удалить(), уничтожить объект — присвоить Неопределено. Табличную часть объекта после очистки обязательно записывайте, предварительно сделав копию базы.

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

Можно ли удалить таблицу значений из базы данных 1С?

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

Чем отличается Очистить() от присвоения Неопределено?

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

Как удалить все строки, где колонка пустая?

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

Освобождает ли память метод Очистить() для большой таблицы?

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

Как очистить таблицу значений на управляемой форме?

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

Почему после удаления строк в цикле остались лишние записи?

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