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

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

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

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

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

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

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

Различие между очисткой значений и удалением строки

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

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

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

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

СтрокаТЧ = Объект.Товары[0];

СтрокаТЧ.Номенклатура = Неопределено;

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

СтрокаТЧ.Цена = 0;

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

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

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

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

Для удаления конкретной строки у табличной части есть метод Удалить(). Он принимает либо саму строку, либо её индекс (нумерация начинается с нуля):

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

ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;

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

Объект.Товары.Удалить(ТекущаяСтрока);

КонецЕсли;

// Удаление по индексу

Объект.Товары.Удалить(0); // удалит первую строку

На управляемой форме текущую строку удобно получать через свойство ТекущиеДанные элемента формы, связанного с табличной частью. Перед удалением всегда проверяйте, что строка действительно выбрана, иначе метод вызовет ошибку обращения к Неопределено.

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

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

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

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

Безопасных подхода два. Первый — обход с конца коллекции по индексу:

Для Индекс = 1 - Объект.Товары.Количество() По 0 Цикл

Инд = -Индекс;

Если Объект.Товары[Инд].Количество = 0 Тогда

Объект.Товары.Удалить(Инд);

КонецЕсли;

КонецЦикла;

Второй, более читаемый вариант — сначала собрать строки-кандидаты в массив через НайтиСтроки(), а затем удалить их отдельным циклом:

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

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

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

Объект.Товары.Удалить(Строка);

КонецЦикла;

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

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

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

Если нужно удалить все строки, используется метод Очистить():

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

Метод работает и на клиенте, и на сервере, не требует обхода коллекции и выполняется быстро. После вызова табличная часть пуста, функция Количество() возвращает 0. В модуле объекта (например, в обработчике ПередЗаписью) обращение идёт напрямую к табличной части: Товары.Очистить();.

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

Особенности для управляемых и обычных форм

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

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

После программного удаления строк на управляемой форме интерфейс обновляется автоматически, но признак модифицированности документа стоит установить явно — Модифицированность = Истина; — чтобы платформа предложила сохранить изменения при закрытии формы.

Проверка результата и смежные задачи

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

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

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

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

Объект.Товары.Количество() вернуло ожидаемое число

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

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

Итоговые суммы документа
Норма

Итоги пересчитаны и совпадают с суммой по оставшимся строкам

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

Итоги устарели и не соответствуют содержимому табличной части

Проведение документа
Норма

Документ проводится без ошибок, движения соответствуют строкам

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

Ошибки проведения или движения по удалённым позициям

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

Ещё один вариант — замена содержимого строки копированием из другой строки через ЗаполнитьЗначенияСвойств() или методом табличной части. Это удобно при реализации команд «Дублировать строку» или «Заполнить по образцу».

Сравнение подходов

Обнуление реквизитов строки

Подходит, когда строка нужна как заготовка для повторного заполнения; итоги и нумерация не меняются

Удалить(Строка) / Удалить(Индекс)

Для точечного исключения позиции; требует аккуратности с индексами при групповом удалении

НайтиСтроки() + удаление по массиву

Оптимально для удаления по условию; код устойчив и читаем, чуть больше памяти на массив

Очистить()

Для полного сброса табличной части; не подходит, если нужно сохранить хотя бы одну строку

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

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

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

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

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

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

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

Чем отличается Очистить() от удаления всех строк в цикле?

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

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

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

Нужно ли перепроводить документ после программного удаления строк?

Да, если документ проведён. Удаление строк меняет табличную часть, но движения по регистрам обновятся только при перепроведении. До перепроведения в отчётах и остатках будут старые данные, что может исказить учёт.

Итог

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

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