Показаны сообщения с ярлыком Сложные периодические расчеты. Показать все сообщения
Показаны сообщения с ярлыком Сложные периодические расчеты. Показать все сообщения

среда, 24 июня 2015 г.

1с специалист. Решение задачи 3.31


Сложное для понимания условие. Основная путаница в  том какую структуру регистра сведений "Графики работы" выбрать.
В условии говорится о сменах и о том что "Каждый охранник может работать в любую смену", значит можно так понимать что вчера охранник работал в смену 1, сегодня в смену 3, а завтра может в смену 2. Далеко не очевидно тогда как это увязывается с условием "Все сотрудники работают по графику работы, установленному для каждого охранника отдельно",  что намекает на то что измерение сотрудник должно быть в регистре и оно в свою очередь должно быть связано с измерением реквизита расчета.
Таким образом видится 2 варианта РС.


 

С практической точки зрения первый вариант слегка абсурден, ведь для каждого сотрудника придется заполнять график для каждой из смен и пятидневку для отпуска, это нормально если сотрудников больше 1000?.
Еще смены 2 и 3 имеют протяженность в 7 часов. В остальном ничего нового. Периодичность РР = "месяц", при формировании записей проконтролируем переход из одного месяца в другой  и при необходимость разобьем запись на 2.

ПВР "Основные начисления" (Тариф, Больничный). Больничный естественно вытесняет тариф а тариф является базовым для больничного.
ПВР "Дополнительные начисления". (Компенсация и переработка). Базовым ВР для переработки будет также тариф.

При расчете тарифа все стандартно.
Для расчета больничного заполним его базовый период равный прошлой неделе.
Для расчета компенсации добавим РС "Размеры компенсаций" с периодичность год, и единственным ресурсом "Размер". Заполним значение результата прямо в обработке проведения документа.
Для расчета переработки добавим константу "Недельная норма часов", в РР "основные начисления" добавим ресурс "Отработано часов". При расчете будем сравнивать значение базы по этому ресурсу со значением константы. Если случилась переработка, то часы пераработки умножим на 100.

Отчет.
ВЫБРАТЬ
ДополнительныеНачисления.Сотрудник,
ДополнительныеНачисления.Параметр КАК КоличествоЧасовПереработки,
ДополнительныеНачисления.Результат КАК СуммаПремии
ИЗ
РегистрРасчета.ДополнительныеНачисления КАК ДополнительныеНачисления
ГДЕ
ДополнительныеНачисления.ПериодРегистрации МЕЖДУ &ДатаНачала И &ДатаОкончания
И ДополнительныеНачисления.ВидРасчета = &ВидРасчета
И ДополнительныеНачисления.Результат <> 0



воскресенье, 14 июня 2015 г.

1c специалист. Решение задачи 3.49

Одна из самых сложных задач в сборнике. Просмотрев "по диагонали" условие задачи по началу и не приметил подвоха, но почитав на форумах обсуждение этой задачи стало понятно что это "Мега задача". Если внимательно посмотреть на отчет, то можно увидеть косяк в арифметике: у сотрудника Ивановой начальное сальдо = 100, начислено 200 ,а  к выплате = 270. Как такое может быть? опечатку естественно исключаем. Есть 2 гипотезы: 1)  так как ведомость за январь, то возможно с января сменилась основная валюта учета и начальное сальдо 100 (чисто гипотетически -это сумма в долларах) , затем начислено 200 (евро) Итого 270 могло получится путем конвертации 100 долларов в 70 евро, но складывать вместе попугаев с крокодилами по меньшей мере некорректно, поэтому более правдоподобным кажется вторая гипотеза: Ивановой положено 300 уе к выплате, но 30-ку "зажали" и решили пока выплатить только 270, исходя из этого и будем двигаться в решении задачи.

1) Проектирование регистров.
Кроме РР придется использовать РН "Взаиморасчеты", документ "Начисление ЗП" будет делать движения (+), документ "Зарплата к выплате" (-).


Структура РР  "Основные начисления" будет следующей:

Обратите внимание на 2 момента:
  • Валюту обязательно  в реквизиты, иначе при начисление оклада и командировки  в разных валютах не произойдет вытеснение фактического периода действия оклада.
  • 2 ресурса : "Сумма"- в валюте начисления и "Результат в валюте учета" . Для чего это нужно: Допустим в ноябре начисления сотруднику в рублях, в декабре начисления  в долларах, а в январе отправили в командировку оплачиваемую в евро. Как в этом случае делать расчет. Для этого и пригодится второй ресурс. Базу переведем в рубли, и полученную рублевую сумму перегоним в евро.


