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