gifts2017

Как в ЗУП 3.0 правильно получить тариф/оклад по сотруднику

Опубликовал Антон Антонов (monkbest) в раздел Программирование - Практика программирования

Речь пойдет о том, как в новой редакции получить тариф/оклад сотрудника на заданную дату. Этот самый тариф нам очень часто нужен для вывода в отчетах чисто информативно. Проблема в том, что в 1С ЗУП 3.0 не очевидно, какое из плановых начислений является основным.

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

В 2.5 на сотрудника можно было повесить всего одно основное начисление, был жесткий контроль. При попытке повесить в кадровом приказе два начисления мы получали сообщение "сотруднику не может быть назначено основное начисление дважды"

.

 

 

При этом основным называлось то, у которого реквизит "ВидВремени" был равен "Начисление за работу полную смену в пределах нормы времени".

Теперь такого нет, в 1С Зарплата и Управление персонало 3.0 мы легко можем повесить человеку два "основных" начисления. Тут теперь вообще нет такого понятия, как основное/не основное. Сделали это не спроста, на практике бывают хитрые случаи, когда у человека одновременно и тариф по часам и оклад и тариф для сдельной оплаты труда. Это редкость, но такое бывает и структура данных в ЗУП 3.0 этому не мешает.

Так вот, получается, что у человека есть куча плановых начислений, и понять, кто из них основное мы не можем. Как это все настроить, чтобы оно потом корректно считалос - совсем другая история. Наша задача заполнить в шапке абстрактного отчета по сотруднику "оклад/тариф". Хотя, почему абстрактного, в расчетном листке в заголовке как раз он и выводится.

Первая засада с выбором наичсления решается следующим образом: у вида расчета есть поле "РеквизитДопУпорядочивания", у кого он меньше, тот и будет главным.

Этот реквизит не видим пользователю, он определяет порядок вывода видов расчета в расчетке (по нему идет сортировка). Правится его значение в форме списка выидов расчета с помощью стрелочек

 

Но это не все. Найдя плановое начисление с самым маленьким "порядком", Вы не узнаете его размер. Теперь в ЗУП 3.0 размеры показателей лежат в отдельном регистре сведений. Раньше конфой было ограничено их количество шестью. Теперь их может быть много, и глядя в регистр сведений "ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников" нифига не понятно, кто из них главный.

Чтобы понять, кто из них главный, надо залезть в таб.часть вида расчета "Показатели" и по булеву полю "ОсновнойПоказатель" вычисляем самого главного, он будет гарантировано один.

  {loadposition position-14}

Ниже привожу рабочий текст запроса, который возвращает все что нужно

ВЫБРАТЬ РАЗРЕШЕННЫЕ
ПлановыеНачисленияСрезПоследних.Сотрудник КАК Сотрудник,

