Как настроить интерактивное открытие формы элемента в режиме просмотра при отсутствии прав на редактирование?

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

В практике разработки на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда пользователь, имеющий права только на «Чтение» и «Просмотр» справочника, не может открыть форму элемента двойным кликом из динамического списка. Вместо ожидаемого открытия формы в режиме «Только просмотр» система выдает ошибку «Нарушение прав доступа». При этом программное открытие формы через код работает корректно.

В этой статье мы подробно разберем, почему платформа может пытаться вызвать действие «Изменить» вместо «Просмотр», как диагностировать причину отказа в доступе и какие настройки динамического списка влияют на это поведение.

Механизм выбора стандартного действия платформой

Разберем, как платформа интерпретирует двойной клик по строке таблицы. По умолчанию в 1С при двойном нажатии срабатывает стандартная команда Изменить (Edit). Логика системы устроена следующим образом: если у пользователя есть права на редактирование, открывается форма для изменения. Если прав на редактирование нет, платформа должна автоматически переключиться на команду Просмотр (View).

Однако этот автоматический «откат» к просмотру может блокироваться. Проанализируем основные причины:

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

Диагностика через Журнал регистрации и Отладку

Если пользователь получает сообщение о нарушении прав, первым делом необходимо выяснить, на какое именно право (или на какой объект) накладывается ограничение. Рассмотрим шаги профессиональной диагностики:

Шаг 1. Анализ Журнала регистрации. Перейдем в Журнал регистрации и установим фильтр по пользователю и событию «Отказ в доступе». Если система запрашивает право «Редактирование», значит, инициализируется именно режим изменения объекта.

Шаг 2. Остановка по ошибке. Чтобы понять, в какой момент возникает отказ, воспользуемся отладчиком. В меню «Отладка» выберем пункт «Остановка по ошибке» и установим флажок «Останавливаться по ошибке». Если ошибка происходит в коде 1С (например, в модуле формы элемента), отладчик покажет конкретную строку.

Шаг 3. Замер производительности. Если «Остановка по ошибке» не срабатывает (ошибка происходит внутри ядра платформы), проанализируем ситуацию с помощью замера производительности. Запустим замер, совершим двойной клик и остановим замер. В списке процедур мы увидим последние вызванные обработчики, такие как ПриСозданииНаСервере или ПриЧтенииНаСервере.

Скрытая запись в коде формы

Часто проблема кроется не в платформе, а в прикладном коде модуля формы элемента. Проанализируем ситуацию: форма открывается, но в процедурах ПриСозданииНаСервере или ПриОткрытии разработчик добавил код, который неявно пытается изменить данные. Это может быть:

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

Влияние Библиотеки стандартных подсистем (БСП)

Если конфигурация использует БСП, стоит проверить настройки подсистемы «Управление доступом». Иногда ограничение прав накладывается не на уровне метаданных (ролей), а через механизм RLS (Record Level Security). В этом случае пользователь видит элемент в списке (право «Чтение» есть), но попытка инициализации формы в режиме редактирования блокируется механизмом RLS еще до того, как форма отобразится.

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

Решение проблемы через программный перехват

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

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


&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    // Отменяем стандартное поведение платформы
    СтандартнаяОбработка = Ложь;
    
    // Подготавливаем параметры открытия формы
    ПараметрыФормы = Новый Структура("Ключ", ВыбраннаяСтрока);
    
    // Принудительно открываем форму в режиме просмотра
    ОткрытьФорму("Справочник.ИмяВашегоСправочника.ФормаОбъекта", ПараметрыФормы, Элемент, , , , , РежимОткрытияОкнаФормы.Независимый);
    
КонецПроцедуры

Используя параметр СтандартнаяОбработка = Ложь, мы сообщаем системе, что сами берем на себя ответственность за открытие формы. В этом случае платформа не будет пытаться вызвать команду «Изменить» и сразу перейдет к выполнению нашего кода открытия формы элемента.

Итоги и рекомендации

Для исправления ошибки «Нарушение прав доступа» при интерактивном открытии рекомендуем следующий порядок действий:

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