Автор Тема: Задача 3.02  (Прочитано 63022 раз)

0 Пользователей и 1 Гость просматривают эту тему.

iliya

  • Новичок
  • *
  • Сообщений: 7
  • ФИО: Илья Никитин
Re: Задача 3.02
« Ответ #195 : Август 03, 2017, 01:48:40 pm »
Добрый день, коллеги!
В задаче сказано, что часовая ставка определяется как сумма всех начислений за два предыдущих месяца деленная на количество отработанных часов в двух предыдущих месяцах.

Момент первый. Отработано часов не одно и то же что рабочих часов в месяце.
ДанныеГрафика.ЗначениеБазовыйПериод возвращает количество рабочих часов базовго периода. Оно всегда будет равно сумме рабочих часов по графику. Даже если сотрудник не работал в периоде.
Для получения отработанных часов за другие периоды, необходимо в параметрах виртуальной таблицы данных графика ставить фильтр по сотруднику, виду расчета (по которому определяем рабочие часы, например оклад) и периоду действия (базовый период расчитываемой записи). Синхронизация по номеру строки в данном случае не подойдет.

Момент второй. Какие виды расчета принять за расчеты подходящие для определения отработанного времени? Входит ли в их состав Командировка из условия задания непонятно.

И еще третий момент - исходя из условий задачи у сотрудника не может быть других отклонений кроме командировки. Тогда если считать время проведенное в командировке как отработанные часы, Фактически отработано часов всегда будет равно ЧасовПоОкладу + ЧасовПоКомандировке и равно рабочих часов в месяце. Будет ли в этом случае достаточно просто взять количество базовых часов из данных графика командировки (ДанныеГрафика.ЗначениеБазовыйПериод)?

foxspb

  • Новичок
  • *
  • Сообщений: 2
Re: Задача 3.02
« Ответ #196 : Август 04, 2017, 09:11:53 am »
Значит так... По первому моменту - создаём тогда ресурс регистра расчета (например, "ЧасовОтработано") с типом Число. И именно в этом ресурсе храним данные об отработанных часах. Для того чтобы получить данные об отработанных часах за предыдущие периоды, надо просто посчитать их по этому ресурсу.
Момент второй - для расчета отработанного времени берём только вид расчета "Оклад". Добавить часы проведённые в командировке можно, тогда их надо также хранить в ресурсе.  Момент третий - часы проведенные в командировке определяем по пятидневному графику работы. В любом случае - при очной сдаче это можно узнать у преподавателя, а при дистанционной - написать свои комментарии на принимаемое решение. Заранее разработай самый сложный вариант решения этой задачи.


iliya

  • Новичок
  • *
  • Сообщений: 7
  • ФИО: Илья Никитин
