Как в 1С:ЗУП 3.1 разрешить кадровику формировать расчетный свод без доступа к зарплате в документах

Программист 1С v8.3 (Управляемые формы) 1С:Зарплата и Управление Персоналом IT и автоматизация бизнеса
← На главную

Приветствуем вас, коллеги! В практической работе с конфигурацией «1С:Зарплата и управление персоналом 3.1» (ЗУП) часто возникает классическая дилемма. Кадровой службе для сверки численности, контроля заполнения данных или формирования отчетности требуется видеть сводные зарплатные показатели — например, типовой отчет «Полный свод начислений, удержаний и выплат». Однако, если дать кадровику стандартные роли для работы с зарплатой, он получит избыточный доступ к расчетным листкам и детальным суммам начислений прямо внутри кадровых документов.

Давайте подробно разберем, почему возникает эта проблема, как устроена система разграничения прав в 1С:ЗУП 3.1, и как правильно реализовать задачу программным и административным путем.

В чем заключается конфликт прав доступа?

В программе 1С:ЗУП 3.1 кадровые и расчетные документы физически объединены. Такие объекты, как Документ.Отпуск, Документ.БольничныйЛист или Документ.Командировка, содержат как кадровые реквизиты (период, вид отпуска, статьи), так и расчетные (средний заработок, суммы начислений, НДФЛ, взносы). Для кадровиков обычно используется профиль «Кадровик (без доступа к зарплате)». Этот профиль скрывает все зарплатные вкладки в этих документах.

Если мы попытаемся решить задачу получения свода простым добавлением типовых ролей чтения зарплаты (таких как ЧтениеНачисленнойЗарплаты, ЧтениеВыплаченнойЗарплаты и ЧтениеНачисленнойЗарплатыРасширенная), то кадровик мгновенно увидит все конфиденциальные финансовые расчеты во всех отпусках и больничных листах сотрудников компании. Очевидно, что такой подход нарушает корпоративную безопасность.

Почему не работают простые попытки программного обхода?

При первой попытке решить задачу программисты часто пробуют динамически добавлять роли текущему пользователю в коде или запускать стандартный отчет в привилегированном режиме через внешнюю обработку. Давайте выясним, почему эти методы «не взлетают»:

  1. Динамическое добавление ролей: Попытка программно добавить роли в коллекцию ПользователиИнформационнойБазы.ТекущийПользователь.Роли требует записи объекта пользователя (вызов метода Записать()). Это действие считается административным. Обычный пользователь без полных прав не может изменять состав своих ролей. Более того, даже если бы это было возможно, изменения состава ролей вступают в силу только после перезапуска сеанса работы с базой данных 1С.
  2. Интерактивное открытие внешнего отчета: Если пользователь пытается открыть внешний отчет через стандартное меню Файл -> Открыть, платформа 1С запускает его в контексте текущего сеанса пользователя. При этом метод УстановитьПривилегированныйРежим(Истина) просто игнорируется для пользователей без административных прав.
  3. Безопасный режим БСП: При регистрации внешнего отчета в справочнике Дополнительные отчеты и обработки система по умолчанию запускает его в безопасном режиме. В безопасном режиме использование привилегированного режима также жестко блокируется платформой.

Чтобы обойти эти ограничения и предоставить кадровику возможность формировать сложный отчет «Полный свод начислений...» (который в конфигурации базируется на системном отчете АнализНачисленийИУдержаний), нам потребуется разработать специальный внешний отчет, использующий стандарты БСП (Библиотеки стандартных подсистем), и правильно настроить его интеграцию в систему.

Пошаговое руководство по созданию внешнего отчета в привилегированном режиме

Рассмотрим детальный алгоритм создания отчета, который сможет формировать данные по зарплате под учетной записью кадровика без расширения его прав.

Шаг 1. Создание заготовки отчета в конфигураторе

