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

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

demos

  • Новичок
  • *
  • Сообщений: 4
  • ФИО: demos
ЗУП 3.0 Специалист Билет 6
« : Октябрь 12, 2014, 11:04:32 pm »
1. Включаем в настройках натуральный доход, в его начислении формула: "НатуральныйДоход" , Только если введено значение показателя "НатуральныйДоход"
 2. Создаем начисление "Премия за звонки", формула: "Оклад * ПроцентПремииЗаЗвонки / 100", учет времени: "Звонки", Только если введено значение показателя: СредняяОценкаЗаЗвонки. Причем показатель ПроцентПремииЗаЗвонки зависит от показателя СредняяОценкаЗаЗвонки по шкале:
 400-450: 10;
 450-475: 25;
 475-500: 40;
 так как конфигурация не поддерживает дробные шкалы.

 3. Включаем в настройках Дополнительные реквизиты и добавляем для Сотрудник: Код оператора (строка). После этого заполняем коды у сотрудников

 4. Создаем документ: ДанныеОЗвонках
 Он будет писать в РС ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников - значение средней оценки
 и в РН РабочееВремяСотрудников отработанное время на звонках, как Табель
 форма:
 
Код
&НаКлиенте
 Процедура ЗагрузитьИзФайла(Команда)
        
      Режим = РежимДиалогаВыбораФайла.Открытие;
      ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);   
        
      Если ДиалогОткрытияФайла.Выбрать() Тогда
            
          Объект.ТаблицаЗвонков.Очистить();
            
          ТекстФайла = Новый ТекстовыйДокумент;
          ТекстФайла.Прочитать( ДиалогОткрытияФайла.ВыбранныеФайлы[0] );
          ТекстФайла = ТекстФайла.ПолучитьТекст();          
          Для Счетчик = 1 По СтрЧислоСтрок( ТекстФайла ) Цикл
                
              Стр = СтрПолучитьСтроку( ТекстФайла, Счетчик );
                      
              Звонок = Объект.ТаблицаЗвонков.Добавить();
                
              Звонок.ВремяНачала        = Дата( Сред(Стр,7,4) + Сред(Стр,4,2) + Сред(Стр,1,2) + Сред(Стр,12,2) + Сред(Стр,15,2) + "00" );
              Звонок.ВремяОкончания    = Дата( Сред(Стр,24,4) + Сред(Стр,21,2) + Сред(Стр,18,2) + Сред(Стр,29,2) + Сред(Стр,32,2) + "00" );
              Звонок.КодОператора        = Сред(Стр,35,3);
              Звонок.Оценка            = Сред(Стр,39,1);              
          КонецЦикла;
            
      КонецЕсли;      
        
 КонецПроцедуры
Модуль:
 
