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