Почему после добавления роли в расширение пропадают реквизиты и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием
← На главную

При разработке расширений в системе 1С:Предприятие 8.3 программисты часто сталкиваются с загадочным поведением: после добавления новой роли в расширение, реквизиты, созданные в этом же расширении, внезапно исчезают с экранных форм. Это происходит даже у пользователей с полными правами и у администраторов системы. В конфигураторе мы видим реквизит и элемент формы, а в режиме «Предприятие» поле просто отсутствует, как будто его и не было.

Рассмотрим подробно причины этого явления, разберем механизм работы прав в расширениях и выясним, как вернуть видимость объектов по шагам.

Причина проблемы: Смена модели безопасности «Все или ничего»

Проанализируем логику работы платформы 1С. До тех пор, пока в вашем расширении нет ни одной роли, платформа считает это расширение «полностью доверенным». В этом случае доступ к любым новым объектам (справочникам, документам) или реквизитам, добавленным через расширение, предоставляется всем пользователям информационной базы автоматически. Особенно это касается пользователей с ролью ПолныеПрава из основной конфигурации.

Однако, как только вы добавляете в расширение хотя бы одну собственную роль (или заимствуете типовую), механизм автоматического предоставления прав отключается. Платформа переходит в режим строгого ограничения. Теперь она считает, что если в расширении появились роли, то вы берете управление безопасностью этого расширения на себя. Это означает:

  1. Права на любые новые объекты расширения должны быть явно прописаны в ролях именно этого расширения.
  2. Эти роли должны быть явно назначены пользователям, включая администраторов.
  3. Роль ПолныеПрава из основной конфигурации больше не дает автоматического доступа к элементам расширения, если в расширении определена своя структура прав.

Шаг 1. Проверка прав в роли расширения

Выясним, отмечены ли права на «потерянные» реквизиты. Если вы добавили роль в расширение для решения узкой задачи (например, дать доступ к одному регистру), вам необходимо расширить эту роль или создать новую «административную» роль внутри расширения. Проверьте следующие пункты:

Важный нюанс: Если у пользователя нет прав на просмотр реквизита на уровне метаданных, платформа при генерации формы просто удалит соответствующий элемент управления. Именно поэтому программная установка Элементы.ИмяРеквизита.Видимость = Истина не срабатывает — элемента уже нет в коллекции формы к моменту выполнения кода.

Шаг 2. Создание роли для администратора в расширении

Посмотрим на ситуацию со стороны администратора. Чтобы он снова увидел пропавшие данные, рекомендуется создать в расширении специальную роль, назовем ее, например, расш_ПолныеПрава. В этой роли следует отметить права на все объекты и реквизиты, которые были добавлены или изменены в рамках данного расширения.

После создания роли ее необходимо включить в профиль групп доступа или назначить пользователю напрямую. Без этого даже «суперпользователь» будет видеть интерфейс основной конфигурации без дополнений расширения.

Шаг 3. Программное назначение ролей

Иногда возникают ситуации (особенно в типовых конфигурациях вроде ERP или УТ 11), когда новая роль из расширения не сразу появляется в списках выбора «Профилей групп доступа» Библиотеки Стандартных Подсистем (БСП). В этом случае роль можно назначить программно. Рассмотрим пример кода, который перебирает пользователей информационной базы и добавляет им нужную роль из расширения:


&НаСервере
Процедура НазначитьРольНаСервере()
    Для Каждого ТекущийПользовательИБ Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
        // Добавляем роль из расширения по ее метаданным
        ТекущийПользовательИБ.Роли.Добавить(Метаданные.Роли.расш_МояНоваяРоль);
        Попытка
            ТекущийПользовательИБ.Записать();
        Исключение
            Сообщить("Не удалось записать пользователя: " + ТекущийПользовательИБ.Имя);
        КонецПопытки;
    КонецЦикла;
КонецПроцедуры

Этот метод позволяет быстро вернуть доступ всем пользователям, не дожидаясь обновления кэша идентификаторов метаданных БСП.

Шаг 4. Обновление идентификаторов метаданных

Проанализируем, почему роль может быть не видна в интерфейсе. В типовых конфигурациях за список ролей отвечают справочники идентификаторов. Если вы добавили роль в расширение, БСП может об этом «не знать». Чтобы исправить это в пользовательском режиме (если у вас административные права), можно запустить обработку ОбновлениеИдентификаторовОбъектовМетаданных или дождаться автоматического обновления при первом входе после установки расширения. Также полезно вызвать метод Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанные().

Шаг 5. Работа с кэшем и режимом совместимости

Если права настроены, роли назначены, но реквизиты все равно не появились, стоит обратить внимание на технические моменты:

  1. Кэш сервера 1С: Расширения активно кэшируются. Попробуйте перезагрузить службу кластера серверов 1С или обновить расширение, изменив в нем любое незначительное свойство (например, комментарий) и сохранив его.
  2. Заимствование форм: Если реквизит добавлен в расширение, а форма, на которой он расположен, заимствована без изменений, платформа иногда может использовать старый макет формы. Попробуйте заново «вытащить» реквизит на заимствованную форму в конфигураторе расширения.
  3. Режим совместимости: Убедитесь, что режим совместимости расширения совпадает с режимом совместимости основной конфигурации. Начиная с версии платформы 8.3.15, механизмы работы с ролями стали более стабильными, но старые режимы (ниже 8.3.11) имеют существенные ограничения на использование ролей в расширениях.

Рекомендация по проектированию расширений

Чтобы избежать подобных проблем в будущем, придерживайтесь золотого правила: если вы решили использовать свои роли в расширении, всегда создавайте минимум две. Одна роль должна предоставлять полные права на все объекты расширения для администраторов, а вторая (и последующие) — ограничивать доступ для конкретных групп пользователей. Никогда не оставляйте расширение с ролями без «административной» роли, иначе вы рискуете потерять видимость собственных доработок в самый неподходящий момент.

← На главную