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