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