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

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

В процессе автоматизации учета часто возникает необходимость ограничить возможность «задним числом» изменять важные документы, такие как приходные и расходные кассовые ордера. Рассмотрим, как организовать надежную систему запрета редактирования, опираясь на лучшие практики программирования в 1С.

Реализация базового запрета на уровне формы

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

Для реализации логики нам потребуется сравнить текущую дату системы и дату документа. Если даты не совпадают, мы устанавливаем свойство ТолькоПросмотр в значение Истина.


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

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

Гибкая настройка через регистр сведений

Если задача усложняется (необходимо разрешить редактирование только определенным сотрудникам), одного кода в форме недостаточно. Лучшим решением будет создание РегистраСведений. Назовем его, например, РазрешенияНаРедактированиеДокументов.

  1. Создайте регистр сведений с измерениями Касса (тип СправочникСсылка.Кассы) и Пользователь (тип СправочникСсылка.Пользователи).
  2. Добавьте ресурс Разрешено (тип Булево).
  3. При открытии или записи документа выполняйте запрос к этому регистру.

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

Обеспечение безопасности данных на сервере

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

Рассмотрим пример реализации:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

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

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

Рекомендации по архитектуре решения

При внедрении данного функционала мы рекомендуем придерживаться следующих принципов:

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

← На главную