Код
Функция ПустаяТаблицаДанныхОВремени()
      ТаблицаДанныхОВремени = Новый ТаблицаЗначений;
      ТаблицаДанныхОВремени.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
      ТаблицаДанныхОВремени.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
      ТаблицаДанныхОВремени.Колонки.Добавить("ВидВремени", Новый ОписаниеТипов("СправочникСсылка.ВидыИспользованияРабочегоВремени"));
      ТаблицаДанныхОВремени.Колонки.Добавить("Дней", Новый ОписаниеТипов("Число"));
      ТаблицаДанныхОВремени.Колонки.Добавить("Часов", Новый ОписаниеТипов("Число"));
      ТаблицаДанныхОВремени.Колонки.Добавить("ВЦеломЗаПериод", Новый ОписаниеТипов("Булево"));
      Возврат ТаблицаДанныхОВремени;
 КонецФункции      

 Процедура ОбработкаПроведения(Отказ, Режим)
        
      Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Очистить();
      Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Записывать = Истина;
        
      Движения.РабочееВремяСотрудников.Очистить();
      Движения.РабочееВремяСотрудников.Записывать = Истина;
        
      ЗначенияПоУмолчанию = Новый Структура("Организация");
      ЗарплатаКадры.ПолучитьЗначенияПоУмолчанию(ЗначенияПоУмолчанию, НачалоМесяца(Дата) );
      ДатаНачалаПериода = НачалоМесяца(Дата);
      ДатаОкончанияПериода = КонецМесяца(Дата);
      ПериодРегистрации = Дата;
      Организация = ЗначенияПоУмолчанию.Организация;       
        
      ВыборкаДанныхОВремени = Документы.ТабельУчетаРабочегоВремени.ДанныеОВремениСотрудников(ЭтотОбъект);    
        
      Запрос = Новый Запрос;
      Запрос.Текст =   
      "ВЫБРАТЬ
      |    ТаблицаЗвонков.КодОператора,
      |    ТаблицаЗвонков.Оценка,
      |    РАЗНОСТЬДАТ(ТаблицаЗвонков.ВремяНачала, ТаблицаЗвонков.ВремяОкончания, СЕКУНДА) КАК Время,
      |    НАЧАЛОПЕРИОДА(ТаблицаЗвонков.ВремяНачала, ДЕНЬ) КАК Дата
      |ПОМЕСТИТЬ ВТТаблицаЗвонков
      |ИЗ
      |    &ТаблицаЗвонков КАК ТаблицаЗвонков
      |
      |ИНДЕКСИРОВАТЬ ПО
      |    ТаблицаЗвонков.КодОператора
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |    ВыборкаДанныхОВремени.Сотрудник КАК Сотрудник,
      |    ВыборкаДанныхОВремени.Дата КАК Дата,
      |    ВыборкаДанныхОВремени.ВидУчетаВремени,
      |    ВыборкаДанныхОВремени.Дни,
      |    ВыборкаДанныхОВремени.Часы
      |ПОМЕСТИТЬ ВТВыборкаДанныхОВремени
      |ИЗ
      |    &ВыборкаДанныхОВремени КАК ВыборкаДанныхОВремени
      |ГДЕ
      |    ВыборкаДанныхОВремени.ВидУчетаВремени = &ВидУчетаВремениЯвка
      |
      |ИНДЕКСИРОВАТЬ ПО
      |    Сотрудник,
      |    Дата
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |    СотрудникиДополнительныеРеквизиты.Ссылка КАК Сотрудник,
      |    ВТТаблицаЗвонков.Оценка КАК Оценка,
      |    ВТТаблицаЗвонков.Время КАК Время,
      |    ВТТаблицаЗвонков.Дата
      |ПОМЕСТИТЬ ВТЗвонкиПоСотрудникам
      |ИЗ
      |    ВТТаблицаЗвонков КАК ВТТаблицаЗвонков
      |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Сотрудники.ДополнительныеРеквизиты КАК СотрудникиДополнительныеРеквизиты
      |        ПО ВТТаблицаЗвонков.КодОператора = СотрудникиДополнительныеРеквизиты.Значение
      |            И (СотрудникиДополнительныеРеквизиты.Свойство = &Свойство)
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |    ВТЗвонкиПоСотрудникам.Сотрудник,
      |    СРЕДНЕЕ(ВТЗвонкиПоСотрудникам.Оценка) КАК Оценка,
      |    СУММА(ВТЗвонкиПоСотрудникам.Время) КАК Время
      |ИЗ
      |    ВТЗвонкиПоСотрудникам КАК ВТЗвонкиПоСотрудникам
      |
      |СГРУППИРОВАТЬ ПО
      |    ВТЗвонкиПоСотрудникам.Сотрудник
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |    ВТВыборкаДанныхОВремени.Сотрудник,
      |    ВТВыборкаДанныхОВремени.Дата,
      |    ВТВыборкаДанныхОВремени.Дни,
      |    ВТВыборкаДанныхОВремени.Часы,
      |    СУММА(ВТЗвонкиПоСотрудникам.Время) КАК Время
      |ИЗ
      |    ВТВыборкаДанныхОВремени КАК ВТВыборкаДанныхОВремени
      |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТЗвонкиПоСотрудникам КАК ВТЗвонкиПоСотрудникам
      |        ПО ВТВыборкаДанныхОВремени.Дата = ВТЗвонкиПоСотрудникам.Дата
      |            И ВТВыборкаДанныхОВремени.Сотрудник = ВТЗвонкиПоСотрудникам.Сотрудник
      |
      |СГРУППИРОВАТЬ ПО
      |    ВТВыборкаДанныхОВремени.Дни,
      |    ВТВыборкаДанныхОВремени.Часы,
      |    ВТВыборкаДанныхОВремени.Сотрудник,
      |    ВТВыборкаДанныхОВремени.Дата";
        
      Запрос.УстановитьПараметр("ТаблицаЗвонков", ТаблицаЗвонков);       
      Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Код оператора"));
      Запрос.УстановитьПараметр("ВыборкаДанныхОВремени", ВыборкаДанныхОВремени.Владелец().Выгрузить() );
      Запрос.УстановитьПараметр("ВидУчетаВремениЯвка", ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.Явка") );
        
      ТаблицаДанныхОВремени = ПустаяТаблицаДанныхОВремени();   
        
      РезультатыЗапроса = Запрос.ВыполнитьПакет();
        
      Выборка = РезультатыЗапроса[3].Выбрать();
      Пока Выборка.Следующий() Цикл
          Если Выборка.Оценка >= 4 Тогда
              Показатель = Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Добавить();
              Показатель.ПериодДействия = НачалоМесяца(Дата);
              Показатель.Сотрудник = Выборка.Сотрудник;
              Показатель.Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоРеквизиту("Идентификатор", "СредняяОценкаЗаЗвонки");
              Показатель.Организация = Организация;
              Показатель.Значение = Выборка.Оценка * 100;
          КонецЕсли;
      КонецЦикла;
        
      Выборка = РезультатыЗапроса[4].Выбрать();
      Пока Выборка.Следующий() Цикл
          ДанныеПоВидуВремениНаДату = ТаблицаДанныхОВремени.Добавить();
          ДанныеПоВидуВремениНаДату.Дата = Выборка.Дата;
          ДанныеПоВидуВремениНаДату.Сотрудник = Выборка.Сотрудник;
          ДанныеПоВидуВремениНаДату.ВидВремени = Справочники.ВидыИспользованияРабочегоВремени.НайтиПоРеквизиту("БуквенныйКод","ЗВК");
          ДанныеПоВидуВремениНаДату.Дней = Выборка.Дни;
          ДанныеПоВидуВремениНаДату.Часов = Выборка.Время / 60 / 60;
          ДанныеПоВидуВремениНаДату.ВЦеломЗаПериод = Ложь;
            
          ДанныеПоВидуВремениНаДату = ТаблицаДанныхОВремени.Добавить();
          ДанныеПоВидуВремениНаДату.Дата = Выборка.Дата;
          ДанныеПоВидуВремениНаДату.Сотрудник = Выборка.Сотрудник;
          ДанныеПоВидуВремениНаДату.ВидВремени = ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.Явка");
          ДанныеПоВидуВремениНаДату.Дней = Выборка.Дни;
          ДанныеПоВидуВремениНаДату.Часов = Выборка.Часы;
          ДанныеПоВидуВремениНаДату.ВЦеломЗаПериод = Ложь;          
      КонецЦикла;
        
      УчетРабочегоВремени.ЗарегистрироватьДанныеТабеля(Движения, ТаблицаДанныхОВремени);   
        
 КонецПроцедуры


 5. Создаем РН Бонусы, остатки, изм Сотрудник, ресурс Количество.

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

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


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

Добавлено (12.10.2014, 23:04)
---------------------------------------------
7. Создаем документ: СписаниеБонусов. Будет минусовать РН Бонусы и писать в РН ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников показатель - НатуральныйДоход
 форма:
 
 

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

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

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


 модуль:

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

Добавлено (12.10.2014, 23:04)
---------------------------------------------
очтет:
 

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

 СГРУППИРОВАТЬ ПО
     НачисленияДанныеГрафика.ПериодДействия,
     НачисленияДанныеГрафика.Сотрудник

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

 ////////////////////////////////////////////////////////////////////////////////
 ВЫБРАТЬ
     ВТНачисления.ПериодДействия,
     ВТНачисления.Сотрудник,
     ВТНачисления.ОтработаноЧасов,
     ВТНачисления.НачисленоПоОкладу,
     ВТНачисления.СредняяОценкаКлиентов,
     ВТНачисления.НачисленоПремии,
     ВТНачисления.ДлительностьЗвонков,
     ЕСТЬNULL(БонусыОстаткиИОбороты.КоличествоПриход, 0) КАК НачисленоБонусов,
     ЕСТЬNULL(БонусыОстаткиИОбороты.КоличествоНачальныйОстаток, 0) КАК ОстатокБонусовНаНачалоПериода,
     ЕСТЬNULL(БонусыОстаткиИОбороты.КоличествоРасход, 0) КАК ПотраченоБонусов,
     ВТНачисления.СуммаНатуральногоДохода,
     ЕСТЬNULL(БонусыОстаткиИОбороты.КоличествоКонечныйОстаток, 0) КАК ОстатокБонусовНаКонецПериода
 ИЗ
     ВТНачисления КАК ВТНачисления
         ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Бонусы.ОстаткиИОбороты(
                 &НачалоПериода,
                 &КонецПериода,
                 Месяц,
                 ,
                 Сотрудник В
                     (ВЫБРАТЬ
                         ВТНачисления.Сотрудник
                     ИЗ
                         ВТНачисления КАК ВТНачисления)) КАК БонусыОстаткиИОбороты
         ПО ВТНачисления.ПериодДействия = БонусыОстаткиИОбороты.Период
             И ВТНачисления.Сотрудник = БонусыОстаткиИОбороты.Сотрудник
« Последнее редактирование: Октябрь 12, 2014, 11:01:43 pm от Дмитрий »

W1zZzarD

  • Новичок
  • *
  • Сообщений: 0
  • ФИО: Илья
ЗУП 3.0 Специалист Билет 6
« Ответ #1 : Октябрь 28, 2014, 04:32:13 pm »
Документ НачислениеБонусов в процедуре заполнения не совсем понятно откуда возьмутся данные по ВидРасчетаЗвонки, какой документ сделал начисления по этому виду начислений.


demos

  • Новичок
  • *
  • Сообщений: 4
  • ФИО: demos
ЗУП 3.0 Специалист Билет 6
« Ответ #2 : Октябрь 29, 2014, 07:39:09 am »
данные берутся из НачисленияДанныеГрафика по начислению ВидРасчетаЗвонки за прошлый месяц.
 
Цитата
Создать документ «Начисление бонусов»,  который будет вводиться ежемесячно посленачисления зарплаты за месяц.
1. звоним
 2. начисляем зарплату
 3. высчитываем бонусы
 4. тратим бонусы
 5. начисляем зарплату и оплачиваем услуги за бонусы

Gurin

  • Новичок
  • *
  • Сообщений: 1
  • ФИО: Гурин Максим
Re: ЗУП 3.0 Специалист Билет 6
« Ответ #3 : Ноябрь 10, 2014, 02:04:28 pm »
Подскажите пожалуйста как Вы настраивали отчет чтобы в шапке не указывался Месяц?

demos

  • Новичок
  • *
  • Сообщений: 4
  • ФИО: demos
Re: ЗУП 3.0 Специалист Билет 6
« Ответ #4 : Ноябрь 10, 2014, 08:24:57 pm »
1. правой кнопкой на группировке Сотрудник - "Установить Имя", называем например zzzz
2. переходим на вкладку макеты, Создать макет заголовка группировки, имя группировки zzzz
3. копируем шапку отчета из ворда и вставляем в макет
4. задаем область шапки.

Tex

  • Пользователь
  • **
  • Сообщений: 11
  • ФИО: Андрей
Re: ЗУП 3.0 Специалист Билет 6
« Ответ #5 : Февраль 12, 2015, 08:49:59 am »
Непонятно зачем тут создавать новый вид времени и замещать часы Явки на него??
Тут просто при бале выше 4 писать надбавку в плановые начисления и показатель в разовые показатели штатной процедурой. 

paxanb

  • Пользователь
  • **
  • Сообщений: 26
Re: ЗУП 3.0 Специалист Билет 6
« Ответ #6 : Апрель 05, 2016, 07:53:09 am »
Непонятно зачем тут создавать новый вид времени и замещать часы Явки на него??

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

И вообще, в каждом билете свои фишки и способы решения. Решение топорно и в лоб не всегда является наиболее верным.
« Последнее редактирование: Апрель 05, 2016, 08:06:25 am от paxanb »

mkanaev

  • Пользователь
  • **
  • Сообщений: 27
  • ФИО: Канаев Михаил Сергеевич
Re: ЗУП 3.0 Специалист Билет 6
« Ответ #7 : Апрель 05, 2016, 08:59:23 am »
paxanb, полностью согласен, с учетом того что среднюю оценку все равно придется брать из своего регистра и не одно начисление не зависит от отработанного времени по звонкам...

mkanaev

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

   Начисления(а так же оклад) вывел в константы для получения в отчете. Показатели    вывел в константы для получения в документах.

2. Создал регистр сведений "ПроцентПремииЗаЗвонки". Измерение "От", Ресурс "Значение". Для хранения процентов премий от средней оценки за месяц.

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

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

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

Среднюю оценку в документе и в отчете определяю по след. принципу: Сумма оценок/КоличествоЗаписей.

В форме документа разработал процедуру загрузки данных из файла txt, загрузка происходит согласно заданной в тех. задании структуре.

5. Разработал регистр накопления "ОстаткиБонусов", для хранения заработанных бонусов по сотруднику. Измерения: "Сотрудник", Ресурс: "Сумма".

6. Разработал документ "Начисление бонусов". Структура:
   Табличная часть "Данные":
      - Сотрудник
      - ОтработаноЧасов
      - ДлительностьОтработаныхЗвонков
      - НачисленоБонусов
      

На форме документа разработал процедуру заполнения документа. Процедура анализирует отработанное время сотрудников из регистра расчета "Начисления" временной таблицы "ДанныеГрафика", по начислению оклад. Длительность звонков берется из регистра сведений "ДанныеОЗвонках". Значения сравниваются, если длительность звонков >= 60 % от отработанного времени то запись попадает в табличную часть "Данные".

Документ формирует движения в регистр накопления "ОстаткиБонусов", с видом движения "Приход".

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

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

8. Разработал отчет "МотивацияОператоров".
Отчет собирает данные из виртуальной таблицы "ДанныеГрафика" регистра расчета "Начисления", регистра сведений "ДанныеОЗвонках" и регистра накопления
"ОстаткиБонусов". Применять механизм представлений в данной задачи негде.

9. Ввел данные по 2-м сотрудникам за 3 месяца.

Код:

Модуль формы документа "ДанныеОЗвонках"
&НаКлиенте
Процедура Загрузить(Команда)

ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтаФорма);

