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