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