Ситуация, когда программист вносит изменения в существующую роль в конфигураторе (например, добавляет права на новые документы), сохраняет конфигурацию и обновляет базу данных, но в режиме «1С:Предприятие» права не появляются, встречается довольно часто. Это особенно характерно для современных конфигураций, построенных на базе Библиотеки стандартных подсистем (БСП). В таких системах механизмы управления доступом многослойны, и простого обновления конфигурации базы данных бывает недостаточно.
В этой статье мы подробно разберем, почему возникают задержки в обновлении прав, и рассмотрим пошаговые инструкции по принудительному обновлению вспомогательных данных и очистке кэша.
Одной из первичных причин, по которой система «не видит» изменения в метаданных, является задержка обновления внутренних идентификаторов. Для решения этой задачи разберем использование специального параметра запуска. Нам необходимо запустить сеанс «1С:Предприятие» с ключом, который инициирует процедуры обновления БСП.
Выполним следующие шаги:
/C ЗапуститьОбновлениеИнформационнойБазы
Важно: Обратите внимание на прямой слэш и букву «С» (латинская). После запуска системы под пользователем с полными правами, 1С выполнит регламентные процедуры по обновлению справочников идентификаторов объектов метаданных. После завершения процесса ключ из параметров запуска следует удалить.
Если конфигурация использует БСП, права доступа часто кэшируются в служебных регистрах. Для их актуализации существует штатный инструмент. Если у вас есть доступ к дистрибутиву БСП или вы можете найти эту обработку в составе вашей конфигурации (часто она скрыта), воспользуемся ей.
Проанализируем порядок работы с обработкой ОбновлениеВспомогательныхДанных.epf:
Этот метод позволяет принудительно пересчитать права ролей, которые в современных версиях БСП (начиная с 3.0) хранятся в специальных регистрах для ускорения работы системы.
Иногда требуется быстро обновить права программным способом, не прибегая к внешним обработкам. Разберем ситуацию, когда мы можем выполнить код во внешней обработке или через консоль кода. Для этого воспользуемся методами серверных общих модулей БСП.
Выясним, какой код поможет нам актуализировать права доступа:
// Принудительное обновление прав ролей в регистрах БСП
УправлениеДоступомСлужебный.ОбновитьПраваРолей();
// Если используется ограничение на уровне записей (RLS),
// может потребоваться обновление ключей доступа
УправлениеДоступом.ОбновитьКлючиДоступа();
Проанализируем эти команды: первая обновляет состав прав, закрепленных за ролями, вторая — актуализирует записи в регистрах, отвечающих за RLS, что критично, если вы используете профили групп доступа. При необходимости точечной актуализации прав без выполнения общих процедур подойдёт обработка для точечного пересчета прав доступа пользователей и групп.
Рассмотрим ситуацию, когда права на самом деле применились, но пользователь не видит объект. Выясним причину через проверку функциональных опций и командного интерфейса. В 1С права и видимость — это разные механизмы.
Если все вышеперечисленные методы не помогли, разберем радикальный способ — очистку кэша. Существует два вида кэша, которые могут хранить старые описания ролей:
Клиентский кэш: Очищается стандартным удалением базы из списка и повторным ее добавлением, либо удалением папок из %LOCALAPPDATA%\1C\1cv8\.
Серверный кэш: Это «тихий» убийца изменений. Даже если вы обновили всё на клиенте, сервер 1С может продолжать использовать старое описание метаданных. Процедура очистки выглядит так:
C:\Program Files\1cv8\srvinfo\reg_1541\).snccntx. В этой папке хранятся сеансовые данные и кэш метаданных.Проанализируем влияние расширений. Если в базе установлены расширения, они могут перекрывать права основной конфигурации. Посмотрим на критические моменты:
Чтобы окончательно убедиться, применились ли права, воспользуемся простым кодом. Запустим его под пользователем, у которого возникли проблемы:
ИмяДокумента = "ИмяВашегоДокумента"; // Например, "РеализацияТоваровУслуг"
Если ПравоДоступа("Чтение", Метаданные.Документы[ИмяДокумента]) Тогда
Сообщить("Право на чтение есть");
Иначе
Сообщить("Право на чтение отсутствует");
КонецЕсли;
Если этот код возвращает «Истина», а документа в интерфейсе нет — ищите проблему в Функциональных опциях или Подсистемах. Если возвращает «Ложь» — значит, не сработало именно обновление ролей/профилей в регистрах БСП или мешает кэш. Для интерактивной проверки прав и использующих их профилей можно использовать инструмент для быстрой проверки прав доступа на объект метаданных.