Имя: Пароль:
1C
 
Больничный вытесняет оклад, но сама сумма больничного не рассчитывается
0 bayron1
 
30.06.24
09:04
Приветствую, уважаемые знатоки. Прошу помочь с расчетом больничного. Он вытесняет оклад, т.е.оклад считается правильно с учетом больничного. Но размер и сумма самого больничного листа не записывается в регистр. Расчет зарплаты ведется через общий модуль:
Процедура РассчитатьРегистрРасчета(Набор, Отказ) Экспорт
    
    Ссылка = Набор.Отбор.Регистратор.Значение;
    ИмяРегистра = Набор.Метаданные().Имя;
    Запрос = Новый Запрос;
    
    Запрос.Текст = "ВЫБРАТЬ
    | ОсновныеНачисления.ВидРасчета.КатегорияРасчета КАК Категория,
    | ОсновныеНачисления.ВидРасчета.СпособРасчета КАК Способ
    |ИЗ
    | РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления
    |ГДЕ
    | ОсновныеНачисления.Регистратор = &Ссылка
    |
    |УПОРЯДОЧИТЬ ПО
    | Категория    
    |ИТОГИ ПО
    | Категория";
    
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "ОсновныеНачисления", ИмяРегистра);
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    
    Результат = Запрос.Выполнить();
    ВыборкаКатегории = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    Пока ВыборкаКатегории.Следующий() Цикл  
        
        ВыборкаСпособы = ВыборкаКатегории.Выбрать();
        
        Параметры = ПолучитьСтруктуруНеобходимыхДанных(ВыборкаСпособы);
        Результат = ПолучитьДанныеДляРасчета(Параметры, ИмяРегистра, Ссылка, ВыборкаКатегории.Категория);
        
        Выборка = Результат.Выбрать();  
        
        РассчитатьЗаписиРегистраРасчета(Выборка, Набор, Отказ);
        
        Набор.Записать(,Истина);
        
    КонецЦикла;
    
    
КонецПроцедуры  

Процедура РассчитатьЗаписиРегистраРасчета(Выборка, Набор, Отказ)  
    
    Поиск = Новый Структура("НомерСтроки");
    
    Для каждого Запись Из Набор Цикл
        
        Поиск.НомерСтроки = Запись.НомерСтроки;
        Выборка.Сбросить();
        
        Если Выборка.НайтиСледующий(Поиск) Тогда
            
            Если Выборка.Способ = Перечисления.СпособыРасчета.ПоОтработанномуВремени Тогда  
                
            Результат = Выборка.Размер*Выборка.Факт;
                            
            ИначеЕсли Выборка.Способ = Перечисления.СпособыРасчета.ПоБольничномуЛисту Тогда
                
                Результат = Выборка.Размер*Выборка.Факт/3;
                   
                                
            ИначеЕсли Выборка.Способ = Перечисления.СпособыРасчета.Процентом Тогда
                
                Результат = Выборка.Размер*Выборка.База/100;
                
            КонецЕсли;
            
            Запись.Результат = Результат * ?(Запись.Сторно, -1, 1);
            
        КонецЕсли;
        
    КонецЦикла;
    
    
КонецПроцедуры


Функция ПолучитьСтруктуруНеобходимыхДанных(Выборка)
    
    Параметры = Новый Структура;
    Параметры.Вставить("ДанныеГрафика", Ложь);
    Параметры.Вставить("База", Ложь);
    
    Пока Выборка.Следующий() Цикл
        
        Если Выборка.Способ = Перечисления.СпособыРасчета.ПоБольничномуЛисту
            ИЛИ Выборка.Способ = Перечисления.СпособыРасчета.ПоОтработанномуВремени    Тогда
            Параметры.ДанныеГрафика = Истина;
            
        ИначеЕсли Выборка.Способ = Перечисления.СпособыРасчета.Процентом Тогда
            Параметры.База = Истина;
        КонецЕсли;
        
    КонецЦикла;
    
    Возврат Параметры;
    
    
КонецФункции


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

        
        Запрос.Текст = Запрос.Текст + "
        |ИЗ
        | РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления";
        
        Если Параметры.ДанныеГрафика Тогда
            
            Запрос.Текст = Запрос.Текст + "
            
            | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.ДанныеГрафика (
            | Регистратор = &Ссылка
            | И ВидРасчета.КатегорияРасчета= &КатегорияРасчета) КАК ОсновныеНачисленияДанныеГрафика
            | ПО ОсновныеНачисления.НомерСтроки = ОсновныеНачисленияДанныеГрафика.НомерСтроки";
            
        КонецЕсли;
        
        Если Параметры.База Тогда
            
            Запрос.Текст = Запрос.Текст + "
           |ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка И ВидРасчета.КатегорияРасчета=&Категория) КАК ОсновныеНачисленияБазаОсновныеНачисления
            | ПО ОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаОсновныеНачисления.НомерСтроки
            |ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка И ВидРасчета.КатегорияРасчета=&Категория) КАК ОсновныеНачисленияБазаДополнительныеНачисления
            | ПО ОсновныеНачисления.НомерСтроки = ОсновныеНачисленияБазаДополнительныеНачисления.НомерСтроки";

        КонецЕсли;
        
        Запрос.Текст = Запрос.Текст + "
        |ГДЕ
        | ОсновныеНачисления.Регистратор = &Ссылка
        | И ОсновныеНачисления.ВидРасчета.КатегорияРасчета = &КатегорияРасчета";
        
    ИначеЕсли ИмяРегистра = "ДополнительныеНачисления"
        Тогда
        
        Запрос.Текст = "ВЫБРАТЬ
        | ДополнительныеНачисления.НомерСтроки,
        | ДополнительныеНачисления.ВидРасчета.СпособРасчета КАК Способ,
        | ДополнительныеНачисления.Размер";
        
        Если Параметры.База Тогда
            Запрос.Текст = Запрос.Текст + ",
            | ДополнительныеНачисленияБазаОсновныеНачисления.РезультатБаза";
        КонецЕсли;
        
        Запрос.Текст = Запрос.Текст + "
        |ИЗ
        | РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления";
        
        Если Параметры.База
            Тогда
            Запрос.Текст = Запрос.Текст + "
            | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ДополнительныеНачисления.БазаОсновныеНачисления(&Измерения, &Измерения, , Регистратор = &Ссылка) КАК ДополнительныеНачисленияБазаОсновныеНачисления
            | ПО ДополнительныеНачисления.Регистратор = ДополнительныеНачисленияБазаОсновныеНачисления.Регистратор
            | И ДополнительныеНачисления.НомерСтроки = ДополнительныеНачисленияБазаОсновныеНачисления.НомерСтроки";
            
            Измерения = Новый СписокЗначений;
            Измерения.Добавить("Сотрудник");
            Измерения.Добавить("Подразделение");
            
            Запрос.УстановитьПараметр("Измерения", Измерения);
            
        КонецЕсли;
        
        Запрос.Текст = Запрос.Текст + "
        |ГДЕ
        | ДополнительныеНачисления.Регистратор = &Ссылка
        | И ДополнительныеНачисления.ВидРасчета.КатегорияРасчета = &КатегорияРасчета";
        
    КонецЕсли;
    
    Результат = Запрос.Выполнить();
    Возврат Результат;
    
КонецФункции
1 bayron1
 
30.06.24
09:06
Обработка проведения документа "начисление зарплаты":
Процедура ОбработкаПроведения(Отказ, Режим)
      
     Движения.ОсновныеНачисления.Записывать = Истина;
     Движения.ДополнительныеНачисления.Записывать = Истина;
    
     Для Каждого ТекСтрокаНачисления Из Начисления Цикл
        
         Если ТипЗнч(ТекСтрокаНачисления.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления") Тогда
            
             Движение = Движения.ОсновныеНачисления.Добавить();
             Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
             Движение.ПериодДействияКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);                      
            
               Если ТекСтрокаНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.БольничныйЛист Тогда
               Движение.ТипГрафика = Константы.Пятидневка.Получить();
           Иначе
               Движение.ТипГрафика = ТекСтрокаНачисления.ТипГрафика;
              
               КонецЕсли;
                         
         ИначеЕсли ТипЗнч(ТекСтрокаНачисления.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ДополнительныеНачисления") Тогда
            
             Движение = Движения.ДополнительныеНачисления.Добавить();
            
         КонецЕсли;  
        
         Движение.ПериодРегистрации = ПериодРегистрации;
         Движение.Сторно = ТекСтрокаНачисления.Сторно;
         Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
         Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
         Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
         Движение.БазовыйПериодНачало = НачалоМесяца(ПериодРегистрации);
         Движение.БазовыйПериодКонец = КонецМесяца(ПериодРегистрации);
         Движение.Размер = ТекСтрокаНачисления.Размер;
        
     КонецЦикла;
    
        
     Движения.Записать();
    
     РасчетЗП.РассчитатьРегистрРасчета(Движения.ОсновныеНачисления, Отказ);
    
     РасчетЗП.РассчитатьРегистрРасчета(Движения.ДополнительныеНачисления, Отказ);
    
КонецПроцедуры
2 Гена
 
30.06.24
09:42
Эх, Семён, Семён... Что ж Вы оптовичка-то светите, коль решили написать модуль неналоговой зарплаты? )

И оплачивать дни болезни только в 1/3 - это как-то не по-людски, согласитесь... ну ладно там 3/4 или 1/2 в зависимости от стажа работы у этого оптовичка, но треть - это даже не жаба, а жабища )

Главное: ну кто начисления считает от графика? От табеля, батенька, надо считать, от табеля.
Отработал день - получи по труду, больше отработал - больше получи.

Ну и назвать процедуру РассчитатьРегистрРасчета - это не эстетично... это фи )
3 bayron1
 
30.06.24
10:13
Спасибо) можно закрыть
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший