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