Автор Тема: ЗУП 3.0 Специалист Билет 4  (Прочитано 8320 раз)

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

demos

  • Новичок
  • *
  • Сообщений: 4
  • ФИО: demos
ЗУП 3.0 Специалист Билет 4
« : Октябрь 16, 2014, 11:39:40 pm »
очень странная задача, даже в условии ошибка - Годовой лимит возмещения оплаты за квартиру, а потом в таблице - Годовой лимит медицинских расходов
 судя по отчету, нужно заводить остаточный РН, актуальностью на год. Но кто его будет закрывать в конце года, тоже не понятно...

 1. Создаем РН Лимиты, остатки, изм - Год (дата), Сотрудник, ресурс - Сумма.
 2. Включаем в настроках - отпуска без оплаты и компенсационные выплаты.
 3. Создаем начисление - "_КомпенсацияКвартплаты" назначение: Компенсационные выплаты, Начисление выполняется: Только если введено значение показателя, формула: РазмерКомпенсации_КомпенсацияКвартплаты, налог: пп.4, ст.255 НК РФ.
 4. Создаем разряды в справочнике - РазрядыКатегорииДолжностей, потом создаем должность и привязываем ей разряды.
 5. Создаем документ "ПодтверждениеРасходов", будет вводится в течении месяца. Также пусть закрывает прошлогодние лимиты)
 модуль объекта:
 
Код
Процедура ОбработкаПроведения(Отказ, Режим)
        
      Движения.Лимиты.Записывать = Истина;
        
      // закрываем все предыдущие лимиты
      Запрос = Новый Запрос;
      Запрос.Текст =   
          "ВЫБРАТЬ
          |    ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения,
          |    ДОБАВИТЬКДАТЕ(ЛимитыОстатки.Год, ГОД, 1) КАК Период,
          |    ЛимитыОстатки.Сотрудник,
          |    ЛимитыОстатки.Год,
          |    ЕСТЬNULL(ЛимитыОстатки.СуммаОстаток, 0) КАК Сумма
          |ИЗ
          |    РегистрНакопления.Лимиты.Остатки(&КонецПериода, ) КАК ЛимитыОстатки";
        
      Запрос.УстановитьПараметр("КонецПериода", НачалоГода(Дата) - 1 );
        
      РезультатЗапроса = Запрос.Выполнить();
      Если НЕ РезультатЗапроса.Пустой() Тогда
          Движения.Лимиты.Загрузить( РезультатЗапроса.Выгрузить() );
      КонецЕсли;   
        
        
        
      // пишем новые записи
      Для Каждого ТекСтрокаДанныеРасходов Из ДанныеРасходов Цикл
          Движение = Движения.Лимиты.Добавить();
          Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
          Движение.Период = Дата;
          Движение.Сотрудник = ТекСтрокаДанныеРасходов.Сотрудник;
          Движение.Год = НачалоГода(Дата);
          Движение.Сумма = ТекСтрокаДанныеРасходов.Расход;
      КонецЦикла;

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


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

      ЗначениеВРеквизитФормы( ЗначениеФорма, "Объект" );
        
 КонецПроцедуры

 &НаКлиенте
 Процедура Заполнить(Команда)
      ЗаполнитьНаСервере();
 КонецПроцедуры


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


 7. Отчет
 
Код
ВЫБРАТЬ
      Начисления.ПериодДействия,
      Начисления.Сотрудник,
      ЛимитыОстаткиИОбороты.СуммаНачальныйОстаток КАК ОстатокЛимитаНаНачалоПериода,
      ЛимитыОстаткиИОбороты.СуммаРасход КАК ЗаработаноЛимитаЗаПериод,
      ЛимитыОстаткиИОбороты.СуммаПриход КАК ПодтвержденныеРасходы,
      Начисления.Результат КАК ФактическиВозмещенныеРасходы,
      ЛимитыОстаткиИОбороты.СуммаКонечныйОстаток КАК ОстатокЛимитаНаКонецПериода
 ИЗ
      РегистрРасчета.Начисления КАК Начисления
          ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Лимиты.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Месяц, , ) КАК ЛимитыОстаткиИОбороты
          ПО Начисления.ПериодРегистрации = ЛимитыОстаткиИОбороты.Период
              И Начисления.Сотрудник = ЛимитыОстаткиИОбороты.Сотрудник
 ГДЕ
      Начисления.ВидРасчета = &ВидРасчета