ОткрытьФорму("Документ.ДанныеОЗвонках.Форма.ФормаВыбораФайла",, ЭтаФорма,, ВариантОткрытияОкна.ОтдельноеОкно,, ОписаниеОповещения);

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

&НаКлиенте
Процедура ПослеВыбораФайла(АдресФайла, ДопПараметр) Экспорт

Если АдресФайла = Неопределено Тогда

Возврат;

КонецЕсли;

Попытка
ЧтениеТекста = Новый ЧтениеТекста(АдресФайла);
ТекстФайла = ЧтениеТекста.Прочитать();
Исключение
ПоказатьПредупреждение(, "Не удалось открыть файл");
Возврат;
КонецПопытки;

МассивДанных = СтруктурироватьФайл(ТекстФайла);

ТекстОшибки = "";

МассивДанных = ОпределитьДанныеНаСервере(МассивДанных, ТекстОшибки);

Если Не ПустаяСтрока(ТекстОшибки) Тогда

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

КонецЕсли;

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

Для Каждого ЭлементМассива Из МассивДанных Цикл

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

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

Функция ОпределитьДанныеНаСервере(МассивДанных, ТекстОшибки)

МассивВозврат = Новый Массив;

МассивСотрудников = Новый Массив;

Для Каждого ЭлементМассива Из МассивДанных Цикл

