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

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

В процессе эксплуатации систем на базе 1С:Предприятие 8 (таких как ERP, Комплексная автоматизация или Управление торговлей) часто возникает бизнес-задача: ограничить возможность редактирования документов пользователями по прошествии определенного времени. Например, если документ был проведен, у пользователя есть 2-3 дня на внесение правок, после чего документ должен стать доступен только для просмотра. Это необходимо для обеспечения неизменности данных после закрытия оперативного периода или расчета себестоимости.

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

Способ 1. Использование типового механизма «Дата запрета изменения данных»

Прежде чем приступать к написанию кода, проанализируем возможности типового функционала. В современных конфигурациях 1С (ERP, КА 2, УТ 11, БП 3.0) встроен мощный механизм Даты запрета изменения. Он позволяет устанавливать ограничения не только на фиксированную дату, но и использовать динамические (относительные) значения.

Рассмотрим по шагам, как настроить автоматический сдвиг даты запрета:

  1. Перейдем в раздел НСИ и администрирование — Настройка пользователей и прав.
  2. Установим флаг Даты запрета изменения и перейдем по ссылке Настроить.
  3. В открывшемся окне мы можем установить общую дату для всех пользователей или настроить исключения. Для нашей задачи выберем способ настройки По пользователям или Общая дата.
  4. Самый важный момент: в поле выбора даты вместо конкретного числа (например, 01.01.2023) выберем значение из списка Другие значения.
  5. Выберем пункт Конец прошлого дня, Конец прошлой недели или Конец предыдущего месяца.
  6. В поле Отсрочка установки запрета укажем количество дней. Например, если мы укажем «Конец прошлого дня» и отсрочку «3 дня», система будет автоматически блокировать документы, дата которых старше трех дней относительно текущего момента.

Важное уточнение: типовой механизм проверяет дату документа. Если документ создан «задним числом» (например, сегодня создали документ за прошлый месяц), он будет заблокирован сразу, если дата запрета уже наступила для того периода.

Способ 2. Программное ограничение через процедуру ПриОткрытии

Если типовой механизм по каким-то причинам не подходит (например, требуется очень сложная логика проверки прав), можно воспользоваться программным методом. Проанализируем вариант с изменением свойства формы ТолькоПросмотр.

Этот метод часто используется начинающими разработчиками. В модуле формы документа в процедуре ПриОткрытии (на клиенте) или в ПриЧтенииНаСервере (на сервере) прописывается условие проверки даты:


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

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

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

Для реализации гарантированного запрета редактирования (как интерактивного, так и программного) лучше всего использовать Подписки на события. Это позволяет не снимать документ с поддержки и внедрить логику через расширение конфигурации.

Разберем алгоритм реализации:

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

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

    // Наша логика: запрет редактирования через 3 дня после даты документа
    КоличествоДнейСекунд = 3 * 24 * 60 * 60; // 3 дня в секундах
    
    Если Источник.Проведен И (Источник.Дата + КоличествоДнейСекунд < ТекущаяДата()) Тогда
        // Проверяем, не является ли пользователь администратором (опционально)
        Если Не РольДоступна("ПолныеПрава") Тогда
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Редактирование документа запрещено, так как прошло более 3-х дней с момента его создания.";
            Сообщение.Сообщить();
            Отказ = Истина;
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры

Этот метод считается наиболее профессиональным, так как он срабатывает на уровне сервера непосредственно перед записью данных в базу.

Нюанс: Фиксация момента фактического проведения

Проанализируем ситуацию, упомянутую в обсуждении: что если бизнес требует считать 3 дня не от даты документа (которая может быть изменена), а от момента фактического проведения? Стандартная «Дата запрета» ориентируется именно на дату документа.

Если нам нужно блокировать изменения именно через 3 дня после того, как пользователь физически нажал кнопку «Провести», нам потребуется дополнительный реквизит. Выясним, как это реализовать:

  1. Добавим через расширение в нужные документы реквизит ДатаПервогоПроведения (тип: Дата).
  2. В подписке на событие ПередЗаписью будем заполнять этот реквизит только один раз при первом проведении.
  3. Проверку блокировки будем вести уже не по полю Дата, а по полю ДатаПервогоПроведения.

Альтернативный вариант без добавления реквизитов — использование подсистемы Версионирование объектов. Мы можем программно обратиться к истории версий документа, найти самую раннюю версию со статусом «Проведен» и узнать её дату. Однако этот способ более трудозатратный и создает дополнительную нагрузку на систему при записи каждого документа.

Настройка исключений по разделам и ролям

Рассмотрим подробнее возможности настройки в ERP. Часто бывает нужно запретить редактирование складских документов через 2 дня, а финансовых — через 10. Типовой механизм позволяет это сделать:

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

← На главную