« Последнее редактирование: Октябрь 16, 2014, 11:40:51 pm от Дмитрий »

AHuk87

  • Новичок
  • *
  • Сообщений: 2
  • ФИО: AHuk87
Re: ЗУП 3.0 Специалист Билет 4
« Ответ #1 : Ноябрь 12, 2014, 06:35:02 pm »
Решал почти такую же задачу сегодня. Единственно что там компенсации давались на каждого ребёнка. В связи с этим вопрос как в ЗУП узнать сколько детей? В голову пришло только использование регистра сведений "СоставыСемейФизическихЛиц". Откуда я выбирал степени родства детей. Но для этого пришлось создать свой регистр сведений и внести туда все степени родства, которые являются детьми. Есть идеи как сделать это лучше?

И я создавал 2 оборотных регистра накопления "ФактическиеРасходы" и "Лимиты " куда писал подвержденные расходы из документа "ПодтверждениеРасходов" и рассчитанные плановые и  фактически возмещенные расходы из документа "РасчетЛимитов" соответственно. Обороты при расчете фактически возмещенных расходов брал с начала года по конец месяца расчета.
« Последнее редактирование: Ноябрь 12, 2014, 06:55:05 pm от AHuk87 »


svetlanagold

  • Новичок
  • *
  • Сообщений: 9
  • ФИО: Светлана
Re: ЗУП 3.0 Специалист Билет 4
« Ответ #2 : Март 25, 2016, 09:54:31 am »
На экзамене попался этот билет. Сделала с одним регистром накопления, но экзаменатор сказала, что с одним регистром накопления задачу решить невозможно. Надо делать два регистра Учет лимитов и Учет фактических расходов.

paxanb

  • Пользователь
  • **
  • Сообщений: 26
Re: ЗУП 3.0 Специалист Билет 4
« Ответ #3 : Апрель 03, 2016, 04:14:34 pm »
Кто-нить может объяснить, почему задачу надо решать на двух РН(об) вместо одного РН(остатки)?

+ можно обойтись без создания документа ПодтверждениеРасходов. Также категории должностей можно двумя способами сделать, без создания новых объектов, и при этом не зашивать лимиты внутрь кода (храня в РС).
« Последнее редактирование: Апрель 03, 2016, 10:07:02 pm от paxanb »

mkanaev

  • Пользователь
  • **
  • Сообщений: 27
  • ФИО: Канаев Михаил Сергеевич
Re: ЗУП 3.0 Специалист Билет 4
« Ответ #4 : Апрель 05, 2016, 09:51:00 am »
Мое решение:
Описание.

1. Завел показатель "Компенсация", показатель разовый по сотруднику и собирает все введенные данные за месяц. Вывел в константы для использования в документах.
2. Завел начисление "Компенсация", формула = Показатель "Компенсация". Вывел в константы для использования в отчете.
3. Создал константы "Показатель_Оклад", "Начисление_ОтпускЗаСвойСчет" для получения начисления в документе, при заполнении данных о лимитах. Т.к. начисление отпуска за свой счет может не существовать в базе, вывел в константы.
4. Создал регистр накопления "КомпенсацияКварПлаты" след. структуры:
   Измерения:
      - сотрудник
      - год, для получения остатков только по тому году в котором проходим          действие, согласно условиям задачи "Лимиты на след. год не переносятся".
   Ресурсы:
      - сумма

В модуле набора записей прописал алгоритм приведения измерения Год в один формат, год = НачалоГода(Год).

Принцип работы регистра:
   Регистр хранит в себе остатки лимитов по компенсации. Если остаток положительный то по сотруднику есть лимит компенсации который он ещё не использовал, т.е. не подтвердил фактическими расходами. Если остаток отрицательный, то по сотруднику есть подтвержденные расходы на которые не хватило лимита.

Пример работы документов с регистром:

   - Док. расчет лимитов 1: + 5000 р. Остаток 5000р.
   - Док. Подтверждение расходов 1: - 6000. Остаток -1000р. (+5000 в регистр    значения оперативных показателей по сотруднику, т.е. к начислению)
   - Док. расчет лимитов 2: +5000 р. Остаток 4000р. (+1000 в регистр значения    оперативных показателей по сотруднику, т.е. сотруднику выплачиваются расходы    которые он подтвердил ранее но на которые не хватило лимита)
   - Док. Подтверждение расходов 2: - 3000. Остаток 1000р. (+3000 в регистр    значения оперативных показателей по сотруднику, т.е. к начислению)

