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

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

Как программно очистить таблицу в 1С

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

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

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

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

Какие таблицы бывают в 1С и чем они отличаются

Прежде чем писать код, нужно понять, с каким именно объектом вы работаете. От этого зависит доступный набор методов и поведение после очистки.

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

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

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

// Объект документа получен для изменения

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

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

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

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

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

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

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

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

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

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

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

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

Полезная проверка после очистки — свойство Количество(): Если ТЗ.Количество() = 0 Тогда .... Так удобно убедиться, что таблица действительно пуста, прежде чем загружать в неё новый набор данных.

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

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

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

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

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

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

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

КонецЦикла;

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

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

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

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

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

КонецЕсли;

КонецЦикла;

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

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

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

&НаКлиенте

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

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

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

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

Очистка данных регистра или справочника целиком

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

// Очистка регистра сведений

НаборЗаписей = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();

НаборЗаписей.Записать(); // пустой набор затирает существующие записи

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

Выборка = Справочники.Номенклатура.Выбрать();

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

ЭлементОбъект = Выборка.ПолучитьОбъект();

ЭлементОбъект.Удалить();

КонецЦикла;

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

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

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

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

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

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

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

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

Метод Количество() возвращает 0

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

Строки остались — вероятно, очистка выполнена не у того объекта

Сохранность данных в базе
Норма

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

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

Данные вернулись — объект не был записан после очистки

Структура таблицы значений
Норма

Колонки на месте, таблица готова к новому заполнению

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

Колонки пропали — был создан новый объект или очищены колонки

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

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

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

Почему после Очистить() данные не пропали из базы?

Метод Очистить() изменяет объект только в памяти. Если вы работаете с объектом документа или справочника, изменения попадут в базу только после вызова Записать(). Без записи при повторном открытии объекта данные окажутся на месте.

Как удалить строки таблицы в цикле, не пропустив часть из них?

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

Можно ли очистить динамический список на форме?

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

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

Нет. Метод удаляет только строки, структура колонок сохраняется. Если нужно убрать и колонки, вызовите отдельно Колонки.Очистить() или создайте новую таблицу значений.

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

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

Итог

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

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