В практике разработки на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда пользователь, имеющий права только на «Чтение» и «Просмотр» справочника, не может открыть форму элемента двойным кликом из динамического списка. Вместо ожидаемого открытия формы в режиме «Только просмотр» система выдает ошибку «Нарушение прав доступа». При этом программное открытие формы через код работает корректно.
В этой статье мы подробно разберем, почему платформа может пытаться вызвать действие «Изменить» вместо «Просмотр», как диагностировать причину отказа в доступе и какие настройки динамического списка влияют на это поведение.
Разберем, как платформа интерпретирует двойной клик по строке таблицы. По умолчанию в 1С при двойном нажатии срабатывает стандартная команда Изменить (Edit). Логика системы устроена следующим образом: если у пользователя есть права на редактирование, открывается форма для изменения. Если прав на редактирование нет, платформа должна автоматически переключиться на команду Просмотр (View).
Однако этот автоматический «откат» к просмотру может блокироваться. Проанализируем основные причины:
Да, а обработка события не перехвачена в коде, система может жестко требовать права на правку.СпособРедактирования. Если выбрано значение В списке, то при попытке интерактивного открытия система инициирует режим редактирования строки прямо в таблице. Для этого действия права «Чтение» недостаточно — требуется «Изменение».Просмотр, то у системы не остается альтернативного действия при отсутствии прав на Изменение.Если пользователь получает сообщение о нарушении прав, первым делом необходимо выяснить, на какое именно право (или на какой объект) накладывается ограничение. Рассмотрим шаги профессиональной диагностики:
Шаг 1. Анализ Журнала регистрации. Перейдем в Журнал регистрации и установим фильтр по пользователю и событию «Отказ в доступе». Если система запрашивает право «Редактирование», значит, инициализируется именно режим изменения объекта.
Шаг 2. Остановка по ошибке. Чтобы понять, в какой момент возникает отказ, воспользуемся отладчиком. В меню «Отладка» выберем пункт «Остановка по ошибке» и установим флажок «Останавливаться по ошибке». Если ошибка происходит в коде 1С (например, в модуле формы элемента), отладчик покажет конкретную строку.
Шаг 3. Замер производительности. Если «Остановка по ошибке» не срабатывает (ошибка происходит внутри ядра платформы), проанализируем ситуацию с помощью замера производительности. Запустим замер, совершим двойной клик и остановим замер. В списке процедур мы увидим последние вызванные обработчики, такие как ПриСозданииНаСервере или ПриЧтенииНаСервере.
Часто проблема кроется не в платформе, а в прикладном коде модуля формы элемента. Проанализируем ситуацию: форма открывается, но в процедурах ПриСозданииНаСервере или ПриОткрытии разработчик добавил код, который неявно пытается изменить данные. Это может быть:
Если в коде формы присутствует метод Объект.Записать() или иное действие, инициирующее запись, пользователь с правами только на просмотр получит ошибку доступа. При программном открытии через ПолучитьФорму().Открыть() разработчик часто передает параметр ТолькоПросмотр = Истина, что может обходить некоторые проверки, в то время как интерактивный клик идет по стандартному сценарию.
Если конфигурация использует БСП, стоит проверить настройки подсистемы «Управление доступом». Иногда ограничение прав накладывается не на уровне метаданных (ролей), а через механизм RLS (Record Level Security). В этом случае пользователь видит элемент в списке (право «Чтение» есть), но попытка инициализации формы в режиме редактирования блокируется механизмом RLS еще до того, как форма отобразится.
Также проверьте наличие дат запрета изменения данных. Если элемент относится к закрытому периоду, платформа может блокировать открытие формы в режиме редактирования, выдавая общую ошибку прав доступа.
Если стандартные настройки не помогают, мы можем принудительно переопределить действие при двойном клике. Для этого в форме списка выберем таблицу (динамический список) и создадим обработчик события Выбор.
Разберем пример кода, который гарантирует открытие формы в режиме просмотра:
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Отменяем стандартное поведение платформы
СтандартнаяОбработка = Ложь;
// Подготавливаем параметры открытия формы
ПараметрыФормы = Новый Структура("Ключ", ВыбраннаяСтрока);
// Принудительно открываем форму в режиме просмотра
ОткрытьФорму("Справочник.ИмяВашегоСправочника.ФормаОбъекта", ПараметрыФормы, Элемент, , , , , РежимОткрытияОкнаФормы.Независимый);
КонецПроцедуры
Используя параметр СтандартнаяОбработка = Ложь, мы сообщаем системе, что сами берем на себя ответственность за открытие формы. В этом случае платформа не будет пытаться вызвать команду «Изменить» и сразу перейдет к выполнению нашего кода открытия формы элемента.
Для исправления ошибки «Нарушение прав доступа» при интерактивном открытии рекомендуем следующий порядок действий:
В отдельном окне.Записать()) или изменение реквизитов объекта при открытии.Выбор (или ПередНачаломИзменения) для программного управления процессом открытия формы в режиме только чтения.