Как запретить редактирование проведенного документа в 1С, сохранив возможность его распроведения?

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

В процессе разработки часто возникает задача реализации «защиты от дурака»: необходимо запретить пользователям редактировать уже проведенные документы, но при этом оставить возможность снять проведение, внести изменения и провести документ заново. Стандартный механизм ролей «Интерактивное изменение проведенных» часто оказывается слишком жестким, так как он блокирует не только редактирование, но и саму возможность изменения статуса проведения документа.

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

Использование подписки на событие «ПередЗаписью»

Наиболее эффективным способом реализации данной задачи является создание Подписки на событие. Этот подход позволяет централизованно управлять проверкой доступа для всех документов системы, не внося изменения в каждый конкретный модуль объекта.

Чтобы реализовать данную логику, выполним следующие шаги:

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

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


Процедура ЗапретРедактированияПроведенныхПередЗаписью(Источник, Отказ) Экспорт
    // Проверяем, что у пользователя нет прав администратора
    Если НЕ РольДоступна("ПолныеПрава") Тогда
        // Проверяем, проведен ли документ и не помечен ли он на удаление
        Если Источник.Проведен И (НЕ Источник.ПометкаУдаления) Тогда
            // Устанавливаем отказ записи
            Отказ = Истина;
            // Выводим сообщение пользователю
            #Если Клиент Тогда
                Предупреждение("У текущего пользователя нет прав на изменение проведённых документов. 
                |Сначала снимите проведение документа.");
            #КонецЕсли
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Почему этот метод эффективен?

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

Современный подход: расширения конфигурации

Если вы работаете на современных версиях 1С:Предприятие (Управляемые формы), рекомендуется использовать Расширения конфигурации. Вместо прямого использования подписок, можно создать расширение, добавить в него нужные документы и использовать аннотацию &Перед для метода ПередЗаписью.

Это выглядит следующим образом:


&Перед("ПередЗаписью")
Процедура МойПередЗаписью(Отказ)
    Если ЭтотОбъект.Проведен И НЕ РольДоступна("РазрешитьРедактированиеПроведенных") Тогда
        Отказ = Истина;
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Редактирование запрещено!");
    КонецЕсли;
КонецПроцедуры

Использование Расширений является стандартом индустрии, так как позволяет обновлять типовую конфигурацию 1С без конфликтов, оставляя ваши доработки в отдельном модуле.

Важные замечания

При реализации «защиты от дурака» помните, что проверка на сервере в событии ПередЗаписью является самой надежной, так как она блокирует запись независимо от того, через какой интерфейс или обработку происходит попытка изменения. Дополнительно можно настроить доступность формы (свойство ТолькоПросмотр), однако это является лишь косметической мерой, не обеспечивающей полноценную безопасность данных.

← На главную