При такой логике регистра выполняется требование что не израсходованные лимиты переносятся на следующий месяц и подтвержденные расходы на которые не хватило лимитов компенсируются в след. месяце.

В документах работающих с данным регистром есть проверка остатков за предыдущие года и списание, что бы не болтались остатки в регистре.

5. Создал регистр сведений "ЛимитыКомпенсации", для хранения количество окладом по категориям должностей.
Измерения: Категория, ресурс: Значение.

6. Разработал документ "РасчетЛимитов". Структура:
   Шапка:
      - Организация, для записи в регистр                  "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников"
   
   Табличная часть Данные:
      - Сотрудник
      - КатегорияДолжности
      - РазмерОклада
      - ПлановыйЛимит
      - КоэффициентВремени
      - ЗаработанныйЛимит.

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

При проведении документа списываются остатки лимитов за предыдущие года, согласно описанному алгоритму выше. Если по сотрудникам из документа есть отрицательные лимиты, то в регистр "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников" пишется запись на сумму меньшую между "ЗаработанныйЛимит" и СуммаОстаток * -1.
Пример описан выше. Документ делает движения по регистру накопления " КомпенсацияКварПлаты " с видом "Приход".

7. Разработан документ "РасходыПоКварПлате". Структура документа:
   Шапка:
      - Организация, для записи в регистр                  "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников"
   
   Табличная часть Данные:
      - Сотрудник
      - Сумма

При проведении документа формируются проводки по регистру накопления " КомпенсацияКварПлаты " с видом "Расход". Если по сотруднику есть остатки по накопленным лимитам то сумма = минимальная из Сумма(документ) и СуммаОстаток, записывается в регистр накопления "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников". Если сумма превышает сумму остатков то остаток после проведения этого документа будет отрицательный и может быть покрыт следующим документом "РасчетЛимитов".

8. Создал отчет: "ВозмещениеСоциальныхРасходов". Отчет формируется из регистра расчета "Начисления" по начислениям компенсация и регистра накопления " КомпенсацияКварПлаты"

9. Заполнил БД по двум сотрудникам за три месяца.

mkanaev

  • Пользователь
  • **
  • Сообщений: 27
  • ФИО: Канаев Михаил Сергеевич
Re: ЗУП 3.0 Специалист Билет 4
« Ответ #5 : Апрель 05, 2016, 09:52:30 am »
Модуль формы документа "Расчет лимитов":
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьНаСервере()

