Как дать пользователю право удалить один документ в 1С без полных прав администратора?

Программист 1С v8.3 (Управляемые формы) Сфера услуг, туризм и социальный сектор
← К списку

Мы часто сталкиваемся с ситуацией, когда пользователю требуется выполнить специфическое действие в системе 1С:Предприятие, например, удалить конкретный документ, но при этом мы не хотим предоставлять ему полные права администратора. Это очень правильный подход к управлению доступом, поскольку выдача избыточных прав может привести к серьезным проблемам с целостностью данных и безопасностью. Давайте вместе разберем, как грамотно подойти к решению этой задачи, минимизируя риски.

Почему нельзя давать пользователю прямые права на удаление?

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

  1. Пометка на удаление. Пользователи могут пометить документ на удаление, нажав клавишу `Delete` или выбрав соответствующую команду. Это действие не удаляет документ фактически, а лишь устанавливает специальную пометку.
  2. Физическое удаление. Непосредственное удаление помеченных объектов — это необратимая операция. Система контролирует ссылочную целостность, то есть не позволит удалить объект, если на него есть ссылки в других объектах базы данных, пока эти ссылки не будут устранены или заменены.

Исходя из этого, мы рекомендуем использовать стандартные механизмы, которые уже предусмотрены в системе.

Решение 1: Рекомендуемый подход – Пометка на удаление и регламентное задание

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

  1. Предоставляем пользователю право на пометку.

    Убедимся, что у пользователя есть право на "Интерактивная пометка на удаление" для нужного вида документов. Это позволит ему установить пометку, не удаляя документ физически.

    Для установки пометки на удаление пользователь может открыть документ и нажать соответствующую кнопку или выбрать команду "Пометить на удаление / Снять пометку" в контекстном меню списка документов.

  2. Настраиваем автоматическое удаление помеченных объектов.

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

    Для этого администратор должен настроить регламентное задание, которое будет запускать обработку "Удаление помеченных объектов". Как правило, эта обработка уже включена в состав конфигурации и доступна через раздел "Администрирование".

    Рассмотрим, как это работает:

    1. Пользователь помечает документ на удаление.
    2. Через определенный интервал (например, раз в день, ночью), срабатывает регламентное задание.
    3. Это регламентное задание запускает серверную процедуру, которая выполняет физическое удаление всех помеченных объектов, прошедших проверку ссылочной целостности.

    Преимущества этого подхода:

    • Безопасность. Пользователь не имеет прямых прав на физическое удаление, что исключает случайные или злонамеренные действия.
    • Целостность данных. Удаление происходит под контролем системы, которая проверяет ссылочную целостность, предотвращая появление "битых" ссылок.
    • Автоматизация. Рутинная задача по очистке базы от помеченных объектов выполняется автоматически.
    • Аудит. Все действия по пометке и удалению логируются, что позволяет отслеживать изменения.

    Мы настоятельно рекомендуем использовать именно этот метод, так как он обеспечивает максимальную надежность и безопасность вашей информационной базы.

Решение 2: Удаление через привилегированный режим (для специфических задач)

В некоторых очень редких и специфических случаях, когда стандартный двухэтапный процесс по каким-то причинам неприемлем, и требуется, чтобы пользователь инициировал физическое удаление документа "здесь и сейчас", мы можем рассмотреть использование привилегированного режима. Однако, сразу отметим, что этот подход требует очень осторожного применения и глубокого понимания принципов работы 1С.

Что такое привилегированный режим?

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

Как использовать привилегированный режим?

Существует несколько способов использования привилегированного режима:

  1. Метод УстановитьПривилегированныйРежим().

    В серверном коде мы можем временно включить привилегированный режим перед выполнением операции и отключить его после. Этот метод применим только на сервере.

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

    
    // В серверной процедуре
    УстановитьПривилегированныйРежим(Истина); // Включаем привилегированный режим
    
    Попытка
        ОбъектДокумента = Документы.МойДокумент.ПолучитьОбъект(СсылкаНаДокумент);
        Если ОбъектДокумента <> Неопределено Тогда
            ОбъектДокумента.Удалить(); // Выполняем удаление
        КонецЕсли;
    Исключение
        // Обработка ошибок
    КонецПопытки;
    
    УстановитьПривилегированныйРежим(Ложь); // Отключаем привилегированный режим
    
  2. Привилегированные общие модули.

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

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

