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

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

demos

  • Новичок
  • *
  • Сообщений: 4
  • ФИО: demos
ЗУП 3.0 Специалист Билет 3
« : Октябрь 08, 2014, 08:58:33 pm »
Исходя из описания документа ОценкаРаботПоПроекту примем за факт, что 1 сотрудник в 1 проекте в 1 роли может участвовать в 1 месяце только 1 раз )

 1. Создаем Начисление - ежемесячно, оплата за отработанное время, формула: РасчетнаяБаза * ПроцентПремии / 100 , где РасчетнаяБаза зависит от начисления по дням.

 2. РН - РаботаВПроектах, периодический в пределах суток
 измерения: Сотрудник, Проект, Роль
 Ресурс: Дней
 Регистраторы: ФормированиеРабочейГруппы, ИсключениеИзрабочейГруппы
 (будет работать по аналогии с РН РабочееВремяСотрудников... если Сотрудник исключен, выставляется Дней -1, если включен +1)

 3. Документ ФормированиеРабочейГруппы
 только здесь используется физ таблица РН РаботаВПроектах, если использовать обороты, тогда нужно брать за факт, что Дата начала всех периодов в таблице >= Дата документа

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

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


 4. Документ ИсключениеИзрабочейГруппы
 
Код
Процедура ОбработкаПроведения(Отказ, Режим)
            
        Движения.РаботаВПроектах.Очистить();
        Движения.РаботаВПроектах.Записать();        
        Движения.РаботаВПроектах.Записывать = Истина;
            
        Запрос = Новый Запрос;
        Запрос.Текст =     
        "ВЫБРАТЬ
        |    ЕСТЬNULL(РаботаВПроектахОбороты.ДнейОборот, 0) КАК ДнейОборот,
        |    РаботаВПроектахОбороты.Роль
        |ИЗ
        |    РегистрНакопления.РаботаВПроектах.Обороты(
        |            &НачалоПериода,
        |            ,
        |            ,
        |            Проект = &Проект
        |                И Сотрудник = &Сотрудник) КАК РаботаВПроектахОбороты";
            
        Запрос.УстановитьПараметр("НачалоПериода", ДатаИсключения);
        Запрос.УстановитьПараметр("Проект", Проект);
        Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
            
        РезультатЗапроса = Запрос.Выполнить();
            
        Выборка = РезультатЗапроса.Выбрать();
            
        Пока Выборка.Следующий() Цикл
                
            Если Выборка.ДнейОборот > 0 Тогда
                СчетчикДата = ДатаИсключения;
                Пока СчетчикДата <= ДатаИсключения + ((Выборка.ДнейОборот-1)*24*60*60) Цикл
                    Движение = Движения.РаботаВПроектах.Добавить();
                    Движение.Период = СчетчикДата;
                    Движение.Проект = Проект;
                    Движение.Сотрудник = Сотрудник;
                    Движение.Роль = Выборка.Роль;
                    Движение.Дней =  -1;
                    СчетчикДата = СчетчикДата + (24*60*60);
                КонецЦикла;                
            Иначе
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "В этот период пользователь не работает над проектом!";
                Сообщение.Поле = "ДатаИсключения";
                Сообщение.УстановитьДанные(ЭтотОбъект);
                Сообщение.Сообщить();
                Отказ = Истина;                
            КонецЕсли;     
        КонецЦикла;
            
            
 КонецПроцедуры


 5. Документ ОценкаРаботПоПроекту

 5.1. Форма
 
