Ситуация, когда программист создает полную копию существующей роли в конфигураторе, но пользователь с этой новой ролью теряет доступ к определенным полям или кнопкам, является классической проблемой для систем на базе 1С:Предприятие. На первый взгляд это кажется нелогичным: если права в дереве метаданных идентичны, то и поведение системы должно быть одинаковым. Однако в современных конфигурациях (особенно в 1С:Бухгалтерия 2.0 и выше) механизмы ограничения прав давно вышли за пределы простого проставления галочек в конфигураторе.
Разберем подробно причины этого явления и методы их устранения, чтобы вернуть доступ к нужным реквизитам, таким как ЦенаВключаетНДС в документе СчетНаОплатуПоставщику.
Самая распространенная причина заключается в том, что разработчики конфигурации используют «жесткое» кодирование (hardcode) имен ролей непосредственно в программных модулях. Система может проверять не наличие конкретного права на объект, а именно факт наличия у пользователя роли с конкретным именем.
Когда вы копируете роль, вы даете ей новое имя (например, ДобавлениеИзменениеДанныхБухгалтерии_Копия). Для программного кода это совершенно незнакомая роль, даже если внутри нее права настроены один в один как в оригинале. Рассмотрим, как это выглядит в коде:
Если РольДоступна("ДобавлениеИзменениеДанныхБухгалтерии") Тогда
ЭлементыФормы.ЦенаВключаетНДС.Доступность = Истина;
Иначе
ЭлементыФормы.ЦенаВключаетНДС.Доступность = Ложь;
КонецЕсли;
В данном примере, если у пользователя установлена ваша новая роль, проверка вернет Ложь, и поле станет недоступным.
Что нужно сделать:
РольДоступна() или ВводДоступен(), значит, вам придется либо добавить свою новую роль в это условие, либо изменить логику проверки.В конфигурациях, использующих элементы БСП, права управляются через специальные справочники и регистры. Простого добавления роли в конфигураторе недостаточно, чтобы система начала учитывать ее в своих алгоритмах.
Проанализируем работу справочника Идентификаторы объектов метаданных. Система хранит в нем список всех ролей, объектов и прав. Если вы создали роль копированием, она может не попасть в этот справочник автоматически или не связаться с нужными профилями доступа.
Рассмотрим шаги для обновления данных:
Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника();
/С ЗапуститьОбновлениеИнформационнойБазы в строке запуска.Часто доступность таких полей, как ЦенаВключаетНДС, регулируется не только правами, но и бизнес-логикой в процедурах ПриОткрытии() или ПриЧтенииНаСервере(). Выясним причину, используя отладчик. Это самый надежный способ понять, где именно "срезаются" права.
Разберем по шагам процесс отладки:
СчетНаОплатуПоставщику в процедуре ПередОткрытием или ПриОткрытии.ЭлементыФормы.ЦенаВключаетНДС.Доступность.Истина на Ложь, изучите стек вызовов. Вероятно, управление передается в общий модуль, где происходит проверка прав.В Бухгалтерии 2.0 и более поздних версиях используется механизм профилей групп доступа. Когда вы заменяете штатную роль на свою в профиле, система должна пересчитать права доступа в регистрах сведений. Иногда этот процесс не завершается корректно из-за кэширования.
Проанализируем ситуацию с кэшем. Удаление базы из списка и очистка временных файлов пользователя (папки AppData\Local\1C) — это правильные шаги, но иногда требуется «серверная» очистка. Если база клиент-серверная, попробуйте перезапустить службу 1С:Предприятия.
Совет по работе с профилями: Вместо полной замены штатной роли на свою копию, рассмотрите возможность создания дополнительной роли. В 1С права суммируются. Если вам нужно что-то ограничить, штатную роль лучше оставить (чтобы не ломать программные проверки), а ограничения наложить через новую роль или через механизм RLS (Row Level Security), если это возможно.
Проверьте, не завязана ли видимость или доступность поля на функциональные опции, которые могут быть недоступны новой роли. Хотя поле ЦенаВключаетНДС обычно зависит от учетной политики, в сложных конфигурациях доступ к изменению настроек налогового учета может быть жестко ограничен списком «доверенных» ролей в модуле управления доступом.
Подведем итог: если две идентичные роли работают по-разному, значит, конфигурация обращается к роли не через механизм метаданных, а через ее Имя в программном коде или в служебных справочниках БСП.
Наиболее правильным решением будет:
ИдентификаторыОбъектовМетаданных.Доступность.Помните, что архитектурно правильнее добавлять новые права отдельными маленькими ролями, дополняя ими стандартные профили, чем пытаться полностью заменить базовые роли конфигурации их копиями. Это значительно упростит дальнейшую поддержку и обновление вашей базы данных.