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

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

AvalonE2010

  • Новичок
  • *
  • Сообщений: 2
  • ФИО: Алексей
Задача 3.04
« Ответ #60 : Ноябрь 06, 2013, 04:02:01 pm »
Здравствуйте! Подскажите а как реализуется условие:
 -----------------------------------
 Если сумма начисленных командировочных, оказывается меньше, чем сумма оклада,
 который мог бы быть начислен за дни командировки, тогда сотруднику начисляется доплата до
 оклада
 -------------------------------------
 У самого мысли что надо по периоду действия командировки сформировать записи аналогичные окладу(с учетом того что оклад мог изменится в этом периоде) и сравнить рез. сумму с суммой оклада. Но как то это больно сложно получается...Подскажите кто как делал.

mikas-2008

  • Новичок
  • *
  • Сообщений: 1
  • ФИО: Mikas
Задача 3.04
« Ответ #61 : Декабрь 06, 2013, 10:10:17 pm »
Цитата AvalonE2010 ()
Если сумма начисленных командировочных, оказывается меньше, чем сумма оклада, который мог бы быть начислен за дни командировки, тогда сотруднику начисляется доплата до
 оклада

 У меня мысли такие: фирма очень ценит своих сотрудников, так как в реальной жизни при начислении ЗП чаще всего командировочные меньше оклада :D. А если серьезно, то мы смотрим на оклад за день и командировку за день. Если сумма командировки меньше суммы оклада, то появляется еще одно начисление ДоплатаКОкладу, которая компенсирует разницу. Сумма Доплат = (СуммаЗаДеньОклад - СуммаЗаДеньКомандировка) * КоличествоДнейВКомандировке.

 П.с. задачу еще не решал, но в ближайшее выложу свое решение.
« Последнее редактирование: Декабрь 07, 2013, 01:01:38 am от Mikas »


mikas-2008

  • Новичок
  • *
  • Сообщений: 1
  • ФИО: Mikas
Задача 3.04
« Ответ #62 : Декабрь 12, 2013, 03:32:38 pm »
artfa, спасибо дружище. wink Натолкнул на гениальную и простую мысль. Делить нужно не только оклад но и командировку. Наверное дня 4-е крутил разные варианты, пока не понял, как нужно использовать механизмы платформы для расчета отпуска и командировки. Выкладываю свое решение. Крутил его по разному. Все работает.

Добавлено (12.12.2013, 15:32)
---------------------------------------------

Цитата AvalonE2010 ()
Если сумма начисленных командировочных, оказывается меньше, чем сумма оклада, который мог бы быть начислен за дни командировки, тогда сотруднику начисляется доплата до
 оклада

 Как раз в этом и кроется секрет данной задачи. Начислить командировку и оклад просто. Для начисления необходимо во время перехода разбить оклад и командировку на две части. Одну до изменения, другую после. Хитрость при начислении командировки кроется в использовании реквизита регистра расчета и записи туда размера оклада в разных периодах, разные значения, а уж потом при расчете командировки смотреть, какая там сумма оклада с базы и с оклада за данный период. Смотри мое решение, будет понятно. 

 П.с. при данном алгоритме думаю, что даже не важен порядок расчета оклада и командировки. Командировка в любом случае использует свои данные, ей рассчитанные данные оклада за текущий месяц не важны. Оклад в любом случае будет вытеснен, как только данные о периоде действия командировки будут записаны в регистр.
Вложения:
mikas_3.04.dt

Юрий1980

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Юрец
Задача 3.04
« Ответ #63 : Декабрь 27, 2013, 11:45:37 am »
Вот готовое решение. Все работает. http://yadi.sk/d/MfMqUwbKF2Nzs

