При разработке или доработке конфигураций на базе Библиотеки стандартных подсистем (БСП) программисты часто сталкиваются с ситуацией, когда при попытке удаления элемента справочника или документа система выдает сообщение «Ошибка прав доступа». Это происходит даже в тех случаях, когда у пользователя, казалось бы, есть все необходимые права на сам объект. В этой статье мы подробно разберем причины такого поведения платформы, проанализируем роль технических регистров БСП и найдем способы корректного решения проблемы как для интерактивного, так и для программного удаления.
Первое, что нам необходимо сделать — это понять, как 1С:Предприятие работает со ссылочной целостностью на уровне платформы. Основная причина ошибки кроется не в самом справочнике, а в связанных с ним объектах. Рассмотрим подробнее свойство «Ведущее» у измерений регистров (сведений, накопления, расчета).
Если в каком-либо регистре измерение помечено как Ведущее, это накладывает на платформу жесткое обязательство: запись в этом регистре не может существовать «в пустоте» без объекта, на который она ссылается. Следовательно, при удалении основного объекта (например, контрагента) платформа автоматически пытается удалить все записи во всех регистрах, где этот контрагент указан как ведущее измерение. Для выполнения этой операции пользователю требуются права на удаление записей в этих зависимых регистрах.
Проанализируем ситуацию: в БСП «под капотом» работает огромное количество подсистем. Когда вы добавляете БСП в свою конфигурацию, многие справочники и документы автоматически становятся «владельцами» данных в системных регистрах. Если у рядового пользователя есть права на удаление справочника, но нет прав на удаление записей в техническом регистре БСП (например, в регистре сведений ДополнительныеСведения), система прервет операцию с ошибкой прав доступа.
Выясним, какие именно регистры чаще всего блокируют удаление объектов. При полной интеграции БСП ссылки на ваши объекты могут попадать в следующие регистры, где измерения часто настроены как ведущие:
Если вы столкнулись с ошибкой, первым делом загляните в Журнал регистрации. Отфильтруйте события по статусу «Отказ в доступе». Там будет четко указано имя регистра, на который не хватило прав.
Если ваша задача — программная очистка справочников или документов в коде (например, в рамках какой-то обработки), самым правильным и безопасным методом будет использование привилегированного режима. Это позволит системе игнорировать проверку прав на технические регистры БСП, к которым у обычного пользователя не должно быть прямого доступа.
Рассмотрим пример кода для корректного удаления объекта:
Процедура УдалитьОбъектПрограммно(СсылкаНаОбъект) Экспорт
// Включаем привилегированный режим, чтобы обойти ограничения прав
// на технические регистры БСП (версионирование, доп. сведения и др.)
УстановитьПривилегированныйРежим(Истина);
ОбъектДляУдаления = СсылкаНаОбъект.ПолучитьОбъект();
Если ОбъектДляУдаления <> Неопределено Тогда
Попытка
// Выполняем непосредственное удаление
ОбъектДляУдаления.Удалить();
Исключение
ЗаписатьЛогОшибки("Не удалось удалить объект: " + ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
// Возвращаем обычный режим проверки прав
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Важный момент: если код выполняется в модуле с установленным признаком Привилегированный, вызывать УстановитьПривилегированныйРежим не обязательно, так как весь код модуля уже выполняется с полными правами. Это стандартная практика БСП — выносить операции удаления в серверные привилегированные модули.
Если удаление должно происходить интерактивно (хотя в БСП это не приветствуется), или если вы не хотите использовать привилегированный режим, необходимо добавить пользователям соответствующие права. Посмотрим, какие стандартные роли БСП могут помочь решить проблему:
ДополнительныеСведения.Однако помните: давать пользователям прямые права на удаление записей в системных регистрах БСП — это риск нарушить целостность данных системы. Поэтому лучшим решением для интерактивной работы остается стандартный механизм «Пометка на удаление».
Проанализируем концепцию БСП. Большинство типовых конфигураций (ЕРП, УТ, КА) намеренно отключают право «Интерактивное удаление» (Shift+Del) для всех пользователей. Это «фича», а не баг. Система предполагает следующий сценарий:
1. Пользователь ставит пометку на удаление на справочник или документ (на это действие обычно прав достаточно).
2. Ответственное лицо (или регламентное задание) запускает типовую обработку «Удаление помеченных объектов».
3. Эта обработка работает в привилегированном режиме, проверяет все бизнес-ссылки и корректно вычищает объект вместе со всеми «хвостами» в регистрах БСП.
Если вы создаете самописную конфигурацию с БСП, мы рекомендуем придерживаться именно этой логики. Если же заказчик настаивает на мгновенном удалении кнопкой, используйте обертку в коде с УстановитьПривилегированныйРежим(Истина), как было показано выше.
Подведем итоги нашего исследования. Если при удалении возникает ошибка прав доступа в конфигурации с БСП, выполните следующие шаги:
РегистрСведений ругается система.УстановитьПривилегированныйРежим(Истина) перед вызовом метода Удалить().Такой подход позволит вам сохранить стабильность системы и избежать конфликтов с механизмами Библиотеки стандартных подсистем, обеспечивая при этом корректную работу пользователей.