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