Добавлено (27.12.2013, 11:45)
---------------------------------------------
Основные начисления Использует период действия. Оклад вытесняется  командировкой, командировка зависит по базе от Основных и дополнительных видов расчета (Кроме Оклада полный). Оклад полный ничем не вытесняется. Дополнительные начисления не используют период действия но зависят по базе от Основных начислений. Надбавка От Оклада. Доплата от оклада полного. При проведение расходной для надбавки базовый период это месяц регистрации а для доплаты (вводится одновременно с командировкой) базовый период это период действия командировки. После этого в общем модуле делаем расчет двух окладов и командировки а потом Надбавки и Доплаты. При расчете доплаты у нас есть база по окладу расчетному с учетом изменения. Мы ее сравниваем с начисленной выше Командировкой (запоминаем номер строки командировки в реквизите размер доплата). И если доплата больше командировки на разницу установим значение результат записи доплаты .


non1ka

  • Новичок
  • *
  • Сообщений: 5
  • ФИО: Тюрин Илья Александрович
Задача 3.04
« Ответ #64 : Февраль 04, 2014, 08:58:28 pm »
sv_mikh, Почему вы в решении Доплату за Вахту выносите в Основные начисления?
 По моему это явное Дополнительное начисление, т.к. не имеет периода действия и не вытесняет ни одно из начислений.
 Но а в остальном очень хорошее решение.
Вложения:
3574294.dt

IT_PROGRAMMIST

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Дмитрий
Задача 3.04
« Ответ #65 : Февраль 05, 2014, 01:36:28 pm »
non1ka.
 
Цитата
По моему это явное Дополнительное начисление, т.к. не имеет периода действия и не вытесняет ни одно из начислений
А в вашем решении для дополнительных начислений указана зависимость по периоду действия...

non1ka

  • Новичок
  • *
  • Сообщений: 5
  • ФИО: Тюрин Илья Александрович
Задача 3.04
« Ответ #66 : Февраль 06, 2014, 11:17:07 pm »
IT_PROGRAMMIST
 
Цитата
А в вашем решении для дополнительных начислений указана зависимость по периоду действия...
В моем решении "Дополнительные начисления" имеют зависимость по базе, другими словами имеют базовый период начало и базовый период конец.
 Но не имеют периода действия другими словами не имеют период действия начало и период действия конец и не влияют на вытеснение.

Leo705

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Андрей
Задача 3.04
« Ответ #67 : Апрель 01, 2014, 07:57:52 am »
Мое решение smile
« Последнее редактирование: Апрель 01, 2014, 10:19:53 am от Андрей »

EfKonstanin

  • Новичок
  • *
  • Сообщений: 1
  • ФИО: Константин
Задача 3.04
« Ответ #68 : Сентябрь 14, 2014, 12:38:02 pm »
Посмотрев некоторые решения, можно прийти к выводу, что условие "Если сумма начисленных командировочных, оказывается меньше, чем сумма оклада, который мог бы быть начислен за дни командировки, тогда сотруднику начисляется доплата до оклада" можно выполнить, записав начальное значение оклада в реквизит РР допустим "Параметр", но почему никто не учитывает в решении "худший" вариант, когда размер оклада у нас изменился во время командировки, тогда и запись по виду расчета "Командировка" нужно делить на 2 записи, чтобы корректно рассчитать "Сумму возможного оклада".
 При решении используются 3-этажные запросы. Да это бесспорно более эффективно рассчитать все значения в запросе и через "ЗаполнитьЗначенияСвойств" загрузить все записи, НО мне вот интересно сколько времени будет потрачено на отладку этих самых запросов? В условиях нехватки времени считаю, что лучше лучше не городить 3-этажные запросы.
 Ps. Пока не могу добавить свое решение.

naumenko_alex

  • Пользователь
  • **
  • Сообщений: 11
  • ФИО: Александр
Re: Задача 3.04
« Ответ #69 : Март 30, 2015, 11:20:26 pm »
Интересная задачка.
Выкладываю своё решение. 8)
На разработку ушло часов 5. На экзамене конечно не успеть.
Буду ждать ваших отзывов и комментов.
Интересует ваше мнение.

rusmosav

  • Проверенный
  • ***
  • Сообщений: 137
Re: Задача 3.04
« Ответ #70 : Апрель 22, 2015, 06:18:02 pm »
Прощу оценить.
« Последнее редактирование: Апрель 23, 2015, 05:41:27 am от rusmosav »

Pamazillo

  • Новичок
  • *
  • Сообщений: 8
  • ФИО: Паша