Код
&НаСервере
 Процедура ПроектПриИзмененииНаСервере()

 ОбъектФормы = РеквизитФормыВЗначение("Объект");

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

 Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца( ОбъектФормы.Дата ) );
 Запрос.УстановитьПараметр("КонецПериода", КонецМесяца( ОбъектФормы.Дата ) );
 Запрос.УстановитьПараметр("Проект", ОбъектФормы.Проект);

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

 ОбъектФормы.ОценкаИсполнителей.Загрузить( РезультатЗапроса.Выгрузить() );

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

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

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

 ОбъектФормы = РеквизитФормыВЗначение("Объект");

 Запрос = Новый Запрос;
 Запрос.Текст =
 "ВЫБРАТЬ
 |    РаботаВПроектахОбороты.Проект,
 |    РаботаВПроектахОбороты.Сотрудник
 |ИЗ
 |    РегистрНакопления.РаботаВПроектах.Обороты(&НачалоПериода,
 &КонецПериода, , Роль =
 ЗНАЧЕНИЕ(Перечисление.РолиСотрудниковВПроектах.Руководитель)) КАК
 РаботаВПроектахОбороты";

 Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца( ОбъектФормы.Дата ) );
 Запрос.УстановитьПараметр("КонецПериода", КонецМесяца( ОбъектФормы.Дата ) );

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

 ОбъектФормы.ОценкаРуководителей.Загрузить( РезультатЗапроса.Выгрузить() );

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

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

 &НаКлиенте
 Процедура ПроектПриИзменении(Элемент)
 ПроектПриИзмененииНаСервере();
 КонецПроцедуры

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


 5.2. Модуль объекта, здесь пишем в РC ПлановыеНачисления и РС ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников
 