МассивСотрудников.Добавить(ЭлементМассива.Сотрудник);

КонецЦикла;

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

Для Каждого ЭлементМассива Из МассивДанных Цикл

НачалоПериода = Неопределено;
КонецПериода  = Неопределено;
Сотрудник     = Неопределено;
Оценка   = Неопределено;

ПоискСотрудника = ТаблицаСотрудников.Найти(ЭлементМассива.Сотрудник, "Код");
Если ПоискСотрудника = Неопределено Тогда
ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", "
|") + "Не найден сотрудник с кодом: " + ЭлементМассива.Сотрудник;
Продолжить;
Иначе
Сотрудник = ПоискСотрудника.Сотрудник;
КонецЕсли;

Попытка
День    = Число(Лев(ЭлементМассива.НачалоПериода, 2));
Месяц   = Число(Прав(Лев(ЭлементМассива.НачалоПериода, 5), 2));
Год     = Число(Прав(Лев(ЭлементМассива.НачалоПериода, 10), 4));
Час     = Число(Прав(Лев(ЭлементМассива.НачалоПериода, 13), 2));
Минута  = Число(Прав(Лев(ЭлементМассива.НачалоПериода, 16), 2));
НачалоПериода = Дата(Год, Месяц, День, Час, Минута, 0);
Исключение
ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", "
|") + "Не удалось определить дату: " + ЭлементМассива.НачалоПериода;
Продолжить;
КонецПопытки;

