• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Как выбрать записи из журнала расчетов Зарплата.

  • Автор темы Ramzay
  • Дата начала
R

Ramzay

Итак, Есть некая группа рассчетов, назовем ее ГР_РАСЧ. есть ПЕРИОД, за который нужно посчитать.
Нужно ссуммировать из журнала расчетов Зарплата все расчеты по сотруднику, которые зарегистрированны не позже чем ПЕРИОД
Кроме того если расчет не входит в ГР_РАСЧ, то нужно ссуммировать зарегистрированные в ПЕРИОДе. Иначе - действующие в ПЕРИОДЕ.
 
G

gorlanovmax

Телепаты!!! На выход!!! Появилась работа для Вас. Когда поймете, что хочет человек, отпишитесь :D
 
M

mialord

Мхе. Ого.
Нужно посчитать все начислений
- ну попробуй, только это не записная книжка, а форум. Ты промахнулся чуть :D
Ни версии, ни релиза.
Телепаты!!! На выход!!!
Присоеденяюсь. Если хотите чтобы вам помогли, будте покорректнее пожалуйста.

Если 8-ка.
Я не совсем понял задачу, что вам надо сделать, так что напишу так же, примерно
Нужно ссуммировать из журнала расчетов Зарплата все расчеты по сотруднику, которые зарегистрированны не позже чем ПЕРИОД
Код:
ВЫБРАТЬ
ВЫБОР КОГДА ЧтоТо.Период < ЧтоТо.Период ТОГДА СУММА(ЧтоТо.ГР_РАСЧ) КОНЕЦ КАК ПервыйПараметр
Кроме того если расчет не входит в ГР_РАСЧ, то нужно ссуммировать зарегистрированные в ПЕРИОДе. Иначе - действующие в ПЕРИОДЕ.
Код:
ВЫБОР КОГДА <если расчет не входит в ГР_РАСЧ> ТОГДА <нужно ссуммировать зарегистрированные в ПЕРИОДе> ИНАЧЕ <действующие в ПЕРИОДЕ> КОНЕЦ КАК ВторойПараметр
 
R

Ramzay

Извиняюсь, что не назвал версию. Версия 7.7
Проблема вот в чем. Типовое решение данной задачи происходит по схеме:

Код:
Рез=0;
ЖЗ=СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖЗ.Выбрать;	 // Выбрать некий набор записей. 
//Мне нужно ВыбратьПоОбъекту, но такого метода нет
Пока ЖЗ.ПолучитьЗапись()=1 Цикл
ЖЗПериод=?(ЖЗ.ВидРасч.ВходитВГруппу(ГруппаРасчетов.ГР_РАСЧ)=1, Жз.ПеридДействия,ПериодРегистрации);
Если ЖЗПериод=Период тогда
Рез=Рез+Жз.Результат;
КонецЕсли;
КонецЦикла;
Получается, что нужно рисовать два цикла. А может можно одним?
 
N

NomadSoul

Задачу можно решать и запросом. в зависимости от вхождения расчета в группу делаем два варианта текста запроса: для выборки по периоду действия или для выборки по периоду регистрации.
 
R

Ramzay

Задачу можно решать и запросом. в зависимости от вхождения расчета в группу делаем два варианта текста запроса: для выборки по периоду действия или для выборки по периоду регистрации.

Что-то я не совсем понял.
в зависимости от вхождения расчета в группу

Мы что, должны организовать цикл по ЖЗ, на каждой итеррации анализировать ВидРасч и в зависимости от ситуации выполнять тот или иной запрос?

Или напишите текст запроса, который по идее долже возвращать записи, которые нужно суммировать. Если, конечно, не возможно посчитать искомую сумму прямо в запросе.
 
N

NomadSoul

Ramzay, суммировать результаты расчета можно прямо в запросе.
Пример запроса:
ТекстЗапроса = "//{{ЗАПРОС(Фонд1)
|Период с ДатаАктуальности по ДатаАктуальности1;
|ВидРасч = ЖурналРасчетов.Зарплата.ВидРасч;
|Результат = ЖурналРасчетов.Зарплата.Результат;
|ДатаОкончания = ЖурналРасчетов.Зарплата.ДатаОкончания;
|Функция РезультатСуммаОблПФ = Сумма(Результат) когда(глВидРасчета_ВходитВГруппуИ(ВидРасч,грОблагаетсяПФ)=1);
|Условие(глВидРасчета_ВходитВГруппуИ(ВидРасч,грОблагаетсяПФ)=1);
|"//}}ЗАПРОС

Этот запрос выбирает расчеты по периоду регистрации. Если надо выбирать по периоду действия, уберите слово "Период". Если надо выбрать по сотруднику, выбирайте из журанала зарплата объект и сделай условие на равенство объекта конкретному сотруднику. Запрос выдран из моей конфы по зарплате, там у меня своя функция для определения входимости,а вам наверно нужно будет использовать стандартные.
 
R

Ramzay

Похоже я не достаточно подробно объяснил. Проблема вот в чем.