Код
Процедура ОбработкаПроведения(Отказ, Режим)

 Запрос = Новый Запрос;
 Запрос.Текст =
 "ВЫБРАТЬ
 |    ОценкаРаботПоПроектуОценкаИсполнителей.Ссылка.Проект,
 |    ОценкаРаботПоПроектуОценкаИсполнителей.Сотрудник,
 |    ЕСТЬNULL(ОценкаРаботПоПроектуОценкаИсполнителей.Срок, 0) *
 ЕСТЬNULL(ОценкаРаботПоПроектуОценкаИсполнителей.Качество, 0) КАК Оценка
 |ПОМЕСТИТЬ ВТ
 |ИЗ
 |    Документ.ОценкаРаботПоПроекту.ОценкаИсполнителей КАК ОценкаРаботПоПроектуОценкаИсполнителей
 |ГДЕ
 |    ОценкаРаботПоПроектуОценкаИсполнителей.Ссылка = &Ссылка
 |
 |ОБЪЕДИНИТЬ ВСЕ
 |
 |ВЫБРАТЬ
 |    ОценкаРаботПоПроектуОценкаРуководителей.Проект,
 |    ОценкаРаботПоПроектуОценкаРуководителей.Сотрудник,
 |    ЕСТЬNULL(ОценкаРаботПоПроектуОценкаРуководителей.Срок, 0) *
 ЕСТЬNULL(ОценкаРаботПоПроектуОценкаРуководителей.Качество, 0)
 |ИЗ
 |    Документ.ОценкаРаботПоПроекту.ОценкаРуководителей КАК ОценкаРаботПоПроектуОценкаРуководителей
 |ГДЕ
 |    ОценкаРаботПоПроектуОценкаРуководителей.Ссылка = &Ссылка
 |;
 |
 |////////////////////////////////////////////////////////////////////////////////
 |ВЫБРАТЬ
 |    ВТ.Проект,
 |    ВТ.Сотрудник,
 |    ВТ.Оценка,
 |    РаботаВПроектахОбороты.Роль,
 |    МИНИМУМ(РаботаВПроектахОбороты.Период) КАК ДатаНачала,
 |    СУММА(ЕСТЬNULL(РаботаВПроектахОбороты.ДнейОборот, 0)) КАК Дней
 |ПОМЕСТИТЬ ВТТ
 |ИЗ
 |    ВТ КАК ВТ
 |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.РаботаВПроектах.Обороты(
 |                &НачалоПериода,
 |                &КонецПериода,
 |                День,
 |                (Проект, Сотрудник) В
 |                    (ВЫБРАТЬ
 |                        ВТ.Проект,
 |                        ВТ.Сотрудник
 |                    ИЗ
 |                        ВТ КАК ВТ)) КАК РаботаВПроектахОбороты
 |        ПО ВТ.Проект = РаботаВПроектахОбороты.Проект
 |            И ВТ.Сотрудник = РаботаВПроектахОбороты.Сотрудник
 |
 |СГРУППИРОВАТЬ ПО
 |    ВТ.Сотрудник,
 |    РаботаВПроектахОбороты.Роль,
 |    ВТ.Проект,
 |    ВТ.Оценка
 |;
 |
 |////////////////////////////////////////////////////////////////////////////////
 |ВЫБРАТЬ
 |    ВТТ.Проект,
 |    ВТТ.Сотрудник,
 |    ВТТ.Роль,
 |    ВТТ.Оценка,
 |    ВТТ.ДатаНачала КАК ДатаСобытия,
 |    ДОБАВИТЬКДАТЕ(ВТТ.ДатаНачала, ДЕНЬ, ВТТ.Дней - 1) КАК ДействуетДо,
 |    ВТТ.Сотрудник.ФизическоеЛицо КАК ФизическоеЛицо,
 |    ВЫБОР
 |        КОГДА ВТТ.Роль = ЗНАЧЕНИЕ(Перечисление.РолиСотрудниковВПроектах.Руководитель)
 |            ТОГДА ВЫБОР
 |                    КОГДА ВТТ.Проект.Секретность = 1
 |                        ТОГДА 40
 |                    КОГДА ВТТ.Проект.Секретность = 2
 |                        ТОГДА 60
 |                    КОГДА ВТТ.Проект.Секретность = 3
 |                        ТОГДА 80
 |                    ИНАЧЕ 0
 |                КОНЕЦ
 |        КОГДА ВТТ.Роль = ЗНАЧЕНИЕ(Перечисление.РолиСотрудниковВПроектах.Исполнитель)
 |            ТОГДА ВЫБОР
 |                    КОГДА ВТТ.Проект.Секретность = 1
 |                        ТОГДА 50
 |                    КОГДА ВТТ.Проект.Секретность = 2
 |                        ТОГДА 70
 |                    КОГДА ВТТ.Проект.Секретность = 3
 |                        ТОГДА 90
 |                    ИНАЧЕ 0
 |                КОНЕЦ
 |        ИНАЧЕ 0
 |    КОНЕЦ КАК ПроцентПремии
 |ИЗ
 |    ВТТ КАК ВТТ
 |ГДЕ
 |    ВТТ.Дней > 0";

 Запрос.УстановитьПараметр("Ссылка", Ссылка);
 Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Дата) );
 Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Дата) );

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

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

 // получаем организацию по умолчанию
 ОрганизацияПоУмолчанию = Новый Структура("Организация");
 ЗарплатаКадры.ПолучитьЗначенияПоУмолчанию(ОрганизацияПоУмолчанию, НачалоМесяца(Дата) );
 // создаем пустые таблицы начислений и показателей
 ПлановыеНачисления = РасчетЗарплатыРасширенный.ПустаяТаблицаРегистрацииПлановыхНачислений();
 ЗначенияПоказателей = РасчетЗарплатыРасширенный.ПустаяТаблицаРегистрацииЗначенийПериодическихПоказателей();

 Пока Выборка.Следующий() Цикл
 Начисление = ПлановыеНачисления.Добавить();
 Начисление.ДатаСобытия = Выборка.ДатаСобытия;
 Начисление.Сотрудник = Выборка.Сотрудник;
 Начисление.ФизическоеЛицо = Выборка.ФизическоеЛицо;
 Начисление.Начисление = ПланыВидовРасчета.Начисления.НайтиПоКоду("ОЗРНП");
 Начисление.Используется = ИСТИНА;
 Начисление.Размер = 0;
 Начисление.ДействуетДо = Выборка.ДействуетДо;

 Показатель = ЗначенияПоказателей.Добавить();
 Показатель.ДатаСобытия = Выборка.ДатаСобытия;
 Показатель.Сотрудник = Выборка.Сотрудник;
 Показатель.Организация = ОрганизацияПоУмолчанию.Организация;
 Показатель.ФизическоеЛицо = Выборка.ФизическоеЛицо;
 Показатель.Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоРеквизиту("Идентификатор","ПроцентПремии");
 Показатель.Значение = Выборка.ПроцентПремии * Выборка.Оценка;
 Показатель.ДействуетДо = Выборка.ДействуетДо;
 КонецЦикла;

 СтруктураПлановыхНачислений = Новый Структура;
 СтруктураПлановыхНачислений.Вставить("ДанныеОПлановыхНачислениях", ПлановыеНачисления);
 СтруктураПлановыхНачислений.Вставить("ЗначенияПоказателей", ЗначенияПоказателей);
 РасчетЗарплаты.СформироватьДвиженияПлановыхНачислений(ЭтотОбъект, Движения, СтруктураПлановыхНачислений);

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


 6. Отчет. После создания предопределенного отчета нужно сделать обработку,
 которая вызывает следующую функцию -
 Справочники.ИдентификаторыОбъектовМетаданных.ОбновитьДанныеСправочника();

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

 ИНДЕКСИРОВАТЬ ПО
 Сотрудник,
 Период
 ;

 ////////////////////////////////////////////////////////////////////////////////
 ВЫБРАТЬ
 ВТДанные.Сотрудник,
 ВТДанные.Период
 ПОМЕСТИТЬ ВТСотрудники
 ИЗ
 ВТДанные КАК ВТДанные
 ;

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

 ////////////////////////////////////////////////////////////////////////////////
 ВЫБРАТЬ
 ВТДанные.Период,
 ВТДанные.Сотрудник,
 ВТДанные.ОтработаноДней,
 ВТДанные.НачисленоПоДневнойСтавке,
 ВТДанные.НачисленоПремии,
 ВТДанные.Проект,
 ВТДанные.Роль,
 Представления_КадровыеДанныеСотрудников.Должность,
 ВТДанные.ФактическийПроцентПремии
 ИЗ
 ВТДанные КАК ВТДанные
 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Представления_КадровыеДанныеСотрудников КАК Представления_КадровыеДанныеСотрудников
 ПО ВТДанные.Сотрудник = Представления_КадровыеДанныеСотрудников.Сотрудник
 И ВТДанные.Период = Представления_КадровыеДанныеСотрудников.Период


 Итого - с минимальным изменением конфигурации, точнее вообще ничего не меняли )
