В типовой конфигурации 1С:Зарплата и управление персоналом 3.1 часто возникает ситуация, когда кадровые специалисты имеют возможность нажать гиперссылку «Исправить» в документах (например, «Отпуск», «Больничный лист»), которые уже были рассчитаны и утверждены сотрудниками расчетного отдела. Это приводит к созданию нового исправительного документа в периоде, который расчетчик считает закрытым или требующим особого контроля. Рассмотрим подробно, как можно ограничить этот функционал, не прибегая к глобальным датам запрета для всей организации.
Прежде чем переходить к блокировке, проанализируем, как работает этот механизм. Кнопка (или гиперссылка) «Исправить» появляется в формах так называемых многофункциональных документов автоматически. Это происходит в двух случаях:
ПерерасчетВыполнен или флажок «Расчет утвержден» на форме).Проблема заключается в том, что даже если у кадровика нет прав на расчет зарплаты, программа по умолчанию позволяет ему инициировать процесс исправления, создавая «черновик» исправительного документа. Выясним, какими способами можно это предотвратить.
Рассмотрим наиболее «мягкий» вариант, не требующий программирования. Платформа 1С позволяет администратору настраивать видимость элементов формы и тиражировать эти настройки на группы пользователей. Разберем этот процесс по шагам:
Документ.Отпуск).Важный нюанс: Этот метод скрывает кнопку только визуально. Опытный пользователь может вернуть ее через те же настройки формы, если у него есть на это права. Поэтому данный способ подходит для защиты от случайных действий, но не является строгим запретом.
Проанализируем ситуацию с датами запрета. Часто от этого метода отказываются, считая, что он закрывает период сразу для всех. Однако в 1С реализован механизм персональных дат запрета. Выясним, как это применить:
В разделе «Администрирование» — «Дату запрета изменения данных» установим переключатель в положение «По пользователям». Это позволит нам установить дату запрета для группы «Кадровики» на конец прошлого месяца, в то время как для группы «Расчетчики» период останется открытым. В этом случае при попытке нажать «Исправить» в документе прошлого периода программа выдаст сообщение о невозможности записи нового документа в закрытом периоде.
Если требуется гарантированный запрет на уровне программного кода, наиболее правильным методом будет использование Расширения конфигурации. Большинство документов ЗУП используют единые механизмы для вывода панели исправлений. Проанализируем программную часть:
За вывод кнопок исправления отвечает общий модуль ИсправлениеДокументовЗарплатаКадры. Мы можем создать расширение и перехватить процедуру, которая определяет видимость команд исправления. Рассмотрим пример логики кода в расширении:
&После("ПриСозданииНаСервере")
Процедура ИЗМ_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем наличие роли Расчетчик или ПолныеПрава
Если Не РольДоступна("ДобавлениеИзменениеНачисленийЗарплаты")
И Не РольДоступна("ПолныеПрава") Тогда
// Находим элемент формы, отвечающий за исправление
ЭлементИсправить = ЭтаФорма.Команды.Найти("Исправить");
Если ЭлементИсправить <> Неопределено Тогда
ЭлементИсправить.Видимость = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот метод хорош тем, что он работает централизованно. Достаточно один раз «зацепиться» за общий механизм, и кнопка исчезнет во всех многофункциональных документах (Отпусках, Больничных, Командировках) для всех кадровиков сразу.
Посмотрим на ситуацию со стороны безопасности данных. Даже если кнопка скрыта, документ может быть создан программно или через копирование. Чтобы исключить это, создадим в расширении подписку на событие ПередЗаписью для группы документов. Разберем алгоритм проверки:
Процедура ПередЗаписьюДокументаДляКадровика(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Проверяем, является ли документ исправительным
// У исправительных документов заполнено поле ИсправляемыйДокумент
Если ЗначениеЗаполнено(Источник.ИсправляемыйДокумент) Тогда
// Проверяем права текущего пользователя
Если Не ПравоДоступа("ИнтерактивноеДобавление", Метаданные.Документы.НачислениеЗарплаты) Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "У вас недостаточно прав для создания исправительных документов.
Обратитесь в расчетный отдел.";
Сообщение.Сообщить();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В данном примере мы используем проверку права на документ НачислениеЗарплаты как косвенный признак того, является ли пользователь расчетчиком. Если права на расчет отсутствуют, система заблокирует запись любого документа, у которого заполнено поле ИсправляемыйДокумент.
Разберем самый сложный, но «штатный» с точки зрения архитектуры способ — RLS (Record Level Security). В конфигураторе можно настроить профиль групп доступа так, чтобы для ролей кадровика действовало ограничение на изменение документов, у которых реквизит ИсправляемыйДокумент не является пустым.
Проанализируем плюсы и минусы RLS:
Выяснив все возможные варианты, мы рекомендуем следующий порядок действий:
Использование расширений позволяет сохранить конфигурацию на поддержке, что критически важно для ЗУП, которая обновляется практически ежемесячно из-за изменений в законодательстве. Программный метод через расширение гарантирует, что ваши настройки не «слетят» при очередном обновлении релиза.