Попытка
День    = Число(Лев(ЭлементМассива.КонецПериода, 2));
Месяц   = Число(Прав(Лев(ЭлементМассива.КонецПериода, 5), 2));
Год     = Число(Прав(Лев(ЭлементМассива.КонецПериода, 10), 4));
Час     = Число(Прав(Лев(ЭлементМассива.КонецПериода, 13), 2));
Минута  = Число(Прав(Лев(ЭлементМассива.КонецПериода, 16), 2));
КонецПериода = Дата(Год, Месяц, День, Час, Минута, 0);
Исключение
ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", "
|") + "Не удалось определить дату: " + ЭлементМассива.КонецПериода;
Продолжить;
КонецПопытки;

Попытка
Оценка = Число(ЭлементМассива.Оценка);
Если Оценка > 5 Или Оценка < 0 Тогда
ВызватьИсключение "";
КонецЕсли;
Исключение
ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", "
|") + "Не удалось определить оценку: " + ЭлементМассива.Оценка;
Продолжить;
КонецПопытки;

МассивВозврат.Добавить(Новый Структура("Сотрудник, НачалоПериода, КонецПериода, Оценка", Сотрудник, НачалоПериода, КонецПериода, Оценка));

КонецЦикла;

Возврат МассивВозврат;

КонецФункции