« Последнее редактирование: Октябрь 08, 2014, 09:08:04 pm от Дмитрий »

Olga91

  • Новичок
  • *
  • Сообщений: 1
Re: ЗУП 3.0 Специалист Билет 3
« Ответ #1 : Ноябрь 27, 2014, 10:20:23 am »
Скажите, пожалуйста. А какие измерения задавать в отчете у виртуальной таблицы РегистрРасчета.Начисления.БазаНачисления?


Tex

  • Пользователь
  • **
  • Сообщений: 11
  • ФИО: Андрей
Re: ЗУП 3.0 Специалист Билет 3
« Ответ #2 : Февраль 17, 2015, 10:22:17 am »
Демос написал, что за третий билет ему отняли два бала за неправильный выбор регистра. В связи с этим переделал этот билет. Писал периоды работы работников по проектам в РС ПлановыеНачислении. Исключение писал туда же, с Используется = ЛОЖЬ. Далее оценки писал в  в РС ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.
Все прекрасно работает. Получилось компактнее, легче. "Все гениальное просто"  ;)

FireAlex

  • Новичок
  • *
  • Сообщений: 2
Re: ЗУП 3.0 Специалист Билет 3
« Ответ #3 : Август 21, 2015, 07:54:38 am »
Демос написал, что за третий билет ему отняли два бала за неправильный выбор регистра. В связи с этим переделал этот билет. Писал периоды работы работников по проектам в РС ПлановыеНачислении. Исключение писал туда же, с Используется = ЛОЖЬ. Далее оценки писал в  в РС ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.
Все прекрасно работает. Получилось компактнее, легче. "Все гениальное просто"  ;)
Как в таком случае лучше получить сотрудников у которых есть действующее начисление (премия) в текущем месяце? самому писать запрос или есть типовая функция?

