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

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

Разберем классическую ситуацию при разработке на платформе 1С:Предприятие 8.3: вы добавили новый реквизит в табличную часть существующего документа (например, Документ.ЗаказПокупателя) через расширение конфигурации. Вы вывели его на форму, проверили под учетной записью с полными правами — все отлично работает. Однако, как только заходит рядовой пользователь с ограниченными правами, новый реквизит бесследно исчезает. При этом в отладке внутри Объект.Товары данные присутствуют, а вот в ЭтаФорма.Элементы колонки уже нет.

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

Причина 1: Недостаток прав на заимствованный объект в роли расширения

Чаще всего корень проблемы кроется в неочевидной логике работы платформы с ролями в расширениях. При добавлении реквизита в заимствованный объект мы создаем новую роль в расширении (или заимствуем существующую). Обычно разработчик просто ставит галочки на права "Просмотр" и "Редактирование" для самого нового реквизита. Однако этого недостаточно!

Разберем по шагам, как правильно настроить права:

  1. Откройте роль в вашем расширении.
  2. Найдите сам заимствованный объект (например, документ ЗаказПокупателя), к которому вы добавили реквизит.
  3. Убедитесь, что у этой роли в расширении установлены права на сам объект: как минимум "Чтение" и "Просмотр". Без доступа к самому документу внутри контекста расширения, платформа не даст пользователю увидеть новые реквизиты, даже если на них права выданы явно.
  4. Если реквизит нужно редактировать, добавьте права на изменение объекта в этой же роли.

Второй, более "экологичный" путь решения этой задачи — заимствовать в расширение все роли из основной конфигурации, под которыми работает данный пользователь и которые дают ему доступ к этому документу. Если вы добавите права на ваш новый реквизит прямо в заимствованные роли пользователей (в расширении), элементы начнут корректно отображаться. Для быстрого определения ролей с доступом к объекту и использующих их профилей подойдёт обработка для проверки прав доступа на объекты метаданных.

Причина 2: Роль добавлена, но не включена в профиль групп доступа (БСП)

В современных конфигурациях 1С (УТ 11, ERP, КА 2, БП 3.0), построенных на базе Библиотеки стандартных подсистем (БСП), недостаточно просто создать роль в конфигураторе. Проанализируем действия в режиме 1С:Предприятие:

Если вы создали собственную роль в расширении, она не применится к пользователю автоматически, даже если вы назначили ее в качестве основной роли расширения. Вам необходимо:

  1. Запустить базу в режиме "1С:Предприятие" под администратором.
  2. Перейти в раздел администрирования настроек пользователей и прав.
  3. Открыть справочник "Профили групп доступа".
  4. Найти профиль, который назначен проблемному пользователю, или создать новый профиль для вашего расширения.
  5. Нажать кнопку Обновить роли (это заставит БСП "увидеть" новые роли из расширения).
  6. Отметить галочкой вашу новую роль из расширения и сохранить профиль.

После перезахода пользователя в программу реквизит должен появиться.

Причина 3: Кэш платформы и необходимость реструктуризации

Иногда настройки ролей выполнены идеально, но платформа все равно "не видит" элемент формы. Это связано с кэшированием метаданных и особенностями хранения структуры расширений в базе данных.

Посмотрим, какие действия помогут принудительно обновить кэш и метаданные:

  1. Чистка кэша: Удалите временные файлы платформы на клиенте. Однако часто проблема кроется в серверном кэше.
  2. Перезапуск сервера: Если у вас клиент-серверный вариант работы, перезапуск службы "Агент сервера 1С:Предприятия" может решить проблему "зависших" метаданных.
  3. Принудительная реструктуризация: Это очень действенный "трюк". Добавьте в расширение любой фиктивный реквизит (например, типа Булево), обновите конфигурацию базы данных, а затем удалите этот реквизит и обновите базу еще раз. Это заставит СУБД физически перестроить таблицы расширения и обновить внутренние связи прав и метаданных.

