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

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

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

Как программно удалить элементы справочника в 1С: пометка на удаление, прямое удаление, методы Удалить() и УстановитьПометкуУдаления, примеры кода и проверка ссылок.

Программное удаление данных из справочника — типовая задача при чистке базы, отладке обменов и откате ошибочных загрузок. Важно сразу разделить два сценария: удалить отдельные элементы справочника (записи) или удалить сам объект метаданных «Справочник» из конфигурации. Это принципиально разные операции с разными последствиями.

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

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

Что именно нужно удалить: элементы или сам справочник

Под фразой «удалить справочник» чаще всего скрывается одна из трёх задач: очистить справочник от всех элементов, удалить конкретные элементы по отбору или полностью убрать объект метаданных из конфигурации. От выбора зависит инструментарий.

Очистка и точечное удаление элементов выполняются кодом на встроенном языке — в обработке, консоли кода или регламентном задании. Удаление объекта метаданных доступно только разработчику в конфигураторе: платформа не позволяет из прикладного кода удалять таблицы данных, потому что это меняет структуру базы.

Маршрут решения

Как выбрать действие

Нужно удалить часть элементов справочникаИспользуйте пометку на удаление и штатную обработку удаления помеченных объектов
Нужно полностью очистить справочник без проверки ссылокПереберите элементы выборкой и вызовите Удалить() у каждого объекта
Нужно убрать сам справочник из конфигурацииУдалите объект в конфигураторе и обновите конфигурацию базы данных, предварительно очистив ссылки

Безопасный способ: пометка на удаление

Рекомендуемый механизм — установка пометки удаления. Платформа при этом не стирает данные физически, а лишь отмечает их, что позволяет отменить операцию и выполняет штатную проверку ссылочной целостности при окончательном удалении.

Элемент помечается через объект справочника: получаем ссылку, преобразуем её в объект методом ПолучитьОбъект(), вызываем УстановитьПометкуУдаления(Истина). После этого элемент исключается из большинства стандартных выборок, но физически остаётся в базе.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.ПометкаУдаления = ЛОЖЬ

| И Номенклатура.ЭтоГруппа = ЛОЖЬ";

Выборка = Запрос.Выполнить().Выбрать();

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

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

ОбъектЭлемента.УстановитьПометкуУдаления(Истина);

КонецЦикла;

После пометки запустите штатную обработку «Удаление помеченных объектов» (раздел «Администрирование» в типовых конфигурациях). Она проверит, где используются помеченные элементы, и удалит только те, на которые нет ссылок. Объекты со ссылками останутся помеченными — сначала нужно заменить или удалить ссылающиеся данные.

Порядок безопасного удаления
  1. 1
    Сделайте резервную копию базы или выгрузку в dt
  2. 2
    Пометьте нужные элементы методом УстановитьПометкуУдаления(Истина)
  3. 3
    Запустите обработку «Удаление помеченных объектов» в монопольном режиме
  4. 4
    Проверьте список объектов, которые не удалось удалить из-за ссылок
  5. 5
    Очистите или замените ссылки и повторите удаление

Прямое удаление элементов методом Удалить()

Метод Удалить() у объекта справочника стирает запись физически, минуя пометку. Платформа при этом не выполняет контроль ссылочной целостности в прикладном коде: если на элемент есть ссылки из документов или регистров, в них останутся «битые» ссылки вида «Объект не найден».

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

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

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

Если Выборка.ЭтоГруппа Тогда

Продолжить;

КонецЕсли;

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

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

КонецЦикла;

Для больших объёмов выполняйте удаление порциями внутри транзакций или с промежуточной фиксацией, чтобы не получить длинную блокировку таблицы и переполнение журнала транзакций на клиент-серверном варианте. Удаление десятков тысяч элементов одной транзакцией может надолго заблокировать работу пользователей.

Проверка ссылок перед удалением

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

МассивСсылок = Новый Массив;

МассивСсылок.Добавить(УдаляемаяСсылка);