Мне нужно посчитать налоги. Мы налоги считаем следующим образом. Когда мы вычисляем облагаемую сумму, мы берем все начисления, которые зарегистрированы в облагаемом месяце. Выбрасывамем из этой суммы отпускные и больничные, которые действуют не в облагаемом периоде. И добавляем отпускные и больничные, которые зарегистрированы ранее облагаемого месяца и действуют в нем.
Таким образом мы получаем облагаемую сумму за месяц.

До сих пор эту сумму мы вычисляли с помощью двух циклов. Один выбирал записи из журнала расчетов зарплата с помощью ВыбратьЗаписи (выбираются записи действующие в облагаемом периоде). Второй цикл выбирал записи с помощью метода ВыбратьПериод (выбираются записи зарегистрированные в облагаемом периоде)

Теперь есть потребность выбрать вместо цикла одним запросом (или одним циклом, что имеет аналогичные с запросом проблемы). Так вот возвращаясь к запросу предыдущего сообщения хочется задать вопрос по перовой строке запроса

Период с ДатаАктуальности по ДатаАктуальности1

Какие брать даты? Теоритически выборка не должна ограничиваться датами вообще. Но такой запрос будет ужасно долго работать. Что бы ограничить количество записей в наборе можно было бы это сделать ограничив выборку одним объектом. Но как это сделать я не знаю. Если Использовать фразу:

Условие(Объект=ТекОбъект)

то время выборки не сократится, поскольку, как я понимаю таблица журнала расчетов зарплата не проиндексирована по полю "Объект" и следовательно будут последовательно перебиратся все записи таблицы.

А может нужно как то привязать Справочник.Сотрудники и как-то связать его с ЖурналомРасчетов.Запрлата. Например как-то так:

Справочник.Сотрудники.ТекущийЭлемент() = ЖурналРасчетов.Запрлата.Объект ?
 
N

NomadSoul

Ramzay, как мне представляется, для выполнения этой задачи Вам необходимо выбрать записи по периоду действия (при этом уйдут отпускные и больничные, которые зарегистрированы в тек. месяце но приходятся на следующий и придут отпускные и больничные который зарегистрированы в прошлых периодах но приходятся на тек. месяц) и просуммировать те из них, которые облагаются налогом, это делается таким запросом:

ТекстЗапроса = "//{{ЗАПРОС(Фонд1)
|с ДатаАктуальности по ДатаАктуальности1;
|ВидРасч = ЖурналРасчетов.Зарплата.ВидРасч;
|Результат = ЖурналРасчетов.Зарплата.Результат;
|Функция РезультатСуммаОблНалогом = Сумма(Результат);
|Условие(ВидРасч.ВходитВГруппу(грОблагаетсяНалогом)=1);
|"//}}ЗАПРОС

Обычно у нас налоги считают за месяц. Т.е. ДатаАктуальности = начало требуемого месяца, ДатаАктуальности1 = конец требуемого месяца.
В РезультатСуммаОблНалогом будет сумма облагаемых налогом начислений, приходящихся на требуемый месяц.
 
R

Ramzay

Может я чего-то не понимаю, но если мы считаем налоги за март 2009, то ДатаАктуальности='01.03.2009', а ДатаАктуальности1='31.03.2009'. Следовательно фраза:

с ДатаАктуальности по ДатаАктуальности1;

сразу отсекает записи, которые зарегистрированы в этом периоде и действуют в прошлом (или будущем) периоде. Например, мы считаем налоги за март 2009. В марте у сотрудника есть такие начисления:

Оклад дейстувует с 01.03.2009 по 31.03.2009
Премия действует с 01.02.2009 по 28.02.2009 (выплачивается в марте за февраль)

Премия запросом будет однозначно игнорирована, поскольку фраза с ДатаАктуальности по ДатаАктуальности1; выберет только записи действующие в марте.
 
N

NomadSoul

Ramzay, у Вас так настроена премия (а обычно настраивают так что она регистрируется в марте и период действия - март, но при расчете суммы берутся начисления февраля), то ее придется выбирать отдельным запросом.

Премию, кстати, советую перенастроить, так как при текущей настройке будут неправильно считаться больничные (если при расчете б.л. текущая ситуация не учтена)
 
R

Ramzay

NomadSoul ,т.е. ты предлагаешь показывать период действия премии в марте? Гм. У нас бывают месяца, когда выплачиваются две премии сразу. Как правило это декабрь (конец года). В начале декабря мы получаем премию за ноябрь, а в конце декабря мы получаем премию за декабрь (в этом случае мы в начале января ничего не получим).
Получается что две премии выплаченные в декабре мы не сможем отличить друг от друга. Получится сл.картина:

Оклад дейстувует с 01.12.2008 по 31.12.2008
Премия действует с 01.12.2008 по 31.12.2008 (выплачивается в декабре за ноябрь в начале месяца)
Премия действует с 01.12.2008 по 31.12.2008 (выплачивается в декабре за декабрь в конце месяца)

Как видно последние две строки нелья отиличить друх от друга. Я не совсем уверен, что это правильно.
А в расчете больничных мы премию учли.
 
N

NomadSoul

Я бы решил подобный вопрос двумя видами расчетов по премии ("премия за текущий месяц", "премия за прошлый месяц"). Если возникнет потребность в отчете по премиям, что тогда будете мутить? Много циклов и анализов? Просто усложняете себе жизнь, IMHO.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!