Приветствуем вас, коллеги! В практической работе с конфигурацией «1С:Зарплата и управление персоналом 3.1» (ЗУП) часто возникает классическая дилемма. Кадровой службе для сверки численности, контроля заполнения данных или формирования отчетности требуется видеть сводные зарплатные показатели — например, типовой отчет «Полный свод начислений, удержаний и выплат». Однако, если дать кадровику стандартные роли для работы с зарплатой, он получит избыточный доступ к расчетным листкам и детальным суммам начислений прямо внутри кадровых документов.
Давайте подробно разберем, почему возникает эта проблема, как устроена система разграничения прав в 1С:ЗУП 3.1, и как правильно реализовать задачу программным и административным путем.
В программе 1С:ЗУП 3.1 кадровые и расчетные документы физически объединены. Такие объекты, как Документ.Отпуск, Документ.БольничныйЛист или Документ.Командировка, содержат как кадровые реквизиты (период, вид отпуска, статьи), так и расчетные (средний заработок, суммы начислений, НДФЛ, взносы). Для кадровиков обычно используется профиль «Кадровик (без доступа к зарплате)». Этот профиль скрывает все зарплатные вкладки в этих документах.
Если мы попытаемся решить задачу получения свода простым добавлением типовых ролей чтения зарплаты (таких как ЧтениеНачисленнойЗарплаты, ЧтениеВыплаченнойЗарплаты и ЧтениеНачисленнойЗарплатыРасширенная), то кадровик мгновенно увидит все конфиденциальные финансовые расчеты во всех отпусках и больничных листах сотрудников компании. Очевидно, что такой подход нарушает корпоративную безопасность.
При первой попытке решить задачу программисты часто пробуют динамически добавлять роли текущему пользователю в коде или запускать стандартный отчет в привилегированном режиме через внешнюю обработку. Давайте выясним, почему эти методы «не взлетают»:
ПользователиИнформационнойБазы.ТекущийПользователь.Роли требует записи объекта пользователя (вызов метода Записать()). Это действие считается административным. Обычный пользователь без полных прав не может изменять состав своих ролей. Более того, даже если бы это было возможно, изменения состава ролей вступают в силу только после перезапуска сеанса работы с базой данных 1С.УстановитьПривилегированныйРежим(Истина) просто игнорируется для пользователей без административных прав.Чтобы обойти эти ограничения и предоставить кадровику возможность формировать сложный отчет «Полный свод начислений...» (который в конфигурации базируется на системном отчете АнализНачисленийИУдержаний), нам потребуется разработать специальный внешний отчет, использующий стандарты БСП (Библиотеки стандартных подсистем), и правильно настроить его интеграцию в систему.
Рассмотрим детальный алгоритм создания отчета, который сможет формировать данные по зарплате под учетной записью кадровика без расширения его прав.
Создадим новый внешний отчет в режиме «Конфигуратор»:
СводНачисленийДляКадровика.НаборДанных1). Добавим туда любое тестовое поле, чтобы СКД была валидной. На самом деле мы подменим эту схему динамически.Для того чтобы отчет правильно интегрировался с механизмами БСП и переопределял форму настроек, откроем модуль объекта созданного внешнего отчета и добавим туда следующий код:
Функция СведенияОВнешнейОбработке() Экспорт
Наименование = "Полный свод начислений (для кадровиков)";
Имя = Метаданные.Имя;
Версия = "1.1";
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = Перечисления.ВидыДополнительныхОтчетовИОбработок.ДополнительныйОтчет;
ПараметрыРегистрации.Наименование = Наименование;
// КРИТИЧЕСКИ ВАЖНО: Выключаем безопасный режим, чтобы работал привилегированный режим!
ПараметрыРегистрации.БезопасныйРежим = Ложь;
ПараметрыРегистрации.Версия = Версия;
ПараметрыРегистрации.Информация = СтрШаблон("Дополнительный отчет '%1'. Версия: %2", Наименование, Версия);
Команда = ПараметрыРегистрации.Команды.Добавить;
Команда.Представление = Наименование;
Команда.Идентификатор = Имя;
Команда.Использование = ОбщегоНазначения.ИмяЗначенияПеречисления(Перечисления.СпособыВызоваДополнительныхОбработок.ОткрытиеФормы);
Команда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
// Сообщаем БСП, что хотим обрабатывать событие создания формы на сервере
Настройки.События.ПриСозданииНаСервере = Истина;
КонецПроцедуры
Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
// Создаем экземпляр оригинального отчета по анализу начислений
ОтчетСвод = Отчеты.АнализНачисленийИУдержаний.Создать();
КлючВарианта = "ПолныйСводНачисленийУдержанийИВыплат";
// Инициализируем настройки оригинального отчета
ОтчетСвод.ИнициализироватьОтчет(КлючВарианта);
// Подменяем схему компоновки данных в контексте формы
СхемаКомпоновкиДанных = ОтчетСвод.SхемаКомпоновкиДанных;
АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, Форма.УникальныйИдентификатор);
Форма.НастройкиОтчета.АдресСхемы = АдресСхемы;
Форма.НастройкиОтчета.СхемаМодифицирована = Истина;
// Загружаем настройки варианта "Полный свод"
Если КомпоновщикНастроек.Настройки.Структура.Количество() = 0 Тогда
Вариант = СхемаКомпоновкиДанных.ВариантыНастроек.Найти(КлючВарианта);
КомпоновщикНастроек.ЗагрузитьНастройки(Вариант.Настройки);
КонецЕсли;
КонецПроцедуры
Рассмотрим подробнее, что происходит в этой части кода. Функция СведенияОВнешнейОбработке регистрирует отчет в справочнике дополнительных отчетов. Обратите внимание на свойство БезопасныйРежим = Ложь. Это ключевой параметр: без него отчет не сможет получить доступ к данным в обход прав пользователя.
Процедура ПриСозданииНаСервере подменяет пустую схему нашего внешнего отчета на оригинальную схему отчета АнализНачисленийИУдержаний. Это позволяет использовать все богатые настройки, отборы и группировки типового отчета.
Теперь опишем процедуру формирования данных. Перейдем в модуль объекта отчета и переопределим стандартное событие компоновки. Мы принудительно включим привилегированный режим, получим настройки и выведем результат в табличный документ:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Включаем привилегированный режим для чтения данных без проверки прав текущего пользователя
УстановитьПривилегированныйРежим(Истина);
// Создаем экземпляр оригинального отчета для получения его структуры и СКД
ОтчетСвод = Отчеты.АнализНачисленийИУдержаний.Создать();
КлючВарианта = "ПолныйСводНачисленийУдержанийИВыплат";
ОтчетСвод.ИнициализироватьОтчет(КлючВарианта);
// Получаем текущие настройки, которые пользователь указал на форме (период, отборы по организации и т.д.)
НастройкиОтчета = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();
// Инициализируем компоновщик макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(
ОтчетСвод.СхемаКомпоновкиДанных,
НастройкиОтчета,
ДанныеРасшифровки,
,
Тип("ГенераторМакетаКомпоновкиДанных"),
Истина
);
// Получаем внешние наборы данных, которые формируются программно модулями ЗУП
НаборыВнешнихДанных = ЗарплатаКадрыОтчеты.НаборыВнешнихДанныхАнализНачисленийИУдержаний();
// Инициализируем процессор компоновки
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, НаборыВнешнихДанных, ДанныеРасшифровки, Истина);
// Выводим результат в итоговый табличный документ на форме
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
// Отключаем привилегированный режим безопасности
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Проанализируем этот код. Поскольку отчет «Полный свод» в ЗУП 3.1 формируется на базе внешних наборов данных, которые собираются сложными алгоритмами в общих модулях, стандартный запуск макета СКД не сработает. Мы вызываем экспортный метод ЗарплатаКадрыОтчеты.НаборыВнешнихДанныхАнализНачисленийИУдержаний(), который в привилегированном режиме заполняет временные таблицы для компоновщика макета. Это гарантирует, что кадровик получит абсолютно идентичный отчет, какой получил бы расчетчик зарплаты.
После сохранения отчета в файл (с расширением .erf) выполните следующие действия в режиме предприятия:
Важное предупреждение: Помните, что привилегированный режим сработает только при запуске отчета из интерфейса дополнительных отчетов и обработок. Если кадровик попытается открыть этот файл через меню Файл -> Открыть, система выдаст ошибку прав доступа или сформирует пустой отчет.
Если в вашем штате нет программиста 1С или вы хотите решить задачу стандартными средствами администрирования, рассмотрим два альтернативных варианта.
В составе БСП есть мощный инструмент автоматизации — рассылка отчетов. Этот вариант полностью исключает человеческий фактор и необходимость кадровику заходить в закрытые зоны программы.
Как это настроить:
В результате система будет самостоятельно по расписанию формировать отчет с использованием полных прав расчетчика, конвертировать его в PDF или Excel и отправлять на почту кадровику. Кадровик вовремя получает актуальные сводные данные, при этом его права в самой информационной базе остаются минимальными и безопасными.
Для крупных организаций практикуется создание специальной дополнительной учетной записи. Например, пользователю «Иванова (Кадры)» создают вторую учетную запись «Иванова (Аудит)».
Этому второму пользователю назначается профиль «Аудитор» или копируются права расчетчика, но без прав на изменение документов (только на чтение). Кадровик заходит под этой учетной записью исключительно для формирования регламентированных отчетов по зарплате раз в месяц, а повседневную работу ведет под своей обычной учетной записью кадровика. Это минимизирует риски случайного искажения кадрово-расчетных документов.
Выбирайте наиболее подходящий для вашей компании метод и обеспечивайте надежную и безопасную работу в 1С:ЗУП 3.1!