mkanaev

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

Описание.
1. Завел показатель "Работа на проектах". Действует во всех месяцах после ввода значения, так как начисления периодические.
Вывел показатель в константы для использования в документах и отчетах.

2.Завел начисление "Работа на проектах". Формула начисления: "РасчетнаяБаза * ПоказательРаботаНаПроектах / 100". В базу входит оплата по окладу.
Вывел начисление в константы для использования в документах и отчетах.

3. Завел справочник "Проекты". Завел перечисление "Степени секретности". Создал реквизит справочника "Проекты" - "Степень секретности".

4. Завел не периодический регистр сведений " ПлановыйРазмерПремииЗаРаботуНаПроекте " для хранения процентов премии по степени секретности проекта.

5. Завел перечисление "Роли на проекте" для хранения ролей: "Руководитель", "Исполнитель".

6. Создал периодический регистр сведений "РаботаНаПроектах" для хранения периодов работы на проекте. Измерения: Сотрудник, Проект. Ресурсы: Роль, ДействуетДо, Используется.
Используется - ресурс который определяет является ли запись началом работы на проекте или прекращением работы на проекте.
ДействуетДо - если не заполнен то по плану работа на проекте бес срочна. ДействуетДо - последний день работы на проекте, например если период = 01.01.2016 ДействуетДо = 12.01.2016 то период работы будет с 01.01.2016 по 12.01.2016. Запись с ресурсом "Используется  = ложь", является записью досрочного прекращения работы на проекте.
Дата досрочного прекращения это дата с которой сотрудник не работает на проекте, например период (запись начало работы) = 01.01.2016 период (запись досрочного прекращения работы) = 12.01.2016 то период работы будет с 01.01.2016 по 11.01.2016.

4. Разработал документ "Формирование рабочей группы", для включения сотрудника в рабочую группу. Документ имеет реквизит шапки "Проект", в котором указывается проект в который включается сотрудник. Создал табличную часть "Данные" с реквизитами "Сотрудник", "НачалоПериода", "КонецПериода", "Роль".
При проведении документа проверяется не работает ли сотрудник на других или этом проекте на начало периода и не началась ли работа на проекте в середине периода. Для адекватного проведения получаю реальную дату окончания работы на проекте если таковая есть в базе данных.
Например:
Документ формирование рабочей группы № 1, с 01.01.2016 по 31.03.2016.
Документ Исключение из рабочей группы № 1, с 15.01.2016.
Документ формирование рабочей группы № 2, с 15.01.2016 по 31.01.2016.

Для адекватной проверки (при перепроведении) не работает ли сотрудник в период документа 1 необходимо получить не только период документ с 01.01.2016 по 31.03.2016
но и досрочные исключения, после чего получиться период с 01.01.2016 по 14.01.2016 и как следствие не пересекается с периодом из документ исключения из рабочей группы.
При проведении проверяю нет ли в документе записей которые пересекаются, если есть то выдаю ошибку.
Документ формирует движения в регистр сведений "РаботаНаПроектах"

7. Разработал документ "Исключение из рабочей группы". При проведении проверяю работает ли человек на проекте из которого его пытаются исключить, для того что бы в регистре не было лишних записей, если не работает то выдаю ошибку. Документ формирует движения в регистр сведений "РаботаНаПроектах" с ресурсом Используется = Ложь. В шапку документа добавлен реквизит "Проект", создана табличная часть "Данные" с реквизитами: "Сотрудник", "ДатаИсключения".

8. Создал документ "Оценка работы на проектах".
Реквизиты документа:
   -"Организация" - для стандартных регистров подсистемы.
   - "Вид операции", тип    ПеречислениеСсылка.ВидыОперации_ОценкаРаботНаПроектах, который согласно    тех. заданию разделяет документ на оценку руководителей и оценку исполнителей.
   - Проект, необходим и появляется на форме только если это оценка исполнителей
