Создан новый вид расчет Отпуск для регистра Основные начисления, он вытесняет Оклад и Больничный. Базовым для него установлен оклад. В способы расчета добавлен новый способ Отпуск, он установлен способом для созданного вида расчет в пользовательском режиме. Категория установлена 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 Тогда
Возврат;
КонецЕсли;
Если Не Отказ Тогда
ДокОбъект.Записать();
КонецЕсли;
КонецПроцедуры
Для того, чтобы избежать очистки набора записей регистра расчет при вызове функции документа РассчитатьДокумент, в нее введен необязательный параметр Очищать, по умолчанию Истина.
Финальный код модуля объекта:
Функция РассчитатьДокумент(Очищать = Истина) Экспорт
Отказ = Ложь;
Движения.ОсновныеНачисления.Записывать = Истина;
Движения.ДополнительныеНачисления.Записывать = Истина;
Для Каждого ТекСтрокаНачисления Из Начисления Цикл
Если ТипЗнч(ТекСтрокаНачисления.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления") Тогда
Движение = Движения.ОсновныеНачисления.Добавить();
Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
Движение.ПериодДействияКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);
Если ТекСтрокаНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.БольничныйЛист Тогда
Движение.ТипГрафика = Константы.Пятидневка.Получить();
Иначе Движение.ТипГрафика = ТекСтрокаНачисления.ТипГрафика;
КонецЕсли;
Если ТекСтрокаНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда
Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(Движение.ПериодДействияНачало), -3);
Движение.БазовыйПериодКонец = НачалоМесяца(Движение.ПериодДействияНачало)-1;
КонецЕсли;
ИначеЕсли ТипЗнч(ТекСтрокаНачисления.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ДополнительныеНачисления") Тогда
Движение = Движения.ДополнительныеНачисления.Добавить();
Движение.БазовыйПериодНачало = ТекСтрокаНачисления.ДатаНачала;
Движение.БазовыйПериодКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);
КонецЕсли;
Движение.Сторно = ТекСтрокаНачисления.Сторно;
Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
Движение.Размер = ТекСтрокаНачисления.Размер;
Движение.НомерСтрокиДокумента = ТекСтрокаНачисления.НомерСтроки;
КонецЦикла;
Движения.Удержания.Записывать = Истина;
Для Каждого ТекСтрокаУдержания Из Удержания Цикл
Движение = Движения.Удержания.Добавить();
Движение.Сторно = ТекСтрокаУдержания.Сторно;
Движение.ВидРасчета = ТекСтрокаУдержания.ВидРасчета;
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.Сотрудник = ТекСтрокаУдержания.Сотрудник;
Движение.Подразделение = ТекСтрокаУдержания.Подразделение;
Движение.Размер = ТекСтрокаУдержания.Размер;
Движение.БазовыйПериодНачало = НачалоМесяца(ПериодРегистрации);
Движение.БазовыйПериодКонец = КонецМесяца(ПериодРегистрации);
Движение.НомерСтрокиДокумента = ТекСтрокаУдержания.НомерСтроки;
КонецЦикла;
Для решения данной задачи было добавлено Значение перечисления способы расчета – Отпуск
Пердопределенный вид расчета Отпуск с соответствующим способом расчета.
В регистре ОсновныеНачисления был добавлен ресурс ДнейОтработано, в который помещается количество фактически отработанных дней в периоде.
Так же добавлен реквизит НомерСтрокиДокумента для установки расчитанной средней зп за 3 мес. и подстановки её в документ.
Были скорректированы универсальные алгоритмы расчета по регистрам расчета. И в структуре с учетом Отпуска и в запросе с учетом нового ресурса и реквизита и в самом расчете по
способу расчета.
Был добавлен механизм расчета средней зп для учета отпускных.
Процедура РасчитатьНаСервере() Экспорт
Отказ=Ложь;
Если Ссылка.Пустая() Тогда
Записать();
КонецЕсли;
Движения.ОсновныеНачисления.Записывать=Истина;
Для Каждого ТекСтрокаНачисления Из Начисления Цикл
Если ТипЗнч(ТекСтрокаНачисления.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления") Тогда
Если ТекСтрокаНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда
Движение = Движения.ОсновныеНачисления.Добавить();
Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
Движение.ПериодДействияКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);
Движение.ТипГрафика = ТекСтрокаНачисления.ТипГрафика;
Движение.НомерСтрокиДокумента=ТекСтрокаНачисления.НомерСтроки;
Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(ТекСтрокаНачисления.ДатаНачала),-3);
Движение.БазовыйПериодКонец = НачалоМесяца(ТекСтрокаНачисления.ДатаНачала)-1;
Движение.Сторно = ТекСтрокаНачисления.Сторно;
Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
Движение.Размер = ТекСтрокаНачисления.Размер;
КонецЕсли;
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
Движения.Записать();
РасчетЗП.РассчитатьРегистрРасчета(Движения.ОсновныеНачисления, Отказ,Начисления);
Движения.ОсновныеНачисления.Очистить();
Движения.Записать();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОсновныеНачисленияФактическийПериодДействия.Подразделение КАК Подразделение,
| ОсновныеНачисленияФактическийПериодДействия.Сотрудник КАК Сотрудник,
| ОсновныеНачисленияФактическийПериодДействия.ВидРасчета КАК ВидРасчета,
| ОсновныеНачисленияФактическийПериодДействия.ПериодДействияНачало,
| ОсновныеНачисленияФактическийПериодДействия.ПериодДействияКонец,
| ОсновныеНачисленияФактическийПериодДействия.Регистратор,
| ОсновныеНачисленияФактическийПериодДействия.НомерСтрокиДокумента
|ИЗ
| РегистрРасчета.ОсновныеНачисления.ФактическийПериодДействия(ПериодДействия МЕЖДУ &ДатаНчала И &ДатаОкончания) КАК ОсновныеНачисленияФактическийПериодДействия
|
|УПОРЯДОЧИТЬ ПО
| ВидРасчета,
| Подразделение,
| Сотрудник
|ИТОГИ ПО
| Подразделение";
ТекДок=Интервал.Расшифровка.Регистратор;
ТекНомерСтроки=Интервал.Расшифровка.НомерСтрокиДокумента;
массивИнтервалов=Новый Массив;
Для каждого ТекИнтервал Из Интервал.Значение Цикл
Если ТекИнтервал.Расшифровка.Регистратор=ТекДок и ТекИнтервал.Расшифровка.НомерСтрокиДокумента = ТекНомерСтроки Тогда
МассивИнтервалов.Добавить(ТекИнтервал);
КонецЕсли;
КонецЦикла;
Если массивИнтервалов.Количество()> 1 Тогда
ОтменаРедактирования= Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Претаскивание сложных интервалов не поддержывается.";
Сообщение.Сообщить();
КонецЕсли;
Если не ОтменаРедактирования Тогда
ОтменаРедактирования = СдвинутьПериод(ТекДок,ТекНомерСтроки,Интервал.Начало,Интервал.Конец);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция СдвинутьПериод(Документ,Номерстроки,Начало,Конец)
ДокОбъект=Документ.ПолучитьОбъект();
Если ДокОбъект.Начисления.Количество()< Номерстроки Тогда
Возврат истина;
КонецЕсли;
Попытка
ТекущаяСтрока=ДокОбъект.Начисления[Номерстроки-1];
ТекущаяСтрока.ДатаНачала=Начало;
ТекущаяСтрока.ДатаОкончания=Конец;
ДокОбъект.РасчитатьНаСервере();
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ""+ОписаниеОшибки();
Сообщение.Сообщить();
Возврат Истина;
КонецПопытки;
СформироватьОтчет();
Возврат Ложь;
КонецФункции
Так же был подкорректирована обработка проведения документа Начисление ЗП
Вход
Важно!
Для новых покупателей Базового курса - с чего начать
...........................................................
Все контакты Саппорта Spec8.ru
...........................................................
Как задавать вопросы по материалам курса и ДЗ
...........................................................
Что такое Мастер-группа
...........................................................
Все материалы этого сайта являются составной частью Базового / Продвинутого курсов по программированию - и являются объектами авторского и имущественного права.
Любое их распространение без письменного согласования с авторами запрещено.
Создан новый вид расчет Отпуск для регистра Основные начисления, он вытесняет Оклад и Больничный. Базовым для него установлен оклад. В способы расчета добавлен новый способ Отпуск, он установлен способом для созданного вида расчет в пользовательском режиме. Категория установлена 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;
КонецЕсли;
ИначеЕсли ТипЗнч(ТекСтрокаНачисления.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ДополнительныеНачисления") Тогда
Движение = Движения.ДополнительныеНачисления.Добавить();
Движение.БазовыйПериодНачало = ТекСтрокаНачисления.ДатаНачала;
Движение.БазовыйПериодКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);
КонецЕсли;
Движение.Сторно = ТекСтрокаНачисления.Сторно;
Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
Движение.Размер = ТекСтрокаНачисления.Размер;
Движение.Результат = ТекСтрокаНачисления.Результат;
Движение.НомерСтрокиДокумента = ТекСтрокаНачисления.НомерСтроки;
КонецЦикла;
Движения.Удержания.Записывать = Истина;
Для Каждого ТекСтрокаУдержания Из Удержания Цикл
Движение = Движения.Удержания.Добавить();
Движение.Сторно = ТекСтрокаУдержания.Сторно;
Движение.ВидРасчета = ТекСтрокаУдержания.ВидРасчета;
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.Сотрудник = ТекСтрокаУдержания.Сотрудник;
Движение.Подразделение = ТекСтрокаУдержания.Подразделение;
Движение.Размер = ТекСтрокаУдержания.Размер;
Движение.БазовыйПериодНачало = НачалоМесяца(ПериодРегистрации);
Движение.БазовыйПериодКонец = КонецМесяца(ПериодРегистрации);
Движение.Результат = ТекСтрокаУдержания.Результат;
Движение.НомерСтрокиДокумента = ТекСтрокаУдержания.НомерСтроки;
КонецЦикла;
КонецПроцедуры
Для решения данной задачи было добавлено Значение перечисления способы расчета – Отпуск
Пердопределенный вид расчета Отпуск с соответствующим способом расчета.
В регистре ОсновныеНачисления был добавлен ресурс ДнейОтработано, в который помещается количество фактически отработанных дней в периоде.
Так же добавлен реквизит НомерСтрокиДокумента для установки расчитанной средней зп за 3 мес. и подстановки её в документ.
Были скорректированы универсальные алгоритмы расчета по регистрам расчета. И в структуре с учетом Отпуска и в запросе с учетом нового ресурса и реквизита и в самом расчете по
способу расчета.
Был добавлен механизм расчета средней зп для учета отпускных.
Отказ=Ложь;
Если Ссылка.Пустая() Тогда
Записать();
КонецЕсли;
Движения.ОсновныеНачисления.Записывать=Истина;
Для Каждого ТекСтрокаНачисления Из Начисления Цикл
Если ТипЗнч(ТекСтрокаНачисления.ВидРасчета) = Тип("ПланВидовРасчетаСсылка.ОсновныеНачисления") Тогда
Если ТекСтрокаНачисления.ВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Отпуск Тогда
Движение = Движения.ОсновныеНачисления.Добавить();
Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
Движение.ПериодДействияКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);
Движение.ТипГрафика = ТекСтрокаНачисления.ТипГрафика;
Движение.НомерСтрокиДокумента=ТекСтрокаНачисления.НомерСтроки;
Движение.БазовыйПериодНачало = ДобавитьМесяц(НачалоМесяца(ТекСтрокаНачисления.ДатаНачала),-3);
Движение.БазовыйПериодКонец = НачалоМесяца(ТекСтрокаНачисления.ДатаНачала)-1;
Движение.Сторно = ТекСтрокаНачисления.Сторно;
Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
Движение.Подразделение = ТекСтрокаНачисления.Подразделение;
Движение.Размер = ТекСтрокаНачисления.Размер;
КонецЕсли;
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
Движения.Записать();
РасчетЗП.РассчитатьРегистрРасчета(Движения.ОсновныеНачисления, Отказ,Начисления);
Движения.ОсновныеНачисления.Очистить();
Движения.Записать();
КонецПроцедуры
Создан отчет по диаграмме Ганта
Процедура Сформировать(Команда)
СформироватьОтчет();
КонецПроцедуры
&НаСервере
Процедура СформироватьОтчет()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОсновныеНачисленияФактическийПериодДействия.Подразделение КАК Подразделение,
| ОсновныеНачисленияФактическийПериодДействия.Сотрудник КАК Сотрудник,
| ОсновныеНачисленияФактическийПериодДействия.ВидРасчета КАК ВидРасчета,
| ОсновныеНачисленияФактическийПериодДействия.ПериодДействияНачало,
| ОсновныеНачисленияФактическийПериодДействия.ПериодДействияКонец,
| ОсновныеНачисленияФактическийПериодДействия.Регистратор,
| ОсновныеНачисленияФактическийПериодДействия.НомерСтрокиДокумента
|ИЗ
| РегистрРасчета.ОсновныеНачисления.ФактическийПериодДействия(ПериодДействия МЕЖДУ &ДатаНчала И &ДатаОкончания) КАК ОсновныеНачисленияФактическийПериодДействия
|
|УПОРЯДОЧИТЬ ПО
| ВидРасчета,
| Подразделение,
| Сотрудник
|ИТОГИ ПО
| Подразделение";
Запрос.УстановитьПараметр("ДатаНчала", Отчет.Период.ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", Отчет.Период.ДатаОкончания);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаПодразделение = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Отчет.Результат.Очистить();
Пока ВыборкаПодразделение.Следующий() Цикл
СерияПодразделение= Отчет.Результат.УстановитьСерию(ВыборкаПодразделение.Подразделение);
ВыборкаДетальныеЗаписи = ВыборкаПодразделение.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Серия=Отчет.Результат.УстановитьСерию(ВыборкаДетальныеЗаписи.Сотрудник,ВыборкаПодразделение.Подразделение);
Точка= Отчет.Результат.УстановитьТочку(ВыборкаДетальныеЗаписи.ВидРасчета);
Значение=Отчет.Результат.ПолучитьЗначение(Точка,Серия);
Значение.Редактирование=Истина;
Интервал=Значение.Добавить();
Интервал.Начало=ВыборкаДетальныеЗаписи.ПериодДействияНачало;
Интервал.Конец=ВыборкаДетальныеЗаписи.ПериодДействияКонец;
Интервал.Расшифровка=Новый Структура("Регистратор,НомерСтрокиДокумента",ВыборкаДетальныеЗаписи.Регистратор,ВыборкаДетальныеЗаписи.НомерСтрокиДокумента);
КонецЦикла;
Отчет.Результат.РазвернутьСерию(СерияПодразделение,Истина);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура РезультатПриОкончанииРедактированияИнтервала(Элемент, Интервал, ОтменаРедактирования)
Сдвиг=Интервал.Начало - НачалоДня(Интервал.Начало);
Интервал.Начало = Интервал.Начало-Сдвиг;
Интервал.Конец = Интервал.Конец-Сдвиг;
ТекДок=Интервал.Расшифровка.Регистратор;
ТекНомерСтроки=Интервал.Расшифровка.НомерСтрокиДокумента;
массивИнтервалов=Новый Массив;
Для каждого ТекИнтервал Из Интервал.Значение Цикл
Если ТекИнтервал.Расшифровка.Регистратор=ТекДок и ТекИнтервал.Расшифровка.НомерСтрокиДокумента = ТекНомерСтроки Тогда
МассивИнтервалов.Добавить(ТекИнтервал);
КонецЕсли;
КонецЦикла;
Если массивИнтервалов.Количество()> 1 Тогда
ОтменаРедактирования= Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Претаскивание сложных интервалов не поддержывается.";
Сообщение.Сообщить();
КонецЕсли;
Если не ОтменаРедактирования Тогда
ОтменаРедактирования = СдвинутьПериод(ТекДок,ТекНомерСтроки,Интервал.Начало,Интервал.Конец);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция СдвинутьПериод(Документ,Номерстроки,Начало,Конец)
ДокОбъект=Документ.ПолучитьОбъект();
Если ДокОбъект.Начисления.Количество()< Номерстроки Тогда
Возврат истина;
КонецЕсли;
Попытка
ТекущаяСтрока=ДокОбъект.Начисления[Номерстроки-1];
ТекущаяСтрока.ДатаНачала=Начало;
ТекущаяСтрока.ДатаОкончания=Конец;
ДокОбъект.РасчитатьНаСервере();
ДокОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ""+ОписаниеОшибки();
Сообщение.Сообщить();
Возврат Истина;
КонецПопытки;
СформироватьОтчет();
Возврат Ложь;
КонецФункции
Так же был подкорректирована обработка проведения документа Начисление ЗП