Безопасность при использовании привилегированного режима

Использование привилегированного режима должно быть логически обосновано и тщательно контролироваться, чтобы избежать потенциальных уязвимостей безопасности. * Минимизация кода. В привилегированном режиме должен выполняться только тот код, который действительно требует повышенных прав. * Проверка параметров. Все входные параметры, передаваемые в привилегированный код, должны быть тщательно проверены, чтобы избежать "инъекций" и несанкционированных действий. * Логирование. Все действия, выполненные в привилегированном режиме, должны быть залогированы для целей аудита.

Пример реализации с привилегированным режимом

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

  1. Создадим новую "Команду формы", например, с именем `УдалитьВыбранныйДокумент`.

  2. В обработчике команды на клиенте вызовем серверную процедуру:

    
    &НаКлиенте
    Процедура УдалитьВыбранныйДокумент(Команда)
        Если Вопрос("Вы уверены, что хотите удалить выбранный документ?", РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да Тогда
            // Получаем текущий выбранный документ в списке
            Если Элементы.Список.ТекущаяСтрока <> Неопределено Тогда
                СсылкаДокумента = Элементы.Список.ТекущаяСтрока;
                УдалитьДокументНаСервере(СсылкаДокумента);
            КонецЕсли;
        КонецЕсли;
    КонецПроцедуры
    
  3. Создадим серверную процедуру в модуле формы или в привилегированном общем модуле:

    Вариант 1: В модуле формы (с явным включением привилегированного режима)

    
    &НаСервере
    Процедура УдалитьДокументНаСервере(СсылкаДокумента)
        УстановитьПривилегированныйРежим(Истина); // Включаем привилегированный режим
    
        Попытка
            ОбъектДокумента = СсылкаДокумента.ПолучитьОбъект();
            Если ОбъектДокумента <> Неопределено Тогда
                ОбъектДокумента.Удалить();
                Сообщить("Документ успешно удален.");
            Иначе
                Сообщить("Не удалось получить объект документа для удаления.");
            КонецЕсли;
        Исключение Как Искл
            Сообщить("Ошибка удаления документа: " + Искл.Описание);
        КонецПопытки;
    
        УстановитьПривилегированныйРежим(Ложь); // Отключаем привилегированный режим
    КонецПроцедуры
    

    Вариант 2: В привилегированном общем модуле (рекомендуется)

    Создадим общий модуль, например, `МодульУдаленияПривилегированный`, и установим у него свойство "Привилегированный" в `Истина`. В этом модуле создадим функцию:

    
    // Общий модуль "МодульУдаленияПривилегированный"
    // Свойство "Привилегированный" = Истина
    
    Процедура УдалитьДокумент(СсылкаДокумента) Экспорт
        Попытка
            ОбъектДокумента = СсылкаДокумента.ПолучитьОбъект();
            Если ОбъектДокумента <> Неопределено Тогда
                ОбъектДокумента.Удалить();
                // Дополнительная логика, например, запись в журнал регистрации
            КонецЕсли;
        Исключение Как Искл
            // Обработка ошибок, возможно, с повторной попыткой или логированием
            ВызватьИсключение "Ошибка удаления документа: " + Искл.Описание;
        КонецПопытки;
    КонецПроцедуры
    

    Тогда вызов из модуля формы будет выглядеть так:

    
    &НаСервере
    Процедура УдалитьДокументНаСервере(СсылкаДокумента)
        Попытка
            МодульУдаленияПривилегированный.УдалитьДокумент(СсылкаДокумента);
            Сообщить("Документ успешно удален.");
        Исключение Как Искл
            Сообщить(Искл.Описание);
        КонецПопытки;
    КонецПроцедуры
    

    Этот подход более чистый, так как логика привилегированного режима скрыта внутри модуля.

Важные меры предосторожности при работе с удалением данных

Независимо от выбранного метода, всегда помните о следующих мерах предосторожности:

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

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

← К списку