Имя: Пароль:
1C
1C 7.7
v7: Расчет праздничных
0 Standart
 
11.04.16
11:15
Дня доброго, сообщество любителей 1С.
У меня образовалась проблема  в виде неправильного расчета праздничных дней диспетчерам. Огни работают по индивидуальному графику. В журнале ЗП показывает праздничный день, стоит 1, но не показывает часы. У каждого диспетчера разные часы.
http://www.picshare.ru/view/7274013/

ИндГрафик=ГрафикДокументом(ДатаОкончания, Объект);
    Если ИндГрафик=0 тогда
        Ставка = Объект.Ставка.Получить(ДатаОкончания);
    Иначе
        Ставка =1;
    КонецЕсли;
    
    СпВремен = СоздатьОбъект("СписокЗначений");
    РабочееВремяЗаПериод(Объект, ДатаНачала, ДатаОкончания, 1, СпВремен);
    ВсегоДней =СпВремен.ПолучитьЗначение(1); // здесь это дней по графику работы сотрудника в праздничные дни
    ВсегоЧасов =СпВремен.ПолучитьЗначение(2);
    ГрафикРаботы = Объект.ГрафикРаботы.Получить(ДатаОкончания);

    Оклад = ОкладПоРазряду(Объект,ДатаОкончания)*Ставка;    
    //ДопОклад = Объект.ДопОклад.Получить(ДатаОкончания)/100;
    Если Оклад <> 0 Тогда
        //ВесьОклад = Округление( Оклад*(1+ДопОклад), Константа.ОкруглениеРасчетовПоУмолчанию);
        Если (ГрафикРаботы.Выбран()=0) или (ГрафикРаботы.МесБалансРабВр.Получить(ДатаОкончания ) <=0) тогда
            Календ = ВзятьКалендарь(Объект,ДатаОкончания);
            ЗаОдинЧас = Оклад /Календ.Часов(НачалоПериодаПоДате(ДатаНачала),КонецПериодаПоДате(ДатаНачала));        
        иначе
            ЗаОдинЧас = Оклад / ГрафикРаботы.МесБалансРабВр.Получить(ДатаОкончания );
        КонецЕсли;  
    Иначе
        Тариф = ТарифПоРазряду(Объект, ДатаОкончания)*Ставка;
        //ВесьТариф = Округление( Тариф*(1+ДопОклад), Константа.ОкруглениеРасчетовПоУмолчанию);                                                    
    КонецЕсли;
        
    // /\/\ 21.02.05,Лосич С.В. /\/\
    
    Если ВсегоДней>0 Тогда
        // \/\/ 03.12.03 \/\/
        //// человек по графику работает в праздник - как правило, это почасовики
        ТипаТабель = СоздатьОбъект("СписокЗначений");
        ТипаТабель = глОтработанноеВремяЗаПериод(Объект,ДатаНачала,ДатаОкончания);
        ВсегоЧасов = ТипаТабель.ПолучитьЗначение(4);
    
        ЧасовВечером = 0;
        ЧасовНочью = 0;
        Если Объект.ГрафикРаботы.Получить(ДатаНачала).Выбран()>0 Тогда
            РабочееВремяЗаПериод(Объект, ДатаНачала, ДатаОкончания, 2, СпВремен);
            ЧасовВечером =  СпВремен.ПолучитьЗначение(2);                                                      
            РабочееВремяЗаПериод(Объект, ДатаНачала, ДатаОкончания, 3, СпВремен);
            ЧасовНочью =  СпВремен.ПолучитьЗначение(2);
        КонецЕсли;
        //Результат = Округление(ЗаОдинЧас*(ЧасовНочью*Константа.КоэфНочныхЧасов+ВсегоЧасов)*Константа.КоэфПраздничных, Константа.ОкруглениеРасчетовПоУмолчанию);
        // не учитываются ночные и вечерние коэффициенты,
        Результат = Округление(ЗаОдинЧас*ВсегоЧасов*(1+Константа.КоэфПраздничных), Константа.ОкруглениеРасчетовПоУмолчанию, 1);
        Часы = ?(Сторно=1, -ВсегоЧасов,ВсегоЧасов);
    Иначе
        // человек по графику не работает в праздник
        Дней = (ДатаОкончания-ДатаНачала)+1;
        //Результат = Округление( (ЗаОдинЧас*Константа.ЧасовВРабочемДне,ЗаОдинДень)*(1+Константа.КоэфПраздничных)*Дней,Константа.ОкруглениеРасчетовПоУмолчанию,1);
        Результат = Округление(ЗаОдинЧас*Константа.КоэфПраздничных*Константа.ОкруглениеРасчетовПоУмолчанию,1);
        //ВсегоЧасов =константа.ЧасовВРабочемДне+Дней;
        Часы = ?(Сторно=1, -ВсегоЧасов, ВсегоЧасов);
        Дни = ?(Сторно=1, -Дней, Дней);
    КонецЕсли;