&НаКлиенте
Функция СтруктурироватьФайл(ТекстФайла)

МассивВозврат = Новый Массив;

Для ИИ = 1 По СтрЧислоСтрок(ТекстФайла) Цикл

СтрокаФайла = СтрПолучитьСтроку(ТекстФайла, ИИ);
Если СокрЛП(СтрокаФайла) = "" Тогда
Продолжить;
КонецЕсли;

НачалоПериода = "";
КонецПериода  = "";
Сотрудник     = "";
Оценка   = "";

Разделитель = СтрНайти(СтрокаФайла, ";");
Если Разделитель > 0 Тогда
НачалоПериода = СокрЛП(Лев(СтрокаФайла, Разделитель - 1));
СтрокаФайла = Прав(СтрокаФайла, СтрДлина(СтрокаФайла) - Разделитель);
Иначе
НачалоПериода = СокрЛП(СтрокаФайла);
МассивВозврат.Добавить(Новый Структура("НачалоПериода, КонецПериода, Сотрудник, Оценка", НачалоПериода, КонецПериода, Сотрудник, Оценка));
Продолжить;
КонецЕсли;

Разделитель = СтрНайти(СтрокаФайла, ";");
Если Разделитель > 0 Тогда
КонецПериода = СокрЛП(Лев(СтрокаФайла, Разделитель - 1));
СтрокаФайла = Прав(СтрокаФайла, СтрДлина(СтрокаФайла) - Разделитель);
Иначе
КонецПериода = СокрЛП(СтрокаФайла);
МассивВозврат.Добавить(Новый Структура("НачалоПериода, КонецПериода, Сотрудник, Оценка", НачалоПериода, КонецПериода, Сотрудник, Оценка));
Продолжить;
КонецЕсли;