ПлановыеНачисленияСрезПоследних.Начисление КАК Начисление,
ВЫБОР
КОГДА ПлановыеНачисленияСрезПоследних.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1)
ИЛИ ПлановыеНачисленияСрезПоследних.ДействуетДо > КОНЕЦПЕРИОДА(&Период, ДЕНЬ)
И &Период <> ДАТАВРЕМЯ(1, 1, 1)
ТОГДА ПлановыеНачисленияСрезПоследних.Используется
ИНАЧЕ ПлановыеНачисленияСрезПоследних.ИспользуетсяПоОкончании
КОНЕЦ КАК Используется
ПОМЕСТИТЬ ВТПлановыеНачисленияСрезПоследних
ИЗ
РегистрСведений.ПлановыеНачисления.СрезПоследних(&Период, Сотрудник = &Сотрудник) КАК ПлановыеНачисленияСрезПоследних
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ПлановыеНачисленияСрезПоследних.Сотрудник КАК Сотрудник,
ПлановыеНачисленияСрезПоследних.Начисление КАК Начисление,
Начисления.РеквизитДопУпорядочивания КАК Порядок,
ЕСТЬNULL(НачисленияПоказатели.Показатель, ЗНАЧЕНИЕ(Справочник.ПоказателиРасчетаЗарплаты.ПустаяСсылка)) КАК ОсновнойПоказатель
ПОМЕСТИТЬ ВТПлановыеНачисленияСотрудниковСПоказателем
ИЗ
ВТПлановыеНачисленияСрезПоследних КАК ПлановыеНачисленияСрезПоследних
ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовРасчета.Начисления КАК Начисления
ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовРасчета.Начисления.Показатели КАК НачисленияПоказатели
ПО Начисления.Ссылка = НачисленияПоказатели.Ссылка
И (НачисленияПоказатели.ОсновнойПоказатель)
ПО ПлановыеНачисленияСрезПоследних.Начисление = Начисления.Ссылка
ГДЕ
ПлановыеНачисленияСрезПоследних.Используется
ИНДЕКСИРОВАТЬ ПО
Сотрудник,
Порядок,
Начисление
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ПлановыеНачисленияСотрудников.Сотрудник КАК Сотрудник,
МИНИМУМ(ПлановыеНачисленияСотрудников.Порядок) КАК Порядок
ПОМЕСТИТЬ ВТПорядокОсновныхНачислений
ИЗ
ВТПлановыеНачисленияСотрудниковСПоказателем КАК ПлановыеНачисленияСотрудников
СГРУППИРОВАТЬ ПО
ПлановыеНачисленияСотрудников.Сотрудник
ИНДЕКСИРОВАТЬ ПО
Сотрудник,
Порядок
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТПлановыеНачисленияСотрудниковСПоказателем.Сотрудник,
ВТПлановыеНачисленияСотрудниковСПоказателем.Начисление,
ВТПлановыеНачисленияСотрудниковСПоказателем.ОсновнойПоказатель,
ВЫБОР
КОГДА ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковСрезПоследних.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
ТОГДА ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковСрезПоследних.Значение
КОГДА ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковСрезПоследних.ДействуетДо < &период
ТОГДА ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковСрезПоследних.ЗначениеПоОкончании
ИНАЧЕ ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковСрезПоследних.Значение
КОНЕЦ КАК ТарифОклад
ИЗ
ВТПорядокОсновныхНачислений КАК ВТПорядокОсновныхНачислений
ЛЕВОЕ СОЕДИНЕНИЕ ВТПлановыеНачисленияСотрудниковСПоказателем КАК ВТПлановыеНачисленияСотрудниковСПоказателем
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.СрезПоследних(&Период, ) КАК ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковСрезПоследних
ПО ВТПлановыеНачисленияСотрудниковСПоказателем.Сотрудник = ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковСрезПоследних.Сотрудник
И ВТПлановыеНачисленияСотрудниковСПоказателем.ОсновнойПоказатель = ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковСрезПоследних.Показатель
ПО ВТПорядокОсновныхНачислений.Сотрудник = ВТПлановыеНачисленияСотрудниковСПоказателем.Сотрудник
И ВТПорядокОсновныхНачислений.Порядок = ВТПлановыеНачисленияСотрудниковСПоказателем.Порядок


 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Павел Алексеенко (qwinter) 08.02.15 20:53
Изобретаете велосипед? Что мешает для этого использовать регистр сведений "Значения совокупных тарифных ставок сотрудников"?
2. Антон Антонов (monkbest) 10.02.15 11:54
(1) qwinter, ответ кроется в названии регистра :) прочитайте его заново по слогам и станет ясно, что это не оклад/тариф. Если у человека часововй тариф, то в него пишется "совокупная тарифная ставка", которая примерно плановый его доход за месяц.

по крайней мере для релиза 3 0 20 45 я прав

Еще, я не сам придумал это, эта статья - результат моих раскопок в типовой конфе. Копал через расчетный листок. Т.е. это не мой велосипед, так делают авторы конфигурации, я лишь доношу результат своих раскопок.

Задача у меня была написать внешний отчет, где рядом с ФИО сотрудника писалась бы его форма оплаты и его тариф/оклад. Мой запрос как раз выдает и имя показателя и его значение.
3. С К (Gauss) 10.02.15 17:22
(2) monkbest, пишете "Найдя плановое начисление...Вы не узнаете его размер"

Странно, открыв форму списка РС "Плановые начисления" вижу колонку "Размер".
Он совпадает со значениями в РС "ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников"­.

В каких случаях они могут отличаться?
4. Антон Антонов (monkbest) 11.02.15 06:59
(3) Gauss, в случае оклада он совпадает, в случае часового тарифа, туда пишется примерный общий заработок, я точно не уверен, но, возможно, он равен совокупной тарифной ставке. Т.е. программа смотрит, что за график у человека, какие-то часы умножает на часовой тариф и итоговую сумму пишет в размер.