Табличная часть "Данные", реквизиты: Сотрудник, Проект(если оценка руководителей),    НачалоПериода, КонецПериода, ПлановыйПроцентПремии, ОценкаКачетва,    ОценкаСкорости, ФактическийПроцентПремии.
На форме разработал процедуру заполнения документа периодами работы сотрудников на проектах, согласно тех. заданию если оценка руководителей то подбираются все работы на проектах в роли руководителей, если исполнители то подбираются периоды работы сотрудников в качестве исполнителей на проекте указанном в шапке. Так же при заполнении из регистра сведений берется значение "ПлановыйПроцентПремии" в соответствии с секретностью проекта.
На форме реализована процедура расчета: ФактическийПроцентПремии = ПлановыйПроцентПремии * ОценкаСкорости * ОценкаКачетва.

Документ формирует движения по регистрам сведений:

   - "ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников"
   - "ПлановыеНачисления"
   
ФактическийПроцентПремии является реальным процентом премии.

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

9. Разработал отчет согласно тех. заданию. Получаю данные по отработанным дням и начисленному окладу за период расчета премии с помощью виртуальной таблицы "БазаНачисления", значение процента премии беру из регистра сведений " ЗначенияПоказателейНачислений", получение данных по должности и данных работы на проектах вывел в механизм "Представления".

10. Заполнил базу данных по двум сотрудникам за 3 месяца.

mkanaev

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

Движения.РаботаНаПроектах.Записать();

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

ВыборкаПроверка1 = Результат[2].Выбрать();
ВыборкаПроверка2 = Результат[3].Выбрать();

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

СообщениеПользователю = Новый СообщениеПользователю;
СообщениеПользователю.Текст = "Сотрудник " + Строка(ВыборкаПроверка1.Сотрудник) + " в период с " + формат(ВыборкаПроверка1.НачалоПериода, "ДЛФ=DD") + " по " + формат(ВыборкаПроверка1.КонецПериода, "ДЛФ=DD") + " уже работает на проекте: " + Строка(ВыборкаПроверка1.Проект);
СообщениеПользователю.Сообщить();
Отказ = Истина;

КонецЦикла;

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

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

КонецЦикла;   

Если Отказ Тогда
Возврат;
КонецЕсли;        

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

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

Модуль документа "Исключение из рабочей группы"
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

Движения.РаботаНаПроектах.Записать();

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

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

КонецЦикла;

Если Отказ Тогда

Возврат;

КонецЕсли;

// регистр РаботаНаПроектах
Движения.РаботаНаПроектах.Записывать = Истина;
Для Каждого ТекСтрокаДанные Из Данные Цикл
Движение = Движения.РаботаНаПроектах.Добавить();
Движение.Период = ТекСтрокаДанные.ДатаИсключения;
Движение.Сотрудник = ТекСтрокаДанные.Сотрудник;
Движение.Проект = Проект;
Движение.Используется = Ложь;
КонецЦикла;

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

Модуль формы "Оценка работ на проекте"

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

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

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

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

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

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

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

КонецЦикла;
     
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

ИзменитьОтображениеЭлементов();

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

Процедура ИзменитьОтображениеЭлементов()

Если Объект.ВидОперации = Перечисления.ВидОперации_ОценкаРаботНаПроектах.Исполнители Тогда

Элементы.Проект.Видимость = Истина;
Элементы.ДанныеПроект.Видимость = Ложь;

Иначе

Элементы.Проект.Видимость = Ложь;
Элементы.ДанныеПроект.Видимость = Истина;

КонецЕсли;

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

&НаКлиенте
Процедура ВидОперацииПриИзменении(Элемент)

ИзменитьОтображениеЭлементов();

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

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

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

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

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

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

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

Возврат;

КонецЕсли;

ТекущаяСтрока.ФактическийПроцент = ТекущаяСтрока.ПлановыйПроцентПремии * ТекущаяСтрока.ОценкаКачества * ТекущаяСтрока.ОценкаСкорости;

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

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

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

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

&НаКлиенте
Процедура ДанныеОценкаСкоростиПриИзменении(Элемент)
Пересчитать();
КонецПроцедуры

