Вечная проблема – выяснение, кто прав, между кадровиками и бухгалтерией. Наверняка есть организации, где этой проблемы не существует, но я еще такой компании не встречал. Проблемы обостряются после перехода с ЗУП 2.5 на ЗУП 3.1.
Дело в том, что разработчик конфигурации убрал разделение между документами кадровыми и документами начисления. Грубо говоря – в ЗУП 3.1 кадровый документ это документ и для расчетчика. То есть и расчетчики, и кадровики пользуются одними и теми же документами. Кадровик видит свою часть, которая необходима ему для работы, а расчетчик видит свою часть. Разработчик поделил функциональность и дал возможность регулировать ее в «Профиле групп доступа»(Ролями). Все бы ничего, но есть небольшие проблемы:
- Кадровикам нужен доступ к печати «Справки расчета».
- Кадровикам нужна возможность изменять начисления в кадровых переводах.
- Кадровикам нужна возможность посмотреть начисляемый ФОТ и размер аванса.
Все эти возможности у кадровиков есть, но только при включенных ролях «ЧтениеДанныхДляНачисленияЗарплатыРасширенная» или «ДобавлениеИзменениеДанныхДляНачисленияЗарплатыРасширенная». Вроде бы добавь в «Профиль групп доступа» кадровику эти роли и все будет работать, а нет!
При включении любой из этих ролей в набор прав «Кадровика» появляется одна особенность – в некоторых документах автоматически рассчитывается средний заработок и устанавливается галочка «Расчет утвердил». То есть при включенных ролях кадровик, формируя отпуск сотруднику, при создании самого документа автоматом устанавливается галочка «Расчет утвердил», а так же рассчитывается средний заработок, плюс открывается вкладка «Начислено (подробно)». Далее расчетчик в своем списке документов уже видит, что документ рассчитан (документ не выделен жирным цветом) и не обрабатывает его. Так же бывает так, что расчетчик, рассчитав зарплату за месяц (Бывает хуже, если уже выплатили зарплату), обнаруживает, перерасчет некоторых сотрудников (Оказывается, что кадровики задним числом провели отпуск или командировку или же оклад поменяли кому либо). Расчетчик в недоумении откуда разность в начислении и выплате щелкает по всем отчетам и ищет источник возникшей проблемы, тратя на это кучу времени и сил в дальнейших выяснениях отношений с кадрами. На мой взгляд - это не совсем правильно.
При выключенных ролях «ЧтениеДанныхДляНачисленияЗарплатыРасширенная» или «ДобавлениеИзменениеДанныхДляНачисленияЗарплатыРасширенная». Ситуация в ЗУП 3.1 такова: кадровик создает приказ о переводе сотрудника на другую должность. Так же кадровику требуется увеличить оклад, но кадровик не видит вкладку «Оплата труда». В данной ситуации изменить оклад может только расчетчик, потому что у него вышеперечисленные роли как раз включены в «Профиль групп доступа». Я согласен с тем, что нужно подстраиваться под программу и изменять сам процесс работы кадровиков и расчетчиков, но по разным причинам не всегда это удается.
Такая же ситуация и с другими документами.
Решение:
- Включить кадровикам роль «ЧтениеДанныхДляНачисленияЗарплатыРасширенная» и обязательно отключить роль «ДобавлениеИзменениеДанныхДляНачисленияЗарплатыРасширенная» .
- Если конфигурация на поддержке, то снять ее с поддержки. Снять с поддержки рекомендую только один общий модуль, дабы обновлять было в дальнейшем легче. С поддержки снимаем общий модуль «ЗарплатаКадрыРасширенный».
- Далее открываем общий модуль «ЗарплатаКадрыРасширенный», ищем в нем функцию «ПраваНаМногофункциональныйДокумент», в конце функции, перед строкой «Возврат ПраваНаДокумент;» добавляем строки:
//alex.swon.2+
Если Пользователи.РолиДоступны("ЧтениеНачисленнойЗарплатыРасширенная", , Ложь) И НЕ Пользователи.РолиДоступны("ДобавлениеИзменениеНачисленнойЗарплатыРасширенная", , Ложь) тогда
Если ТипЗнч(Объект.Ссылка) = Тип("ДокументСсылка.ПриемНаРаботу") ИЛИ ТипЗнч(Объект.Ссылка) = Тип("ДокументСсылка.ПриемНаРаботуСписком")
ИЛИ ТипЗнч(Объект.Ссылка) = Тип("ДокументСсылка.КадровыйПеревод") ИЛИ ТипЗнч(Объект.Ссылка) = Тип("ДокументСсылка.КадровыйПереводСписком") тогда
ПраваНаДокумент.ПолныеПраваПоРолям = Истина;
ПраваНаДокумент.ОграниченияНаУровнеЗаписей.ЧтениеБезОграничений = Истина;
ПраваНаДокумент.ОграниченияНаУровнеЗаписей.ИзменениеБезОграничений = Истина;
ПраваНаДокумент.ОграниченияНаУровнеЗаписей.ИзменениеКадровыхДанных = Истина;
Иначе
ПраваНаДокумент.ПолныеПраваПоРолям = Ложь;
ПраваНаДокумент.ОграниченияНаУровнеЗаписей.ЧтениеБезОграничений = Ложь;
ПраваНаДокумент.ОграниченияНаУровнеЗаписей.ИзменениеБезОграничений = Ложь;
ПраваНаДокумент.ОграниченияНаУровнеЗаписей.ИзменениеКадровыхДанных = Истина;
КонецЕсли;
КонецЕсли;
//alex.swon.2-
Итоговый код функции:
Функция ПраваНаМногофункциональныйДокумент(Объект) Экспорт
МногофункциональныеДокументы = ЗарплатаКадрыРасширенныйКлиентСервер.ТипыМногофункциональныхДокументов();
ОписаниеДокумента = МногофункциональныеДокументы.Получить(ТипЗнч(Объект.Ссылка));
ДанныеДляПроверкиОграничений = ДанныеДляПроверкиОграниченийНаУровнеЗаписейМногофункциональногоДокумента(Объект);
ИспользуетсяРасчетЗарплаты = ПолучитьФункциональнуюОпцию("ИспользоватьРасчетЗарплатыРасширенная");
ПолныеПраваНаДокумент = ИспользуетсяРасчетЗарплаты И ПолныеПраваНаМногофункциональныйДокумент(Объект.Ссылка);
ЧтениеБезОграничений = Ложь;
ИзменениеБезОграничений = Ложь;
Если ПолныеПраваНаДокумент Тогда
ИзменениеБезОграничений = Не ЕстьОграниченияНаУровнеЗаписейПоВидуУчета("Изменение", ОписаниеДокумента.ВидУчета, ДанныеДляПроверкиОграничений);
ЧтениеБезОграничений = ИзменениеБезОграничений;
Если Не ЧтениеБезОграничений Тогда
ЧтениеБезОграничений = Не ЕстьОграниченияНаУровнеЗаписейПоВидуУчета("Чтение", ОписаниеДокумента.ВидУчета, ДанныеДляПроверкиОграничений);
КонецЕсли;
КонецЕсли;
ИзменениеКадровыхДанных = ИзменениеБезОграничений;
Если Не ИзменениеКадровыхДанных Тогда
ИзменениеКадровыхДанных = Не ЕстьОграниченияНаУровнеЗаписейПоВидуУчета("Изменение", "КадровыеДанные", ДанныеДляПроверкиОграничений);
КонецЕсли;
ПраваНаДокумент = Новый Структура(
"ПолныеПраваПоРолям,
|ОграниченияНаУровнеЗаписей");
ПраваНаДокумент.ПолныеПраваПоРолям = ПолныеПраваНаДокумент;
ОграниченияНаУровнеЗаписей = Новый Структура(
"ЧтениеБезОграничений,
|ИзменениеБезОграничений,
|ИзменениеКадровыхДанных");
ОграниченияНаУровнеЗаписей.ЧтениеБезОграничений = ЧтениеБезОграничений;
ОграниченияНаУровнеЗаписей.ИзменениеБезОграничений = ИзменениеБезОграничений;
ОграниченияНаУровнеЗаписей.ИзменениеКадровыхДанных = ИзменениеКадровыхДанных;
ПраваНаДокумент.ОграниченияНаУровнеЗаписей = ОграниченияНаУровнеЗаписей;
Если ОбщегоНазначения.ПодсистемаСуществует("ЗарплатаКадрыКорпоративнаяПодсистемы.УправленческаяЗарплата") Тогда
Модуль = ОбщегоНазначения.ОбщийМодуль("УправленческаяЗарплата");
Модуль.ПриПолученииПравНаМногоФункциональныйДокумент(ПраваНаДокумент, ОписаниеДокумента, ДанныеДляПроверкиОграничений);
КонецЕсли;
//alex.swon.2+
Если Пользователи.РолиДоступны("ЧтениеНачисленнойЗарплатыРасширенная", , Ложь) И НЕ Пользователи.РолиДоступны("ДобавлениеИзменениеНачисленнойЗарплатыРасширенная", , Ложь) тогда
Если ТипЗнч(Объект.Ссылка) = Тип("ДокументСсылка.ПриемНаРаботу") ИЛИ ТипЗнч(Объект.Ссылка) = Тип("ДокументСсылка.ПриемНаРаботуСписком")
ИЛИ ТипЗнч(Объект.Ссылка) = Тип("ДокументСсылка.КадровыйПеревод") ИЛИ ТипЗнч(Объект.Ссылка) = Тип("ДокументСсылка.КадровыйПереводСписком") тогда
ПраваНаДокумент.ПолныеПраваПоРолям = Истина;
ПраваНаДокумент.ОграниченияНаУровнеЗаписей.ЧтениеБезОграничений = Истина;
ПраваНаДокумент.ОграниченияНаУровнеЗаписей.ИзменениеБезОграничений = Истина;
ПраваНаДокумент.ОграниченияНаУровнеЗаписей.ИзменениеКадровыхДанных = Истина;
Иначе
ПраваНаДокумент.ПолныеПраваПоРолям = Ложь;
ПраваНаДокумент.ОграниченияНаУровнеЗаписей.ЧтениеБезОграничений = Ложь;
ПраваНаДокумент.ОграниченияНаУровнеЗаписей.ИзменениеБезОграничений = Ложь;
ПраваНаДокумент.ОграниченияНаУровнеЗаписей.ИзменениеКадровыхДанных = Истина;
КонецЕсли;
КонецЕсли;
//alex.swon.2-
Возврат ПраваНаДокумент;
КонецФункции
4. Далее в этом же модуле ищем процедуру «УстановитьВторогоОтветственногоВМногофункциональныхДокументах». В конце процедуры перед строкой «УстановитьПредупреждающуюНадписьВМногофункциональныхДокументах(Форма, ОписаниеДокумента.РеквизитСостояние);» добавляем строки:
//alex.swon.2+
//Включим РОЛЬ ЧтениеНачисленнойЗарплатыРасширенная и уберем возможность установки "Рассчитал" в кадровых документов
Если ПолныеПраваНаДокумент И Пользователи.РолиДоступны("ДобавлениеИзменениеНачисленнойЗарплатыРасширенная", , Ложь) Тогда
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Форма.Элементы, ОписаниеДокумента.РеквизитСостояние, "Доступность", Истина);
Если Форма.Объект[ОписаниеДокумента.РеквизитСостояние] Тогда
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Форма.Элементы, ОписаниеДокумента.ВторойОтветственный, "Доступность", Истина);
Если Не ЗначениеЗаполнено(Форма.Объект[ОписаниеДокумента.ВторойОтветственный]) Тогда
Форма.Объект[ОписаниеДокумента.ВторойОтветственный] = ПользователиКлиентСервер.ТекущийПользователь();
КонецЕсли;
Иначе
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Форма.Элементы, ОписаниеДокумента.ВторойОтветственный, "Доступность", Ложь);
Если ЗначениеЗаполнено(Форма.Объект[ОписаниеДокумента.ВторойОтветственный]) Тогда
Форма.Объект[ОписаниеДокумента.ВторойОтветственный] = Неопределено;
КонецЕсли;
КонецЕсли;
Иначе
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Форма.Элементы, ОписаниеДокумента.РеквизитСостояние, "Доступность", Ложь);
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Форма.Элементы, ОписаниеДокумента.ВторойОтветственный, "Доступность", Ложь);
Форма.Объект[ОписаниеДокумента.РеквизитСостояние] = Ложь;
КонецЕсли;
//alex.swon.2-
Итоговый код всей процедуры
Процедура УстановитьВторогоОтветственногоВМногофункциональныхДокументах(Форма, ПолныеПраваНаДокумент) Экспорт
Если Не Форма.ПолучитьФункциональнуюОпциюФормы("ИспользоватьРасчетЗарплатыРасширенная") Тогда
Возврат;
КонецЕсли;
МногофункциональныеДокументы = ЗарплатаКадрыРасширенныйКлиентСервер.ТипыМногофункциональныхДокументов();
ОписаниеДокумента = МногофункциональныеДокументы.Получить(ТипЗнч(Форма.Объект.Ссылка));
//alex.swon.2+
//Включим РОЛЬ ЧтениеНачисленнойЗарплатыРасширенная и уберем возможность установки "Рассчитал" в кадровых документов
Если ПолныеПраваНаДокумент И Пользователи.РолиДоступны("ДобавлениеИзменениеНачисленнойЗарплатыРасширенная", , Ложь) Тогда
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Форма.Элементы, ОписаниеДокумента.РеквизитСостояние, "Доступность", Истина);
Если Форма.Объект[ОписаниеДокумента.РеквизитСостояние] Тогда
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Форма.Элементы, ОписаниеДокумента.ВторойОтветственный, "Доступность", Истина);
Если Не ЗначениеЗаполнено(Форма.Объект[ОписаниеДокумента.ВторойОтветственный]) Тогда
Форма.Объект[ОписаниеДокумента.ВторойОтветственный] = ПользователиКлиентСервер.ТекущийПользователь();
КонецЕсли;
Иначе
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Форма.Элементы, ОписаниеДокумента.ВторойОтветственный, "Доступность", Ложь);
Если ЗначениеЗаполнено(Форма.Объект[ОписаниеДокумента.ВторойОтветственный]) Тогда
Форма.Объект[ОписаниеДокумента.ВторойОтветственный] = Неопределено;
КонецЕсли;
КонецЕсли;
Иначе
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Форма.Элементы, ОписаниеДокумента.РеквизитСостояние, "Доступность", Ложь);
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Форма.Элементы, ОписаниеДокумента.ВторойОтветственный, "Доступность", Ложь);
Форма.Объект[ОписаниеДокумента.РеквизитСостояние] = Ложь;
КонецЕсли;
//alex.swon.2-
УстановитьПредупреждающуюНадписьВМногофункциональныхДокументах(Форма, ОписаниеДокумента.РеквизитСостояние);
КонецПроцедуры
Готово.
Теперь у кадровиков есть возможность :
- Создавать Кадровые перемещения с возможностью указания начислений.
- Печатать справку расчет при увольнении сотрудника.
- Видеть ФОТ, оклад и размер аванса сотрудника.
- Создавать командировки и отпуска без изначально установленной галочки «Расчет утвердил» и без автоматического расчета среднего заработка.
- Доступ к отчетам по начислению заработной платы.
Проверено на платформе 8.3.11.3034
Версия конфигурации ЗУП 3.1.5.129