Дата = ?(Объект.Дата = '00010101000000', ТекущаяДата(), Объект.Дата);

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Организация", Объект.Организация);
Запрос.УстановитьПараметр("Отпуск", Константы.Начисление_ОтпускЗаСвойСчет.Получить());
Запрос.УстановитьПараметр("Оклад", Константы.Показатель_Оклад.Получить());
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Дата));
Запрос.УстановитьПараметр("КонецПериода",  КонецМесяца(Дата));
Запрос.Текст = "ВЫБРАТЬ
               | СостоянияСотрудников.Сотрудник,
               | &НачалоПериода КАК НачалоПериода,
               | &КонецПериода КАК КонецПериода,
               | ВЫБОР
               | КОГДА КадроваяИсторияСотрудников.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1)
               | ИЛИ КадроваяИсторияСотрудников.ДействуетДо > &КонецПериода
               | ТОГДА КадроваяИсторияСотрудников.Должность.ТарифнаяСетка
               | ИНАЧЕ КадроваяИсторияСотрудников.ДолжностьПоОкончании.ТарифнаяСетка
               | КОНЕЦ КАК КатегорияДолжности,
               | МАКСИМУМ(ВЫБОР
               | КОГДА ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1)
               | ИЛИ ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.ДействуетДо > &КонецПериода
               | ТОГДА ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Значение
               | ИНАЧЕ ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.ЗначениеПоОкончании
               | КОНЕЦ) КАК РазмерОклада,
               | ЛимитыКомпенсации.Значение КАК КоличествоОкладов
               |ПОМЕСТИТЬ Данные
               |ИЗ
               | РегистрСведений.СостоянияСотрудников.СрезПоследних(&КонецПериода, ) КАК СостоянияСотрудников
               | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&КонецПериода, ГоловнаяОрганизация = &Организация) КАК КадроваяИсторияСотрудников
               | ПО СостоянияСотрудников.Сотрудник = КадроваяИсторияСотрудников.Сотрудник
               | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЛимитыКомпенсации КАК ЛимитыКомпенсации
               | ПО (ВЫБОР
               | КОГДА КадроваяИсторияСотрудников.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1)
               | ИЛИ КадроваяИсторияСотрудников.ДействуетДо > &КонецПериода
               | ТОГДА КадроваяИсторияСотрудников.Должность.ТарифнаяСетка
               | ИНАЧЕ КадроваяИсторияСотрудников.ДолжностьПоОкончании.ТарифнаяСетка
               | КОНЕЦ = ЛимитыКомпенсации.Категория)
               | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.СрезПоследних(&КонецПериода, Организация = &Организация) КАК ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников
               | ПО СостоянияСотрудников.Сотрудник = ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Сотрудник
               | И (ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Показатель = &Оклад)
               |ГДЕ
               | НЕ СостоянияСотрудников.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияСотрудника.Увольнение)
               |
               |СГРУППИРОВАТЬ ПО
               | СостоянияСотрудников.Сотрудник,
               | ВЫБОР
               | КОГДА КадроваяИсторияСотрудников.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1)
               | ИЛИ КадроваяИсторияСотрудников.ДействуетДо > &КонецПериода
               | ТОГДА КадроваяИсторияСотрудников.Должность.ТарифнаяСетка
               | ИНАЧЕ КадроваяИсторияСотрудников.ДолжностьПоОкончании.ТарифнаяСетка
               | КОНЕЦ,
               | ЛимитыКомпенсации.Значение
               |
               |ИМЕЮЩИЕ
               | МАКСИМУМ(ВЫБОР
               | КОГДА ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1)
               | ИЛИ ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.ДействуетДо > &КонецПериода
               | ТОГДА ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Значение
               | ИНАЧЕ ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.ЗначениеПоОкончании
               | КОНЕЦ) > 0
               |;
               |
               |////////////////////////////////////////////////////////////////////////////////
               |ВЫБРАТЬ
               | Данные.Сотрудник,
               | Данные.НачалоПериода,
               | Данные.КонецПериода,
               | Данные.КатегорияДолжности,
               | Данные.РазмерОклада,
               | Данные.РазмерОклада * Данные.КоличествоОкладов / 12 КАК ПлановыйЛимит,
               | СУММА(ВЫБОР
               | КОГДА Начисления.ПериодДействияНачало ЕСТЬ NULL
               | ТОГДА 0
               | ИНАЧЕ РАЗНОСТЬДАТ(Начисления.ПериодДействияНачало, Начисления.ПериодДействияКонец, ДЕНЬ) + 1
               | КОНЕЦ) КАК КоличествоДнейОтпуска
               |ПОМЕСТИТЬ ДанныеСОтпуском
               |ИЗ
               | Данные КАК Данные
               | ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета.Начисления КАК Начисления
               | ПО Данные.Сотрудник = Начисления.Сотрудник
               | И (Начисления.ВидРасчета = &Отпуск)
               | И (НЕ Начисления.Сторно)
               | И (Начисления.Активность)
               | И (Начисления.ПериодДействияНачало МЕЖДУ &НачалоПериода И &КонецПериода)
               |
               |СГРУППИРОВАТЬ ПО
               | Данные.Сотрудник,
               | Данные.НачалоПериода,
               | Данные.КонецПериода,
               | Данные.КатегорияДолжности,
               | Данные.РазмерОклада,
               | Данные.РазмерОклада * Данные.КоличествоОкладов / 12
               |;
               |
               |////////////////////////////////////////////////////////////////////////////////
               |ВЫБРАТЬ
               | ДанныеСОтпуском.Сотрудник,
               | ДанныеСОтпуском.НачалоПериода,
               | ДанныеСОтпуском.КонецПериода,
               | ДанныеСОтпуском.КатегорияДолжности,
               | ДанныеСОтпуском.РазмерОклада,
               | ДанныеСОтпуском.ПлановыйЛимит,
               | ВЫБОР
               | КОГДА ДанныеСОтпуском.КоличествоДнейОтпуска = 0
               | ТОГДА 1
               | ИНАЧЕ ВЫБОР
               | КОГДА ДанныеСОтпуском.КоличествоДнейОтпуска >= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ) + 1
               | ТОГДА 0
               | ИНАЧЕ ВЫРАЗИТЬ((РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ) + 1 - ДанныеСОтпуском.КоличествоДнейОтпуска) / (РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ) + 1) КАК ЧИСЛО(3, 2))
               | КОНЕЦ
               | КОНЕЦ КАК КоэффициентВремени,
               | ВЫБОР
               | КОГДА ДанныеСОтпуском.КоличествоДнейОтпуска = 0
               | ТОГДА 1
               | ИНАЧЕ ВЫБОР
               | КОГДА ДанныеСОтпуском.КоличествоДнейОтпуска >= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ) + 1
               | ТОГДА 0
               | ИНАЧЕ ВЫРАЗИТЬ((РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ) + 1 - ДанныеСОтпуском.КоличествоДнейОтпуска) / (РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ) + 1) КАК ЧИСЛО(3, 2))
               | КОНЕЦ
               | КОНЕЦ * ДанныеСОтпуском.ПлановыйЛимит КАК ЗаработанныйЛимит
               |ИЗ
               | ДанныеСОтпуском КАК ДанныеСОтпуском";
   
