При настройке прав доступа для пользователей с ограниченными ролями в конфигурации «1С:Управление торговлей 11» разработчики нередко сталкиваются с ситуацией, когда при открытии общего журнала (например, РеестрТорговыхДокументов) возникает аварийное завершение работы формы со следующей ошибкой:
{ЖурналДокументов.РеестрТорговыхДокументов.Форма.ФормаСписка.Форма(162)}: Поле объекта не обнаружено (Организация)
Ошибка проявляется в коде при попытке прямого обращения к элементу формы:
Элементы.Организация.Видимость = ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоОрганизаций");
Разберем детально механизм платформы 1С, приводящий к такому поведению, и рассмотрим практические способы решения этой проблемы без выдачи пользователям избыточных административных прав.
Графа журнала документов объединяет в себе одноименные реквизиты различных видов документов, зарегистрированных в составе этого журнала. Механизм прав платформы устроен следующим образом:
Элементы управляемой формы.Элементы.Организация. Поскольку платформа удалила элемент из коллекции из-за нехватки прав, обращение вызывает исключение «Поле объекта не обнаружено».Предоставлять пользователю права на все документы системы, включенные в единый реестр, чаще всего недопустимо по соображениям безопасности. Чтобы форма открывалась корректно, перехватим обработчик инициализации формы в расширении конфигурации и заменим прямое обращение на безопасный поиск элемента.
Рассмотрим пример кода в расширении для формы списка журнала документов с директивой &Вместо или &После:
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
ЭлементОрганизация = Элементы.Найти("Организация");
Если ЭлементОрганизация <> Неопределено Тогда
ЭлементОрганизация.Видимость = ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоОрганизаций");
КонецЕсли;
КонецПроцедуры
Проанализируем этот подход: метод Найти() возвращает Неопределено, если элемент был исключен платформой. Ошибка исчезает, форма успешно открывается, а колонка просто скрывается у пользователя, не нарушая работу интерфейса.
Если пользователю действительно необходимо видеть графу «Организация» в журнале, разберем по шагам, как выдать права минимально необходимым объемом:
РеестрТорговыхДокументов.Организация.Организация (самому документу при этом достаточно оставить право «Чтение», не открывая просмотр всех его полей, сумм и табличных частей).Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника().Журнал РеестрТорговыхДокументов исторически проектировался как сквозной инструмент и слабо приспособлен для профилирования прав. В конфигурации «Управление торговлей 11» предусмотрены специализированные раздельные рабочие места, не требующие открытия доступа ко всей базе сразу:
Документы продажи (все) в разделе Продажи. В нем доступна типовая команда Печать → Реестр документов, а также стандартная возможность меню Еще → Вывести список... для формирования печатного реестра.Внутренние документы (все) в разделе Склад и доставка. Он ограничен исключительно складским контуром.Документы закупки (все) в разделе Закупки.Журнал учета оригиналов первичных документов, позволяющее отслеживать состояние первичных документов без конфликта прав.Если требуется выводить сводный список документов произвольных типов в рамках единой печатной формы, оптимальным решением является внешний отчет на Системе компоновки данных (СКД).
В тексте запроса набора данных обязательно используем конструкцию ВЫБРАТЬ РАЗРЕШЕННЫЕ:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
"Реализация товаров и услуг" КАК ТипДокумента,
Ссылка КАК Документ,
Номер КАК Номер,
Дата КАК Дата,
Организация КАК Организация,
СуммаДокумента КАК Сумма
ИЗ
Документ.РеализацияТоваровИУслуг
ГДЕ
Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ РАЗРЕШЕННЫЕ
"Перемещение товаров",
Ссылка,
Номер,
Дата,
Организация,
0
ИЗ
Документ.ПеремещениеТоваров
ГДЕ
Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
Такой отчет автоматически отфильтрует данные по доступным пользователю ограничениям и не вызовет платформенных ошибок при нехватке прав на отдельные типы документов.