Объект в 1С не удаляется: разбираем причины и способы
Содержание
Объект в 1С почти никогда не удаляется «просто так» — программа сначала проверяет, не ссылается ли на него что-то ещё. Если на справочник, документ или элемент есть хотя бы одна ссылка, стандартная обработка откажется его удалить и покажет список того, что мешает. Это защита от «висячих» ссылок, а не ошибка.
Значит, задача сводится к двум шагам: найти, кто держит объект, и либо убрать эти ссылки, либо убедиться, что объект можно удалять напрямую. Ниже — все рабочие способы удалить то, что не удаляется: от штатной обработки в режиме Предприятия до прямого удаления через код и реструктуризации базы. Платформа — 1С:Предприятие 8.3, интерфейс «Такси».
Почему объект не получается удалить
Причин, по которым объект остаётся в базе, немного, и почти все сводятся к ссылкам.
- 🔗 На объект ссылаются другие данные. Документы, движения регистров, другие справочники. Пока ссылка жива, удаление заблокировано.
- 📌 Это предопределённый элемент. Предопределённые элементы справочников создаются в конфигураторе и защищены от удаления из режима Предприятия.
- 🔒 Объект занят другим сеансом. Пользователь открыл эту же карточку или проводит документ с этим объектом — возникает блокировка.
- ⚙️ Объект нужен механизму конфигурации. Многие элементы входят в состав библиотеки стандартных подсистем (БСП) и используются служебными процедурами.
Разберём, как распознать каждую ситуацию и что с ней делать.
Пометка на удаление и запуск стандартной обработки
Прямого удаления «одной кнопкой» в режиме Предприятия нет — сначала объект помечают на удаление, а потом удаляет отдельная обработка, которая контролирует ссылки.
- Встаньте на нужный элемент или документ в списке.
- Нажмите
Delили в контекстном меню выберите пункт о пометке на удаление. У помеченного объекта появляется перечёркнутый значок. - Запустите обработку:
Администрирование → Обслуживание → Удаление помеченных объектов. В типовых конфигурациях (Бухгалтерия 3.0, ЗУП 3.1, Управление торговлей 11) путь одинаковый; название раздела «Обслуживание» стабильно. - Выберите режим. Автоматический удаляет все помеченные объекты, выборочный — только отмеченные вами в списке. Для разовой задачи удобнее выборочный.
- Нажмите удаление и дождитесь результата.
Если ссылок нет — объект исчезает. Если ссылки есть — обработка не удалит его и покажет таблицу препятствующих объектов. Это и есть ключ к решению.
Отдельно — группы (папки) справочников. Пока в группе лежат элементы, она не удалится: сначала пометьте на удаление её содержимое либо перенесите элементы в другую группу. Обработка не считает группу «пустой», если внутри остался хоть один непомеченный элемент.
Пометка на удаление обратима. Снять её можно тем же пунктом меню, пока объект ещё не удалён обработкой. Поэтому помечать не страшно — реальное удаление происходит только на шаге с обработкой.
Как увидеть, что ссылается на объект
Когда обработка сообщает «обнаружены объекты, препятствующие удалению», она выводит список этих объектов. С ним и работают.
- Дважды щёлкните по строке списка — откроется сам документ или элемент, который держит ссылку.
- Разберитесь, почему ссылка существует: объект выбран в реквизите документа, участвует в движениях регистра, подставлен в другой справочник.
Чтобы собрать все ссылки заранее, не дожидаясь отказа обработки, пригодится отчёт по ссылкам. Встаньте на объект и поищите в его командной панели команду поиска мест использования — она строит список всех объектов, где встречается ссылка.
Чаще всего ссылку держат четыре вида данных:
- Реквизиты документов и справочников — объект выбран в поле карточки.
- Движения регистров — элемент участвует в проводках, остатках, начислениях. Даже если сам документ помечен на удаление, движения снимаются только при его удалении.
- Табличные части — строка документа ссылается на удаляемую номенклатуру, контрагента и т. п.
- Настройки и служебные данные — объект подставлен в учётную политику, настройки пользователя, правила обмена.
Дальше — два пути:
- Убрать ссылку. Если документ ошибочный, пометьте на удаление и его тоже; если нужный — замените в нём значение на другой объект и перепроведите.
- Удалить всё вместе. Пометьте на удаление и объект, и все ссылающиеся на него документы, затем запустите обработку одним заходом — она удалит их в правильном порядке.
Прежде чем помечать на удаление документы, убедитесь, что они не влияют на закрытые периоды и отчётность. Удаление проведённого документа убирает его движения из регистров и меняет итоги.
Блокировки сеансами и монопольный режим
Иногда ссылок нет, а объект всё равно не удаляется — обработка пишет, что не может его заблокировать. Это значит, что объект прямо сейчас занят другим сеансом: кто-то открыл карточку, проводит документ или строит отчёт по этим данным.
Что делать:
- Попросите пользователей закрыть карточки и списки, где виден этот объект.
- Посмотрите активные сеансы:
Администрирование → Обслуживание → Активные пользователи(в файловой базе), либо в консоли администрирования серверной базы. - Если объектов много и удаление массовое — выполняйте его, когда в базе никого нет.
Для большого разового удаления надёжнее монопольный режим: Администрирование → Обслуживание → Блокировка работы пользователей (установка запрета входа) или запуск базы с монопольным доступом.
Перед установкой монопольного режима предупредите пользователей: активные сеансы будут завершены, несохранённые данные потеряются. Делайте это в нерабочее время или по согласованию.
В серверной базе зависшие сеансы, которые держат объект, видны в консоли администрирования кластера. Там же их можно завершить принудительно.
Принудительное завершение сеанса обрывает работу пользователя без сохранения. Сначала попробуйте связаться с человеком, завершайте сеанс только если он явно «висит».
Монопольный режим нужен не всегда: единичный объект обработка удалит и при работающих пользователях, если его никто не держит. Монополия оправдана при массовой чистке, когда объекты связаны цепочками ссылок.
Предопределённые элементы и объекты библиотек
Отдельный случай — предопределённые элементы справочников, планов счетов, планов видов характеристик. Их создаёт конфигуратор, и из режима Предприятия они не удаляются принципиально: обработка сообщит, что элемент предопределённый.
Чтобы удалить такой элемент:
- Откройте конфигуратор.
- Найдите объект метаданных (например, нужный справочник) и его предопределённые данные.
- Удалите предопределённый элемент из списка предопределённых.
- Выполните
Обновление конфигурации базы данных(F7).
После обновления элемент в базе перестаёт быть предопределённым и превращается в обычный — теперь его можно пометить на удаление и удалить штатной обработкой в режиме Предприятия.
В современных платформах у объектов есть свойство режима создания предопределённых данных. Если оно переключено так, что элементы не создаются автоматически, повторного появления удалённого элемента после обновления не будет. Если же режим автоматический, платформа может создать предопределённый элемент заново — тогда сначала меняйте настройку в конфигураторе, а уже потом удаляйте данные.
Похожая логика с объектами, которые входят в библиотеку стандартных подсистем (БСП). Многие служебные справочники и их элементы задействованы в механизмах конфигурации. Удалять их вручную не стоит: даже если убрать ссылки, механизм ожидает эти данные и будет создавать их заново или выдавать ошибку. Если мешает именно элемент БСП, сначала разберитесь, какой механизм его использует, и отключите соответствующую функциональность в настройках, а не удаляйте данные «насквозь».
Удаление через код: прямое удаление и поиск по ссылкам
Когда штатная обработка не подходит — например, удалить нужно тысячи объектов по условию, — применяют код во внешней обработке. Здесь два принципиально разных подхода.
Поиск по ссылкам — безопасный способ. Метод НайтиПоСсылкам возвращает таблицу всех мест, где встречается ссылка. По ней вы решаете, что делать дальше:
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(УдаляемаяСсылка);
ТаблицаСсылок = НайтиПоСсылкам(МассивСсылок);
Если ТаблицаСсылок.Количество() > 0 Тогда
Сообщить("На объект есть ссылки, прямое удаление оставит их битыми");
Иначе
Объект = УдаляемаяСсылка.ПолучитьОбъект();
Объект.Удалить();
КонецЕсли;
Прямое (непосредственное) удаление — метод Удалить() у объекта. Он убирает объект из базы без контроля ссылок. Это быстро, но все ссылки на объект станут «битыми»: в документах останутся ссылки на несуществующий элемент, что ломает отчёты и проведение.
Прямое удаление через Удалить() не проверяет ссылки. Применяйте его только когда точно знаете, что ссылок нет, и обязательно на копии базы перед боевым запуском.
Запрос или консоль запросов используют не для самого удаления, а чтобы отобрать объекты под удаление: выбрать элементы по условию (устаревшие, без движений, с определённым признаком), получить массив ссылок и затем пометить их на удаление пакетно. Само удаление лучше оставить штатной обработке с контролем ссылок.
Чтобы выбрать способ, сравните три варианта:
| Способ | Когда применять | Риск |
|---|---|---|
| Пометка + штатная обработка | Почти всегда, в том числе массово | Минимальный: ссылки контролируются |
НайтиПоСсылкам + анализ | Нужно заранее понять, что мешает | Нет, это только чтение |
Прямое Удалить() | Точно известно, что ссылок нет | Высокий: битые ссылки без контроля |
По умолчанию выбирайте первую строку. Прямое удаление — крайний случай и только на проверенной копии.
Очистка и реструктуризация базы после удаления
Удаление объекта из данных — это одно, а удаление объекта из конфигурации (метаданных) — другое. Если вы убрали из конфигуратора целый реквизит, справочник или документ, в таблицах базы остаются «следы», пока не пройдёт реструктуризация.
- После удаления объекта метаданных в конфигураторе выполните
Обновление конфигурации базы данных(F7) — платформа перестроит таблицы. - Если после этого остаются сомнения в целостности, запустите
Администрирование → Тестирование и исправлениев конфигураторе. Там доступны реструктуризация таблиц, пересчёт итогов и проверка логической целостности. - Для проверки физической целостности файловой базы есть утилита
chdbfl.exeиз каталога платформы. Её запускают по закрытой базе.
Реструктуризация и тестирование требуют монопольного доступа и могут идти долго на большой базе. Сначала резервная копия, потом запуск в нерабочее время.
Массовое удаление помеченных объектов тоже стоит завершать пересчётом итогов регистров: после чистки документов итоги могут разойтись с движениями.
Если удаление делали прямым методом без контроля ссылок, отдельно проверьте базу на «битые» ссылки. Симптом — в документах или отчётах появляется пустое значение вместо объекта либо текст вида «ссылка на несуществующий объект». В типовых конфигурациях на основе БСП для этого есть служебная обработка поиска некорректных ссылок; найденные ссылки либо очищают, либо заменяют на действующий объект.
Распределённые базы и права на удаление
В распределённой информационной базе (РИБ) удаление помеченных объектов выполняют только в главном узле. Удаление, сделанное там, уходит в периферийные узлы штатным обменом. Если удалять в периферийном узле самостоятельно, объект вернётся при следующей синхронизации или появятся расхождения между узлами.
Порядок для РИБ:
- Пометьте и удалите объекты в главном узле.
- Выполните обмен данными, чтобы изменения разошлись по периферии.
- Проверьте, что в периферийных узлах объект исчез.
По правам: удаление помеченных объектов — операция администратора. Обычному пользователю обработка удаления, как правило, недоступна. Интерактивное удаление (прямое, минуя обработку) включается отдельным правом в роли и по умолчанию отключено — это сделано намеренно, чтобы рядовой пользователь не оставлял битых ссылок. Не раздавайте это право всем: оставьте удаление за администратором или ответственным специалистом.
Частые вопросы
Можно ли вернуть объект после удаления?
Почему объект удалился, но ссылки на него остались в документах?
Удалить() без контроля ссылок. Штатная обработка такого не допускает — она либо удаляет вместе со ссылками, либо отказывает. Восстанавливайте из копии и повторяйте удаление штатным способом.