Почему в 1С:УНФ не работает ограничение доступа по контрагентам и как это исправить?

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

Настройка разграничения прав доступа на уровне записей (RLS) в 1С:Управление нашей фирмой (УНФ) — задача часто встречающаяся. Типовой сценарий предполагает, что определенные менеджеры должны видеть только «своих» контрагентов и документы по ним. Однако на практике часто возникает ситуация: RLS включен, группы доступа созданы и распределены, но документы запрещенных контрагентов всё равно отображаются в списках, хотя внутри самого документа в поле Контрагент красуется надпись «Объект не найден». Разберем детально, почему так происходит и как заставить систему работать корректно.

Анализируем симптом: почему виден документ, но не виден контрагент?

Ситуация, когда в поле контрагента отображается «Объект не найден», — это классический признак того, что RLS сработал наполовину. Рассмотрим причины этого явления:

  1. Ограничение справочника: На справочник Контрагенты права успешно наложились. Пользователь не имеет прав на чтение записи в справочнике, поэтому система подменяет ссылку на объект текстом «Объект не найден».
  2. Отсутствие ограничения на документ: На сам объект метаданных (например, документ РасходСоСчета) ограничение либо не наложено вовсе, либо оно настроено некорректно. В 1С права работают по принципу «разрешено всё, что не запрещено» в рамках доступных ролей. Если у пользователя есть хотя бы одна роль, дающая право чтения документа без условий RLS, он увидит этот документ в списке.
  3. Несоответствие реквизитов: Типовой механизм RLS в УНФ ищет конкретное поле (обычно Контрагент) в шапке документа. Если вы используете операцию, где контрагент указывается в табличной части, или если вы добавили свой собственный реквизит, стандартный запрос RLS его просто не увидит.

Разбираемся в режимах RLS: Стандартный против Производительного

Проанализируем технологическую основу доступа в современных версиях УНФ. Начиная с версии 3.0, конфигурация активно использует производительный режим ограничения доступа Библиотеки стандартных подсистем (БСП). Это принципиально меняет подход к разработке.

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

Если вы добавили новый реквизит в документ, система не «узнает» о нем автоматически. Чтобы ваш реквизит участвовал в фильтрации, необходимо зарегистрировать его в логике БСП. Рассмотрим, как это сделать программно.

Решение 1: Регистрация полей в модуле менеджера объекта

Выясним, как заставить систему учитывать новый или измененный реквизит при проверке прав. Для этого необходимо внести изменения в Модуль менеджера соответствующего документа. Нам потребуется переопределить процедуру ПриЗаполненииПараметровОграниченияДоступа.

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


Процедура ПриЗаполненииПараметровОграниченияДоступа(Параметры) Экспорт

	Настройки = Параметры.Настройки;
	
	// Указываем, что документ должен ограничиваться по значению контрагента
	// "Контрагент" здесь — это имя реквизита в документе
	Настройки.ОбъектПроверяетсяПоГруппамДоступаОбособленно = Истина;
	Настройки.ДобавитьОграничениеДоступа(Настройки.Поля.Контрагент, "Контрагенты");

КонецПроцедуры

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

Решение 2: Исправление ролей и шаблонов RLS

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

Выясним алгоритм действий для исправления ролей:

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

Пример текста ограничения в роли:

#ПоЗначению("Документ.РасходСоСчета","Чтение","", "Контрагенты", "Контрагент", "", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","", "","")

Решение 3: Проверка «Административных» ролей

Частая ошибка — наличие у пользователя лишних ролей. Посмотрим на ситуацию глазами системы: если у пользователя 10 ролей с RLS, а 11-я роль (например, какая-нибудь техническая роль УдаленныйДоступОбменДанными) дает право на чтение документа без RLS, то пользователь увидит все документы. Права в 1С всегда суммируются в сторону расширения.

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

Решение 4: Принудительное обновление ключей доступа

Если вы уверены, что настройки верны, а код написан правильно, но RLS всё равно «глючит», причина может быть в устаревшем кэше прав. В производительном режиме RLS данные о правах хранятся в регистрах сведений КлючиДоступаКОбъектам и КлючиДоступаПользователей.

Проанализируем способы обновления:


ПараметрыОбновления = УправлениеДоступомСлужебный.ПараметрыОбновленияДоступа();
ПараметрыОбновления.СпискиДляОбновления.Добавить(Метаданные.Документы.РасходСоСчета);
УправлениеДоступомСлужебный.ОбновитьДоступ(ПараметрыОбновления);

Подведем итоги: чек-лист для исправления RLS

Для успешного решения проблемы пройдемся по следующим шагам:

  1. Проверка функциональных опций: Убедитесь, что в «Настройках пользователей и прав» включена опция «Ограничивать доступ на уровне записей» и включены «Группы доступа контрагентов».
  2. Проверка заполнения: Убедитесь, что во ВСЕХ карточках контрагентов заполнено поле «Группа доступа», и эти же группы прописаны в профилях групп доступа соответствующих пользователей.
  3. Анализ реквизитов документа: Если вы добавили свой реквизит контрагента или используете табличные части — типовой RLS работать не будет. Требуется доработка модуля менеджера (ПриЗаполненииПараметровОграниченияДоступа).
  4. Аудит ролей: Исключите наличие ролей без шаблонов RLS у пользователя (особенно ролей типа «Полные права» или технических системных ролей).
  5. Регламентные операции: Выполните полное обновление ключей доступа через административные процедуры БСП.

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

← На главную