Почему в списке документов не активна кнопка отмены проведения и как это исправить?

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

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

Разберем детально, по каким неочевидным причинам платформа отключает команды проведения и отмены проведения, как локализовать ошибку и какие способы решения существуют.

Механизм расчета доступности стандартных команд платформой

Проанализируем поведение платформы «1С:Предприятие 8.3». В управляемых формах платформа рассчитывает доступность стандартных команд динамически. При этом система выполняет проверку прав не только на сам документ, но и на связанные с ним метаданные:

  1. Права на регистры из состава движений документа. При отмене проведения платформа очищает наборы записей. Если у роли пользователя отсутствует право Изменение хотя бы на один регистр накопления, бухгалтерии или сведений, входящий в ветку метаданных документа Движения, платформа автоматически делает интерактивную команду отмены проведения неактивной.
  2. Отказ в подписках на события подсистем БСП. При изменении статуса проведения документа вызываются обработчики подписок на события (например, подсистемы «Версионирование объектов» Библиотеки стандартных подсистем). Если подсистема пытается выполнить запись в служебный регистр сведений (в частности, ВерсииОбъектов) в пользовательском сеансе без привилегированного режима, операция блокируется из-за недостатка прав.
  3. Ограничения доступа на уровне записей (RLS). Если для роли определены условия RLS на подчиненные регистры движений, система может заблокировать изменение наборов записей, что приведет к отключению кнопок управления проведением.

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

Диагностика проблемы: программная отмена проведения

Выясним точную причину недоступности команды. Для этого создадим внешнюю обработку или вызовем отмену проведения программно в сеансе пользователя с ограниченными правами. Программный вызов заставит платформу выполнить операцию до конца и выдать конкретное исключение с указанием заблокированного объекта метаданных.

Посмотрим на пример кода диагностической обработки:


&НаСервере
Процедура ВыполнитьОтменуПроведенияНаСервере(СсылкаНаДокумент)
    ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();
    ДокОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
КонецПроцедуры

При выполнении этого кода в пользовательском сеансе платформа вызовет ошибку с четким текстом, например: «Нарушение прав доступа при записи в регистр сведений: ВерсииОбъектов». Это указывает на то, что сама отмена проведения не может завершиться из-за блокировки служебных механизмов.

Способ 1. Корректировка прав и ролей пользователя

Разберем по шагам, как исправить права доступа:

  1. Назначение ролей подсистемы версионирования. Проверим, назначена ли пользователю типовая роль для работы с версиями объектов (например, ЧтениеВерсийОбъектов или аналогичные профильные роли БСП). Если используется типовой механизм профилей групп доступа, включим соответствующую разрешенную роль в профиль пользователя.
  2. Проверка прав на движения документа. Откроем конфигуратор, найдем проблемный документ (например, ПоступлениеНМА) и изучим состав ветки Движения. Убедимся, что у назначенной пользователю роли установлено право Изменение на каждый регистр из этого списка.

Способ 2. Настройка версионирования в пользовательском режиме

Если пользователю не требуется сохранение истории изменений по данному объекту, решим вопрос административной настройкой без изменения конфигурации:

  1. Перейдем в раздел Администрирование — Общие настройки.
  2. Откроем пункт История изменений.
  3. Найдем в списке нужный документ и переключим настройку в значение Не версионировать.

После отключения версионирования подписка на события перестанет обращаться к регистру сведений ВерсииОбъектов при отмене проведения, и стандартная кнопка снова станет активной.

Способ 3. Перевод записи служебных данных в привилегированный режим

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

Рассмотрим, как правильно оборачивать запись служебных объектов:


УстановитьПривилегированныйРежим(Истина);
// Выполнение записи версий или служебных наборов записей
НаборЗаписей = РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Объект.Установить(СсылкаНаДокумент);
НаборЗаписей.Записать();
УстановитьПривилегированныйРежим(Ложь);

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

Способ 4. Создание пользовательской команды с привилегированным вызовом

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

Посмотрим на реализацию серверной процедуры команды:


&НаСервере
Процедура ОтменитьПроведениеНаСервере(СсылкаНаДокумент)
    УстановитьПривилегированныйРежим(Истина);
    
    ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();
    ДокОбъект.Записать(РежимЗаписиДокумента.ОтменаПроведения);
КонецПроцедуры

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

← На главную