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