Выборка = Запрос.Выполнить().Выбрать();

Объект.Данные.Очистить();

Пока Выборка.Следующий() Цикл

СтрокаТаблицыДанные = Объект.Данные.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТаблицыДанные, Выборка);

КонецЦикла;           

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

&НаКлиенте
Процедура ДанныеПлановыйЛимитПриИзменении(Элемент)

Пересчитать();

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

&НаКлиенте
Процедура Пересчитать()

ТекущаяСтрока = Элементы.Данные.ТекущиеДанные;

Если ТекущаяСтрока = Неопределено Тогда

Возврат;

КонецЕсли;

ТекущаяСтрока.ЗаработанныйЛимит = ТекущаяСтрока.ПлановыйЛимит * ТекущаяСтрока.КоэффициентВремени;

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

&НаКлиенте
Процедура ДанныеКоэффициентВремениПриИзменении(Элемент)

Пересчитать();

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

Модуль объекта документа "Расчет лимитов":
Процедура ОбработкаПроведения(Отказ, Режим)

Если Константы.Показатель_Компенсация.Получить().Пустая() Тогда

СообщениеПользователю = Новый СообщениеПользователю;
СообщениеПользователю.Текст = "Не установлена константа ""Показатель_Компенсация""";
СообщениеПользователю.Сообщить();
Отказ = Истина;
Возврат;

КонецЕсли;

Движения.КомпенсацияКварПлаты.Записать();

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("КонецПредыдущегоГода", Новый Граница(КонецГода(ДобавитьМесяц(Дата, -12)), ВидГраницы.Включая));
Запрос.УстановитьПараметр("ПредыдущийГод", НачалоГода(ДобавитьМесяц(Дата, -12)));
Запрос.Текст = "ВЫБРАТЬ
               | Остатки.Сотрудник,
               | Остатки.Год,
               | Остатки.СуммаОстаток КАК Сумма
               |ИЗ
               | РегистрНакопления.КомпенсацияКварПлаты.Остатки(&МоментВремени, Год <= &ПредыдущийГод) КАК Остатки
               |;
               |
               |////////////////////////////////////////////////////////////////////////////////
               |ВЫБРАТЬ
               | Док.Сотрудник,
               | СУММА(Док.ЗаработанныйЛимит) КАК Сумма,
               | МАКСИМУМ(ЕСТЬNULL(Остатки.СуммаОстаток, 0) * -1) КАК СуммаОстаток
               |ИЗ
               | Документ.РасчетЛимитов.Данные КАК Док
               | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.КомпенсацияКварПлаты.Остатки(&МоментВремени, Год = НАЧАЛОПЕРИОДА(&Дата, ГОД)) КАК Остатки
               | ПО Док.Сотрудник = Остатки.Сотрудник
               | И (Остатки.СуммаОстаток < 0)
               |ГДЕ
               | Док.Ссылка = &Ссылка
               |
               |СГРУППИРОВАТЬ ПО
               | Док.Сотрудник
               |
               |ИМЕЮЩИЕ
               | СУММА(Док.ЗаработанныйЛимит) > 0";
   
Результат = Запрос.ВыполнитьПакет();    
   
Выборка = Результат[1].Выбрать();
ВыборкаКорректировкаПрошлыхПериодов = Результат[0].Выбрать();

Пока ВыборкаКорректировкаПрошлыхПериодов.Следующий() Цикл