mkanaev

  • Пользователь
  • **
  • Сообщений: 27
  • ФИО: Канаев Михаил Сергеевич
Re: ЗУП 3.0 Специалист Билет 3
« Ответ #6 : Апрель 05, 2016, 09:49:24 am »
Модуль документа "Оценка работ на проекте"
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

Если Константы.Показатель_РаботаНаПроектах.Получить().Пустая() Тогда

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

КонецЕсли;

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

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

КонецЦикла;

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

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

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

КонецЦикла;

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Данные.Сотрудник,
Данные.ПериодСреза
ПОМЕСТИТЬ ТаблицаСрезов
ИЗ
Данные КАК Данные

СГРУППИРОВАТЬ ПО
Данные.Сотрудник,
Данные.ПериодСреза
;

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Данные.Сотрудник,
Данные.Месяц,
СУММА(Данные.ОтработаноДней) КАК ОтработаноДней,
СУММА(Данные.НачисленоПоДневнойСтавке) КАК НачисленоПоДневнойСтавке,
СУММА(Данные.НачисленоПремии) КАК НачисленоПремии,
Данные.ФактическийПроцентПремии,
Представления_ДанныеПроекта.Роль,
Представления_ДанныеПроекта.Проект,
Представления_Должности.Должность
ИЗ
Данные КАК Данные
ЛЕВОЕ СОЕДИНЕНИЕ Представления_ДанныеПроекта КАК Представления_ДанныеПроекта
ПО Данные.Сотрудник = Представления_ДанныеПроекта.Сотрудник
И Данные.ПериодСреза = Представления_ДанныеПроекта.ПериодСреза
ЛЕВОЕ СОЕДИНЕНИЕ Представления_Должности КАК Представления_Должности
ПО Данные.Сотрудник = Представления_Должности.Сотрудник
И Данные.ПериодСреза = Представления_Должности.ПериодСреза

СГРУППИРОВАТЬ ПО
Данные.Сотрудник,
Данные.Месяц,
Данные.ФактическийПроцентПремии,
Представления_ДанныеПроекта.Роль,
Представления_ДанныеПроекта.Проект,
Представления_Должности.Должность
« Последнее редактирование: Май 25, 2016, 08:00:11 am от mkanaev »

paxanb

  • Пользователь
  • **
  • Сообщений: 26
Re: ЗУП 3.0 Специалист Билет 3
« Ответ #7 : Апрель 06, 2016, 08:50:01 pm »
Демос написал, что за третий билет ему отняли два бала за неправильный выбор регистра. В связи с этим переделал этот билет. Писал периоды работы работников по проектам в РС ПлановыеНачислении. Исключение писал туда же, с Используется = ЛОЖЬ. Далее оценки писал в  в РС ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.
Все прекрасно работает. Получилось компактнее, легче. "Все гениальное просто"  ;)

Понравилось это решение. Действительно, компактно выходит, в рамках нехватки времени на экзамене самое оно.

Как в таком случае лучше получить сотрудников у которых есть действующее начисление (премия) в текущем месяце? самому писать запрос или есть типовая функция?

Присоединяюсь к вопросу. Написание своей функции отнимает много времени на экзамене.
« Последнее редактирование: Апрель 08, 2016, 04:38:56 pm от paxanb »

zst001

  • Новичок
  • *
  • Сообщений: 2
Re: ЗУП 3.0 Специалист Билет 3
« Ответ #8 : Июнь 30, 2016, 09:13:38 am »
Сдавал экзамен 16.06.16 Для документа "ОценкаРаботПоПроекту" делал движения по регистру свед. "ЗначениеПериодическихПоказателейРасчетаЗарплатыСотрудников". И получил такой ответ
" Не верно выбран регистр движений для документа "Оценка работ по проекту". Регистр сведений: ЗначениеПериодическихПоказателейРасчетаЗарплатыСотрудников предназначен для хранения плановых показателей, по условиям задания требовалось регистрировать ежемесячно изменяемые показатели."

mkanaev

  • Пользователь
  • **
  • Сообщений: 27
  • ФИО: Канаев Михаил Сергеевич
