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));
СтрокаФайла = Прав(СтрокаФайла, СтрДлина(СтрокаФайла) - Разделитель);
Иначе
Сотрудник = СокрЛП(СтрокаФайла);
МассивВозврат.Добавить(Новый Структура("НачалоПериода, КонецПериода, Сотрудник, Оценка", НачалоПериода, КонецПериода, Сотрудник, Оценка));
Продолжить;
КонецЕсли;
Оценка = СокрЛП(СтрокаФайла);
МассивВозврат.Добавить(Новый Структура("НачалоПериода, КонецПериода, Сотрудник, Оценка", НачалоПериода, КонецПериода, Сотрудник, Оценка));
КонецЦикла;
Возврат МассивВозврат;
КонецФункции