Движение = Движения.КомпенсацияКварПлаты.Добавить();
Движение.Период = Дата;
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Сотрудник = ВыборкаКорректировкаПрошлыхПериодов.Сотрудник;
Движение.Сумма = ВыборкаКорректировкаПрошлыхПериодов.Сумма;
Движение.Год = ВыборкаКорректировкаПрошлыхПериодов.Год;

КонецЦикла;

Пока Выборка.Следующий() Цикл

Движение = Движения.КомпенсацияКварПлаты.Добавить();
Движение.Период = Дата;
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Сотрудник = Выборка.Сотрудник;
Движение.Сумма = Выборка.Сумма;
Движение.Год = НачалоГода(Дата);

Если Выборка.СуммаОстаток > 0 Тогда

Зачтем = Мин(Выборка.Сумма, Выборка.СуммаОстаток);

Движение = Движения.ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников.Добавить();
Движение.Период = Дата;
Движение.Сотрудник = Выборка.Сотрудник;
Движение.Показатель = Константы.Показатель_Компенсация.Получить();
Движение.Организация = Организация;
Движение.ФизическоеЛицо = Выборка.Сотрудник.ФизическоеЛицо;
Движение.Значение = Зачтем;

КонецЕсли;

КонецЦикла;

Движения.ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников.Записывать = Истина;
Движения.КомпенсацияКварПлаты.Записывать = Истина;

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

mkanaev

  • Пользователь
  • **
  • Сообщений: 27
  • ФИО: Канаев Михаил Сергеевич
Re: ЗУП 3.0 Специалист Билет 4
« Ответ #6 : Апрель 05, 2016, 09:53:29 am »
Модуль документа "Расходы по квар. плате":
Процедура ОбработкаПроведения(Отказ, Режим)

Если Константы.Показатель_Компенсация.Получить().Пустая() Тогда

СообщениеПользователю = Новый СообщениеПользователю;
СообщениеПользователю.Текст = "Не установлена константа ""Показатель_Компенсация""";
СообщениеПользователю.Сообщить();
Отказ = Истина;
Возврат;

КонецЕсли;

Движения.КомпенсацияКварПлаты.Записать();

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.УстановитьПараметр("КонецПредыдущегоГода", Новый Граница(КонецГода(ДобавитьМесяц(Дата, -12)), ВидГраницы.Включая));
Запрос.УстановитьПараметр("ПредыдущийГод", НачалоГода(ДобавитьМесяц(Дата, -12)));
Запрос.Текст = "ВЫБРАТЬ
               | Остатки.Сотрудник,
               | Остатки.Год,
               | Остатки.СуммаОстаток КАК Сумма
               |ИЗ
               | РегистрНакопления.КомпенсацияКварПлаты.Остатки(&МоментВремени, Год <= &ПредыдущийГод) КАК Остатки
               |;
               |
               |////////////////////////////////////////////////////////////////////////////////
               |ВЫБРАТЬ
               | Док.Сотрудник,
               | СУММА(Док.Сумма) КАК Сумма,
               | МАКСИМУМ(ЕСТЬNULL(Остатки.СуммаОстаток, 0)) КАК СуммаОстаток
               |ИЗ
               | Документ.РасходыПоКварПлате.Данные КАК Док
               | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.КомпенсацияКварПлаты.Остатки(&МоментВремени, Год = НАЧАЛОПЕРИОДА(&Дата, ГОД)) КАК Остатки
               | ПО Док.Сотрудник = Остатки.Сотрудник
               | И (Остатки.СуммаОстаток > 0)
               |ГДЕ
               | Док.Ссылка = &Ссылка
               |
               |СГРУППИРОВАТЬ ПО
               | Док.Сотрудник
               |
               |ИМЕЮЩИЕ
               | СУММА(Док.Сумма) > 0";
   
Результат = Запрос.ВыполнитьПакет();    
   
Выборка = Результат[1].Выбрать();
ВыборкаКорректировкаПрошлыхПериодов = Результат[0].Выбрать();

Пока ВыборкаКорректировкаПрошлыхПериодов.Следующий() Цикл

Движение = Движения.КомпенсацияКварПлаты.Добавить();
Движение.Период = Дата;
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Сотрудник = ВыборкаКорректировкаПрошлыхПериодов.Сотрудник;
Движение.Сумма = ВыборкаКорректировкаПрошлыхПериодов.Сумма;
Движение.Год = ВыборкаКорректировкаПрошлыхПериодов.Год;

КонецЦикла;

Пока Выборка.Следующий() Цикл

