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

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

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

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

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

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

Что значит «очистить строку»: два разных сценария

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

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

Третий частный случай — очистить вообще все строки таблицы. Для этого существует отдельный метод Очистить(), который удаляет все строки, но сохраняет структуру колонок.

Как обнулить значения в строке, не удаляя её

Если строка должна остаться, а её поля — очиститься, самый прямой способ — присвоить колонкам пустые значения. Для строковых колонок это пустая строка "", для числовых — 0, для ссылочных — Неопределено или пустая ссылка соответствующего типа, для дат — пустая дата '00010101'.

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

// Обнуление полей конкретной строки

Строка = ТаблицаЗначений[0];

Строка.Количество = 0;

Строка.Сумма = 0;

Строка.Комментарий = "";

Строка.Контрагент = Неопределено;

// Очистка нескольких колонок у всех строк одним вызовом

ТаблицаЗначений.ЗаполнитьЗначения(Неопределено, "Контрагент, Договор, Склад");

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

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

Для полного удаления строки используется метод Удалить() коллекции строк. Ему можно передать либо саму строку (объект СтрокаТаблицыЗначений), либо её индекс. Индексация начинается с нуля: первая строка имеет индекс 0.

// Удаление по объекту строки

Строка = ТаблицаЗначений.Найти(КонтрагентИскомый, "Контрагент");

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

ТаблицаЗначений.Удалить(Строка);

КонецЕсли;

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

Если ТаблицаЗначений.Количество() > 0 Тогда

ТаблицаЗначений.Удалить(0);

КонецЕсли;

Перед удалением по индексу обязательно проверяйте, что таблица не пуста и индекс находится в допустимых пределах. Обращение к несуществующему индексу вызывает ошибку выполнения, которая прервёт обработку.

Порядок действий при удалении строки
  1. 1
    Найдите нужную строку методом Найти, НайтиСтроки или перебором
  2. 2
    Проверьте, что строка найдена (результат не равен Неопределено)
  3. 3
    Вызовите ТаблицаЗначений.Удалить(Строка) или Удалить(Индекс)
  4. 4
    Проверьте результат через ТаблицаЗначений.Количество()

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

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

// Удаление всех строк с нулевым количеством

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

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

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

ТаблицаЗначений.Удалить(Строка);

КонецЦикла;

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

// Безопасное удаление в обратном порядке

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

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

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

ТаблицаЗначений.Удалить(Строка);

КонецЕсли;

КонецЦикла;

Типичные ошибки
01
Удаление строк по индексу в прямом цикле — после сдвига индексов часть строк пропускается
02
Удаление без проверки Неопределено после Найти — ошибка выполнения, если строка не найдена
03
Присваивание Неопределено колонке со строгим типом Число — ошибка преобразования значения
04
Вызов Очистить() вместо удаления одной строки — теряются все данные таблицы

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

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

ТаблицаЗначений.Очистить();

// Колонки сохранены, строк нет

Сообщить(ТаблицаЗначений.Количество()); // 0

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

Особенности для таблиц, связанных с формой

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

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

Проверка результата и ограничения

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

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

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

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

Количество строк после удаления
Норма

Уменьшилось ровно на число удалённых строк

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

Не изменилось или уменьшилось больше, чем ожидалось

Колонки после Очистить()
Норма

Структура колонок сохранена

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

Колонки пропали — вероятно, был создан новый объект вместо Очистить()

Поля обнулённой строки
Норма

Числа равны 0, строки пустые, ссылки Неопределено

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

Остались старые значения — очистка применена не к той строке

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

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

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

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

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

Часто задаваемые вопросы

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

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

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

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

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

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

Можно ли восстановить удалённую строку таблицы значений?

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

Как присвоить пустое значение колонке со ссылочным типом?

Используйте Неопределено, если тип колонки это допускает, либо пустую ссылку конкретного типа, например Справочники.Контрагенты.ПустаяСсылка(). Пустая ссылка предпочтительнее, когда дальше по логике проверяется именно заполненность ссылки через ПустаяСтрока или ЗначениеЗаполнено.

Что быстрее для большой таблицы: удаление строк или новый отбор запросом?

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