Имя: Пароль:
 
1C
 
ЗиУП 3.1 Плановые начисления за период
0 Said_We
 
29.07.20
13:16
Старый стал слепой. Да и ЗиУП 3.х не приходилось внутри сильно смотреть. Максимум структуру, но меняют постоянно кардинально. Запоминать нет смысла - через год поменяют все на 100%.
Зарплата и управление персоналом КОРП, редакция 3.1 (3.1.14.55)

Функция получения плановых начислений на дату:
ТекущиеДанныеОплатыТруда = КадровыйУчетРасширенный.ТекущиеНачисленияСотрудника(Сотрудник, ДатаСведений,,);

Правда и функция какая-то не удобная - возвращает соответствие с ТЗ по каждому ВР. Вернули бы общую ТЗ.

Не вижу функцию получения плановых начислений за период.
Например, необходимо получить плановые начисления за период с 10 по 20 число месяца с разбивкой по периодам изменениям показателей по этим начислениям:
т.е. упрощенно на выходе некая таблица: Сотурудник, ВР, датаС, ДатаПо, размер показателя.
1 SleepyHead
 
29.07.20
13:36
(0) ПлановыеНачисленияИнтервальный
2 Said_We
 
29.07.20
13:42
(1) Это один из РС, в котором хранятся данные.
Вопрос какая функция для получению данных в таком виде. Пусть в виде коллекции соответствий или ещё каком, но информация в виде 4-х колонок должна быть.
В (0) я написал что структуру часто 1С меняет и решили она написать набор статичных функций, которые будут возвращать фиксированные структуры данных в не зависимости от изменений структуры хранения данных. Они сами так рекомендуют - не лезть даже читать данные РС. :-)
3 Said_We
 
29.07.20
14:05
(1) Есть же РС, в котором хранится сам размер показателя. Есть где хранятся исправления.
ПлановыеНачисления, ПлановыеНачисленияИспр, ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников, ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИнтервальный, ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковИспр....

Отдельный РС для хранения значений показателей по подразделениям и организациям: ЗначенияПериодическихПоказателейРасчетаЗарплатыОрганизаций, ЗначенияПериодическихПоказателейРасчетаЗарплатыПодразделений, ЗначенияПоказателейДоплатыЗаРаботуВНочноеВечернееВремя и т.д.

На выходе надо иметь уже готовую таблицу с плановым ВР и значением показателя. На самом деле во ВР может быть сразу несколько показателей. И меняться они могут независимо друг от друга и в разное время. На выходе нужна таблица с максимальной разбивкой по периодам и значениями этих показателей.
4 Ц_У
 
29.07.20
14:27
(3) а если через КадровыйУчетРасширенный.ТекущиеНачисленияСотрудника
5 Said_We
 
29.07.20
14:32
(4) Функция ТекущиеНачисленияСотрудника(Сотрудник, ДатаСведений, ИсключаемыйРегистратор = Неопределено, ФормироватьСПериодичностьДень = Истина) Экспорт
    
    Возврат ТекущиеНачисленияСотрудников(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Сотрудник), ДатаСведений, ИсключаемыйРегистратор, ФормироватьСПериодичностьДень).Получить(Сотрудник);
    
КонецФункции

В качестве параметра передается дата, а не период.
6 Ц_У
 
29.07.20
14:37
(5) это.. и я слепой что-то стал :)
7 d4rkmesa
 
29.07.20
14:39
(5) К (4) можно попробовать еще запрос сделать, как в http://catalog.mista.ru/public/836840/ , см. пункт 1, только запрос переделать вместо Представления_КадровыеДанныеСотрудников указать Представления_ТаблицаРегистра_ПлановыеНачисления. Структуру полей Представления_ТаблицаРегистра_ПлановыеНачисления можно взять из других отчетов по плановым начислениям, например, ДинамикаПлановыхНачислений или АнализПлановыхНачислений.
8 d4rkmesa
 
29.07.20
14:40
(7) Точнее, вместо вызова процедуры.
9 Ц_У
 
29.07.20
14:56
Может так устроит?