КонецПроцедуры
1 Standart
 
11.04.16
11:16
как я не крутил, что не мудрил, чтоб ставился день- сделал, а часы никак не получается.
2 NikVars
 
11.04.16
11:18
Как можно расчитать праздник?! Телепатить предстоящие решений правительства?
В Зик для праздничных дней отдельный календарь Праздники.
3 шаэс
 
11.04.16
11:20
(1) а документ показать?
4 NikVars
 
11.04.16
11:22
(1) А еще есть документ Приказ о работе в праздничные и выходные дни. Он используется?
5 Standart
 
11.04.16
11:25
шаэс
Конфигурация писаная кривыми руками 100 раз. принцип такой, ели у диспетчера стоит в табеле за 8 число Я (явка) часы 9 (основные) и 5 (ночные), должно рассчитывать за 9 часов по формуле: Оклад / на месячный баланс * на количества часов в праздник. Документом не вноситься. Для диспетчеров свой календарь сменной работы, для всех остальных- календарь Служащие.
6 шаэс
 
11.04.16
11:44
(5) у меня мозг сломался от Вашего кода... отладчик не помогает?
7 NikVars
 
11.04.16
11:48
(5) Табель можно править документом? Как отражено количество отработанных часов в праздник?
8 Standart
 
11.04.16
11:56
NikVars
В табеле рабочего времени 08.03 Я (явка), 9 основных, 5 ночных часов. в табеле показывает, что 9 часов праздничных, все верно, но не заносит в журнал ЗП
9 NikVars
 
11.04.16
12:29
(8) А расчет в расчете есть такой вариант расчета для твоего случая? Или отдельный расчет для расчета праздничных дней?
Смотри типовые документы по ЗиК. Например, модуль проведения Документ.ПриказНаОплатуПоСреднему.
В общем, должен быть документ, который заполняет данными журнал расчета. Сама суть расчета должна быть прописана в нужном Виде расчета или в новом виде расчета.
Ну это все в терминах ЗиК. Какая там у тебя конфа-компонента - держи в секрете.
10 Standart
 
11.04.16
15:04
в табеле все аккуратно, выводит 9 часов праздничных, проверял отладчиком. в журнал ЗП они не попадают, пишет: Неверно построен табель по сотруднику. Хотя, всё правильно заполнен. в модуле вида расчета: Оплата праздничных, добился вывода этого дня, ставит 1 (см. картинку в первом сообщении), но не могу вывести часы(строчкой ниже, по 1).
11 NikVars
 
11.04.16
16:53
(10) "в журнал ЗП они не попадают, пишет: Неверно построен табель по сотруднику" может в этом корень проблем?
И кто выдает это интересное сообщение "Неверно построен табель по сотруднику"?
12 Standart
 
12.04.16
10:17
(12)  Выдает Глобальный модуль
13 NikVars
 
12.04.16
10:49
(12) Я искал в ЗиК по тем словам. Сложно сказать, как тебе помочь и не понятно, что ты тут делаешь.
14 Standart
 
