Добавлено (12.10.2014, 23:04)
---------------------------------------------
7. Создаем документ: СписаниеБонусов. Будет минусовать РН Бонусы и писать в РН ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников показатель - НатуральныйДоход
форма:
Добавлено (12.10.2014, 23:04)
---------------------------------------------
очтет:
Непонятно зачем тут создавать новый вид времени и замещать часы Явки на него??
&НаКлиенте
Процедура Загрузить(Команда)
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтаФорма);
ОткрытьФорму("Документ.ДанныеОЗвонках.Форма.ФормаВыбораФайла",, ЭтаФорма,, ВариантОткрытияОкна.ОтдельноеОкно,, ОписаниеОповещения);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораФайла(АдресФайла, ДопПараметр) Экспорт
Если АдресФайла = Неопределено Тогда
Возврат;
КонецЕсли;
Попытка
ЧтениеТекста = Новый ЧтениеТекста(АдресФайла);
ТекстФайла = ЧтениеТекста.Прочитать();
Исключение
ПоказатьПредупреждение(, "Не удалось открыть файл");
Возврат;
КонецПопытки;
МассивДанных = СтруктурироватьФайл(ТекстФайла);
ТекстОшибки = "";
МассивДанных = ОпределитьДанныеНаСервере(МассивДанных, ТекстОшибки);
Если Не ПустаяСтрока(ТекстОшибки) Тогда
СообщениеПользвателю = Новый СообщениеПользователю;
СообщениеПользвателю.Текст = ТекстОшибки;
СообщениеПользвателю.Сообщить();
Возврат;
КонецЕсли;
Объект.Данные.Очистить();
Для Каждого ЭлементМассива Из МассивДанных Цикл
СтрокаТаблицыДанные = Объект.Данные.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТаблицыДанные, ЭлементМассива);
КонецЦикла;
КонецПроцедуры
Функция ОпределитьДанныеНаСервере(МассивДанных, ТекстОшибки)
МассивВозврат = Новый Массив;
МассивСотрудников = Новый Массив;
Для Каждого ЭлементМассива Из МассивДанных Цикл
МассивСотрудников.Добавить(ЭлементМассива.Сотрудник);
КонецЦикла;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Коды", МассивСотрудников);
Запрос.Текст = "ВЫБРАТЬ
| Спр.Ссылка КАК Сотрудник,
| Спр.Код
|ИЗ
| Справочник.Сотрудники КАК Спр
|ГДЕ
| НЕ Спр.ПометкаУдаления
| И Спр.Код В(&Коды)";
ТаблицаСотрудников = Запрос.Выполнить().Выгрузить();
Для Каждого ЭлементМассива Из МассивДанных Цикл
НачалоПериода = Неопределено;
КонецПериода = Неопределено;
Сотрудник = Неопределено;
Оценка = Неопределено;
ПоискСотрудника = ТаблицаСотрудников.Найти(ЭлементМассива.Сотрудник, "Код");
Если ПоискСотрудника = Неопределено Тогда
ТекстОшибки = ТекстОшибки + ?(ТекстОшибки = "", "", "
|") + "Не найден сотрудник с кодом: " + ЭлементМассива.Сотрудник;
Продолжить;
Иначе
Сотрудник = ПоискСотрудника.Сотрудник;
КонецЕсли;
Попытка
День = Число(Лев(ЭлементМассива.НачалоПериода, 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));
СтрокаФайла = Прав(СтрокаФайла, СтрДлина(СтрокаФайла) - Разделитель);
Иначе
Сотрудник = СокрЛП(СтрокаФайла);
МассивВозврат.Добавить(Новый Структура("НачалоПериода, КонецПериода, Сотрудник, Оценка", НачалоПериода, КонецПериода, Сотрудник, Оценка));
Продолжить;
КонецЕсли;
Оценка = СокрЛП(СтрокаФайла);
МассивВозврат.Добавить(Новый Структура("НачалоПериода, КонецПериода, Сотрудник, Оценка", НачалоПериода, КонецПериода, Сотрудник, Оценка));
КонецЦикла;
Возврат МассивВозврат;
КонецФункции
Процедура ОбработкаПроведения(Отказ, Режим)
Если Константы.Показатель_ПремияЗаЗвонки.Получить().Пустая() Тогда
СообщениеПользвателю = Новый СообщениеПользователю;
СообщениеПользвателю.Текст = "Не установлена константа ""Показатель_ПремияЗаЗвонки""";
СообщениеПользвателю.Сообщить();
Отказ = Истина;
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Дата", Дата);
Запрос.Текст = "ВЫБРАТЬ
| док.НомерСтроки,
| док.Сотрудник,
| док.НачалоПериода,
| док.КонецПериода,
| док.Оценка
|ПОМЕСТИТЬ ДанныеДокумента
|ИЗ
| Документ.ДанныеОЗвонках.Данные КАК док
|ГДЕ
| док.Ссылка = &Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВЗ.Сотрудник КАК Сотрудник,
| ВЗ.НачалоПериода КАК НачалоПериода,
| ВЗ.КонецПериода,
| ВЗ.Оценка,
| ВЗ.Минут,
| ЕСТЬ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))
ИЗ
(ВЫБРАТЬ
НАЧАЛОПЕРИОДА(ДанныеОЗвонках.НачалоПериода, МЕСЯЦ) КАК Месяц,
ДанныеОЗвонках.Сотрудник КАК Сотрудник,
СУММА(ДанныеОЗвонках.Оценка) КАК Оценка,
СУММА(ДанныеОЗвонках.Минут) КАК Минут,
КОЛИЧЕСТВО(ДанныеОЗвонках.Оценка) КАК КоличествоЗаписей
ИЗ
РегистрСведений.ДанныеОЗвонках КАК ДанныеОЗвонках
ГДЕ
ДанныеОЗвонках.НачалоПериода МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
НАЧАЛОПЕРИОДА(ДанныеОЗвонках.НачалоПериода, МЕСЯЦ),
ДанныеОЗвонках.Сотрудник) КАК ВЗ) КАК ВЗ
СГРУППИРОВАТЬ ПО
ВЗ.Месяц,
ВЗ.Сотрудник
Доброго дня товарищи! Возник вопрос. Правильно ли хранить среднюю оценку в регистре сведений "ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников" а продолжительность звонков опероторов и суммы полученных работниками натуральных доходов в регистре накопления "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников", заведя для этого соответствующие показатели?
.). В конце месяца в бухгалтерию поступает ежемесячный отчет о полученных каждым оператором услугах за счет бонусов, счет за услуги оплачивает организация, для работника данные суммы признаются доходом в натуральной форме, с которых следует удержать НДФЛ и начислить страховые взносы. Так что вы правы. Я же исходил из того что услуги приходить в течении месяца и получал остатки по регистру накопления.
Документ формирует движения в регистры накопления:В условии задачи ясно сказано, что "В конце месяца в бухгалтерию поступает ежемесячный отчет о полученных каждым оператором услугах за счет бонусов, счет за услуги оплачивает организация". Пишем в регистр плановых начислений итоговую сумму, вид начисления Натуральный доход.
- "ОстаткиБонусов", с видом движения "Расход".
- " ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников". Регистр выбран в связи с тем что сотруднику могут компенсировать оплату за счет бонусов не один раз в течении месяца.
2. Создаем начисление "Премия за звонки", формула: "Оклад * ПроцентПремииЗаЗвонки / 100", учет времени: "Звонки", Только если введено значение показателя: СредняяОценкаЗаЗвонки. Причем показатель ПроцентПремииЗаЗвонки зависит от показателя СредняяОценкаЗаЗвонки по шкале:редакция 3.1 поддерживает
400-450: 10;
450-475: 25;
475-500: 40;
так как конфигурация не поддерживает дробные шкалы.
Прикладываю свое переработанное решение на основе решения пользователя mkanaev. И прикладываю описание решения(пользователь mkanaev). Пришлось в конце обрезать картинки, так как файл слишком большой и не отправляется здесь. Но думаю разобраться можно.Основной минус этого решения, что тут нет как такового натурального дохода. Как вариант можно создать просто документ натурального дохода на сумму после списания бонусов. В таком случае корректно лягут все удержания по налогам. Я именно так и сделал. И в отчет я сумму натурального дохода вытаскиваю из Начислений с ВидомРасчета НатуральныйДоход. Далее слишком сложный код при загрузке файла. Можно сделать гораздо проще. Просто построчно читаем файл и добавляем строки в табличную часть циклом. Меньше писанины больше времени для всяких нюансов. Расчет бонусов тоже можно сделать прямо в документе Начисления бонусов буквально одним запросом. Ну и форма отчета не соотвествует задаче.