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