12.04.16
11:34
NikVars  
подключил высшие умы, они сами в шоке, как у нас все работает. Логики практически нет, но работает, правда, не всегда правильно. Коды раздуты так, что голова кругом от написанного.
Этот Вид расчета я укоротил
Процедура ПровестиРасчет()                            
    ИндГрафик=ГрафикДокументом(ДатаОкончания, Объект);
    Если ИндГрафик=0 тогда
        Ставка = Объект.Ставка.Получить(ДатаОкончания);
    Иначе
        Ставка =1;
    КонецЕсли;    
    СпВремен = СоздатьОбъект("СписокЗначений");    
    РабочееВремяЗаПериод(Объект, ДатаНачала, ДатаОкончания, 1, СпВремен); //заносит в журнал ЗП праздничный день
    ВсегоДней =СпВремен.ПолучитьЗначение(1);
    ВсегоЧасов =СпВремен.ПолучитьЗначение(2);
    ГрафикРаботы = Объект.ГрафикРаботы.Получить(ДатаОкончания);
    Оклад = ОкладПоРазряду(Объект,ДатаОкончания)*Ставка;    
  
    Если Оклад <> 0 Тогда

        Если (ГрафикРаботы.Выбран()=0) или (ГрафикРаботы.МесБалансРабВр.Получить(ДатаОкончания ) <=0) тогда
            Календ = ВзятьКалендарь(Объект,ДатаОкончания);
            ЗаОдинЧас = Оклад /Календ.Часов(НачалоПериодаПоДате(ДатаНачала),КонецПериодаПоДате(ДатаНачала));        
        иначе
            ЗаОдинЧас = Оклад / ГрафикРаботы.МесБалансРабВр.Получить(ДатаОкончания );
        КонецЕсли;  
    Иначе
        Тариф = ТарифПоРазряду(Объект, ДатаОкончания)*Ставка;                                                  
    КонецЕсли;    
    Если ВсегоДней>0 Тогда             
         Иначе
        Дней = (ДатаОкончания-ДатаНачала)+1;
        //Результат = Округление( (ЗаОдинЧас*Константа.ЧасовВРабочемДне)*(1+Константа.КоэфПраздничных)*Дней,Константа.ОкруглениеРасчетовПоУмолчанию,1);
        //ВсегоЧасов =константа.ЧасовВРабочемДне+Дней;
        Часы = ?(Сторно=1, -ВсегоЧасов, ВсегоЧасов);
        Дни = ?(Сторно=1, -Дней, Дней);
        Результат = Округление(ЗаОдинЧас*Константа.ОкруглениеРасчетовПоУмолчанию,1);            
    КонецЕсли;        
КонецПроцедуры  

там, где
РабочееВремяЗаПериод(Объект, ДатаНачала, ДатаОкончания, 1, СпВремен); //заносит в журнал ЗП праздничный день
    ВсегоДней =СпВремен.ПолучитьЗначение(1);
    ВсегоЧасов =СпВремен.ПолучитьЗначение(2);
всего дней- берет значение (ставит 1, на дату 08.03)
а вот ВсегоЧасов - не берет
15 NikVars
 
12.04.16
12:03
Посмотри СпВремен что там в значении 2.
Проще это сделать через Сообщить. Может быть пустячок - ошибка с типами. Обнять Числом() и все заработает...
16 Standart
 
12.04.16
15:28
посмотрел, значение равно 0. мыслей у меня нет. В табеле стоит 9 часов, внизу табеля написано, что праздничных по сотруднику 9 часов.
17 NikVars
 
12.04.16
15:36
(16) Смотри как заполняется СпВремен. Откуда и как в него попадают значения.
18 NikVars
 
12.04.16
15:37
(16) Дай поиск по всем модулям в конфигурации по слову "СпВремен".
19 Standart
 
12.04.16
16:00
спасибо. буду лопатить ГлМодуль. 84 найдено, и практически все в Гл. 3- в ВР Оплата праздничных и штук 5 в отчетах.
20 NikVars
 
12.04.16
16:12
(19) После каждого обращения пиши
Сообщить("1========"+ ...тут чего-то полезное)
И так далее...
В общем увидишь с какого места тебе изучать.
П.С. играйся на копии!
21 Standart
 
12.04.16
16:48
NikVars- конечно на копии. По другому никак, НИЗЯ!!!
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.