ТаблицаСсылок = НайтиПоСсылкам(МассивСсылок);

Если ТаблицаСсылок.Количество() = 0 Тогда

ОбъектЭлемента = УдаляемаяСсылка.ПолучитьОбъект();

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

Иначе

Сообщить("На объект есть ссылки: " + ТаблицаСсылок.Количество());

КонецЕсли;

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

Удаление справочника как объекта метаданных

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

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

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

Типичные ошибки и ограничения

Частая ошибка — попытка удалить предопределённый элемент. Такие элементы связаны с кодом конфигурации по имени, и их удаление (даже пометка) ломает обращения вида Справочники.Валюты.USD. Удалять предопределённые элементы можно только после снятия соответствующего признака в конфигураторе.

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

Типичные ошибки
01
Прямое удаление без проверки ссылок — битые ссылки «Объект не найден» в документах и отчётах
02
Удаление предопределённых элементов — ошибки обращения к ним из кода конфигурации
03
Удаление всех элементов одной транзакцией — длительные блокировки и рост журнала транзакций
04
Удаление объекта метаданных без очистки ссылок в других объектах — отказ обновления конфигурации базы
05
Работа без резервной копии — невозможность отката при ошибке в условии отбора

Проверка результата после удаления

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

Для файловой базы после массового удаления полезно выполнить тестирование и исправление с реструктуризацией — это сожмёт файл и уберёт «пустоты» от удалённых записей. На клиент-серверном варианте аналогичную роль выполняют средства СУБД.

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

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

Количество элементов справочника
Норма

Запрос возвращает 0 или ожидаемый остаток

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

Элементы остались, хотя обработка завершилась без ошибок

Ссылки на удалённые элементы
Норма

НайтиПоСсылкам() возвращает пустую таблицу

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

В документах появились записи «Объект не найден»

Предопределённые элементы
Норма

На месте, доступны из кода

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

Ошибки при обращении по имени из модулей

Работа отчётов и проведение документов
Норма

Отчёты формируются, документы проводятся

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

Ошибки при обращении к удалённым данным

Если обнаружились битые ссылки после прямого удаления, восстановить данные можно только из резервной копии либо пересозданием элементов с теми же GUID через COM-обмен или загрузку из XML. Поэтому резервная копия перед массовыми операциями — не формальность, а обязательное условие.

Итог

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

Элементы справочника удаляйте через пометку и штатную обработку — это безопасный путь с контролем ссылок. Прямое Удалить() применяйте только при гарантированном отсутствии ссылок и наличии резервной копии. Сам справочник как объект метаданных удаляется в конфигураторе после очистки всех ссылок на него.

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

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

Нет. Встроенный язык не позволяет удалять объекты метаданных — только данные (элементы справочника). Удаление самого справочника выполняется в конфигураторе с последующим обновлением конфигурации базы данных.

Чем пометка на удаление лучше прямого удаления?

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

Почему обработка не удалила помеченные элементы?

На элементы есть ссылки из других объектов: документов, регистров, других справочников. Обработка выводит список таких мест использования — нужно либо удалить/заменить ссылающиеся данные, либо оставить элемент помеченным.

Как удалить предопределённый элемент справочника?

Штатно предопределённые элементы не удаляются, так как на них ссылается код конфигурации. Если элемент больше не нужен, сначала в конфигураторе уберите его из списка предопределённых, обновите конфигурацию — после этого элемент станет обычным и его можно удалить.

Как быстро очистить большой справочник в клиент-серверной базе?

Разбейте удаление на порции по несколько тысяч элементов с фиксацией транзакции между порциями, выполняйте операцию в нерабочее время и отключите на этот период регламентные задания, обращающиеся к справочнику. Это снизит блокировки и нагрузку на журнал транзакций СУБД.

Восстановятся ли данные после прямого удаления?

Нет, метод Удалить() стирает запись физически. Восстановление возможно только из резервной копии базы или путём повторной загрузки данных из источника (обмена, файла) с сохранением исходных уникальных идентификаторов.