Движение = Движения.КомпенсацияКварПлаты.Добавить();
Движение.Период = Дата;
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Сотрудник = Выборка.Сотрудник;
Движение.Сумма = Выборка.Сумма;
Движение.Год = НачалоГода(Дата);

Если Выборка.СуммаОстаток > 0 Тогда

Зачтем = Мин(Выборка.Сумма, Выборка.СуммаОстаток);

Движение = Движения.ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников.Добавить();
Движение.Период = Дата;
Движение.Сотрудник = Выборка.Сотрудник;
Движение.Показатель = Константы.Показатель_Компенсация.Получить();
Движение.Организация = Организация;
Движение.ФизическоеЛицо = Выборка.Сотрудник.ФизическоеЛицо;
Движение.Значение = Зачтем;

КонецЕсли;

КонецЦикла;

Движения.ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников.Записывать = Истина;
Движения.КомпенсацияКварПлаты.Записывать = Истина;

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

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

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
КомпенсацияКварПлатыОстаткиИОбороты.Период,
КомпенсацияКварПлатыОстаткиИОбороты.Сотрудник,
0,
КомпенсацияКварПлатыОстаткиИОбороты.СуммаНачальныйОстаток,
КомпенсацияКварПлатыОстаткиИОбороты.СуммаПриход,
КомпенсацияКварПлатыОстаткиИОбороты.СуммаРасход,
КомпенсацияКварПлатыОстаткиИОбороты.СуммаКонечныйОстаток
ИЗ
РегистрНакопления.КомпенсацияКварПлаты.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Месяц, , ) КАК КомпенсацияКварПлатыОстаткиИОбороты
ГДЕ
КомпенсацияКварПлатыОстаткиИОбороты.Год = НАЧАЛОПЕРИОДА(КомпенсацияКварПлатыОстаткиИОбороты.Период, ГОД)) как ВЗ
« Последнее редактирование: Май 25, 2016, 08:00:35 am от mkanaev »

zikonza

  • Новичок
  • *
  • Сообщений: 9
  • Krol ЕСЛИ ВЫ ПОДЕЛИЛИСЬ СВОЕЙ ПОЧТОЙ, УДАЛИТЕ СООБЩЕНИЕ НЕМЕДЛЕННО ИЛИ БУДЕТЕ ЗАБАНЕНЫ. ЧИТАЙТЕ ПРАВИЛА!!! KoDER
  • ФИО: Макаревич Дмитрий Игоревич
Re: ЗУП 3.0 Специалист Билет 4
« Ответ #7 : Апрель 11, 2016, 11:32:53 pm »
Зачем в этой задаче вообще использовать регистр накопления???http://expert.chistov.pro/public/409295/

mkanaev

  • Пользователь
  • **
  • Сообщений: 27
  • ФИО: Канаев Михаил Сергеевич
Re: ЗУП 3.0 Специалист Билет 4
« Ответ #8 : Апрель 12, 2016, 12:20:39 pm »
paxanb
Похоже необходимо сравнивать реальную выплату из РР "Начисления", например с начала года рассчитанной компенсации 10000, подтвержденных расходов 9000р., по РР 8500, и в текущем документе 500р.

Расчет выплаты в текущем месяце будет Мин(10000+500, 9000) - 8500 = 500р.

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

Используя остатки мы берем сколько осталось расходов или компенсации а нужно брать сколько могли компенсировать и сколько компенсировали реально.
Можно не делать два регистра, сделать разделитель в измерениях.
« Последнее редактирование: Апрель 12, 2016, 12:22:13 pm от mkanaev »

maks89

  • Новичок
  • *
  • Сообщений: 1
Re: ЗУП 3.0 Специалист Билет 4
« Ответ #9 : Февраль 17, 2017, 05:30:00 am »
прошу указать на ошибки более опытных ))
Процедура ЗаполнитьНаСервере()

Объект.Выплаты.Очистить();

ВР_Сотрудники = СотрудникиПоШапкеДокумента();

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

Запрос.УстановитьПараметр("Начисление", Объект.НачислениеПоОкладу);
Запрос.УстановитьПараметр("ВР_Сотрудники", ВР_Сотрудники);
Запрос.УстановитьПараметр("Период", КонецМесяца(Объект.Дата));
Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Категория должности 2"));

РезультатЗапроса = Запрос.Выполнить();

    ДетальныеЗаписи =  РезультатЗапроса.Выбрать();

