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