2) Смена валюты.
Понадобится документ "Установка Валюты", для того чтобы при смене валюты перевести долги по взаиморасчетам из одной валюты в другую. 



Вообще многовато кода получилось, по-моему на экзамене решить ее не реально по времени. Я например больше часа ""вкуривал" только одно условие задачи и остальной день ( с перерывами конечно) ее решал. Возможны ошибки, но задача уже так достала что смотреть на нее больше сил нет)



Возможно Вам будет интересен курс "Профессиональный учет в 1С:ЗУП 3.0»

пятница, 12 июня 2015 г.

1c специалист решение задачи 3.48


Основные моменты

 1) "Начисление зарплаты сотрудникам предприятия осуществляется ежемесячно с использованием метода отклонений и ведется одновременно в разных валютах. Количество валют ведения учета заранее не известно".

Только один вариант решения видится:
В РР добавляем измерение(хотя может быть можно было и в реквизит засунуть) "Валюта"
будет 2 ресурса "СуммаРуб" и "СуммаВал", и в реквизит "Курс валюты".
В ТЧ документа добавляем эти же реквизиты.
При расчетах в зависимости от выбранной валюты выполняем пересчет.

2) С ПВР все очевидно: "Основные начисления" (Оклад), "Дополнительные начисления" (Компенсация и премия"). 

3) Добавляем объект перерасчет в РР "Дополнительные начисления".




Возможно Вам будет интересен курс "Профессиональный учет в 1С:ЗУП 3.0»



четверг, 11 июня 2015 г.

1с специалист решение задачи 3.47

Задача выполнялась на основе предыдущей задачи, так как изменения в условии не существенны.
Отличия:
1) Добавилась сумма в евро, поэтому по аналогии с суммой в долларах везде добавляем и сумму в евро.
2) Приводим ПВР согласно условию задачи.
Основные начисления (Тариф, Отпуск)
Дополнительные начисления (Компенсация питания).
3) Добавляем документ. В нем нужны 2 команды: "Заполнить" и "Печать".

Скачать решение задачи 3.47

Возможно Вам будет интересен курс "Профессиональный учет в 1С:ЗУП 3.0»

1c специалист решение задачи 3.46

Основные моменты:

1) Необходимо определится сколько ПВР необходимо 1 или 2. Основной вопрос по ВР "Компенсация мобильной связи". Я полагаю что этот ВР не имеет продолжительности по времени а зависит от количества рабочих дней, поэтому в решении 2 ПВР: "Основные начисления" (Тариф, Премия, Фиксированная сумма) и "Дополнительные начисления" ("Компенсация мобильной связи").

2) В условии сказано "причем для каждого подразделения компании ведется свой график".
Скорее всего это значит что РС "Графики работы" должен быть с 2-мя измерениями "Подразделение" и "График" и регистре расчета необходимо связать измерение "подразделение" с соответствующим измерением регистра сведений.

3) По условию начисление ЗП ведется в 2-х валютах, поэтому в регистрах 2 ресурса (Сумма руб и Сумма Дол.) Значение курса берем из регистра сведений "Курсы валют". Одноименный реквизит добавляем в документ "Начисление ЗП" и будем записывать его в процедуре "ПередЗаписью", и добавляем в реквизит регистров расчета, чтобы было видно по какому курсу рассчитана валютная сумма, иначе при изменении курса можно не найти концов.

4) Расчет по тарифу. Единственный не понятный момент как все же рассчитывать тариф.
Например отработал сотрудник 100 часов, ему значение тарифа брать напрямую из шкалы тарифов соответствующее 100 часам или первые 60 часов по более низкой ставке, а оставшиеся 40 по следующей ставке. Ранее я уже делал расчет вторым способом , но для упрощения сейчас выбран первый вариант.

5) Расчет "Компенсации мобильной связи".
Так как в условии  расчет производится за каждый рабочий день, а не за отработанный
то придется добавить  в РР третий ресурс "РабочихДней".

среда, 10 июня 2015 г.

1с специалист решение задачи 3.45

РЕШЕНИЕ:

1) ПВР "Основные начисления" - Оклад.
    ПВР "Дополнительные начисления" - Премия(Оклад является базовым и ведущим ВР) и надбавка.