Re: Задача 3.04
« Ответ #71 : Июль 28, 2015, 12:00:18 pm »
Много вариаций по поводу условия:
" Если сумма начисленных командировочных, оказывается меньше, чем сумма оклада,
 который мог бы быть начислен за дни командировки, тогда сотруднику начисляется доплата до
 оклада "
//
Не знаю может я пропустил и такое что-то уже есть, но на всякий случай оставлю свой вариант:
При проведении сначала ввожу только оклады (с алгоритмом учета изменений оклада в середине месяца и т.д.). Далее, смысл в том, что пока не введены никакие вытесняющие начисления, эти оклады можно рассчитать (например сделать это в транзакции, которую потом можно отменить) и таким образом получаем суммы окладов, как если бы сотр не был в командировке.
А тем временем, так же ввожу доп начисления "Доплата до оклада", который имеет в базовых начислениях оклад, а базовый период ставится как в командировке. После чего (пока у нас оклады рассчитаны без вытеснений), мы спокойно получаем расчетную базу Доплаты до оклада, в которой как раз и будет сумма оклада за этот период. И эту сумму сохраняю в реквизит Размер.
Далее делаем уже расчет всех ВР, и уже имея для доплаты в размере сумму "эталона" оклада можем её сравнить с рассчитанным результатом командировки (я делал запросом, в котором объединял суммы и в командировке ставил знак минус). Главное соблюсти последовательность расчетов.
//
Мне кажется вполне всё прилично. Критикуйте:)

venvlad

  • Пользователь
  • **
  • Сообщений: 83
Re: Задача 3.04
« Ответ #72 : Сентябрь 29, 2015, 06:18:50 pm »
Моё.

hakerxp

  • Новичок
  • *
  • Сообщений: 3
  • ФИО: Дмитрий
Re: Задача 3.04
« Ответ #73 : Сентябрь 30, 2015, 03:19:01 pm »
Привет всем! Мое решение с учетом замечаний. Особенности:
- Один план - Основные начисления (т.к. вид расчета "Вахта" должен иметь период действия для авторасчета по базе оклада. Галка "Период действия является базовым периодом" стоит).
- Учтено, если оклад менялся в период командировки.
- "Подразделение" должно быть реквизитом регистра (базу брать не нужно по подразделению по условию задачи).
« Последнее редактирование: Сентябрь 30, 2015, 03:32:14 pm от hakerxp »

pila86

  • Пользователь
  • **
  • Сообщений: 17
Re: Задача 3.04
« Ответ #74 : Январь 04, 2016, 05:22:27 pm »
Выкладываю свое решение.
У меня вахта - доп. начисление. Проценты для вахты - ресурс РС "СведенияОСотрудниках".
Учитывается изменение оклада при расчете командировке.
При записи начальных данных в регистры использую текст запроса
ВЫБРАТЬ
   НачислениеЗарплатыДополнительныеНачисления.Ссылка,
   НачислениеЗарплатыДополнительныеНачисления.НомерСтроки,
   НачислениеЗарплатыДополнительныеНачисления.Сотрудник,
   НачислениеЗарплатыДополнительныеНачисления.Подразделение,
   НачислениеЗарплатыДополнительныеНачисления.ВидРасчета,
   НачислениеЗарплатыДополнительныеНачисления.ДатаНачала,
   НачислениеЗарплатыДополнительныеНачисления.ДатаОкончания
ПОМЕСТИТЬ ВТДопНачисления
ИЗ
   Документ.НачислениеЗарплаты.ДополнительныеНачисления КАК НачислениеЗарплатыДополнительныеНачисления
ГДЕ
   НачислениеЗарплатыДополнительныеНачисления.Ссылка = &Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   НачислениеЗарплатыОсновныеНачисления.Ссылка,
   НачислениеЗарплатыОсновныеНачисления.НомерСтроки,
   НачислениеЗарплатыОсновныеНачисления.Сотрудник,
   НачислениеЗарплатыОсновныеНачисления.Подразделение,
   НачислениеЗарплатыОсновныеНачисления.ВидРасчета,
   НачислениеЗарплатыОсновныеНачисления.ДатаНачала,
   НачислениеЗарплатыОсновныеНачисления.ДатаОкончания,
   НачислениеЗарплатыОсновныеНачисления.График
