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

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

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

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

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

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

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

Что такое табличная часть и когда требуется её очистка

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

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

Полная очистка табличной части методом Очистить()

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

// Очистка табличной части "Товары" документа

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

// Очистка ТЧ у ссылки через объект

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

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

ДокОбъект.Записать();

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

Для документов учитывайте режим записи: если документ проведён, вызов Записать() без параметров может завершиться ошибкой блокировки движений. В таком случае используйте Записать(РежимЗаписиДокумента.Проведение) или сначала отмените проведение, если бизнес-логика это допускает.

Порядок полной очистки ТЧ документа
  1. 1
    Получите объект документа из ссылки: ДокОбъект = Ссылка.ПолучитьОбъект()
  2. 2
    Вызовите ДокОбъект.ИмяТабличнойЧасти.Очистить()
  3. 3
    Запишите объект: ДокОбъект.Записать() с нужным режимом записи
  4. 4
    Проверьте результат: откройте документ и убедитесь, что строк нет

Очистка табличной части в управляемой форме

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

&НаКлиенте

Процедура ОчиститьТовары(Команда)

Если Объект.Товары.Количество() = 0 Тогда

Возврат;

КонецЕсли;

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

Модифицированность = Истина;

КонецПроцедуры

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

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

Выборочное удаление строк табличной части

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

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

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

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

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

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

КонецЦикла;

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

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

Если по какой-то причине нужен именно цикл по индексам, обходите коллекцию в обратном порядке — от последней строки к первой. Тогда удаление не влияет на индексы ещё не обработанных элементов:

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

Строка = Объект.Товары[-Индекс];

Если Строка.Пометить Тогда

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

КонецЕсли;

КонецЦикла;

Типичные ошибки при очистке ТЧ
01
Удаление строк в прямом цикле «Для Каждого» — часть строк пропускается из-за смещения индексов
02
Вызов Очистить() у объекта-ссылки без последующего Записать() — изменения не попадают в базу
03
Очистка ТЧ на клиенте без установки Модифицированности — документ закрывается без сохранения
04
Использование Очистить() вместо выборочного удаления — теряются строки, которые нужно было сохранить

Очистка таблицы значений и динамического списка

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

// Таблица значений — реквизит формы

ТаблицаДанных.Очистить();

// Загрузка пустой таблицы — альтернативный способ

ТаблицаДанных.Загрузить(Новый ТаблицаЗначений);

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

Массовая очистка табличных частей в группе документов

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Реализация.Ссылка

|ИЗ

| Документ.РеализацияТоваровУслуг КАК Реализация

|ГДЕ

| НЕ Реализация.Проведен

| И Реализация.Дата < &ДатаОтсечки";

Запрос.УстановитьПараметр("ДатаОтсечки", ДатаОтсечки);

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

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

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

ДокОбъект.Записать();

КонецЦикла;

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

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

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

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

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

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

Объект.Товары.Количество() = 0

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

Строки остались — метод вызван не у той коллекции или объект не тот

Данные в базе после записи
Норма

Перечитанный документ содержит пустую ТЧ

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

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

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

Суммы обнулены или пересчитаны

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

Итоги показывают старые значения — не сработал пересчёт

Если после очистки итоговые реквизиты шапки (например, «СуммаДокумента») не обновились, добавьте в код явный пересчёт: либо вызов экспортной процедуры пересчёта из модуля объекта, либо присвоение Объект.СуммаДокумента = Объект.Товары.Итог("Сумма"). В типовых конфигурациях пересчёт часто выполняется в обработчиках формы, которые не срабатывают при программной очистке.

Итог

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

Полная очистка выполняется методом Очистить(), выборочная — через НайтиСтроки() с Удалить() или обратным циклом. При работе со ссылкой всегда вызывайте Записать(), на форме — устанавливайте Модифицированность. Запросом очистить ТЧ нельзя, а массовую обработку выполняйте с контролем блокировок и резервной копией.

Частые вопросы по очистке табличных частей

Можно ли очистить табличную часть запросом, как в SQL?

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

Почему после Очистить() и Записать() строки снова появляются?

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

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

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

Чем отличается Очистить() от Удалить()?

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

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

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

Безопасно ли очищать ТЧ проведённого документа?

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