2) Добавим объект "ПерерасчетДоп" в РР "Дополнительные начисления".
3) Как обычно при еженедельном расчете ЗП заводим документ "Табель" вертикальной структуры.

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

9) Простейший отчет по объекту "Перерасчет".

СКАЧАТЬ решение задачи 3.45


Возможно Вам будет интересен курс "Профессиональный учет в 1С:ЗУП 3.0»

вторник, 9 июня 2015 г.

1с специалист решение задачи 3.44

Решение:
Основные моменты задачи:
1) "Вертикальный график". Табель выглядит как-то так:



2) Начисление ЗП происходит еженедельно.
3) При начислении оклада в первичные записи необходимо записывать базовый период. Делается это для того чтобы  определить количество рабочих дней в неделе.
4) Необходимо учесть, то что первичная запись может быть разделена сразу на 2: если  неделя переходит из одного месяца в другой.

Сделать это можно так:
Перед записью движений вызываем процедуру РазделитьЗаписьПомесячно


Процедура РазделитьЗаписьПомесячно(Движение)
Если НачалоМесяца(Движение.ПериодДействияНачало) <> НачалоМесяца(Движение.ПериодДействияКонец) Тогда
ДопДвижение = Движения.ОсновныеНачисления.Добавить();
ЗаполнитьЗначенияСвойств(ДопДвижение, Движение);
Движение.ПериодДействияКонец = КонецМесяца(Движение.ПериодДействияНачало);
ДопДвижение.ПериодДействияНачало = НачалоМесяца(ДопДвижение.ПериодДействияКонец);
ДопДвижение.БазовыйПериодНачало = НачалоМесяца(ДопДвижение.ПериодДействияКонец);
Движение.БазовыйПериодКонец    =КонецМесяца(Движение.ПериодДействияНачало);
КонецЕсли;
КонецПроцедуры

Скачать решение задачи 3.44 (1с специалист по платформе)

вторник, 28 апреля 2015 г.

1c специалист. Задача 3.43.

Решение:
Основные моменты задачи:
1) "Вертикальный график". Табель выглядит как-то так:


2) Начисление ЗП происходит еженедельно, собственно из за этого и все остальные проблемы
3) При начислении оклада в первичные записи необходимо записывать базовый период. Может есть способ поэлегантнее, но как-то нужно определить количество рабочих часов в неделе.
4) Необходимо учесть, то что первичная запись может быть разделена сразу на 3: если в течении недели изменился оклад и если неделя переходит из одного месяца в другой.
5) При расчете отпуска считаем именно отработанные дни (не рабочие и не отработанные часы) плюс контроль 24 дней.


Скачать решение задачи 3.43 (1с специалист по платформе)

среда, 22 апреля 2015 г.

1c специалист задача 3.41



Решение

1)  C видами расчета все очевидно
"Оклад" и "Командировка" - в Основные начисления.
Премия - в Дополнительные
2) Так как премия не меняется в течении расчетного периода, а оклад может 1 раз изменится , то наверное правильнее завести 2 регистра сведений с разной периодичностью.
3) Новый момент - это документ "Табель". Создаем ТЧ с 30 реквизитами (дни месяца) и проставляем режиме предприятия либо количество отработанных часов или "К" в случае командировки. Этот документ будет регистратором для оборотного РН "Табель", в котором и будут хранится данные о отработанном времени.

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

Для Каждого ТекСтрока Из ТЗ Цикл
Движение = Движения.Табель.Добавить();
Движение.Период = Период;
Движение.Подразделение = Подразделение;
Движение.Сотрудник = ТекСтрока.Сотрудник;
// Расчет рабочих и командировочных:
ЧислоСекундВСутках = 86400;
Дат = НачалоМесяца(Период);
ДатаОкончания = КонецМесяца(Период);
ЧасыРабочие = 0;
ЧасыКоманд  = 0;
Пока Дат <= ДатаОкончания Цикл
ДеньВМассиве = День(Дат) + 1;
Если ТекСтрока[ДеньВМассиве] = "8" Тогда
ЧасыРабочие = ЧасыРабочие + 8;
ИначеЕсли ТекСтрока[ДеньВМассиве] = "К" Тогда          
ЧасыКоманд  = ЧасыКоманд  + 8;
КонецЕсли; 
Дат = Дат + ЧислоСекундВСутках;
КонецЦикла;
Движение.ЧасыРабочие = ЧасыРабочие;
Движение.ЧасыКоманд = ЧасыКоманд;
КонецЦикла;

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

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Период = НачалоМесяца(Период);

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

