Как решить ошибку доступа при открытии формы списка из-за сохраненных настроек в 1С?

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

При настройке ограничений доступа на уровне записей (RLS) в типовых конфигурациях 1С часто возникает неприятная ситуация: пользователь пытаются открыть форму списка документов (например, «Пересчет товаров» в 1С:Комплексной автоматизации), но система выдает ошибку нарушения прав доступа. Выясним причину этого поведения и проанализируем доступные способы устранения проблемы без снятия конфигурации с поддержки.

Почему возникает ошибка при открытии формы?

Проанализируем механику работы платформы при восстановлении состояния формы. До внедрения RLS пользователь выбирал в отборе конкретный склад или отдел и закрывал форму. Платформа 1С автоматически сохраняет значение полей и отборов в системном хранилище настроек.

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

Способ 1. Точечная очистка пользовательских настроек через интерфейс БСП

Если конфигурация построена на базе Библиотеки Стандартных Подсистем (БСП), не обязательно очищать настройки целиком или сбрасывать весь локальный кэш. Администратор системы с полными правами может точечно сбросить настройки для конкретной формы:

  1. Перейдем в раздел Администрирование > Настройки пользователей и прав.
  2. Откроем пункт Персональные настройки пользователей и выберем Очистка настроек.
  3. В окне очистки укажем проблемного пользователя.
  4. Найдем в списке нужный объект (например, форму списка документа «Пересчет товаров») и удалим только сохраненные данные этой формы.

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

Способ 2. Программное удаление настроек формы

Сохраняемые платформой значения текущих данных и отборов хранятся в базе данных. Для работы с ними предназначены объекты ХранилищеСистемныхНастроек и ХранилищеНастроекДанныхФорм. Разберем пример кода внешней обработки для администратора, с помощью которого можно программно очистить настройки конкретной формы у пользователя:


ИмяПользователя = "ИвановИИ";
КлючОбъекта = "Документ.ПересчетТоваров.Форма.ФормаСписка/ТекущиеДанные";
КлючНастроек = "";

// Удаление сохраненных значений полей формы
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, КлючНастроек, ИмяПользователя);
ХранилищеНастроекДанныхФорм.Удалить(КлючОбъекта, КлючНастроек, ИмяПользователя);

Данный подход позволяет сбросить некорректные данные без использования отладчика и без перезапуска клиента 1С со стороны пользователя.

Способ 3. Перехват события формы в расширении конфигурации

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

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


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

Способ 4. Временное расширение прав или очистка сеансового кэша

Рассмотрим еще два быстрых варианта оперативного исправления ситуаций на практике:

  1. Временное предоставление прав: Администратор временно добавляет пользователю группу доступа с правами на недоступный склад. Пользователь заходит в форму, меняет отбор на доступный склад, закрывает форму (новые настройки сохраняются), после чего временные права отзываются.
  2. Очистка пользовательского кэша: Запуск клиента 1С с параметром /ClearCache или физическое удаление каталогов кэша пользователя помогает в случаях, когда локальные данные формы закешировались на стороне клиента.
← На главную