Как запретить редактирование проведенных документов отдельным пользователям в 1С:Розница?

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

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

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

Способ 1. Ограничение прав через роли и профили групп доступа

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

Проанализируем ключевые права, отвечающие за модификацию проведенных данных:

  1. Интерактивное изменение проведенных — если этот флаг снят в роли пользователя, система позволяет открывать форму проведенного документа, но блокирует любые попытки записать изменения или перепровести его, выдавая системное сообщение о нарушении прав доступа.
  2. Интерактивная отмена проведения — запрещает пользователю переводить проведенный документ в состояние непроведенного.
  3. Интерактивное проведение — определяет базовую возможность пользователя проводить документ.

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

  1. Перейдем в раздел Администрирование → Настройки пользователей и прав → Профили групп доступа.
  2. Создадим новый профиль (или скопируем существующий типовой, например, «Продавец-кассир»).
  3. В списке разрешенных ролей найдем или создадим роль, в которой снят флаг Интерактивное изменение проведенных для целевых документов (например, ЧекККМ, РеализацияТоваров, ПоступлениеТоваров).
  4. Назначим созданный профиль требуемым пользователям через группу доступа.

Важный нюанс: права в 1С работают по правилу логического объединения («ИЛИ»). Если пользователю назначено несколько профилей или ролей, и хотя бы в одной из них право Интерактивное изменение проведенных установлено, документ останется доступным для редактирования.

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

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

Выясним, где находится и как настраивается эта функция:

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

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

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

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

Проанализируем алгоритм проверки. Нам необходимо учесть два критически важных фактора:

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

Посмотрим на пример правильного кода обработчика подписки на событие:


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

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

    // 2. Для новых (еще не записанных) объектов проверка не требуется
    Если Источник.ЭтоНовый() Тогда
        Возврат;
    КонецЕсли;

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

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

Разберем важные детали работы с параметром Отказ и оператором Возврат:

  1. Установка флага Отказ = Истина сообщает платформе о необходимости отменить транзакцию записи объекта.
  2. Оператор Возврат немедленно прерывает выполнение текущей процедуры, предотвращая выполнение последующих проверок и лишних вызовов. Их используют совместно: сначала устанавливается отказ, затем вызывается возврат.

Способ 4. Блокировка формы на стороне клиента (Интерфейсный уровень)

Чтобы пользователь не тратил время на заполнение реквизитов и не получал ошибку только в момент нажатия кнопки «Записать», заблокируем элементы управления на форме сразу при ее открытии.

Для этого в расширении формы документа перехватим серверное событие чтения данных:


&НаСервере
Процедура Расш_ПриЧтенииНаСервереПосле(ТекущийОбъект)
    
    Если ТекущийОбъект.Проведен И НЕ РольДоступна("ПолныеПрава") Тогда
        ЭтотОбъект.ТолькоПросмотр = Истина;
    КонецЕсли;
    
КонецПроцедуры

Установка свойства формы ЭтотОбъект.ТолькоПросмотр = Истина переводит все поля ввода в нередактируемый режим и автоматически отключает команды проведения и записи на командной панели.

Рекомендации по внедрению через расширения конфигурации

Чтобы типовая конфигурация 1С:Розница оставалась на полной поддержке и обновлялась без сложностей:

  1. Создадим новое расширение конфигурации с назначением Адаптация или Дополнение.
  2. Добавим в расширение подписку на событие с источником ДокументОбъект (выбрав нужные типы документов) и событием ПередЗаписью.
  3. Вынесем логику проверки прав и обмена в общий модуль расширения.
  4. При необходимости добавим в расширение формы документов и настроим свойство ТолькоПросмотр в процедуре ПриЧтенииНаСервере.

Такой комплексный подход обеспечивает надежную защиту данных от несанкционированных изменений, корректную синхронизацию в распределенных базах и удобство работы пользователей.

← На главную