4)Доработаем обработку "Заполнение графиков" и заполним график хотя бы для 5-дневки. (подробнее)

5) Создаем регистры расчета.
В регистр "Основные начисления" добавим ресурс "Часы".
6) Дорабатываем документ "Начисление ЗП", в обработке проведения формируем первичные записи. 

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
ПериодРегистрации = НачалоМесяца(ПериодРегистрации);
КонецПроцедуры


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

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

РезультатЗапроса = Запрос.ВыполнитьПакет();
ЕстьКоммандировка = Ложь;

Если Не РезультатЗапроса[0].Пустой() Тогда
Движения.ОсновныеНачисления.Записывать = Истина;
ОснСотр = Новый Массив;
ОснПодр = Новый Массив;

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

Если ОснСотр.Найти(Выборка.Сотрудник)= Неопределено Тогда
ОснСотр.Добавить(Выборка.Сотрудник);
КонецЕсли; 
Если ОснПодр.Найти(Выборка.Подразделение)= Неопределено Тогда
ОснПодр.Добавить(Выборка.Подразделение);
КонецЕсли; 
КонецЦикла; 
КонецЕсли; 


Если Не РезультатЗапроса[1].Пустой() Тогда
Движения.ДополнительныеНачисления.Записывать = Истина;
ДопСотр = Новый Массив;
ДопПодр = Новый Массив;

Выборка = РезультатЗапроса[1].Выбрать();
Пока Выборка.Следующий() Цикл
Движение = Движения.ДополнительныеНачисления.Добавить();
ЗаполнитьЗначенияСвойств(Движение, Выборка);
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.БазовыйПериодНачало = ПериодРегистрации;
Движение.БазовыйПериодКонец  = КонецМесяца(ПериодРегистрации);
Движение.Параметр = Выборка.ПроцентПремии;
Если ДопСотр.Найти(Выборка.Сотрудник)= Неопределено Тогда
ДопСотр.Добавить(Выборка.Сотрудник);
КонецЕсли; 
Если ДопПодр.Найти(Выборка.Подразделение)= Неопределено Тогда
ДопПодр.Добавить(Выборка.Подразделение);
КонецЕсли; 
КонецЦикла; 
КонецЕсли; 

Движения.ОсновныеНачисления.Записать();
Движения.ДополнительныеНачисления.Записать();

Если ЕстьКоммандировка Тогда
Расчеты.РассчитатьНачисления(Движения.ОсновныеНачисления,ПланыВидовРасчета.ОсновныеНачисления.Командировка,ОснСотр, ОснПодр);
КонецЕсли; 
Расчеты.РассчитатьНачисления(Движения.ОсновныеНачисления,ПланыВидовРасчета.ОсновныеНачисления.Оклад,ОснСотр, ОснПодр);
Расчеты.РассчитатьНачисления(Движения.ДополнительныеНачисления,ПланыВидовРасчета.ДополнительныеНачисления.Премия,ДопСотр, ДопПодр);
КонецПроцедуры

7) Описываем алгоритмы расчета в общем модуле.

Процедура РассчитатьНачисления(НаборЗаписей, ВидРасчета, МассивСотрудников, МассивПодразделений) Экспорт

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

Запрос.УстановитьПараметр("Регистратор",Регистратор);
Запрос.УстановитьПараметр("МассивСотрудников",МассивСотрудников);
Запрос.УстановитьПараметр("МассивПодразделений",МассивПодразделений);
Запрос.УстановитьПараметр("ВидРасчета",ВидРасчета);
Измер = Новый Массив(2);
Измер[0] = "Сотрудник" ;
Измер[1] = "Подразделение";
Запрос.УстановитьПараметр("ИзмерОсновного",Измер);
Запрос.УстановитьПараметр("ИзмерБазового",Измер);



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

КонецЦикла; 

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

Запрос.УстановитьПараметр("Регистратор",Регистратор);
Запрос.УстановитьПараметр("МассивСотрудников",МассивСотрудников);
Запрос.УстановитьПараметр("МассивПодразделений",МассивПодразделений);
Запрос.УстановитьПараметр("ВидРасчета",ВидРасчета);
Измер = Новый Массив(2);
Измер[0] = "Сотрудник" ;
Измер[1] = "Подразделение";
Запрос.УстановитьПараметр("ИзмерОсновного",Измер);
Запрос.УстановитьПараметр("ИзмерБазового",Измер);

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

8) Отчет.



Скачать решение задачи 3.41(1с специалист)