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

Тема в разделе "1C и всё что с ней связано", создана пользователем Ramzay, 23 мар 2009.

  1. Ramzay

    Ramzay Гость

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

    gorlanovmax Well-Known Member
    1C Team

    Регистрация:
    19 июн 2008
    Сообщения:
    286
    Симпатии:
    0
    Телепаты!!! На выход!!! Появилась работа для Вас. Когда поймете, что хочет человек, отпишитесь :D
     
  3. mialord

    mialord Гость

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

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

    Ramzay Гость

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

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

    NomadSoul Гость

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

    Ramzay Гость

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

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

    NomadSoul Гость

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

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

    Ramzay Гость

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

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

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

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

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

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

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

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

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

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

    NomadSoul Гость

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

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

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

    Ramzay Гость

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

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

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

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

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

    NomadSoul Гость

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

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

    Ramzay Гость

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

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

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

    NomadSoul Гость

    Я бы решил подобный вопрос двумя видами расчетов по премии ("премия за текущий месяц", "премия за прошлый месяц"). Если возникнет потребность в отчете по премиям, что тогда будете мутить? Много циклов и анализов? Просто усложняете себе жизнь, IMHO.
     
Загрузка...
Похожие Темы - Как выбрать записи
  1. mazer1325
    Ответов:
    7
    Просмотров:
    227
  2. rownong
    Ответов:
    0
    Просмотров:
    772
  3. RadoXX
    Ответов:
    2
    Просмотров:
    1.438
  4. Dock1100
    Ответов:
    2
    Просмотров:
    3.453
  5. HelenHelen
    Ответов:
    20
    Просмотров:
    5.256

Поделиться этой страницей