Как заблокировать редактирование документа за предыдущие дни в 1С?

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

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

Вариант 1. Блокировка на уровне формы в обработчике «ПриЧтенииНаСервере»

Проанализируем простейший способ, когда требуется заблокировать возможность редактирования документа непосредственно в интерфейсе пользователя при открытии формы.

Обратите внимание: проверку даты и установку доступности элементов формы следует выполнять именно в серверном обработчике ПриЧтенииНаСервере, а не в клиентском ПриОткрытии. Обработчик ПриЧтенииНаСервере вызывается системой не только при первоначальном открытии формы, но и при любом перечитывании объекта (например, по кнопке «Перечитать», при программном обновлении или отмене несохраненных изменений).

Рассмотрим пример кода в модуле формы документа:


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

Важные нюансы данного подхода:

  1. Сравнение необходимо производить именно с функцией НачалоДня(), так как реквизит Дата содержит значение с точностью до секунд. Простое сравнение с ТекущаяДатаСеанса() сделает условие некорректным.
  2. Установка свойства ЭтаФорма.ТолькоПросмотр = Истина блокирует все элементы управления, запрещает изменение реквизитов и проведение из формы.

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

Вариант 2. Проверка в модуле объекта и подписке на событие «ПередЗаписью»

Чтобы исключить обход блокировки через журналы и программный код, добавим проверку в событие ПередЗаписью модуля объекта или в подписку на событие.

Разберем важные правила надежной проверки перед записью:

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

Посмотрим на пример процедуры для модуля объекта или обработчика подписки:


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

Вариант 3. Использование типовой подсистемы БСП «Даты запрета изменения»

Наиболее гибкий и масштабируемый вариант для конфигураций на базе БСП (1С:Бухгалтерия предприятия 3.0, 1С:ERP, 1С:КА, 1С:УТ, 1С:УНФ) — подключение нового документа к штатному механизму дат запрета.

Преимущества механизма БСП:

  1. Поддержка динамических (относительных) дат: в настройках можно указать «Конец прошлого дня», «Конец прошлой недели» или «Конец прошлого месяца» с возможностью отсрочки в днях. Система будет автоматически сдвигать границу запрета каждый день без ручного вмешательства администратора.
  2. Гибкая настройка прав по отдельным пользователям и группам пользователей (например, запретить редактирование операторам, но разрешить главному бухгалтеру).

Разберем по шагам подключение документа к механизму БСП:

Шаг 1. Обработка в форме документа

В модуле формы нового документа подключаем стандартный обработчик БСП:


&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    
    // Обработчик механизма "ДатыЗапретаИзменения"
    ДатыЗапретаИзменения.ОбъектПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);
    
КонецПроцедуры

Шаг 2. Создание подписки на событие

Создаем новую подписку на событие (например, ПроверитьДатуЗапретаПередЗаписьюДокумента):

  1. В качестве источника выбираем наш новый документ.
  2. Событие: ПередЗаписью.
  3. В модуле подписки вызываем типовую процедуру БСП:

Процедура ПроверитьДатуЗапретаПередЗаписьюДокумента(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    
    ДатыЗапретаИзменения.ПроверитьДатуЗапретаИзмененияПередЗаписьюДокумента(Источник, Отказ, РежимЗаписи, РежимПроведения);
    
КонецПроцедуры

Шаг 3. Регистрация документа в источниках данных

В общем модуле ДатыЗапретаИзмененияПереопределяемый находим процедуру ЗаполнитьИсточникиДанныхДляПроверкиЗапретаИзменения и регистрируем новый документ:


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

Рекомендация по обновлению: не создавайте новые предопределенные элементы в плане видов характеристик РазделыДатЗапретаИзменения, так как при обновлении типовых конфигураций они могут конфликтовать со структурой метаданных поставщика. Связывайте свои документы с уже имеющимися типовыми разделами учета (например, с общим разделом или разделом бухгалтерского учета).

Шаг 4. Настройка в режиме «1С:Предприятие»

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

← На главную