Создадим новый внешний отчет в режиме «Конфигуратор»:

  1. Укажем имя отчета, например, СводНачисленийДляКадровика.
  2. Создадим пустую Основную схему компоновки данных.
  3. В схему добавим один набор данных типа «Объект» (например, с именем НаборДанных1). Добавим туда любое тестовое поле, чтобы СКД была валидной. На самом деле мы подменим эту схему динамически.

Шаг 2. Описание программного интерфейса БСП в модуле объекта отчета

Для того чтобы отчет правильно интегрировался с механизмами БСП и переопределял форму настроек, откроем модуль объекта созданного внешнего отчета и добавим туда следующий код:


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

Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
    // Сообщаем БСП, что хотим обрабатывать событие создания формы на сервере
    Настройки.События.ПриСозданииНаСервере = Истина;
КонецПроцедуры

Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
    
    // Создаем экземпляр оригинального отчета по анализу начислений
    ОтчетСвод = Отчеты.АнализНачисленийИУдержаний.Создать();
    КлючВарианта = "ПолныйСводНачисленийУдержанийИВыплат";
    
    // Инициализируем настройки оригинального отчета
    ОтчетСвод.ИнициализироватьОтчет(КлючВарианта);
    
    // Подменяем схему компоновки данных в контексте формы
    СхемаКомпоновкиДанных = ОтчетСвод.SхемаКомпоновкиДанных;
    АдресСхемы = ПоместитьВоВременноеХранилище(СхемаКомпоновкиДанных, Форма.УникальныйИдентификатор);
    Форма.НастройкиОтчета.АдресСхемы = АдресСхемы;
    Форма.НастройкиОтчета.СхемаМодифицирована = Истина;
    
    // Загружаем настройки варианта "Полный свод"
    Если КомпоновщикНастроек.Настройки.Структура.Количество() = 0 Тогда
        Вариант = СхемаКомпоновкиДанных.ВариантыНастроек.Найти(КлючВарианта);
        КомпоновщикНастроек.ЗагрузитьНастройки(Вариант.Настройки);
    КонецЕсли;
    
КонецПроцедуры

Рассмотрим подробнее, что происходит в этой части кода. Функция СведенияОВнешнейОбработке регистрирует отчет в справочнике дополнительных отчетов. Обратите внимание на свойство БезопасныйРежим = Ложь. Это ключевой параметр: без него отчет не сможет получить доступ к данным в обход прав пользователя.

Процедура ПриСозданииНаСервере подменяет пустую схему нашего внешнего отчета на оригинальную схему отчета АнализНачисленийИУдержаний. Это позволяет использовать все богатые настройки, отборы и группировки типового отчета.

Шаг 3. Обработка компоновки результата в привилегированном режиме

Теперь опишем процедуру формирования данных. Перейдем в модуль объекта отчета и переопределим стандартное событие компоновки. Мы принудительно включим привилегированный режим, получим настройки и выведем результат в табличный документ:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Включаем привилегированный режим для чтения данных без проверки прав текущего пользователя
    УстановитьПривилегированныйРежим(Истина);
    
    // Создаем экземпляр оригинального отчета для получения его структуры и СКД
    ОтчетСвод = Отчеты.АнализНачисленийИУдержаний.Создать();
    КлючВарианта = "ПолныйСводНачисленийУдержанийИВыплат";
    ОтчетСвод.ИнициализироватьОтчет(КлючВарианта);
    
    // Получаем текущие настройки, которые пользователь указал на форме (период, отборы по организации и т.д.)
    НастройкиОтчета = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();
    
    // Инициализируем компоновщик макета
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(
        ОтчетСвод.СхемаКомпоновкиДанных, 
        НастройкиОтчета, 
        ДанныеРасшифровки, 
        , 
        Тип("ГенераторМакетаКомпоновкиДанных"), 
        Истина
    );
    
    // Получаем внешние наборы данных, которые формируются программно модулями ЗУП
    НаборыВнешнихДанных = ЗарплатаКадрыОтчеты.НаборыВнешнихДанныхАнализНачисленийИУдержаний();
    
    // Инициализируем процессор компоновки
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных, НаборыВнешнихДанных, ДанныеРасшифровки, Истина);
    
    // Выводим результат в итоговый табличный документ на форме
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
    
    // Отключаем привилегированный режим безопасности
    УстановитьПривилегированныйРежим(Ложь);
    