ПОМЕСТИТЬ ВТОсновныеНачисления
ИЗ
   Документ.НачислениеЗарплаты.ОсновныеНачисления КАК НачислениеЗарплатыОсновныеНачисления
ГДЕ
   НачислениеЗарплатыОсновныеНачисления.Ссылка = &Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
   ОсновныеНачисления.Сотрудник,
   ОсновныеНачисления.Подразделение
ПОМЕСТИТЬ ВТСотрудникиДляПериодовОклада
ИЗ
   ВТОсновныеНачисления КАК ОсновныеНачисления
ГДЕ
   ОсновныеНачисления.ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРАсчета.ОсновныеНАчисления.Оклад), ЗНАЧЕНИЕ(ПланВидовРАсчета.ОсновныеНАчисления.Командировка))
;

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ОсновныеНачисления.НомерСтроки,
   ОсновныеНачисления.ДатаНачала,
   ВЫБОР
      КОГДА ДанныеПоОкладам.ПериодИзмененияОклада ЕСТЬ NULL
            ИЛИ ДанныеПоОкладам.ПериодИзмененияОклада <= ОсновныеНачисления.ДатаНачала
            ИЛИ ДанныеПоОкладам.ПериодИзмененияОклада > ОсновныеНачисления.ДатаОкончания
         ТОГДА ОсновныеНачисления.ДатаОкончания
      ИНАЧЕ ДОБАВИТЬКДАТЕ(ДанныеПоОкладам.ПериодИзмененияОклада, ДЕНЬ, -1)
   КОНЕЦ КАК ДатаОкончания,
   ВЫБОР
      КОГДА ДанныеПоОкладам.ПериодИзмененияОклада <= ОсновныеНачисления.ДатаНачала
         ТОГДА ДанныеПоОкладам.ОкладПослеИзменения
      ИНАЧЕ ДанныеПоОкладам.ИсходныйОклад
   КОНЕЦ КАК Размер
ПОМЕСТИТЬ ВТПериодыДействия
ИЗ
   ВТОсновныеНачисления КАК ОсновныеНачисления
      ЛЕВОЕ СОЕДИНЕНИЕ ВТДанныеПоОкладам КАК ДанныеПоОкладам
      ПО ОсновныеНачисления.Сотрудник = ДанныеПоОкладам.Сотрудник
         И ОсновныеНачисления.Подразделение = ДанныеПоОкладам.Подразделение
ГДЕ
   ОсновныеНачисления.ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРАсчета.ОсновныеНАчисления.Оклад), ЗНАЧЕНИЕ(ПланВидовРАсчета.ОсновныеНАчисления.Командировка))

ОБЪЕДИНИТЬ

ВЫБРАТЬ
   ОсновныеНачисления.НомерСтроки,
   ДанныеПоОкладам.ПериодИзмененияОклада,
   ОсновныеНачисления.ДатаОкончания,
   ДанныеПоОкладам.ОкладПослеИзменения
ИЗ
   ВТОсновныеНачисления КАК ОсновныеНачисления
      ЛЕВОЕ СОЕДИНЕНИЕ ВТДанныеПоОкладам КАК ДанныеПоОкладам
      ПО ОсновныеНачисления.Сотрудник = ДанныеПоОкладам.Сотрудник
         И ОсновныеНачисления.Подразделение = ДанныеПоОкладам.Подразделение
ГДЕ
   ОсновныеНачисления.ВидРасчета В (ЗНАЧЕНИЕ(ПланВидовРАсчета.ОсновныеНАчисления.Оклад), ЗНАЧЕНИЕ(ПланВидовРАсчета.ОсновныеНАчисления.Командировка))
   И ДанныеПоОкладам.ПериодИзмененияОклада МЕЖДУ ДОБАВИТЬКДАТЕ(ОсновныеНачисления.ДатаНачала, ДЕНЬ, 1) И ОсновныеНачисления.ДатаОкончания
;

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

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