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

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

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

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

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

Разберем логику реализации по шагам:

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

Пример программного кода для реализации данной защиты:


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

Этот метод гарантирует, что даже при попытке «обхода» интерфейса данные не будут сохранены в базу. Обратите внимание, что мы используем РежимЗаписиДокумента, что позволяет четко идентифицировать, что именно делает пользователь.

Управление доступностью элементов формы

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

Рассмотрим, как реализовать это в событии формы ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    Если Объект.Проведен Тогда
        // Отключаем доступность всех элементов формы
        Для Каждого Элемент Из ЭтаФорма.Элементы Цикл
            // Исключаем только кнопку отмены проведения (например, с именем КомандаОтменаПроведения)
            Если Элемент.Имя <> "КомандаОтменаПроведения" Тогда
                Элемент.Доступность = Ложь;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры

Дополнительные рекомендации по обеспечению безопасности данных

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

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

← На главную