Как запретить редактирование проведенного документа в 1С:Управление торговлей?

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

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

1. Настройка прав доступа (стандартный механизм)

Самый правильный и рекомендуемый подход — использование встроенных механизмов платформы. 1С позволяет управлять правами на уровне конфигурации, не прибегая к изменению программного кода.

  1. Откройте «Конфигуратор» и перейдите в ветку «Роли».
  2. Выберите роль, которая назначена вашим пользователям.
  3. Найдите нужный документ в списке прав.
  4. Снимите флажок напротив права «Интерактивное изменение проведенных».

Результат: После применения этих настроек пользователь не сможет изменить документ, пока тот проведен. Если же ему потребуется внести правки, он будет обязан сначала выполнить «Отмену проведения». Разумеется, доступ к отмене проведения также можно ограничить отдельным правом, чтобы превратить процесс внесения правок в контролируемую процедуру.

2. Программная защита на уровне формы

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

Рассмотрим пример кода, который необходимо разместить в обработчике события ПриОткрытии (или ПередОткрытием для старых форм):


Если НЕ РольДоступна("ПолныеПрава") Тогда
    Если Проведен Тогда
        ТолькоПросмотр = Истина;
    КонецЕсли;
КонецЕсли;

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

3. Использование подписок на события (защита от записи)

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

  1. Создайте новую подписку на событие.
  2. Установите событие ПередЗаписью для необходимых документов.
  3. Создайте процедуру-обработчик в общем модуле, где пропишем логику запрета:

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

Почему это надежно? Использование условия НЕ Источник.ОбменДанными.Загрузка позволяет корректно работать обменам (например, обмену с сайтом), если вы установите флаг ОбменДанными.Загрузка = Истина в коде самого модуля обмена. Таким образом, вы не сломаете интеграцию, но запретите ручное редактирование.

4. Особенности работы с внешними модулями (Битрикс)

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

Проанализируйте алгоритм записи модуля: найдите процедуру, отвечающую за запись документа, и перед вызовом метода Записать() добавьте проверку:


Если ДокументОбъект.Проведен Тогда
    // Пропускаем обработку или вызываем исключение
    Продолжить;
КонецЕсли;

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

Подводя итог: сочетание правильной настройки ролей для пользователей и использование Подписок на события для защиты данных от внешнего вмешательства — это «золотой стандарт» разработки в 1С. Такой подход позволяет сохранить систему гибкой и надежной.

← На главную