Разделитель = СтрНайти(СтрокаФайла, ";");
Если Разделитель > 0 Тогда
Сотрудник = СокрЛП(Лев(СтрокаФайла, Разделитель - 1));
СтрокаФайла = Прав(СтрокаФайла, СтрДлина(СтрокаФайла) - Разделитель);
Иначе
Сотрудник = СокрЛП(СтрокаФайла);
МассивВозврат.Добавить(Новый Структура("НачалоПериода, КонецПериода, Сотрудник, Оценка", НачалоПериода, КонецПериода, Сотрудник, Оценка));
Продолжить;
КонецЕсли; 

Оценка = СокрЛП(СтрокаФайла);

МассивВозврат.Добавить(Новый Структура("НачалоПериода, КонецПериода, Сотрудник, Оценка", НачалоПериода, КонецПериода, Сотрудник, Оценка));

КонецЦикла;

Возврат МассивВозврат;

КонецФункции
« Последнее редактирование: Апрель 05, 2016, 09:29:32 am от mkanaev »

mkanaev

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

Процедура ОбработкаПроведения(Отказ, Режим)

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

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

КонецЕсли;

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

ВыборкаСотрудник = Результат[1].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ВыборкаПроверка  = Результат[2].Выбрать();

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

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

КонецЦикла;

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

Возврат;

КонецЕсли;

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

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

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

КонецЕсли;

Выборка = ВыборкаСотрудник.Выбрать();

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

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

КонецЦикла;

КонецЦикла;

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

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

Модуль формы "Начисление бонусов":

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

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

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

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Дата));
Запрос.УстановитьПараметр("КонецПериода",  КонецМесяца(Дата));
Запрос.УстановитьПараметр("Оклад", Константы.Начисление_Оклад.Получить());
Запрос.Текст = "ВЫБРАТЬ
               | ВЗ.Сотрудник,
               | СУММА(ВЗ.ОтработаноЧасов) КАК ОтработаноЧасов,
               | СУММА(ВЗ.ДлительностьОтработаныхЗвонков) КАК ДлительностьОтработаныхЗвонков
               |ПОМЕСТИТЬ Данные
               |ИЗ
               | (ВЫБРАТЬ
               | НачисленияДанныеГрафика.Сотрудник КАК Сотрудник,
               | НачисленияДанныеГрафика.ДополнительноеЗначениеФактическийПериодДействия КАК ОтработаноЧасов,
               | 0 КАК ДлительностьОтработаныхЗвонков
               | ИЗ
               | РегистрРасчета.Начисления.ДанныеГрафика(ВидРасчета = &Оклад) КАК НачисленияДанныеГрафика
               | ГДЕ
               | НачисленияДанныеГрафика.ПериодДействияНачало МЕЖДУ &НачалоПериода И &КонецПериода
               | И НачисленияДанныеГрафика.Активность
               | И НЕ НачисленияДанныеГрафика.Сторно
               |
               | ОБЪЕДИНИТЬ ВСЕ
               |
               | ВЫБРАТЬ
               | ДанныеОЗвонках.Сотрудник,
               | 0,
               | ВЫРАЗИТЬ(ДанныеОЗвонках.Минут / 60 КАК ЧИСЛО(10, 2))
               | ИЗ
               | РегистрСведений.ДанныеОЗвонках КАК ДанныеОЗвонках
               | ГДЕ
               | ДанныеОЗвонках.НачалоПериода МЕЖДУ &НачалоПериода И &КонецПериода) КАК ВЗ
               |
               |СГРУППИРОВАТЬ ПО
               | ВЗ.Сотрудник
               |
               |ИМЕЮЩИЕ
               | СУММА(ВЗ.ОтработаноЧасов) > 0 И
               | СУММА(ВЗ.ДлительностьОтработаныхЗвонков) > 0
               |;
               |
               |////////////////////////////////////////////////////////////////////////////////
               |ВЫБРАТЬ
               | Данные.Сотрудник,
               | Данные.ОтработаноЧасов,
               | Данные.ДлительностьОтработаныхЗвонков КАК ДлительностьОтработаныхЗвонков,
               | Данные.ДлительностьОтработаныхЗвонков * 100 КАК НачисленоБонусов
               |ИЗ
               | Данные КАК Данные
               |ГДЕ
               | Данные.ДлительностьОтработаныхЗвонков * 100 / Данные.ОтработаноЧасов >= 60";
   
