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