Вечная проблема – выяснение, кто прав, между кадровиками и бухгалтерией. Наверняка есть организации, где этой проблемы не существует, но я еще такой компании не встречал. Проблемы обостряются после перехода с ЗУП 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
Ничего не понимаю зачем весь этот огород. Дело в том, что в типовом ЗУПе 3 есть разделение. Кадровики и расчетчики прекрасно сосуществуют рядом, не мешая друг другу. При расчете документа расчетчиками кадровики уже ничего не могут поменять в документе.
Включите функцию «Использовать многофункциональность документов».
Мне кажется, что вы вашей статьей собьете с толку новичков, которые ищут информацию по данной теме.
В идеальной организации взаимодествие между кадровиками и расчетчиками происходит именно так, как вы описали. Но позвольте уточнить такой момент: — Как кадровику, не включая роли ЧтениеДанныхДляНачисленияЗарплатыРасширенная, можно распечатать «Справку расчет» или изменить начисление в документе «Кадровый перевод сотрудника»?
А если вы все же включили роль, то как боретесь с моментом, когда после проведения кадровиком документа «Больничный лист», автоматически происходит расчет и в документе устанавливается галочка «Расчет утвердил»?
Константин, с интересом прочитал статью, мне скоро тоже придется решать эту задачу, но снимать с поддержки базу очень не хочется… я обычно пытаюсь решить такие задачи с помощью расширений, не рассматривали ли вы такой подход?
например включить роль ЧтениеДанныхДляНачисленияЗарплатыРасширенная и снимать признак «Расчет утвердил» при закрытии документа?
вопрос рассматривали ли вы такой подход к решению проблемы?
Если снять признак с включенной ролью ЧтениеДанныхДляНачисленияЗарплатыРасширенная, то документ не проводится, ругается на то, что расчет не утвержден.
В идеальной организации взаимодествие между кадровиками и расчетчиками происходит именно так, как вы описали. Но позвольте уточнить такой момент: — Как кадровику, не включая роли ЧтениеДанныхДляНачисленияЗарплатыРасширенная, можно распечатать «Справку расчет» или изменить начисление в документе «Кадровый перевод сотрудника»?
А если вы все же включили роль, то как боретесь с моментом, когда после проведения кадровиком документа «Больничный лист», автоматически происходит расчет и в документе устанавливается галочка «Расчет утвердил»?
Мы тоже через расширение эту проблему разрулили — зачем с поддержки снимать…
(3)Через расширения не пытался… Сейчас прорабатываю этот вариант.
(6) Можете описать Ваш вариант решения? Я думаю, что многим будет полезно и интересно
(6) да-да, все замерли в надежде 🙂
Михаил, поделитесь расширением!
Спасибо большое Михаил Кравченко (MuxaH) за то, что поделился своим вариантом.
Не мог бы ты описать, как ты решил остальные моменты, на которые влияют включенные роли «ЧтениеДанныхДляНачисленияЗарплатыРасширенная» ИЛИ «ДобавлениеИзменениеНачисленнойЗарплатыРасширенная» :
1. Отражение Оклада, ФОТ и Аванса в карточке сотрудника. Ведь без включенной одной из этих ролей данные не доступны кадровику.
2. При создании документа «Кадровое перемещение», нет возможности установить новые начисления или же изменить старые.
3. Командировку поправил, а как дело обстоит с отпусками? с больничными?.
4. Иногда кадровику требуется смотреть расчетные листы. Но при выключенных ролях это не возможно. Как этот момент решил?
1.- 2. Да так же, формы в расширениях можно курочить как твоей душе угодно. Сначала ищешь типовой код, который скрывает от кадровика нужные данные. Создаешь корректировки в расширении. Даже описанный тобой в статье подход (исправление общих модулей) можно расширением без снятия с поддержки разрулить. А с начислениями кадровики настроили штатное расписание, при выборе позиции все начисления сразу встают в ТЧ, они её не смотрят даже. Да и профилю Старший кадровик доступно изменение начислений.
3. Отпуска, больничные нормально разграничивались, с командировками почему-то такая проблема всплыла.
4. На расчетки давал роль Аудитор. Как раз для пользователей с такой ролью и всплыла проблема, что они утверждать могли Командировки.
(10) Благодарю.
Согласен, что можно расширениями все сделать. Но…
В моем решении нужно только снять с поддержки 1 модуль и добавить десятка два строк кода, а ты предлагаешь изменить кучу форм документов, справочников и отчетов в расширениях.
Согласен, что можно сделать и по моему сценарию и без снятия с поддержки, с помощью расширения. Но только в платформе 8.3.11 расширения еще не поддерживают общие модули. Можно обойти этот момент, создав обработку в расширении. Использовать модуль менеджера обработки, как общий модуль. Но все равно придется создавать расширения форм и припиливать к ним обработчики из модуля обработки.
1. Вариант с расширениями — очень затратный по времени. Этот вариант не подойдет тем, кому нужно сделать «Сейчас»…
2. В случае, если разработчик изменит какую либо из форм, то придется допиливать расширения каждый раз. Ты скажешь, — «Ну и общий модуль разработчик может изменить». Конечно, может, но вероятность изменения куда меньше, нежели вероятность изменения одной из множества форм: справочника, документа или отчета. В случае же изменения одного модуля, его легко при обновлении можно поправить, так как там исправлений в коде не много.
3. В твоем варианте решения, ты предлагаешь кадровикам все изменения начислений использовать из штатного расписания. Такой вариант не каждому кадровику понравится. Может быть ты умеешь лучше убеждать людей, которые работают в программе, что твои варианты правильнее, но у меня такого дара к сожалению нет. И убедить кадровиков делать иначе, нежели они привыкли как в ЗУП 2.5 у меня не получалось.
Согласен, что оба варианта решения этих проблем имеют шанс на существование. Какой вариант выбрать решать Вам форумчане.
Я лишь описал как я решил эти проблемы.
(14) Я не предлагаю менять кучу форм, я предлагаю те же 2 десятка строк кода подписать в расширении. А 8.3.11 уже вовсю изменение модулей в расширении поддерживает. У меня ещё 8.3.10 стоит.
1. По временным затратам — не соглашусь. Неудобство только в сравнении при обновлении измененного и типового модуля.
2. Соглашусь, но я и не настаиваю на изменении форм.
3. Это не вариант решения, это так кадровики упростили себе работу. Пока штатку настраивали — так же в перемещениях назначали/убирали начисления, просто я не понимаю зачем им роль ДобавлениеИзменениеНачисленнойЗарплатыРасширенная, и без неё всё прекрасно редактируется.
Но дело хозяйское. Сейчас в 8.3.12 уже можно в расширениях и свои объекты добавлять, и движения по типовым регистрам делать, но лично мне страшно — как оно себя поведёт при отключении расширения. Но тем не менее, за расширениями будущее, как говорят на 🙂
3. У кадровиков убираем роль «ДобавлениеИзменениеНачисленнойЗарплатыРасширенная» и оставляем только «ЧтениеДанныхДляНачисленияЗарплатыРасширенная»
проверьте публикацию.
мне кажется у вас пункт 2 и 4 одинаковый листинг в обоих процедурах в публикации.
(17)Исправил. Извиняюсь, за этот момент.
где правда говорим
Включить кадровикам роль «ЧтениеДанныхДляНачисленияЗарплатыРасширенная» и обязательно отключить роль «ДобавлениеИзменениеДанныхДляНачисленияЗарплатыРасширенная» .
а пишем
//Включим РОЛЬ ЧтениеНачисленнойЗарплатыРасширенная и уберем возможность установки «Рассчитал» в кадровых документов
Если ПолныеПраваНаДокумент И Пользователи.РолиДоступны(«ДобавлениеИзменениеНачисленнойЗарплатыРасширенная», , Ложь) Тогда
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Форма.Элементы, ОписаниеДокумента.РеквизитСостояние, «Доступность», Истина);
(19)Именно так и делаем, как написано в моей публикации. Отключаем роль «ДобавлениеИзменениеДанныхДляНачисленияЗарплатыРасширенная» кадровику и включаем только «ЧтениеДанныхДляНачисленияЗарплатыРасширенная»
В кадровом переводе все равно на вкладке оплаты стоит галочка «Перевод утвержден» и отладка в ваш исправленный модуль в процедуру УстановитьВторогоОтветственногоВМногофункциональныхДокумента х не заходит.
(21) Проверьте релиз вашей ЗУП. Все работало, но на версии 3.1.5.129