Как разрешить пользователю без прав администратора удалять помеченные объекты в 1С:Бухгалтерия 3.0?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При работе в современных конфигурациях на базе 1С:Предприятие 8.3, таких как Бухгалтерия предприятия 3.0, Зарплата и управление персоналом или Управление нашей фирмой, многие администраторы и программисты, используя инструменты для проверки прав, сталкиваются с типовой задачей: необходимо дать право на удаление помеченных объектов пользователю, который не обладает полными правами (например, Главному бухгалтеру). Однако обычное добавление роли к обработке УдалениеПомеченныхОбъектов в Конфигураторе часто не приносит результата — программа продолжает выдавать ошибку "Недостаточно прав для выполнения операции".

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

Почему стандартная роль не работает?

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

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


Если Не Пользователи.ЭтоПолноправныйПользователь() Тогда
    ТекстОшибки = НСтр("ru = 'Недостаточно прав для выполнения операции.'");
    Возврат;
КонецЕсли;

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

Решение 1: Использование расширения конфигурации (Рекомендуемый способ)

Самым правильным и безопасным способом решения задачи без изменения типовой конфигурации является использование Расширения. Это позволит нам "обмануть" систему, перехватив проверки прав и выполнив само удаление в привилегированном режиме.

Рассмотрим по шагам, что нужно сделать в расширении:

  1. Добавим в расширение обработку УдалениеПомеченныхОбъектов.
  2. В модуле формы обработки перехватим процедуры ПриСозданииНаСервере и ПриОткрытии. Нам нужно убрать или закомментировать стандартную проверку на полноправного пользователя.
  3. Для того чтобы само удаление прошло успешно, необходимо переопределить серверную функцию в модуле менеджера или соответствующем общем модуле, добавив команду УстановитьПривилегированныйРежим(Истина).

Проанализируем пример кода, который необходимо внедрить в расширение для модуля формы:


&НаСервере
&Вместо("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Вызываем стандартный обработчик, но игнорируем его попытки установить ошибку прав
    ПродолжитьВызов(Отказ, СтандартнаяОбработка);
    
    // Если стандартный код установил текст ошибки из-за прав, очищаем его
    Если ЗначениеЗаполнено(ЭтотОбъект.ТекстОшибкиДоступа) Тогда
        ЭтотОбъект.ТекстОшибкиДоступа = ""; 
    КонецЕсли;
КонецПроцедуры

После этого в модуле менеджера обработки необходимо найти метод, отвечающий за непосредственное удаление (например, УдалитьОбъекты), и обернуть его в привилегированный режим:


&Вместо("УдалитьПомеченныеОбъекты")
Процедура Расш1_УдалитьПомеченныеОбъекты(ПараметрыУдаления)
    УстановитьПривилегированныйРежим(Истина);
    ПродолжитьВызов(ПараметрыУдаления);
КонецПроцедуры

Использование УстановитьПривилегированныйРежим позволяет программе игнорировать проверку прав на конкретные справочники и документы, выполняя операцию от имени системы.

Решение 2: Добавление прав на системные объекты

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

Разберем список объектов, на которые часто требуются дополнительные права:

Также важно помнить про Интерактивное удаление. Для выполнения стандартной обработки пользователю НЕ нужно право Интерактивное удаление на каждый документ (так как обработка программно помечает на удаление или удаляет программно), но ему обязательно нужно право Удаление (программное) для каждого метаданного, которое он собирается очистить. Если объектов в базе сотни, ручная настройка такой роли становится крайне трудоемкой.

Решение 3: Настройка регламентного задания

Рассмотрим альтернативный вариант, который не требует написания сложного кода. В 1С:Бухгалтерии 3.0 существует встроенное регламентное задание "Удаление помеченных объектов".

Посмотрим, как это настроить:

  1. Зайдите под администратором в раздел Администрирование — Обслуживание — Удаление помеченных объектов.
  2. Выберите вариант "Автоматически по расписанию".
  3. Настройте удобное время (например, каждые 15 минут или раз в день).

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

Дополнительные нюансы: История данных

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

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

Резюме

Для того чтобы не-админ смог удалять объекты, мы рекомендуем совместить два подхода: либо использовать регламентное задание (если оперативность удаления не критична), либо создать небольшое расширение, которое переводит процесс удаления в привилегированный режим. Это позволит избежать выдачи пользователю избыточных прав Администрирование системы, которые открывают доступ к Конфигуратору и опасным настройкам базы данных.

← На главную