При настройке ограничений доступа на уровне записей (RLS) в типовых конфигурациях 1С часто возникает неприятная ситуация: пользователь пытаются открыть форму списка документов (например, «Пересчет товаров» в 1С:Комплексной автоматизации), но система выдает ошибку нарушения прав доступа. Выясним причину этого поведения и проанализируем доступные способы устранения проблемы без снятия конфигурации с поддержки.
Проанализируем механику работы платформы при восстановлении состояния формы. До внедрения RLS пользователь выбирал в отборе конкретный склад или отдел и закрывал форму. Платформа 1С автоматически сохраняет значение полей и отборов в системном хранилище настроек.
После включения ограничений прав на уровне записей выбранный ранее склад становится недоступен текущему пользователю. Однако при следующем запуске форма пытается восстановить сохраненное значение реквизита. Так как прав на чтение ссылки у пользователя больше нет, при обращении платформы к реквизитам этой ссылки возникает исключение «Нарушение прав доступа» еще до того, как пользователь сможет вручную сбросить отбор.
Если конфигурация построена на базе Библиотеки Стандартных Подсистем (БСП), не обязательно очищать настройки целиком или сбрасывать весь локальный кэш. Администратор системы с полными правами может точечно сбросить настройки для конкретной формы:
После этой операции сохраненное значение недоступного склада удалится из базы данных, и пользователь сможет беспрепятственно открыть форму списка.
Сохраняемые платформой значения текущих данных и отборов хранятся в базе данных. Для работы с ними предназначены объекты ХранилищеСистемныхНастроек и ХранилищеНастроекДанныхФорм. Разберем пример кода внешней обработки для администратора, с помощью которого можно программно очистить настройки конкретной формы у пользователя:
ИмяПользователя = "ИвановИИ";
КлючОбъекта = "Документ.ПересчетТоваров.Форма.ФормаСписка/ТекущиеДанные";
КлючНастроек = "";
// Удаление сохраненных значений полей формы
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, КлючНастроек, ИмяПользователя);
ХранилищеНастроекДанныхФорм.Удалить(КлючОбъекта, КлючНастроек, ИмяПользователя);
Данный подход позволяет сбросить некорректные данные без использования отладчика и без перезапуска клиента 1С со стороны пользователя.
Если конфигурация находится на типовой поддержке без возможности изменения, правильным архитектурным решением станет использование расширения (.cfe). В управляемых формах предусмотрено событие ПередЗагрузкойДанныхИзНастроекНаСервере, которое отрабатывает после выполнения ПриСозданииНаСервере, но до показа формы пользователю.
Рассмотрим, как сбросить недоступное значение реквизита в коде расширения:
&НаСервере
Процедура Расш1_ПередЗагрузкойДанныхИзНастроекНаСервере(Настройки)
// Проверяем доступность значения реквизита или сбрасываем его
Если ЗначениеЗаполнено(Склад) Тогда
// При необходимости проверяем доступность ссылки с помощью безопасного запроса
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Таблица.Ссылка КАК Склад
|ИЗ
| Справочник.Склады КАК Таблица
|ГДЕ
| Таблица.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Склад);
Если Запрос.Выполнить().Пустой() Тогда
// Если ссылка недоступна по RLS, очищаем реквизит формы
Склад = Справочники.Склады.ПустаяСсылка();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Рассмотрим еще два быстрых варианта оперативного исправления ситуаций на практике:
/ClearCache или физическое удаление каталогов кэша пользователя помогает в случаях, когда локальные данные формы закешировались на стороне клиента.