Пока ДетальныеЗаписи.Следующий() Цикл

СтрокаВыплаты =  Объект.Выплаты.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаВыплаты,ДетальныеЗаписи);
СтрокаВыплаты.КоэффициентВремени = (ДетальныеЗаписи.ДнейВМесяце - ДетальныеЗаписи.ОтработаноДней )/ ДетальныеЗаписи.ДнейВМесяце;
СтрокаВыплаты.ПлановыйЛимит      = ДетальныеЗаписи.Кратность   *  ДетальныеЗаписи.РазмерОклада;
СтрокаВыплаты.ЗаработанныйЛимит  = СтрокаВыплаты.ПлановыйЛимит *  СтрокаВыплаты.КоэффициентВремени;
СтрокаВыплаты.РазмерДоплаты      = Мин(СтрокаВыплаты.ЗаработанныйЛимит,ДетальныеЗаписи.ПодтвержденныеРасходы);

КонецЦикла;

И проведение

      // Проведение документа
ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект);

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

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

РезультатЗапросаМассив = Запрос.ВыполнитьПакет();

ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников = РезультатЗапросаМассив[1].Выгрузить();

Лимиты = РезультатЗапросаМассив[2].Выгрузить();

Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Записывать = Истина;

Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Загрузить(ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников);

Движения.Лимиты.Записывать = Истина;

Движения.Лимиты.Загрузить(Лимиты);


Вроде мое решение проще и очевиднее

// Проведение документа
ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект);

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

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

РезультатЗапросаМассив = Запрос.ВыполнитьПакет();

ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников = РезультатЗапросаМассив[1].Выгрузить();

Лимиты = РезультатЗапросаМассив[2].Выгрузить();

Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Записывать = Истина;

Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Загрузить(ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников);

Движения.Лимиты.Записывать = Истина;

Движения.Лимиты.Загрузить(Лимиты);
« Последнее редактирование: Февраль 21, 2017, 04:32:44 am от maks89 »

alsygaev

  • Пользователь
  • **
  • Сообщений: 42
  • ФИО: Евгений Алсыгаев
Re: ЗУП 3.0 Специалист Билет 4
« Ответ #10 : Апрель 26, 2019, 04:19:57 am »
Народ, кто в теме по Билету 4? Хочется его сделать выполнив по минимуму изменений в типовой конфе.
1. Создал разовый показатель ФактическийЛимитКвартплаты, куда записывает фактический рассчитанный лимит за месяц.
2. Создал разовый показатель ФактическийРазмерКвартплаты, куда записывается сумма квартплаты, предоставленная сотрудником.
2. Создал начисление с формулой ?((ФактическийЛимитКвартплаты - ФактическийРазмерКвартплаты) <= 0, ФактическийЛимитКвартплаты, ФактическийРазмерКвартплаты)
3. В конфигураторе создал Регистр Накопления ЛимитКвартплаты. Туда будут делаться записи Приход суммы лимита
 за месяц по сотрудникам.
4. В конфигураторе создал документ РасчетЛимитов, который делает движения Приход в Регистре Накопления ЛимитКвартплаты и записывает Разовые Показатели ФактическийЛимитКвартплаты.
5. Далее создал в Предприятии шаблон для Ввода Данных для расчета зарплаты, куда будет записываться показатель ФактическийРазмерКвартплаты по сотруднику.

При расчете зарплаты все работает. НО!!!
Как сделать проверку ОСТАТКА в регистре накопления и как сделать там движение РАСХОД???
« Последнее редактирование: Апрель 26, 2019, 04:31:18 am от alsygaev »

alsygaev

  • Пользователь
  • **
  • Сообщений: 42
  • ФИО: Евгений Алсыгаев
Re: ЗУП 3.0 Специалист Билет 4
« Ответ #11 : Май 13, 2019, 11:24:03 am »
Всем привет. Прошу проверить и покритиковать мое решение Билета 4. Подойдет для экзаменатора? Решение выполнено на релизе 3.1.7.128 КОРП. Решение не включает в себя отчет.

VAAngelov

  • Пользователь
  • **
  • Сообщений: 23
  • Дорогу осилит идущий
  • ФИО: Ангелов Виталий Алексеевич
Re: ЗУП 3.0 Специалист Билет 4
« Ответ #12 : Июнь 03, 2019, 06:04:23 pm »
Прикладываю свое переработанное решение на основе решения пользователя mkanaev. И прикладываю описание решения(пользователь mkanaev)