Имя: Пароль:
1C
1С v8
Алгоритм. Оклады
0 wwwqwert2014
 
29.06.14
20:14
Никак не могу придумать нормальный алгоритм. Постоянно ерунда какая-то получается. Не хочется изобретать велосипед. Можете подсказать как бы вы правильно и рационально реализовали данную задачу.
    
Необходимо начислять оклад документом начислениеЗарплаты. в документе могут быть данные за разные отчетные периоды. Значение оклада берётся из РС. То есть например, сотруднику Бельдыев начисляется оклад за период с 01.04 по 30.04, а сотруднику Васина за период 01.05 - 31.05. Это условие на позволяет на РС в запросе наложить условия начала и конца периода.
Очень важная деталь. Значения окладов могут меньяться каждый день. Это нужно учесть при расчете зарплаты. Я кое-как написал алгоритм, но мне кажется, что это Велосипед. Подскажите, как бы вы написали. Спрашиваю с той целью, чтобы сэкономить время на экзамене:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    // Вставить содержимое обработчика.
    
    
    Движения.ОсновначНачисления.Записывать = Истина;
    
    //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

        Запрос.УстановитьПараметр("Ссылка", Ссылка);

    РезультатЗапроса = Запрос.ВыполнитьПакет();
    
    ГрафикПятидневкаВыборка = РезультатЗапроса[3].Выбрать();

    
    Если ГрафикПятидневкаВыборка.Следующий() Тогда
           ГрафикПятидневка = ГрафикПятидневкаВыборка.ГрафикПятидневка;
    КонецЕсли;
    
    ТЗОклад = РезультатЗапроса[1].Выгрузить();
    
    Сч = 0;
    КоличествоЭлементов = ТЗОклад.Количество();
    Пока Сч < КоличествоЭлементов Цикл
        // Вставить обработку выборки ВыборкаДетальныеЗаписи
        Строка = ТЗОклад[Сч];
        ПредыдущаяСтрока = Новый Структура("Сотрудник, Подрразделение");
        СледующаяСтрока  = Новый Структура("Сотрудник, Подрразделение");
        Попытка
            ПредыдущаяСтрока = ТЗОклад[Сч-1];
            Исключение
                
        КонецПопытки;
        
        Попытка
            СледующаяСтрока = ТЗОклад[Сч+1];
        Исключение
            
        КонецПопытки;
        
        Движение = Движения.ОсновначНачисления.Добавить();
        Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад;
        Движение.График = Строка.График;
        Движение.ПериодДействияНачало = Строка.ДатаНачала;
        Движение.ПериодДействияКонец = КонецДня(Строка.ДатаОкончания);
        
        Если ПредыдущаяСтрока.Сотрудник = Строка.Сотрудник И ПредыдущаяСтрока.Подразделение = Строка.Подразделение Тогда
            Если Строка.Период > Строка.ДатаНачала Тогда
                Движение.ПериодДействияНачало = Строка.Период;
            КонецЕсли;            
        КонецЕсли;
                                                        
        Если СледующаяСтрока.Сотрудник = Строка.Сотрудник И СледующаяСтрока.Подразделение = Строка.Подразделение Тогда
            
            Если СледующаяСтрока.Период < Строка.ДатаОкончания Тогда
                Движение.ПериодДействияКонец = СледующаяСтрока.Период-1;
            КонецЕсли;
            
        КонецЕсли;
        
        
        Движение.ПериодРегистрации = Строка.ДатаНачала;
        Движение.Подразделение = Строка.Подразделение;
        Движение.Регистратор = Ссылка;
        Движение.Сотрудник = Строка.Сотрудник;
        Движение.Размер = Строка.Оклад;
        
        
        Сч = Сч + 1;
        
    КонецЦикла;
    
    
    ТЗКомандировка = РезультатЗапроса[2].Выгрузить();
    
    Для Каждого Строка ИЗ ТЗКомандировка Цикл
        Движение = Движения.ОсновначНачисления.Добавить();
        Движение.БазовыйПериодНачало = НачалоМесяца(ДобавитьМесяц(Строка.ДатаНАчала, -2));
        Движение.БазовыйПериодКонец = НАчалоМЕсяца(Строка.ДатаНачала) - 1;
        Движение.ПериодДействияНачало = Строка.ДатаНачала;
        Движение.ПериодДействияКонец = КонецДня(Строка.ДатаОкончания);
        Движение.ПериодРегистрации = Строка.ДатаНачала;
        Движение.Регистратор = Ссылка;
        Движение.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Командировка;
        Движение.Сотрудник = Строка.Сотрудник;
        Движение.Подразделение = Строка.Подразделение;
        Движение.Сторно = Ложь;
        Движение.График = ГрафикПятидневка;
    КонецЦикла;
    
    Движения.ОсновначНачисления.Записать();

        РассчитатьОсновныеНачисления(Движения.ОсновначНачисления, Ссылка);
    
КонецПроцедуры
1 wwwqwert2014
 
29.06.14
20:14
полное условие задачи:
    Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений. Каждый сотрудник может работать одновременно в нескольких подразделениях компании, то есть совместительство допускается.
    Все сотрудники работают по пятидневному графику работы, однако в решении необходимо предусмотреть возможность работы по нескольким различным графикам.
    Сотрудники предприятия получают оплату по окладу пропорционально отработанному времени в часах. Часовая ставка рассчитывается как начальное значение оклада, деленное на количество рабочих часов в том же периоде, что и фактически отработанные часы. Первоначальное значение оклада может изменяться не чаще, чем один раз в день, но берется на начало расчетного периода. В информационной базе необходимо хранить историю его изменения.
    По мере необходимости любой сотрудник может быть отправлен в командировку.
В этом случае начисление по окладу не происходит. Часы, проведенные в командировке, определяются по пятидневному графику работы. Часовая ставка для расчета командировки определяется как сумма всех начислений за два предыдущих месяца, деленная на количество отработанных часов в двух предыдущих месяцах. Следует учесть, что данные о командировке могут вводиться в систему задним числом.
Механизм перерасчетов в рамках данной задачи использовать не надо.
Ввод всех начислений происходит документом «Начисление зарплаты». Документ в расчетном периоде может быть один (сразу для всех видов расчета), а может быть несколько (по одному для каждого отдельного вида расчета). Считать, что все данные вводятся только в пределах одного месяца, например, можно указать начисление оклада с 10.01 по 31.01, а запись оклад: с 10.01 по 03.02 вводить нельзя. В одном документе могу быть данные за разные расчетные периоды.
2 wwwqwert2014
 
29.06.14
20:20
вот сам dt-шник http://gfile.ru/aa7rO
3 ИсчадиеADO
 
29.06.14
20:22
сходи на форум Чистова, там все эти задачи решенные
4 wwwqwert2014
 
29.06.14
20:27
(3) на чистове прорешены все задачи из этого сборника, а прогрешанные актуальные билеты я не обнаружил. В сборнике пролистал все задачи, нет строчки:В одном документе могу быть данные за разные расчетные периоды. Ни в одной задаче
5 wwwqwert2014
 
29.06.14
20:27
задачи на экзамене малость видоизменены. А это видоизменение окаалось существенным и хотелось бы узнать кто как бы составил алгоритм
6 ИсчадиеADO
 
29.06.14
20:37
(4) были такие задания, не во всех конечно, но были