Помогите написать кусочек кода.

1. user1949369 18.05.23 12:53 Сейчас в теме
Здравствуйте. Помогите пожалуйста. Делаю зарплату, используя План видов расчета, Регистр расчета и документа "Начисление Сотрудникам".

Я делаю пример по книжке. И хочу немного доработать этот пример.

У меня зарплата вычисляет следующим образом, я в регистре расчета заполняю график работы, потом открываю документ "Начисление Сотрудникам" и заполняю его табличную часть, "Вид расчета" выбираю оклад и ставлю 10 000,00 в реквизит "Начислено" (пример скину в картинке).

А видов расчета несколько, "Оклад", "Невыход" и "Премия (20% от оклада)".

И вот что я хочу доработать: У меня есть регистр накопления "Продажи" куда попадают данные с документа "ОказаниеУслуги". И я добавил новый вид расчета "ПроцентОтУслуг" и я хочу чтобы при его выборе в сумме все складывалось вместе с Окладом и Невыходом.

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

Как это можно реализовать лучше, дайте экспертное мнение пожалуйста.

Код Общий модуль "ПроведениеРасчетов":
Процедура РассчитатьНачисления(НаборЗаписейРегистра, ТребуемыйВидРасчета, СписокСотрудников) Экспорт
    
    Регистратор = НаборЗаписейРегистра.Отбор.Регистратор.Значение;
    // Рассчитать первичные записи
    Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда
        // Рассчитать вторичные записи
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |     НачисленияДанныеГрафика.ЗначениеПериодДействия КАК Норма,
            |     НачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК Факт,
            |     НачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки
            |ИЗ
            |     РегистрРасчета.Начисления.ДанныеГрафика(Регистратор = &Регистратор И
            |     ВидРасчета = &ВидРасчета И Сотрудник В (&СписокСотрудников))
            |     КАК НачисленияДанныеГрафика";
        
        Запрос.УстановитьПараметр("Регистратор", Регистратор);
        Запрос.УстановитьПараметр("ВидРасчета", ТребуемыйВидРасчета);
        Запрос.УстановитьПараметр("СписокСотрудников", СписокСотрудников);
        
        ВыборкаРезультата = Запрос.Выполнить().Выбрать(); 
        
        Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл
            СтруктураНомер = Новый Структура("НомерСтроки");
            СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки;
            ВыборкаРезультата.Сбросить();
            Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер) Тогда
                Если ВыборкаРезультата.Норма = 0 Тогда
                    Сообщение = Новый СообщениеПользователю;
                    Сообщение.Текст = "Вид расчета: Оклад – Нет рабочих дней в заданном периоде";
                    Сообщение.Сообщить();
                    ЗаписьРегистра.Результат = 0;
                Иначе
                    // Рассчитать оклад по фактическому периоду и исходным данным
                    ЗаписьРегистра.Результат = (ЗаписьРегистра.ИсходныеДанные / ВыборкаРезультата.Норма) * ВыборкаРезультата.Факт;
                    Сообщение = Новый СообщениеПользователю;
                    Сообщение.Текст = "Выполнен расчет " + ЗаписьРегистра.Регистратор + " – " + ЗаписьРегистра.ВидРасчета + " – " +
                    ЗаписьРегистра.Сотрудник;
                    Сообщение.Сообщить();
                КонецЕсли; 
                
            КонецЕсли; 
            
        КонецЦикла;
        
        
    ИначеЕсли ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда
        Запрос = Новый Запрос;
        Запрос.Текст =
             "ВЫБРАТЬ
            |     НачисленияБазаНачисления.РезультатБаза КАК База,
            |     НачисленияБазаНачисления.НомерСтроки КАК НомерСтроки
            |ИЗ
            |     РегистрРасчета.Начисления.БазаНачисления(&ИзмеренияОсновного,
            |         &ИзмеренияБазового, , Регистратор = &Регистратор И ВидРасчета = &ВидРасчета И             
            |         Сотрудник В (&СписокСотрудников)) КАК НачисленияБазаНачисления";
        
        Измер = Новый Массив(1);
        Измер[0] = "Сотрудник";
        
        Запрос.УстановитьПараметр("ИзмеренияОсновного", Измер);
        Запрос.УстановитьПараметр("ИзмеренияБазового", Измер);
        Запрос.УстановитьПараметр("Регистратор", Регистратор);
        Запрос.УстановитьПараметр("ВидРасчета", ТребуемыйВидРасчета);
        Запрос.УстановитьПараметр("СписокСотрудников", СписокСотрудников);
        ВыборкаРезультата = Запрос.Выполнить().Выбрать();
        
        Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл
            СтруктураНомер = Новый Структура("НомерСтроки");
            СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки;
            ВыборкаРезультата.Сбросить();                  
            
            Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер) Тогда
                ЗаписьРегистра.Результат = ВыборкаРезультата.База * (10 / 100);
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "Выполнен расчет " + ЗаписьРегистра.Регистратор + " – " + ЗаписьРегистра.ВидРасчета + " – " + ЗаписьРегистра.Сотрудник;
                Сообщение.Сообщить();
                
            КонецЕсли; 
            
        КонецЦикла;
        
    КонецЕсли;
    
КонецПроцедуры
Показать


Код Документ "НачисленияСотрудникам": Модуль объекта
Процедура ОбработкаПроведения(Отказ, Режим)
    
    // регистр Начисления
    Движения.Начисления.Записывать = Истина;
    Для Каждого ТекСтрокаНачисления Из Начисления Цикл
        Движение = Движения.Начисления.Добавить();
        Движение.Сторно = Ложь;
        Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
        Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
        Движение.ПериодДействияКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);
        Движение.ПериодРегистрации = Дата;
        Движение.БазовыйПериодНачало = ТекСтрокаНачисления.ДатаНачала;
        Движение.БазовыйПериодКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);
        Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
        Движение.ГрафикРаботы = ТекСтрокаНачисления.ГрафикРаботы;
        Движение.ИсходныеДанные = ТекСтрокаНачисления.Начислено;
    КонецЦикла;
    
    
        // Записываем движения регистров
        Движения.Начисления.Записать();
        // Получим список всех сотрудников, содержащихся в документе
        Запрос = Новый Запрос(
            "ВЫБРАТЬ РАЗЛИЧНЫЕ
            |     НачисленияСотрудникамНачисления.Сотрудник
            |ИЗ
            |     Документ.НачисленияСотрудникам.Начисления КАК НачисленияСотрудникамНачисления
            |
            |ГДЕ
            |     НачисленияСотрудникамНачисления.Ссылка = &ТекущийДокумент");
        Запрос.УстановитьПараметр("ТекущийДокумент", Ссылка);
        
        // Сформируем список сотрудников
        ТаблЗнач = Запрос.Выполнить().Выгрузить();
        МассивСотрудников = ТаблЗнач.ВыгрузитьКолонку("Сотрудник");
        
        // Вызов процедуры РассчитатьНачисления из общего модуля
        ПроведениеРасчетов.РассчитатьНачисления(Движения.Начисления, ПланыВидовРасчета.ОсновныеНачисления.Оклад, МассивСотрудников);
        Движения.Начисления.Записать( , Истина);
        
        ПроведениеРасчетов.РассчитатьНачисления(Движения.Начисления, ПланыВидовРасчета.ОсновныеНачисления.Премия, МассивСотрудников);
        Движения.Начисления.Записать( , Истина);

КонецПроцедуры
Показать
Прикрепленные файлы:
По теме из базы знаний
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот