Администрирование · 10 мин
Как очистить таблицу в 1С: практическое руководство
Как очистить таблицу в 1С: табличную часть документа, таблицу значений, табличный документ и регистр сведений. Примеры кода, проверка результата, типичные ошибки.
Под «очисткой таблицы» в 1С понимают несколько разных задач: удаление строк табличной части документа, сброс таблицы значений в коде, очистка табличного документа на форме или удаление записей регистра. У каждого сценария свой метод и свои риски: где-то достаточно одной строки кода, а где-то ошибка приведёт к потере учётных данных.
Главное правило перед любыми массовыми удалениями — сделать резервную копию информационной базы. Для файловой базы это копирование файла 1Cv8.1CD, для клиент-серверной — выгрузка через конфигуратор (Администрирование → Выгрузить информационную базу) или средствами СУБД. Без копии откатить ошибочную очистку регистра или справочника будет крайне сложно.
Ниже разобраны основные сценарии: работа с табличными частями через интерфейс, программная очистка таблиц значений и табличных частей, очистка табличного документа, а также удаление данных из регистров. Для каждого случая приведены условия применения и способы проверки результата.
Определите, какая именно таблица требует очистки
Прежде чем что-то удалять, важно понять, с каким объектом вы работаете. В 1С словом «таблица» называют как минимум четыре разных сущности: табличную часть объекта (документа или справочника), таблицу значений — временную структуру данных в памяти, табличный документ — область для вывода печатных форм и отчётов, и таблицу регистра в базе данных.
От типа объекта зависит и метод, и последствия. Очистка таблицы значений безопасна — это данные в оперативной памяти. Очистка табличной части изменит конкретный документ. А удаление записей регистра затронет учётные данные и может нарушить отчётность за закрытые периоды.
Очистка через интерфейс или метод Очистить() в коде
Метод Очистить(), данные не хранятся в базе
Метод Очистить() у объекта ТабличныйДокумент
Запись пустого набора записей, требуется копия базы
Как очистить табличную часть документа через интерфейс
Если нужно удалить строки из конкретного документа — например, список товаров в «Поступлении товаров» — проще всего сделать это вручную. Откройте документ, установите курсор на любую строку табличной части, выделите все строки сочетанием Ctrl+A и удалите их клавишей Delete или через контекстное меню «Удалить». После этого запишите документ.
В управляемых формах также доступна кнопка «Ещё» над табличной частью, где может быть команда «Удалить все строки» — её наличие зависит от конфигурации. В типовых решениях такая команда встречается не всегда, поэтому сочетание Ctrl+A с последующим удалением остаётся универсальным способом.
Учтите: если документ уже проведён, очистка табличной части и перепроведение изменят движения по регистрам. Для документов закрытых периодов это может «сломать» сданную отчётность. Проверьте дату запрета изменения данных (Администрирование → Поддержка и обслуживание → Регламентные операции, в типовых конфигурациях — «Даты запрета изменения данных»).
Как очистить таблицу значений или табличную часть программно
Во встроенном языке 1С для очистки коллекций строк используется метод Очистить(). Он удаляет все строки, сохраняя саму колоночную структуру таблицы. Это универсальный метод для таблицы значений, дерева значений и табличной части объекта.
// Очистка таблицы значений
ТаблицаТоваров.Очистить();
// Очистка табличной части документа
ДокументОбъект.Товары.Очистить();
ДокументОбъект.Записать();
// Очистка дерева значений
ДеревоДанных.Строки.Очистить();Обратите внимание на тонкость с табличными частями: метод Очистить() вызывается у объекта документа (ДокументОбъект), а не у ссылки. Если у вас есть только ссылка, сначала получите объект методом ПолучитьОбъект(), затем очистите табличную часть и запишите объект. Без вызова Записать() изменения останутся только в памяти и не попадут в базу.
Для реквизита формы типа «ТаблицаЗначений» или «ДинамическийСписок» логика отличается. Реквизит формы очищается тем же методом Очистить(), но если таблица связана с динамическим списком, очищать её напрямую нельзя — список формируется запросом, и нужно менять сам запрос или отбор.
Как очистить табличный документ
Табличный документ — это объект, в который выводятся отчёты и печатные формы. Чтобы очистить его содержимое программно, используется тот же метод Очистить(). Это типичная операция перед повторным формированием отчёта, чтобы новый результат не добавлялся к старому.
// Очистка табличного документа перед выводом
ТабДок = Новый ТабличныйДокумент;
ТабДок.Очистить();
// Для реквизита формы типа ТабличныйДокумент
РезультатОтчета.Очистить();Если отчёт построен на СКД (системе компоновки данных), вручную очищать табличный документ обычно не требуется — платформа сама заменяет содержимое при повторном формировании. Ручная очистка нужна в собственных процедурах вывода, где результат формируется поэтапно методами Вывести() и Присоединить().
Как удалить записи регистра
Очистка регистра — самая ответственная операция из перечисленных, потому что затрагивает учётные данные. Для регистра сведений или регистра накопления записи удаляются через набор записей: устанавливается отбор (по регистратору или по измерению), и пустой набор записывается с замещением.
// Удаление движений конкретного документа
НаборЗаписей = РегистрыНакопления.ОстаткиТоваров.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(СсылкаНаДокумент);
НаборЗаписей.Записать(Истина); // запись пустого набора удаляет движенияДля полной очистки независимого регистра сведений набор записей создаётся без отбора и записывается пустым. В типовых конфигурациях также есть обработка «Групповое изменение реквизитов» и специализированные сервисные обработки, но прямое удаление записей регистров через них обычно ограничено — это защита от случайной порчи данных.
- 1Сделайте резервную копию базы и проверьте, что она открывается
- 2Определите отбор: весь регистр, конкретный регистратор или измерение
- 3Выполните очистку сначала на копии базы
- 4Проверьте зависимые отчёты и оборотно-сальдовые ведомости
- 5Повторите операцию на рабочей базе в монопольном режиме
- 6Сверьте контрольные итоги до и после операции
Проверка результата и типичные ошибки
После очистки убедитесь, что результат соответствует ожиданиям. Для табличной части — откройте документ и проверьте, что строк нет, а сумма документа обнулилась. Для таблицы значений в коде — проверьте условие Таблица.Количество() = 0. Для регистра — сформируйте отчёт по регистру или универсальный отчёт и убедитесь в отсутствии записей.
Отдельная частая ситуация — попытка удалить строки таблицы значений в цикле «Для Каждого». При удалении текущей строки нумерация смещается, и цикл пропускает элементы. Если нужно удалить не все строки, а выборочно, либо идите по коллекции в обратном порядке, либо соберите строки для удаления в отдельный массив и удаляйте после цикла.
Как проверить результат
Строк нет, итоговая сумма равна нулю, документ записан
Строки остались или документ не записан после очистки
Метод Количество() возвращает 0, колонки сохранены
Ошибка обращения к колонкам — очищена и структура
Отчёт по регистру не показывает удалённые записи, итоги сошлись
Исчезли записи, не входившие в отбор
Область пуста, новый вывод начинается с первой строки
Старые данные остались и новый результат добавился ниже
Частые вопросы
Чем отличается Очистить() от присваивания пустой таблицы?
Метод Очистить() сохраняет структуру колонок и удаляет только строки. Присваивание новой пустой таблицы значений заменяет объект целиком — колонки придётся создавать заново. Для табличной части документа присваивание вообще невозможно, доступен только Очистить().
Можно ли очистить табличную часть сразу у группы документов?
Да, но только программно или через обработку группового изменения: в цикле по выборке ссылок получайте объект, очищайте табличную часть и записывайте. Перед такой операцией обязательно сделайте копию базы и протестируйте обработку на ней, потому что массовое изменение документов влияет на движения по регистрам.
Почему после Очистить() таблицы значений пропали колонки?
Метод Очистить() у таблицы значений удаляет только строки. Если колонки исчезли, скорее всего, был вызван Таблица.Колонки.Очистить() или таблица была пересоздана. Проверьте код на предмет повторного присваивания переменной новой пустой таблицы без описания колонок.
Как очистить регистр сведений, подчинённый регистратору?
Такой регистр очищается набором записей с отбором по регистратору: создайте набор записей менеджером регистра, установите отбор по ссылке документа и запишите пустой набор с параметром Истина. Полностью очистить подчинённый регистр «в один приём» без перебора регистраторов штатно нельзя.
Отменится ли очистка табличной части, если закрыть документ без записи?
Да. Очистка табличной части в открытой форме изменяет данные только в памяти. Если закрыть форму и ответить «Нет» на вопрос о сохранении, строки в базе останутся. В программном сценарии то же правило: без вызова Записать() изменения не фиксируются.
Как удалить не все строки, а только часть по условию?
Используйте отбор: для таблицы значений — метод НайтиСтроки() с параметрами отбора, затем удаляйте найденные строки в отдельном цикле. Для регистра — устанавливайте отбор набора записей по нужным измерениям перед записью пустого набора. Удалять строки прямо в цикле перебора коллекции нельзя из-за смещения индексов.
Что важно запомнить
Для табличных частей, таблиц значений и табличных документов используется метод Очистить(), для регистров — запись пустого набора записей с отбором. Очистка табличной части требует последующей записи объекта, а любые операции с регистрами и массовые изменения документов выполняйте только после создания резервной копии и проверки на тестовой базе.