Алгоритм расчета этого "размера" и совокупной тарифной ставки не копал, но скорее всего придется. Он влияет на расчет простоев сотрудника по вине работодателя и у бухов на моем проекте есть вопросы "откуда он взял эту цифру?"
5. Нина Чернякова (Chernika80) 16.02.15 11:34
Надо попробовать...
У меня бОльшая часть отчетов в 2.5 для кадровиков завязана на "окладе", не знала о такой тонкости в 3.0
спасиб :-)
6. Павел Алексеенко (qwinter) 16.02.15 13:07
(2) monkbest, хоть бы проверили перед ответом. При часовой тарифной ставке она туда и пишется. Изобретатели велосипедов покоряют этот мир(((
7. Антон Антонов (monkbest) 17.02.15 16:01
Давай до свиданья, сам дурак... много чего можно ответить на это. Но давайте разберем все по полочкам:
1. Суть статьи - рассказать как в 3.0 "правильно" получить тариф/оклад. Правильно - значит так, как считают сами создатели. Есть типовой отчет "Анализ начислений и удержаний" в котором есть вариант "Расчетный листок", его вывод был мной проанализирован из тысяч строк кода выдернуто необходимое. Если со временем 1С переделает отчет на другие данные - ради бога, будет новая статья, или не будет.
2. "Изобретатели велосипедов " - говорите Вы - Вы троль. Эта фраза применима к тому, что уже кто-то сделал, а я заново повторяю. Кто-то раскопал этот алгоритм до меня и донес до публики? Или Вы видели документацию от 1С по ЗУП 3.0 живьем? Вы просто увидели, что похожую информацию можно вытащить из другого регистра и начали кидаться какашками.
3. Вам эта информация не интересна - Давай до свиданья, читай другое
4. Зарегился тут давно и считаешь себя гуру? Не мешай другим делиться опытом. Сайт не только для тех, кому такие "земные мелочи" не интересны и им подавай мега менеджмент настройка мега кластера и еще чего. Вообще на ИС модно срать авторов печатных форм и простых вещей, вспомни себя парень, ты тоже был зеленым, а может и еще до сих пор такой. мысль о том, что ты троль меня не покидает.
5. Я не знаю алгоритма заполнения регистра сведений "значения совокупных тарифных ставок", в моей базе он заполняется так, как я Вам написал. Раз его заполнение видимо зависит от настроек, то это не есть надежный источник данных, у него видимо, другое назначение
6. В регистре "значения совокупных тарифных ставок" нет показателя, нет начисления, только вид совокупной тарифной ставки - месячная / часовая /... но имени показателя и начисления там нет.
8. Павел Алексеенко (qwinter) 17.02.15 17:23
(7) monkbest, такое заполнение этого регистра является ошибкой настройки, а точнее установкой у показателя "Час. тариф" признака, что он является месячной тарифной ставкой. При данной настройке кстати у Вас будут неверно считаться ночные и праздничные часы.
9. Антон Антонов (monkbest) 24.02.15 16:09
(8) qwinter, Вы совершенно правы. Этот элемент справочника предопределенный и его править нельзя, но по чьей-то воле в нем галка "является тарифной ставкой" не стоит. Виню в этом кривой перенос из 7.7, ведь он выполнял первоначальное заполнение справочников. Перенос выполнялся на ранних релизах ЗУП 3.0, в конце 2013ого года, косяков в тех релизах было мама не горюй. Исправлять это сейчас пока смысла нет, т.к. формулы ночных, праздничных, простоев, тех.осмотров,... написаны так, что они работают верно, при кривом показателе "стоимость часа"."стоимость часа" - как Вы и говорите действительно считается криво. Но исправление показателя "Час. тариф" само по себе не приведет к верному расчету, потребуется перепроводить кучу документов за весь период. Есть шанс сделать хуже.

Но это все не относится к теме статьи :) см. п.1 и п.6 моего предыдущего поста
Давайте накатаем статью про тарифные ставки, как они считаются, как за ними следить, на что они влияют и какие грабли тут есть. ЗУП 3.0 вообще пока непаханое поле и тут можно про каждый регистр целую статью писать. Документации от 1С пока толком нет, книга на ИТС про ЗУП 3.0 не содержит полезной информации, в ней нет описания внутренних механизмов и причинно-следственных связей между реквизитами, там фразы в стиле "в поле сотрудник выберите сотрудника", "у обособленного подразделения поставьте галку обособленное подразделение".
10. Руслан Хабибуллин (RuslanKhanow) 10.03.15 18:06
(9) monkbest, А как эти данные сейчас выводить,например мне нужно получить размер оклада сотрудник?
Простите за ,возможно, глупый вопрос,я только начал учиться
11. Антон Антонов (monkbest) 17.03.15 07:58
(10) RuslanKhanow, уберите в моем запросе условие по сотруднику и получите всех
12. Максим Моисеев (m.s.moiseev) 25.03.15 01:16
Только сегодня этим занимался, жаль не увидел вашу статью. При проведении документа ПриемНаРаботу в случае если мы попытались добавить 2 вида оклада, то происходит проверка:

Начисления.ОбозначениеВТабелеУчетаРабочегоВремени <> ЗНАЧЕНИЕ(Справочник.ВидыИспользованияРабочегоВремени.ПустаяСсылка)
И Начисления.ЗачетНормыВремени = ИСТИНА

Если результат отсеивания больше 1, то возвращает ошибку.
Вот текст запроса полностью

ВЫБРАТЬ
ПлановыеНачисленияСрезПоследних.Сотрудник,
ПлановыеНачисленияСрезПоследних.Начисление,
ПлановыеНачисленияСрезПоследних.Размер,
ПлановыеНачисленияСрезПоследних.Начисление.ОбозначениеВТабелеУчетаРабочегоВремени КАК ОбозначениеВТабелеУчетаРабочегоВремени,
ПлановыеНачисленияСрезПоследних.Начисление.ЗачетНормыВремени КАК ЗачетНормыВремени
ПОМЕСТИТЬ ВТНачисленияВсеБезОтбора
ИЗ
РегистрСведений.ПлановыеНачисления.СрезПоследних(
&КонецПериода {(&КонецПериода)},
Сотрудник В
(ВЫБРАТЬ
ВТСотрудники.Сотрудник
ИЗ
ВТСотрудники КАК ВТСотрудники)) КАК ПлановыеНачисленияСрезПоследних
ГДЕ
ПлановыеНачисленияСрезПоследних.Используется = ИСТИНА
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
Начисления.Сотрудник КАК Сотрудник,
Начисления.Начисление КАК Начисление,
Начисления.Размер КАК Размер
ИЗ
ВТНачисленияВсеБезОтбора КАК Начисления
ГДЕ
Начисления.ОбозначениеВТабелеУчетаРабочегоВремени <> ЗНАЧЕНИЕ(Справочник.ВидыИспользованияРабочегоВремени.ПустаяСсылка)
И Начисления.ЗачетНормыВремени = ИСТИНА
13. Алексей Лапицкий (Lapitskiy) 18.07.15 05:46
14. Марина Чирина (chmv) 22.09.15 14:30
А мне понравилась статья Спасибо
15. Артем Артеменко (dock) 09.11.15 14:22
обожаю 3.0
Итак, рассмотрим вариант, когда сотруднику было временно назначен другой вид начисления (это может быть совмещение должностей или временный кадровый перевод)
и, барабанная дробь, приведенный запрос нам не выдает ни одного вида начисления! (на дату После окончания действия данного временного начисления)
в чем суть: в запросе используется СрезПоследних, если была введена запись с периодом действия, то срезом последних именно она и будет выведена.
а теперь у нас есть условие:

ПлановыеНачисленияСрезПоследних.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1)
ИЛИ ПлановыеНачисленияСрезПоследних.ДействуетДо > КОНЕЦПЕРИОДА(&Период, ДЕНЬ)


И этим условием мы откидываем наше начисление...
Итог - по данным запроса назначенных видов начисления нет...

16. Антон Антонов (monkbest) 10.11.15 14:56
(15) dock, а ЗначениеПоОкончании не будет заполнено?
17. AliceLight 30.06.16 18:42
Хм, у меня такой способ вернул "Ежемесячную премию" (потому что в начальной штатной расстановке она стояла первее, чем оклад). Ручки пользователя и порядок, в котором пользователь расставит начисления, предугадать сложно. Выкрутилась так: получила данные оклада из регистра сведений "ТекущаяТарифнаяСтавкаСотрудников" - именно оттуда берутся данные при открытии формы элемента Сотрудник для поля "Оклад (тариф)". Напрягает только мысль, возможно ли, что там будут две записи по сотруднику...
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа