В процессе организации документооборота на предприятии нередко возникает задача разделить зоны ответственности пользователей. Например, операторы одного подразделения должны только заполнять и сохранять черновики документов, а ответственные сотрудники другого подразделения — проверять, согласовывать и проводить их в учете. Если просто изменить логику стандартных кнопок командной панели формы, можно столкнуться с потерей платформенных механизмов: исчезают диалоги выбора оперативного или неоперативного проведения, нарушается целостность движений ранее проведенных документов.
Разберем детально, как правильно решить эту задачу типовыми средствами платформы и как при необходимости переопределить режим записи программно.
Проанализируем типовые возможности системы прав 1С:Предприятие. Самым надежным и архитектурно правильным решением является разделение прав пользователей в дереве метаданных без внесения изменений в код экранных форм.
В конфигураторе для каждого объекта типа Документ предусмотрен детальный набор прав:
Разберем по шагам настройку ролей:
При таком подходе платформа 1С автоматически скорректирует интерфейс: у пользователей без права проведения на командной панели формы кнопка «Провести и закрыть» не будет отображаться вовсе, а основным действием станет штатная команда «Записать и закрыть». Это исключает риск случайного проведения или порчи регистров учета.
Если бизнес-логика требует сохранить видимость стандартных кнопок, но программно изменять действие в зависимости от роли текущего сеанса, не следует заменять стандартные кнопки своими командами. Создание пользовательских команд приводит к тому, что платформа перестает выполнять стандартные проверки и не выдает диалог выбора оперативного или неоперативного проведения при несовпадении даты документа с текущим временем сеанса.
Рассмотрим, как правильно перехватить режим записи в обработчике события формы ПередЗаписью. В параметре ПараметрыЗаписи передается структура с управляющими свойствами записи.
Посмотрим на пример кода клиентского обработчика формы документа:
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
// Проверяем, есть ли у текущего пользователя ограничение на проведение
Если Не РольДоступна("ПравоПроведенияДокументов") Тогда
// Принудительно меняем режим на обычную запись
ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Запись;
КонецЕсли;
КонецПроцедуры
При таком переопределении для привилегированных пользователей сохраняется штатное поведение платформы (включая платформенные диалоги проведения), а для пользователей с ограниченными правами документ всегда будет записываться как черновик.
Выясним причину частой ошибки при работе с режимами записи: если пользователь открывает документ, который уже был проведен ранее, и сохраняет его с параметром РежимЗаписиДокумента.Запись, платформа по умолчанию все равно выполнит перепроведение документа.
За это поведение отвечает платформенное свойство расширения формы документа ПриЗаписиПерепроводить, которое по умолчанию установлено в значение Истина. Если перед нами стоит задача запретить изменение движений при редактировании проведенного документа, необходимо управлять этим свойством.
Разберем пример обработки при открытии и перед записью формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Проведен И Не РольДоступна("ПравоПроведенияДокументов") Тогда
// Запрещаем автоматическое перепроведение при интерактивной записи
ПриЗаписиПерепроводить = Ложь;
// Либо полностью блокируем форму проведенного документа от изменений
// ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедуры
Важное предостережение: сохранение проведенного документа без перепроведения (с флагом ПриЗаписиПерепроводить = Ложь) приводит к рассинхронизации данных шапки/табличных частей и сформированных ранее движений по регистрам. Наиболее безопасным подходом в учете является полная блокировка редактирования проведенного документа (установка свойства ТолькоПросмотр = Истина) для сотрудников без права проведения.
Рассмотрим особенности реализации подобной задачи для обычных форм. В обычном приложении обработчик события ПередЗаписью принимает параметры режима записи напрямую в сигнатуре процедуры, а не через структуру.
Посмотрим на пример кода для обычной формы:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если Не РольДоступна("ПолныеПрава") Тогда
// Переопределяем режим записи напрямую
РежимЗаписи = РежимЗаписиДокумента.Запись;
КонецЕсли;
КонецПроцедуры
Проанализируем варианты, когда процесс согласования и заполнения документа состоит из множества шагов:
Статус (например, статус «На согласовании» не формирует движений по учетным регистрам взаиморасчетов и остатков, а статус «Утвержден» формирует полные движения).Использование ролевой модели прав или встроенных механизмов согласования исключает скрытые учетные ошибки и сохраняет стандартную логику платформы 1С:Предприятие.