Re: ЗУП 3.0 Специалист Билет 3
« Ответ #9 : Июль 11, 2016, 09:52:46 am »
zst001

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

Кстати вопрос использования РС "ЗначениеПериодическихПоказателейРасчетаЗарплатыСотрудников" стоял как в билете так и обсуждении, ответ был такой, "ну конечно можно использовать данный регистр, а что вы кроме него можете использовать что бы придти к результату, описанному в задании?".

Student90

  • Пользователь
  • **
  • Сообщений: 11
  • ФИО: Саша
Re: ЗУП 3.0 Специалист Билет 3
« Ответ #10 : Сентябрь 13, 2016, 03:36:49 pm »
Сдавал 17.06.16. РС ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников. Обосновал тем, что нет условия кратности проекта месяцу.
Ответ: Есть такое условие: "Оценка работ исполнителей производится ежемесячно руководителем проекта ...". Что имел ввиду преподаватель - загадка. Либо регистр выбран правильно, но не не правильный ход мыслей, либо надо использовать РАЗОВЫЕ?

« Последнее редактирование: Сентябрь 16, 2016, 11:41:35 am от Student90 »

sleek_35

  • Новичок
  • *
  • Сообщений: 4
Re: ЗУП 3.0 Специалист Билет 3
« Ответ #11 : Октябрь 10, 2016, 11:40:31 pm »
Подскажите, так что лучше использовать для хранения показателей. Показатель периодический, и писать его в "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников"? Или еще что-то... У меня в голове путаница. Как понять что использовать для периодических показателей - "ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников" или "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников"

r32

  • Новичок
  • *
  • Сообщений: 5
Re: ЗУП 3.0 Специалист Билет 3
« Ответ #12 : Октябрь 11, 2016, 08:58:06 am »
Подскажите, так что лучше использовать для хранения показателей. Показатель периодический, и писать его в "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников"? Или еще что-то... У меня в голове путаница. Как понять что использовать для периодических показателей - "ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников" или "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников"
Это зависит от того какие настройки ставишь у самих показателей: "Во всех месяцах после ввода значения" - "ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников";
"Вводится единовременно документом ввода данных для расчтеа зарплаты" - "ЗначенияразовыхПоказателейРасчетаЗарплатыСотрудников";
"Накапливается по отдельным значениям документами ввода данных для расчета зарплаты" - "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников".
Как то так, если не прав - поправьте.

zst001

  • Новичок
  • *
  • Сообщений: 2
Re: ЗУП 3.0 Специалист Билет 3
« Ответ #13 : Ноябрь 01, 2016, 11:57:41 pm »
При пересдаче попался этот же билет использовал регистр "ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников" сдал на 4.
Комментарий:

Роль (Руководитель или исполнитель) можно указть как в документе "Формирование рабочей группы", так и в "Оценка работ по проекту".
Таким образом может быть задано 2 разных значения на один месяц и одного сотрудника, в отчете из-за этого не правильные данные.

Student90

  • Пользователь
  • **
  • Сообщений: 11
  • ФИО: Саша
Re: ЗУП 3.0 Специалист Билет 3
« Ответ #14 : Ноябрь 02, 2016, 02:33:50 pm »
КАК???
РазовыеПоказатели - это показатель за месяц!
Получаем: Сотрудник_А - период работы с 10.10. по 20.10. расчетная премия 40%
Сотрудник_Б - период с 01.10. по 31.10. расчетная премия 40%
У обоих одинаковый дневной тариф. Оба получат одинаковую премию 40%. При этом 1 копал, второй картинки смотрел. Где логика?
С оперативными показателями - это накопление. Т.е. с 01.10 по 15.10 - Проект А = 40%, с 20.10. по 31.10 - Проект Б = 50%. Получим 90%. ...Что я не понимаю в задании и фразе: "премия начисляется на заработок работника по дневной тарифной ставке за период выполнения проекта"?
« Последнее редактирование: Ноябрь 02, 2016, 05:47:28 pm от Student90 »