Причина 4: Влияние RLS (Разграничение прав на уровне записей)

Если в основной конфигурации включено ограничение прав доступа на уровне записей (RLS), и документ подчиняется этим правилам (например, доступ ограничен по Организациям или Группам доступа партнеров), ваша роль в расширении также должна корректно с ними взаимодействовать.

Если собственная роль расширения дает доступ к объекту на чтение, но не содержит шаблонов RLS, которые есть в типовых ролях, платформа может отсекать доступ к данным объекта при формировании формы, и добавленные поля могут оказаться недоступными. Выясним, как это обойти: старайтесь заимствовать типовые роли и добавлять права на реквизит в них, либо тщательно копируйте условия RLS из основной конфигурации в вашу новую роль в расширении. Для комплексного анализа ролей, профилей и ограничений RLS можно использовать инструмент для комплексного анализа и настройки прав доступа.

Причина 5: Программное скрытие реквизитов в коде типовой конфигурации

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

Если при отладке в начале процедуры ПриСозданииНаСервере вашего элемента нет в коллекции ЭтаФорма.Элементы, проверьте, не прячется ли он платформой. Если элемент есть, но исчезает позже, значит его скрывает типовой код.

Рассмотрим пример кода, как можно принудительно вернуть видимость нашему элементу в расширении с помощью аннотации &После:


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

КонецПроцедуры

Причина 6: Связь с функциональными опциями (ФО)

Обратите внимание на то, куда именно вы вывели ваш реквизит. Если вы добавили колонку в табличную часть, которая регулируется Функциональной опцией (ФО) в основной конфигурации, ваш реквизит может унаследовать это поведение.

Если ФО выключена в настройках программы, вся группа элементов или табличная часть может быть скрыта. Убедитесь, что родительский элемент формы не скрыт платформой из-за выключенной функциональной опции. При необходимости отвяжите свой элемент от влияния чужой ФО.

Причина 7: Пользовательские настройки формы

Самая банальная, но частая проблема: платформа однажды сохранила состояние формы для конкретного пользователя, когда у него еще не было прав на ваш реквизит, или он случайно скрыл колонку самостоятельно.

Попросите пользователя нажать кнопку Еще - Изменить форму....
Если реквизит есть в списке, но галочка снята — достаточно просто установить ее. Если реквизит отображается в дереве элементов серым цветом или вообще отсутствует, нажмите Еще - Установить стандартные настройки. Это сбросит кэш пользовательских настроек (хранилище настроек) и перестроит форму по умолчанию.

Причина 8: Свойство "Использовать всегда"

Платформа 1С оптимизирует объем передаваемых данных между сервером и клиентом. Если она считает, что данные реквизита не нужны на клиентской части (например, он скрыт у пользователя или нет явного к нему обращения), она может вообще не получать его значения.

Перейдите в конфигураторе в расширении в список реквизитов формы. Найдите объект, содержащий ваш новый реквизит. Установите галочку в колонке Использовать всегда напротив вашего реквизита. Это гарантирует платформе, что данные этого поля обязательно должны присутствовать в контексте формы на клиенте, независимо от текущих настроек видимости.

Подведем итоги

Работа с расширениями в 1С требует понимания множества взаимосвязей. Если ваш реквизит невидим пользователю без полных прав, выполните следующий чек-лист:

  1. Проверьте, есть ли у роли расширения права на сам объект документа (Просмотр, Чтение), а не только на реквизит.
  2. Убедитесь, что новая роль добавлена в профиль группы доступа пользователя в режиме "Предприятие".
  3. Сбросьте пользовательские настройки формы (Изменить форму - Установить стандартные настройки).
  4. Принудительно реструктуризируйте расширение (добавив и удалив тестовый реквизит).
  5. Убедитесь, что типовой код основной конфигурации не скрывает элемент программно, и при необходимости перехватите установку видимости процедурой &После.

Применяя эти шаги, вы гарантированно решите проблему с отображением реквизитов и сэкономите массу времени на отладке прав доступа.

← На главную