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