В типовых конфигурациях системы 1С:Предприятие 8.3 разработчики намеренно ограничивают возможность физического удаления данных. По умолчанию пользователям доступна только «Пометка на удаление», которая скрывает объект из списков, но оставляет его в базе до запуска специальной регламентной процедуры. В этой статье мы подробно разберем, как обойти это ограничение, когда требуется мгновенное и полное удаление элемента справочника или документа.
Прежде чем переходить к техническим решениям, проанализируем ситуацию с точки зрения архитектуры базы данных. Платформа 1С строго следит за ссылочной целостностью. Если вы удалите номенклатуру, которая уже фигурирует в десяти накладных, эти документы перестанут корректно открываться, а вместо названия товара в отчетах появится надпись Объект не найден. Именно поэтому стандартное действие по нажатию клавиши Del или Shift+Del часто вызывает предупреждение: «Недостаточно прав доступа».
Рассмотрим классический способ разблокировки команды. Для того чтобы пользователь мог удалять элементы физически прямо из формы списка, у него должно быть специфическое право в его роли.
Разберем по шагам, как предоставить это право:
Интерактивное удаление.Важно: В современных конфигурациях (БП 3.0, УТ 11, ERP) крайне не рекомендуется изменять типовые роли. Вместо этого лучше использовать механизм расширений.
Выясним, как активировать непосредственное удаление, не снимая конфигурацию с поддержки. Начиная с версии платформы 8.3.11, мы можем добавлять собственные роли в расширения.
Рассмотрим алгоритм действий в расширении:
УдалениеОбъектовБезКонтроля.Интерактивное удаление.Этот метод позволяет сохранить возможность автоматического обновления основной конфигурации, при этом решив задачу разблокировки прав.
Иногда нам требуется удалить элемент базы данных программно, игнорируя любые интерактивные запреты. В этом случае мы используем метод Удалить(). Посмотрим на пример кода, который позволяет выполнить эту операцию:
// Получаем объект по ссылке или иным способом
СсылкаНаЭлемент = Справочники.Номенклатура.НайтиПоКоду("00001");
Если Не СсылкаНаЭлемент.Пустая() Тогда
// Получаем объектную сущность для выполнения записи/удаления
ОбъектДляУдаления = СсылкаНаЭлемент.ПолучитьОбъект();
// Выполняем непосредственное удаление из базы данных
Попытка
ОбъектДляУдаления.Удалить();
Сообщить("Элемент успешно удален физически.");
Исключение
Сообщить("Не удалось удалить объект: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
Проанализируем этот код: метод Удалить() срабатывает мгновенно. Он не проверяет, используется ли этот элемент в других документах. Это самый быстрый, но и самый опасный способ, так как он может привести к появлению «битых ссылок».
Если в вашей программе используется Библиотека стандартных подсистем (БСП), мы можем воспользоваться встроенной обработкой «Групповое изменение реквизитов». Рассмотрим, как активировать в ней скрытую функцию удаления:
Доступны служебные реквизиты и Режим разработчика (если доступен).Этот метод позволяет администратору системы быстро очистить справочники без необходимости писать код или менять структуру метаданных в конфигураторе.
Мы должны четко понимать риски. Непосредственное удаление (Direct Delete) отличается от стандартного механизма контроля ссылочной целостности следующими моментами:
Номенклатура.Артикул).Поэтому, прежде чем использовать Shift+Del или метод Удалить(), убедитесь, что вы предварительно выполнили поиск ссылок на данный объект и они отсутствуют.