КонецПроцедуры

Проанализируем этот код. Поскольку отчет «Полный свод» в ЗУП 3.1 формируется на базе внешних наборов данных, которые собираются сложными алгоритмами в общих модулях, стандартный запуск макета СКД не сработает. Мы вызываем экспортный метод ЗарплатаКадрыОтчеты.НаборыВнешнихДанныхАнализНачисленийИУдержаний(), который в привилегированном режиме заполняет временные таблицы для компоновщика макета. Это гарантирует, что кадровик получит абсолютно идентичный отчет, какой получил бы расчетчик зарплаты.

Шаг 4. Подключение отчета в пользовательском режиме

После сохранения отчета в файл (с расширением .erf) выполните следующие действия в режиме предприятия:

  1. Перейдите в раздел Администрирование -> Печатные формы, отчеты и обработки -> Дополнительные отчеты и обработки.
  2. Нажмите кнопку Добавить из файла и выберите созданный файл отчета.
  3. Обратите внимание на предупреждение безопасности: система может предложить запустить отчет в безопасном режиме. Отклоните это предложение (безопасный режим должен быть выключен, иначе данные не прочитаются).
  4. В разделе размещения укажите кадровые разделы интерфейса (например, подсистему «Кадры»).
  5. В списке пользователей укажите конкретных сотрудников кадровой службы, которым разрешен доступ к этой команде.

Важное предупреждение: Помните, что привилегированный режим сработает только при запуске отчета из интерфейса дополнительных отчетов и обработок. Если кадровик попытается открыть этот файл через меню Файл -> Открыть, система выдаст ошибку прав доступа или сформирует пустой отчет.

Альтернативные административные решения (без написания кода)

Если в вашем штате нет программиста 1С или вы хотите решить задачу стандартными средствами администрирования, рассмотрим два альтернативных варианта.

Вариант 1. Использование встроенного механизма «Рассылка отчетов»

В составе БСП есть мощный инструмент автоматизации — рассылка отчетов. Этот вариант полностью исключает человеческий фактор и необходимость кадровику заходить в закрытые зоны программы.

Как это настроить:

  1. Зайдите под учетной записью администратора или расчетчика в раздел Администрирование -> Извещения и рассылки -> Рассылки отчетов.
  2. Создайте новую рассылку. В качестве получателя укажите электронную почту кадровика.
  3. В табличную часть добавьте типовой отчет «Полный свод начислений, удержаний и выплат».
  4. Настройте расписание (например, каждый понедельник в 9:00 или в последний день месяца).
  5. В поле «Отправлять от имени» укажите учетную запись расчетчика (у которого есть полные права на зарплату).

В результате система будет самостоятельно по расписанию формировать отчет с использованием полных прав расчетчика, конвертировать его в PDF или Excel и отправлять на почту кадровику. Кадровик вовремя получает актуальные сводные данные, при этом его права в самой информационной базе остаются минимальными и безопасными.

Вариант 2. Заведение «технического» пользователя

Для крупных организаций практикуется создание специальной дополнительной учетной записи. Например, пользователю «Иванова (Кадры)» создают вторую учетную запись «Иванова (Аудит)».

Этому второму пользователю назначается профиль «Аудитор» или копируются права расчетчика, но без прав на изменение документов (только на чтение). Кадровик заходит под этой учетной записью исключительно для формирования регламентированных отчетов по зарплате раз в месяц, а повседневную работу ведет под своей обычной учетной записью кадровика. Это минимизирует риски случайного искажения кадрово-расчетных документов.

Выбирайте наиболее подходящий для вашей компании метод и обеспечивайте надежную и безопасную работу в 1С:ЗУП 3.1!

← На главную