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