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