Re: Задача 3.02
« Ответ #197 : Август 05, 2017, 04:14:56 pm »
Вообще, в ветке форума по сертификации на спеца создал отдельную ветку на 3.02. Ради целей систематизации хранения информации о решениях задач приведу свой пост здесь.
Итак, мой вариант расчета Командировки без использования ресурсов для хранения отработанного времени:

   Если ЕстьКомандировка Тогда
      Запрос.Текст =
      "ВЫБРАТЬ
      |   ОсновныеНачисления.НомерСтроки,
      |   ЕСТЬNULL(ОтработаноЧасов.ЗначениеФактическийПериодДействия, 0) КАК ОтработаноЧасовВБазовомПериоде,
      |   ЕСТЬNULL(ЧасовКомандировки.ЗначениеФактическийПериодДействия, 0) КАК ЧасовКомандировки,
      |   ВЫБОР
      |      КОГДА ЕСТЬNULL(ОтработаноЧасов.ЗначениеФактическийПериодДействия, 0) > 0
      |            И ЕСТЬNULL(ЧасовКомандировки.ЗначениеФактическийПериодДействия, 0) > 0
      |         ТОГДА ЧасовКомандировки.ЗначениеФактическийПериодДействия * (ЕСТЬNULL(БазаИзОсновных.РезультатБаза, 0) + ЕСТЬNULL(БазаИзДополнительных.РезультатБаза, 0)) / ОтработаноЧасов.ЗначениеФактическийПериодДействия
      |      ИНАЧЕ 0
      |   КОНЕЦ КАК Результат
      |ИЗ
      |   РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления
      |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаОсновныеНачисления(
      |            &Измерения,
      |            &Измерения,
      |            ,
      |            ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Командировка)
      |               И Регистратор = &Ссылка) КАК БазаИзОсновных
      |      ПО (БазаИзОсновных.НомерСтроки = ОсновныеНачисления.НомерСтроки)
      |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.БазаДополнительныеНачисления(
      |            &Измерения,
      |            &Измерения,
      |            ,
      |            ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Командировка)
      |               И Регистратор = &Ссылка) КАК БазаИзДополнительных
      |      ПО (БазаИзДополнительных.НомерСтроки = ОсновныеНачисления.НомерСтроки)
      |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(
      |            Сотрудник В
      |                  (ВЫБРАТЬ РАЗЛИЧНЫЕ
      |                     ОсновныеНачисления.Сотрудник
      |                  ИЗ
      |                     РегистрРасчета.ОсновныеНачисления КАК ОсновныеНачисления
      |                  ГДЕ
      |                     ОсновныеНачисления.Регистратор = &Ссылка)
      |               И ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Оклад), ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Командировка))
      |               И (ПериодДействия МЕЖДУ &БазовыйПериодНачало И &БазовыйПериодКонец)) КАК ОтработаноЧасов
      |      ПО (ОтработаноЧасов.Сотрудник = ОсновныеНачисления.Сотрудник)
      |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.ОсновныеНачисления.ДанныеГрафика(
      |            ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Командировка)
      |               И Регистратор = &Ссылка) КАК ЧасовКомандировки
      |      ПО (ЧасовКомандировки.НомерСтроки = ОсновныеНачисления.НомерСтроки)
      |ГДЕ
      |   ОсновныеНачисления.Регистратор = &Ссылка
      |   И ОсновныеНачисления.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисления.Командировка)";
      Запрос.УстановитьПараметр("БазовыйПериодНачало",ДобавитьМесяц(ПериодРегистрации,-2));
      Запрос.УстановитьПараметр("БазовыйПериодКонец",ПериодРегистрации-1);
      Таблица = Запрос.Выполнить().Выгрузить();
« Последнее редактирование: Август 05, 2017, 06:43:24 pm от iliya »

iliya

  • Новичок
  • *
  • Сообщений: 7
  • ФИО: Илья Никитин
Re: Задача 3.02
« Ответ #198 : Август 05, 2017, 04:27:52 pm »
По поводу учета изменений оклада в расчетном периоде. Мне так же как и многим сдесь не все понятно.
Может я и тупой, но объясните мне пожалуйста чем упрощает задачу факт, что более одного раза ставка в периоде не меняется???
Мой вариант решения хоть и учитывает многократное изменение оклада в периоде, но слишком грамоздкий на мой взгляд.

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

В решении период начисления оклада указанный в документе (ДатаНачала, ДатаОкончания) разбивается на подпериоды изменений оклада. Таким образом получаем отрезки времени на которых значение оклада постоянно, их и регистрируем в рабочем наборе записей.
« Последнее редактирование: Август 05, 2017, 04:42:26 pm от iliya »

ArkadiyKG

  • Новичок
  • *
  • Сообщений: 1
  • ФИО: Каранский Аркадий
Re: Задача 3.02
« Ответ #199 : Август 06, 2018, 01:46:28 pm »
Вот мой пример 3.02, реализовал свой метод заполнения оклада по периодам, причем оклад может изменяться неограниченное количество раз.

Запрос большой, но не пугайтесь, половина - это просто пакетный на остальные виды расчета...

За критику - буду благодарен

Евгений Малый

  • Новичок
  • *
  • Сообщений: 5
  • ФИО: Малый Евгений Александрович
Re: Задача 3.02
« Ответ #200 : Август 10, 2018, 11:50:05 am »
Делюсь своим решением: в базе также присутствуют решения задач 1.02 и 2.02, для чистоты восприятия можно отсортировать метаданные по подсистеме "Периодические расчеты".
1. При первой записи в регистр расчета все начисления получаются одним запросом. Запрос небольшой (2 набора, 1 из них - временная таблица).
2. При расчете записей основных начислений сделал два запроса: первый - для окладов, второй - для командировок. Сделал так потому, что при формировании сторно-записей, если получать все одним запросом - у командировки будет пустой фактический период действия.
Из основных моментов вроде все.
За критику буду благодарен

Stanislaw

  • Новичок
  • *
  • Сообщений: 3
Re: Задача 3.02
« Ответ #201 : Май 09, 2020, 06:22:36 pm »
Прошу оценить решение.