Выборка = Запрос.Выполнить().Выбрать();

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

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

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

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

Модуль объекта "НачислениеБонусов":

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

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

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


Модуль объекта "СписаниеБонусов":

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

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

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

КонецЕсли;           

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

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

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

КонецЦикла;

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

Отчет скд:

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

ОБЪЕДИНИТЬ

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

ОБЪЕДИНИТЬ

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

СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(ДанныеОЗвонках.НачалоПериода, МЕСЯЦ),
ДанныеОЗвонках.Сотрудник) КАК ВЗ) КАК ВЗ

СГРУППИРОВАТЬ ПО
ВЗ.Месяц,
ВЗ.Сотрудник
« Последнее редактирование: Май 25, 2016, 08:01:07 am от mkanaev »

mkanaev

  • Пользователь
  • **
  • Сообщений: 27
  • ФИО: Канаев Михаил Сергеевич
Re: ЗУП 3.0 Специалист Билет 6
« Ответ #10 : Апрель 20, 2016, 01:08:36 pm »
Возник вопрос, нужно ли в данной задачи проверять работает ли сотрудник в день совершения звонка?

zikonza

  • Новичок
  • *
  • Сообщений: 9
  • Krol ЕСЛИ ВЫ ПОДЕЛИЛИСЬ СВОЕЙ ПОЧТОЙ, УДАЛИТЕ СООБЩЕНИЕ НЕМЕДЛЕННО ИЛИ БУДЕТЕ ЗАБАНЕНЫ. ЧИТАЙТЕ ПРАВИЛА!!! KoDER
  • ФИО: Макаревич Дмитрий Игоревич
Re: ЗУП 3.0 Специалист Билет 6
« Ответ #11 : Апрель 22, 2016, 04:19:55 pm »
Думаю нет, если он не работал  - значит не отвечал на звонки, значит не проставляли средний бал.

r32

  • Новичок
  • *
  • Сообщений: 5
Re: ЗУП 3.0 Специалист Билет 6
« Ответ #12 : Октябрь 06, 2016, 07:48:59 am »
Доброго дня товарищи! Возник вопрос. Правильно ли хранить среднюю оценку в регистре сведений "ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников" а продолжительность звонков опероторов и суммы полученных работниками натуральных доходов в регистре накопления "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников", заведя для этого соответствующие показатели?

Уфимцева

  • Новичок
  • *
  • Сообщений: 6
  • ФИО: Уфимцева Е.М.
Re: ЗУП 3.0 Специалист Билет 6
« Ответ #13 : Октябрь 07, 2016, 08:01:18 am »
Доброго дня товарищи! Возник вопрос. Правильно ли хранить среднюю оценку в регистре сведений "ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников" а продолжительность звонков опероторов и суммы полученных работниками натуральных доходов в регистре накопления "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников", заведя для этого соответствующие показатели?

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

r32

  • Новичок
  • *
  • Сообщений: 5
Re: ЗУП 3.0 Специалист Билет 6
« Ответ #14 : Октябрь 07, 2016, 08:40:04 am »
Перечитал задание внимательно
Цитировать
.). В конце месяца в бухгалтерию поступает ежемесячный отчет о полученных каждым оператором услугах за счет бонусов, счет за услуги оплачивает организация, для работника данные суммы признаются доходом в натуральной форме, с которых следует удержать НДФЛ и начислить страховые взносы
. Так что вы правы. Я же исходил из того что услуги приходить в течении месяца и получал остатки по регистру накопления.