комментария 2 на “Продвинутый курс. Занятие №18”

  1. Создан новый вид расчет Отпуск для регистра Основные начисления, он вытесняет Оклад и Больничный. Базовым для него установлен оклад. В способы расчета добавлен новый способ Отпуск, он установлен способом для созданного вида расчет в пользовательском режиме. Категория установлена 0, так как начисления по окладу в текущем периоде не влияют на отпускные. В регистр расчета Основные начисления добавлен новый ресурс ОтработаноДней, он будет хранить фактический период действия оклада для расчета отпускных.
    В форме документа НачислениеЗаработнойПлаты создана команда Рассчитать, она производит расчет размеров по строкам и вносит их в документ, одновременно очищая движения. При проведении документы данные заносятся в регистр непосредственно из реквизитов документа, минуя расчет. При этом возможна корректировка результата.
    Также в регистр расчета Основные начисления добавлен новый реквизит НомерСтрокиДокумента, для однозначной идентификации номера сроки документа и строки регистра расчета.
    Между методами передается табличная часть документа, которая дозаполняется при расчете.
    Конечный текст общего модуля для расчета з/п:

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

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

        Результат = Запрос.Выполнить();

        ВыборкаКатегория = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

        Пока ВыборкаКатегория.Следующий() Цикл

            ВыборкаДетальныеЗаписи = ВыборкаКатегория.Выбрать();
            Параметры = ПолучитьСтруктуруНеобходимыхДанных(ВыборкаДетальныеЗаписи);

            Результат = ПолучитьДанныеДляРасчета(Параметры, ИмяРегистра, Ссылка, ВыборкаКатегория.Категория);
           
            Выборка = Результат.Выбрать();
       
            РассчитатьЗаписиРегистраРасчета(Выборка, Движения, Отказ, Таблица);
           
            Движения.Записать( , Истина);
           
        КонецЦикла;

    КонецПроцедуры

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

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

    КонецФункции

    Процедура РассчитатьЗаписиРегистраРасчета(Выборка, Набор, Отказ, Таблица)

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

    Код модуля формы для созданной диаграммы:

    &НаКлиенте
    Процедура Сформировать(Команда)
        СформироватьНаСервере();
    КонецПроцедуры

    &НаСервере
    Процедура СформироватьНаСервере()
       
        Диаграмма.Очистить();

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

    &НаКлиенте
    Процедура ДиаграммаПриОкончанииРедактированияИнтервала(Элемент, Интервал, ОтменаРедактирования)
       
        Расшифровка =  Интервал.Значение.Расшифровка;
        Если Расшифровка.Регистратор = Неопределено Тогда
            Возврат;
        КонецЕсли;
        РазностьДат = Интервал.Конец - Интервал.Начало;
        Начало = НачалоДня(Интервал.Начало);
        Конец = КонецДня(Начало+РазностьДат);
        Если НачалоМесяца(Начало) = НачалоМесяца(Конец) Тогда
        ОбработатьИнтервалНаСервере(Расшифровка, Интервал.Начало, Интервал.Конец);
        Иначе Сообщить("Неверный интервал, перекрывает более одного месяца");
        КонецЕсли;
        СформироватьНаСервере();
       
    КонецПроцедуры

    &НаСервереБезКонтекста
    Процедура ОбработатьИнтервалНаСервере(Расшифровка, Начало, Конец)

        ДокОбъект = Расшифровка.Регистратор.ПолучитьОбъект();
        НомерСтроки = Расшифровка.НомерСтроки;
        Если ДокОбъект.Начисления.Количество()<НомерСтроки И НомерСтроки>0 Тогда
            Возврат;
        КонецЕсли;
       
        ДокОбъект.Начисления[НомерСтроки-1].ДатаНачала = Начало;
        ДокОбъект.Начисления[НомерСтроки-1].ДатаОкончания = Конец;
       
        Отказ = ДокОбъект.РассчитатьДокумент(Ложь);
       
        Если Не Отказ Тогда
            ДокОбъект.Записать();
        КонецЕсли;
       
    КонецПроцедуры

    Для того, чтобы избежать очистки набора записей регистра расчет при вызове функции документа РассчитатьДокумент, в нее введен необязательный параметр Очищать, по умолчанию Истина.
    Финальный код модуля объекта:

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

        РасчетЗП.РассчитатьРегистрРасчета(Движения.ДополнительныеНачисления, Отказ, Начисления);

        Если Очищать Тогда
            Движения.ОсновныеНачисления.Очистить();
            Движения.ДополнительныеНачисления.Очистить();
            Движения.Удержания.Очистить();
            Движения.ОсновныеНачисления.Записывать = Истина;
            Движения.ДополнительныеНачисления.Записывать = Истина;
            Движения.Удержания.Записывать = Истина;
            Движения.Записать();
        КонецЕсли;
       
        Возврат Отказ;
       
    КонецФункции

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

    КонецПроцедуры
  2. Для решения данной задачи было добавлено Значение перечисления способы расчета – Отпуск
    Пердопределенный вид расчета Отпуск с соответствующим способом расчета.
    В регистре ОсновныеНачисления был добавлен ресурс ДнейОтработано, в который помещается количество фактически отработанных дней в периоде.
    Так же добавлен реквизит НомерСтрокиДокумента для установки расчитанной средней зп за 3 мес. и подстановки её в документ.
    Были скорректированы универсальные алгоритмы расчета по регистрам расчета. И в структуре с учетом Отпуска и в запросе с учетом нового ресурса и реквизита и в самом расчете по
    способу расчета.
    Был добавлен механизм расчета средней зп для учета отпускных.

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

    КонецПроцедуры

    Создан отчет по диаграмме Ганта

    &НаКлиенте
    Процедура Сформировать(Команда)
        СформироватьОтчет();
    КонецПроцедуры


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

       
       
    КонецПроцедуры

    &НаКлиенте
    Процедура РезультатПриОкончанииРедактированияИнтервала(Элемент, Интервал, ОтменаРедактирования)
        Сдвиг=Интервал.Начало - НачалоДня(Интервал.Начало);
        Интервал.Начало = Интервал.Начало-Сдвиг;
        Интервал.Конец =  Интервал.Конец-Сдвиг;     
       
        ТекДок=Интервал.Расшифровка.Регистратор;
        ТекНомерСтроки=Интервал.Расшифровка.НомерСтрокиДокумента;
        массивИнтервалов=Новый Массив;
        Для каждого ТекИнтервал Из Интервал.Значение Цикл
            Если ТекИнтервал.Расшифровка.Регистратор=ТекДок и ТекИнтервал.Расшифровка.НомерСтрокиДокумента = ТекНомерСтроки Тогда
                МассивИнтервалов.Добавить(ТекИнтервал);
            КонецЕсли;
        КонецЦикла;
       
        Если массивИнтервалов.Количество()> 1 Тогда
            ОтменаРедактирования= Истина;
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Претаскивание сложных интервалов не поддержывается.";
            Сообщение.Сообщить();
        КонецЕсли;
        Если не ОтменаРедактирования Тогда
            ОтменаРедактирования = СдвинутьПериод(ТекДок,ТекНомерСтроки,Интервал.Начало,Интервал.Конец);
        КонецЕсли;  
       
           
    КонецПроцедуры

    &НаСервере
    Функция СдвинутьПериод(Документ,Номерстроки,Начало,Конец)

        ДокОбъект=Документ.ПолучитьОбъект();
        Если ДокОбъект.Начисления.Количество()< Номерстроки  Тогда
            Возврат истина;   
        КонецЕсли;
       
        Попытка
            ТекущаяСтрока=ДокОбъект.Начисления[Номерстроки-1];
            ТекущаяСтрока.ДатаНачала=Начало;
            ТекущаяСтрока.ДатаОкончания=Конец;  
            ДокОбъект.РасчитатьНаСервере();
            ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
        Исключение
           
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = ""+ОписаниеОшибки();
            Сообщение.Сообщить();
            Возврат Истина;
        КонецПопытки;
       

        СформироватьОтчет();
        Возврат Ложь;
    КонецФункции

    Так же был подкорректирована обработка проведения документа Начисление ЗП