СотрудникиПериоды = Новый ТаблицаЗначений;
    СотрудникиПериоды.Колонки.Добавить("Период", Новый ОписаниеТипов("Дата"));
    СотрудникиПериоды.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
    
    //Тут надо сформировать ТЗ сотрудник/период
    Сотрудник = Справочники.Сотрудники.НайтиПоНаименованию("ххххххххххх");
    
    НоваяСтрока = СотрудникиПериоды.Добавить();
    НоваяСтрока.Период = Дата(2019,12,24);
    НоваяСтрока.Сотрудник = Сотрудник;
    
    НоваяСтрока = СотрудникиПериоды.Добавить();
    НоваяСтрока.Период = ТекущаяДатаСеанса();
    НоваяСтрока.Сотрудник = Сотрудник;
    //
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    
    Запрос.УстановитьПараметр("СотрудникиПериоды", СотрудникиПериоды);
    
    Запрос.Текст =
    "ВЫБРАТЬ
    |    СотрудникиПериоды.Период КАК Период,
    |    СотрудникиПериоды.Сотрудник КАК Сотрудник
    |ПОМЕСТИТЬ ВТСотрудникиПериоды
    |ИЗ
    |    &СотрудникиПериоды КАК СотрудникиПериоды";
    
    Запрос.Выполнить();
    
    НачисленияСотрудников = КадровыйУчет.ТаблицаНачисленийСотрудниковПоВременнойТаблице(Запрос.МенеджерВременныхТаблиц, "ВТСотрудникиПериоды");
10 Said_We
 
29.07.20
15:15
(9) Неа....
КадровыйУчет.ТаблицаНачисленийСотрудниковПоВременнойТаблице()

Возвращает столько срезов на дату - сколько передашь. Мне же не нужны срезы на каждую дату. Необходимо, что бы периоды были сформированы внутри переданного периода в зависимости от данных.

(7) Это понятно что можно самостоятельно из РС вытащить всё в нужном виде. Но "политика партии" разработчиков ЗиУП на сейчас такова, что подобную информацию тащить необходимо их готовыми функциями. Объясняется это просто. Они сами навояли на столько сложную структуру, что сами в ней не могут разобраться и меняют её туды сюды и какая она будет в конечном результате они еще не знают, поэтому что бы ваш написанный код работал они разработали "неизменяемые" функции, которые будут возвращать фиксированные структуры, в не зависимости как данные в БД лежат.
11 Ц_У
 
29.07.20
15:22
(10) не ну потом еще обработать напильником до блеска :)
12 Said_We
 
29.07.20
15:39
(3) "На выходе надо иметь уже готовую таблицу с плановым ВР и значением показателя." - если говорить логикой ЗиУП 3, то упрощенно для начислений это две связанные таблицы. По аналогии с документом "Начисление ЗП" - это таблицы "Начисления" и "Показатели". И связь по полю "ИдентификаторСтрокиВидаРасчета".
13 d4rkmesa
 
29.07.20
15:59
(10) Вы не поняли, Представления_ТаблицаРегистра_ПлановыеНачисления - не конкретный регистр, а "алиас", который после вызова процедур программного интерфейса заменяется на запрос к конкретным регистрам. Если представляете, как отчет ЗУП-овские берут данные, это  аналогично, только можно использовать не только в СКД, а в своих запросах, сделав более удобную выборку к конкретному коду.
14 Ц_У
 
29.07.20
16:09
В тоже время, если посмотреть как отображается история изменений оплаты труда, то там такого навертели... Выходит, что нет типовой функции
15 Said_We
 
29.07.20
16:25
(13) Не увидел в этой схеме получения периода по изменениям показателей. Значения на дату - это не то что необходимо.
(14) Я тоже предварительно к такому выводу пришел, но решил поинтересоваться. Может я стал сильно стар и не вижу.
16 SleepyHead
 
29.07.20
16:28
(15) Погугли по словам "Представления в ЗУП 3.1"- как из регистра сведений сделать интервальный регистр.
Там необязательно с регистром работать, можешь сформировать нужные тебе временные таблицы и уже на них натравить механизм создания интервальных таблиц.

Я как-то пару раз делал, получалось.
17 Said_We
 
29.07.20
19:15
Мне нужно было на выходе ровно так как тянет документ Начисление ЗП.
Поэтому полез посмотрел как заполняется документ. Закопано там хорошо, но наковырял.


Сотрудник = Справочники.Сотрудники.НайтиПоНаименованию("ХХХХХХ");

ДатаС    = Дата(2020,7,10);
ДатаПо    = Дата(2020,7,20);

МенеджерРасчета = РасчетЗарплатыРасширенный.СоздатьМенеджерРасчета(НачалоМесяца(ДатаС), Сотрудник.ГоловнаяОрганизация);

СотрудникиДляНачислений = МенеджерРасчета.ТаблицаСотрудников();

НоваяСтрока = СотрудникиДляНачислений.Добавить();
НоваяСтрока.Сотрудник = Сотрудник;
НоваяСтрока.ДатаНачала = ДатаС;
НоваяСтрока.ДатаОкончания = ДатаПо;
НоваяСтрока.БезусловноСоответствуетКадровымДанным = ЛОЖЬ;
НоваяСтрока.Вычеркивать = ЛОЖЬ;
НоваяСтрока.НеСоответствуетПодразделение = ЛОЖЬ;

МенеджерРасчета.НастройкиРасчета.РассчитыватьНачисления = ИСТИНА;
МенеджерРасчета.НастройкиРасчета.ИсключатьРанееОплаченныеПериоды = ЛОЖЬ;
МенеджерРасчета.НастройкиРасчета.СохранятьИсправления = ЛОЖЬ;
МенеджерРасчета.НастройкиРасчета.ПерваяПоловинаМесяца = ЛОЖЬ;
МенеджерРасчета.НастройкиРасчета.ОкончательныйРасчет = ИСТИНА;
МенеджерРасчета.НастройкиНачислений.РассчитыватьНачисления = ИСТИНА;

ОтборМенеджераРасчета = МенеджерРасчета.СоздатьОтборы();
ОтборМенеджераРасчета.Подразделение = Справочники.ПодразделенияОрганизаций.ПустаяСсылка();

МенеджерРасчета.ЗаполнитьНачислениеЗарплаты(СотрудникиДляНачислений, ОтборМенеджераРасчета, Неопределено);
МенеджерРасчета.Зарплата.Начисления.ВыбратьСтроку();

В таблице значений "Начисления" сидит таблица с разбиением на периоды. Примерно тоже самое что и в документе. Аналогично наверное можно и таблицу Показателей вытащить. Они тоже заполняются при заполнении документа Начисление ЗП. Это отдельная табличная часть.
18 Said_We
 
30.07.20
11:06
(17) В принципе таблица отдельная с показателями не нужна. В этой есть отдельно все значения всех показателей.
МенеджерРасчета.Зарплата.Начисления[0].Показатели.ВыбратьСтроку();
МенеджерРасчета.Зарплата.Начисления[1].Показатели.ВыбратьСтроку();
....
19 SleepyHead
 
30.07.20
11:16
(18) Круто. Теперь остается следить, как этот код будет меняться из версии к версии и допиливать под себя.. Помнится, в одном из релизов алгоритмы поменяли кардинально и где-то до сих пор хранятся архивные алгоритмы расчета.
20 Said_We
 
30.07.20
11:45
(19) Ну нету готового кода, который бы одной функцией возвращал бы эти данные. По крайней мере, я не нашел. Если есть, то покажите.

Основным тут является:
МенеджерРасчета.ЗаполнитьНачислениеЗарплаты(СотрудникиДляНачислений, ОтборМенеджераРасчета, Неопределено);

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

С точки зрения получения плановых начислений - без разницы. Нам рассчитывать не нужно.
21 Said_We
 
30.07.20
17:54
(19)
Наверное вот это имелось ввиду:

Функция СоздатьМенеджерРасчета(МесяцНачисления, Организация) Экспорт
    
    УстановитьПривилегированныйРежим(Истина);
    Если ЗарплатаКадры.ВыполнятьРасчетЗарплатыБезОптимизации() Тогда
        МенеджерРасчета = Обработки.МенеджерРасчетаЗарплатыАрхивный.Создать();
    Иначе
        МенеджерРасчета = Обработки.МенеджерРасчетаЗарплаты.Создать();
    КонецЕсли;
....
22 SleepyHead
 
30.07.20
18:05
(20) Да я без подколов, реально круто. Сам однажды ковырял эту тему, но не дожал. Твой код прихоронил, вдруг пригодится.
23 Said_We
 
31.07.20
14:01
(22) Что-то очень часто у меня - сам задал вопрос и сам ответил. :-(
24 2S
 
31.07.20
14:02
(23) через представления не достучался?
25 Said_We
 
31.07.20
17:55
(24) Через какое представление? Что имеется ввиду?
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс