Экзаменационные билеты можно скачать здесь. Задачника для этого экзамена пока нет. Публикацию "Пример решения задач Специалист ЗУП 3.0" не смотрел, так как её обнаружил после сдачи экзамена и своей публикации.
На основе материалов (более 90% ник demos) форума Аттестация "1С:Специалист" ЗУП, "Конфигурирование подсистем расчета зарплаты и управления персоналом в прикладных решениях "1С:Предприятия 8" (редакция 3.0) и для консультантов 1С:Специалист-консультант Зарплата и управление персоналом 8 ред.3.0 собрал материалы:
- Выгрузки ИБ 6 билетов. Сделано на демо релиза 3.0.23.143, но на экзамене надо делать на пустой.
- Методики графически - см. картинки к публикации по билетам: Доплаты за время работы, Премии по проектам, Компенсации квартплаты, Графики работ, Натуральный доход работников.
- Ключевые алгоритмы, где применил типовой механизм "подмены" текстов запросов, общий модуль для расчета показателей, для отчетов таблицу "ДанныеГрафика" и регистр "ГрафикиРаботыПоВидамВремен", метод "ВыполнитьПакет()" при отладке и выполнении сложных запросов.
Ключевые алгоритмы:
- Решать всё с произвольными показателями - меньше работаем с конфигуратором в отличие от ЗУП 2.5. Подробное описание: www.zup1c.ru . В некоторых билетах показатель достаточно выбрать предопределенный и свои не создавать.
- В отчетах использовать "Представления_" - механизм "подмены" текстов запросов.
- Коды алгоритмов: Билет 1, Билет 2, Билет 3, Билет 4, Билет 5, Билет 6.
БИЛЕТ 1
1. Конфигуратор:
- Подсистема - РС.ПлановыеНачисления, РС.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников, 2 документа, отчет.
- Док.ГрафикРаботыВОсобыхУсловиях движения РС.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников, МО:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Процедура ОбработкаПроведения(Отказ, Режим)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ГрафикРаботыВОсобыхУсловияхТаблицаПериодов.ДатаНачала КАК Период,
| ГрафикРаботыВОсобыхУсловияхТаблицаПериодов.ДатаОкончания КАК ДействуетДо,
| ГрафикРаботыВОсобыхУсловияхТаблицаПериодов.Ссылка.Организация,
| ГрафикРаботыВОсобыхУсловияхТаблицаПериодов.Сотрудник.ФизическоеЛицо КАК ФизическоеЛицо,
| ГрафикРаботыВОсобыхУсловияхТаблицаПериодов.Сотрудник,
| ГрафикРаботыВОсобыхУсловияхТаблицаПериодов.Ссылка.Показатель,
| РАЗНОСТЬДАТ(ГрафикРаботыВОсобыхУсловияхТаблицаПериодов.ДатаНачала, ГрафикРаботыВОсобыхУсловияхТаблицаПериодов.ДатаОкончания, ДЕНЬ) + 1 КАК Значение
|ИЗ
| Документ.ГрафикРаботыВОсобыхУсловиях_1.ТаблицаПериодов КАК ГрафикРаботыВОсобыхУсловияхТаблицаПериодов
|ГДЕ
| ГрафикРаботыВОсобыхУсловияхТаблицаПериодов.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Движения.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Записывать = Истина;
Пока Выборка.Следующий() Цикл
Движение = Движения.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Добавить();
ЗаполнитьЗначенияСвойств(Движение, Выборка);
КонецЦикла;
КонецПроцедуры
#КонецЕсли
- Док.ВводПоказанийУсловийСреды движения РС.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудникови РС.ПлановыеНачисления, МФ:
&НаКлиенте
Процедура Заполнить(Команда)
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
Если ДиалогОткрытияФайла.Выбрать() Тогда
Объект.ТаблицаУсловий.Очистить();
ТекстФайла = Новый ТекстовыйДокумент;
ТекстФайла.Прочитать( ДиалогОткрытияФайла.ВыбранныеФайлы[0] );
ТекстФайла = ТекстФайла.ПолучитьТекст();
Для Счетчик = 1 По СтрЧислоСтрок( ТекстФайла ) Цикл
ТекСтрока = СтрПолучитьСтроку( ТекстФайла, Счетчик );
МассивСтроки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ТекСтрока,";");
Строка = Объект.ТаблицаУсловий.Добавить();
Строка.Дата = Дата(МассивСтроки[0]+" 00:00:00");
Строка.Условие = МассивСтроки[1];
КонецЦикла;
КонецЕсли;
КонецПроцедуры
МО
#Если Не ТолстыйКлиентУправляемоеПриложение Или Сервер Тогда
Процедура ОбработкаПроведения(Отказ, Режим)
ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект);
ДаннныеДляПроведения = получитьДанныеДляПроведения();
РасчетЗарплаты.СформироватьДвиженияПлановыхНачислений(ЭтотОбъект, Движения, ДаннныеДляПроведения);
КонецПроцедуры
Функция получитьДанныеДляПроведения()
Если ТаблицаУсловий.Количество()>0 Тогда
Дата1 = НачалоМесяца(ТаблицаУсловий[0].Дата);
Дата2 = КонецМесяца(ТаблицаУсловий[0].Дата);
иначе
Отказ = Истина;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МИНИМУМ(ВводПоказанийУсловийСредыТаблицаУсловий.Дата) КАК ДатаСобытия,
| МАКСИМУМ(ВводПоказанийУсловийСредыТаблицаУсловий.Дата) КАК ДействуетДо,
| РС.Регистратор.Организация КАК Организация,
| РС.Сотрудник,
| РС.ФизическоеЛицо,
| СРЕДНЕЕ(ВЫБОР
| КОГДА ВводПоказанийУсловийСредыТаблицаУсловий.Условие = 0
| ТОГДА 30
| ИНАЧЕ ВЫБОР
| КОГДА ВводПоказанийУсловийСредыТаблицаУсловий.Условие = 1
| ТОГДА 40
| ИНАЧЕ 50
| КОНЕЦ
| КОНЕЦ) КАК Значение,
| ВводПоказанийУсловийСредыТаблицаУсловий.Ссылка
|ПОМЕСТИТЬ ВТ
|ИЗ
| Документ.ВводПоказанийУсловийСреды_1.ТаблицаУсловий КАК ВводПоказанийУсловийСредыТаблицаУсловий
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников КАК РС
| ПО ВводПоказанийУсловийСредыТаблицаУсловий.Ссылка.Организация = РС.Регистратор.Организация
| И (ВводПоказанийУсловийСредыТаблицаУсловий.Дата МЕЖДУ РС.Период И РС.ДействуетДо)
|ГДЕ
| РС.Показатель = &ПоказательГрафика
| И РС.Период МЕЖДУ &Дата1 И &Дата2
|
|СГРУППИРОВАТЬ ПО
| РС.Сотрудник,
| РС.ФизическоеЛицо,
| РС.Регистратор.Организация
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ.ДатаСобытия,
| ДОБАВИТЬКДАТЕ(ВТ.ДействуетДо, ДЕНЬ, 1) КАК ДействуетДо,
| ВТ.Сотрудник,
| &Начисление КАК Начисление,
| ВТ.ФизическоеЛицо,
| ""1"" КАК Значение,
| ИСТИНА КАК Используется,
| ВТ.Сотрудник.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
| ВТ.Ссылка КАК ДокументОснование
|ИЗ
| ВТ КАК ВТ
|;
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ.ДатаСобытия,
| КОНЕЦПЕРИОДА(ВТ.ДействуетДо, МЕСЯЦ) КАК ДействуетДо,
| ВТ.Организация,
| ВТ.Сотрудник,
| ВТ.ФизическоеЛицо,
| &ПоказательПроцент КАК Показатель,
| ВТ.Значение
|ИЗ
| ВТ КАК ВТ";
Запрос.УстановитьПараметр("ПоказательГрафика", ПоказательГрафика);
Запрос.УстановитьПараметр("ПоказательПроцент", ПоказательПроцент);
Запрос.УстановитьПараметр("Начисление", Начисление);
Запрос.УстановитьПараметр("Дата1", Дата1);
Запрос.УстановитьПараметр("Дата2", Дата2);
РезультатЗапроса = Запрос.ВыполнитьПакет();
ДаннныеДляПроведения = Новый Структура;
// Набор данных для формирования плановых начислений
ПлановыеНачисления = РезультатЗапроса[1].Выгрузить();
ДаннныеДляПроведения.Вставить("ДанныеОПлановыхНачислениях", ПлановыеНачисления);
// Набор данных для формирования плановых начислений
ЗначенияПоказателей = РезультатЗапроса[2].Выгрузить();
ДаннныеДляПроведения.Вставить("ЗначенияПоказателей", ЗначенияПоказателей);
Возврат ДаннныеДляПроведения
КонецФункции
#КонецЕсли
- Отчет МО для "Представление_"
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ЭтотОбъект); КонецПроцедуры #КонецЕсли
СКД
ВЫБРАТЬ
НачисленияДанныеГрафика.ПериодДействияНачало,
НачисленияДанныеГрафика.ПериодРегистрации КАК Период,
НачисленияДанныеГрафика.ОсновноеЗначениеФактическийПериодДействия,
НачисленияДанныеГрафика.Сотрудник КАК Сотрудник,
НачисленияДанныеГрафика.Результат
ПОМЕСТИТЬ ВТНачисления
ИЗ
РегистрРасчета.Начисления.ДанныеГрафика(
ПериодРегистрации МЕЖДУ &НачалоПериода И &КонецПериода
И ВидРасчета = &ВидРасчета) КАК НачисленияДанныеГрафика
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК Организация,
ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) КАК Подразделение,
ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность
ПОМЕСТИТЬ Представления_СрезПоследних_КадроваяИсторияСотрудников
ИЗ
ВТНачисления КАК ВТНачисления
ГДЕ
"ТолькоРазрешенные" = ИСТИНА
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
Представления_СрезПоследних_КадроваяИсторияСотрудников.Должность КАК Должность,
ВТНачисления.Сотрудник КАК Сотрудник,
ВТНачисления.Период КАК Период,
ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Значение КАК ЗапланированоДнейРаботВОсобыхУсловиях,
ВТНачисления.ОсновноеЗначениеФактическийПериодДействия КАК ФактическиОтработаноДнейВОсобыхУсловиях,
ВТНачисления.Результат КАК НачисленоДоплаты,
НАЧАЛОПЕРИОДА(ВТНачисления.ПериодДействияНачало, МЕСЯЦ) КАК Месяц,
ВТНачисления.Результат / ВТНачисления.ОсновноеЗначениеФактическийПериодДействия КАК СреднийРазмерДоплатыЗаОдинДеньРаботы
ИЗ
ВТНачисления КАК ВТНачисления
ЛЕВОЕ СОЕДИНЕНИЕ Представления_СрезПоследних_КадроваяИсторияСотрудников КАК Представления_СрезПоследних_КадроваяИсторияСотрудников
ПО ВТНачисления.Сотрудник = Представления_СрезПоследних_КадроваяИсторияСотрудников.Сотрудник
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников КАК ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников
ПО ВТНачисления.Сотрудник = ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Сотрудник
И (ВТНачисления.Период = НАЧАЛОПЕРИОДА(ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Период, МЕСЯЦ))
ГДЕ
ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Показатель = &Показатель
2. Клиент:
- Откл "Штатное р.", вкл."Использовать тарифные группы", документа «Утверждение тарифной сетки», Принять на работу.
- Создать ВР копированием ВР "За наставничество". Формула "_СреднийПроцентНадбавкиЗаУсловия_1 / 100 * РасчетнаяБаза"
БИЛЕТ 2
1. Конфигуратор:
- Подсистема - РН.Отгулы, РН.ДанныеИндивидуальныхГрафиковСотрудников, РН.ДанныеТабельногоУчетаРабочегоВремениСотрудников, 2 документа, Отчет.
- !!Вариант решения второй(сложный), когда надо расчитывать свой показатель "_КоличествоЧасовВыполненияВредныхРабот_2". Если его заменить на типовой "ВремяВЧасах", то этот код не нужен!!! ОбщийМодуль.РасчетЗарплатыРасширенныйПереопределяемый проц. ЗаполнитьЗначенияДополнительныхПоказателей() расчет показателя при заполнении начислений.
//1. Вычисляемые показатели (что нужно заполнить значениями ИдентификаторНужногоПоказателя = "_КоличествоЧасовВыполненияВредныхРабот_2"; //2. Для получения данных запросом создаем таблицу значений с колонками явно заданного типа ИсходныеДанные = Новый ТаблицаЗначений; ИсходныеДанные.Колонки.Добавить("ДатаНачала", Новый ОписаниеТипов("Дата")); ИсходныеДанные.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники")); //3.Обработаем строки из ДополнительныеПоказатели Для каждого СтрокаПоказателей Из ДополнительныеПоказатели Цикл //4. Исключим заполненные значение показателей Если СтрокаПоказателей.ЗначениеОпределено Тогда Продолжить; КонецЕсли; Если ЗарплатаКадрыРасширенный.ИдентификаторПоказателя(СтрокаПоказателей.Показатель) <> ИдентификаторНужногоПоказателя Тогда Продолжить; КонецЕсли; НоваяСтрока = ИсходныеДанные.Добавить(); ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаПоказателей); КонецЦикла; Если ИсходныеДанные.Количество() = 0 Тогда Возврат; КонецЕсли; ТекстЗапроса = "ВЫБРАТЬ | ИсходныеДанные.Сотрудник, | ИсходныеДанные.ДатаНачала |ПОМЕСТИТЬ ВТИсходныеДанные |ИЗ | &ИсходныеДанные КАК ИсходныеДанные |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТИсходныеДанные.Сотрудник, | ВТИсходныеДанные.ДатаНачала, | СУММА(ЕСТЬNULL(РабочееВремяСотрудников.Часы, 0)) КАК СтажВредныхРабот |ИЗ | ВТИсходныеДанные КАК ВТИсходныеДанные | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДанныеИндивидуальныхГрафиковСотрудников КАК РабочееВремяСотрудников | ПО ВТИсходныеДанные.Сотрудник = РабочееВремяСотрудников.Сотрудник | И ВТИсходныеДанные.ДатаНачала = РабочееВремяСотрудников.ПериодРегистрации |ГДЕ | РабочееВремяСотрудников.ВидУчетаВремени = &ВидУчетаВремени | |СГРУППИРОВАТЬ ПО | ВТИсходныеДанные.Сотрудник, | ВТИсходныеДанные.ДатаНачала"; Запрос = Новый Запрос(ТекстЗапроса); Запрос.УстановитьПараметр("ИсходныеДанные",ИсходныеДанные); Запрос.УстановитьПараметр("ВидУчетаВремени",Справочники.ВидыИспользованияРабочегоВремени.НайтиПоНаименованию("Работа в кислотном цеху")); ТаблицаРезультат = Запрос.Выполнить().Выгрузить(); Для каждого СтрокаПоказателей Из ДополнительныеПоказатели Цикл Если ЗарплатаКадрыРасширенный.ИдентификаторПоказателя(СтрокаПоказателей.Показатель) <> ИдентификаторНужногоПоказателя Тогда Продолжить; КонецЕсли; СтрокаТаблицыРезультат = ТаблицаРезультат.Найти(СтрокаПоказателей.Сотрудник, "Сотрудник"); Если СтрокаТаблицыРезультат <> Неопределено Тогда Если СтрокаТаблицыРезультат.ДатаНачала = СтрокаПоказателей.ДатаНачала Тогда СтрокаПоказателей.Значение = СтрокаТаблицыРезультат.СтажВредныхРабот; СтрокаПоказателей.ЗначениеОпределено = Истина; КонецЕсли; КонецЕсли; КонецЦикла;
- Док.ДанныеПропускнойСистемы движения РН.Отгулы, РН.ДанныеИндивидуальныхГрафиковСотрудников двумя строками, МФ:
&НаКлиенте Процедура ЗагрузитьИзФайла() Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); Если ДиалогОткрытияФайла.Выбрать() Тогда Объект.ДанныеОВремени.Очистить(); ТекстФайла = Новый ТекстовыйДокумент; ТекстФайла.Прочитать( ДиалогОткрытияФайла.ВыбранныеФайлы[0] ); ТекстФайла = ТекстФайла.ПолучитьТекст(); Для Счетчик = 1 По СтрЧислоСтрок( ТекстФайла ) Цикл ТекСтрока = СтрПолучитьСтроку( ТекстФайла, Счетчик ); МассивСтроки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ТекСтрока,";"); Строка = Объект.ДанныеОВремени.Добавить(); Строка.Сотрудник = УзнатьСотрудника(МассивСтроки[0]); Строка.Дата = Дата(МассивСтроки[1]+":00"); Строка.ВремяВхода = Дата(МассивСтроки[1]+":00"); Строка.ВремяВыхода = Дата(МассивСтроки[2]+":00"); КонецЦикла; КонецЕсли; КонецПроцедуры &НаСервере Функция УзнатьСотрудника(Строка) Возврат Справочники.Сотрудники.НайтиПоКоду(Строка); КонецФункции
МО:
#Если Не ТолстыйКлиентУправляемоеПриложение Или Сервер Тогда
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект);
ДанныеДляПроведения = ТаблицаДанныхОВремени();
УчетРабочегоВремени.ЗарегистрироватьДанныеИндивидуальногоГрафика(Движения, ДанныеДляПроведения, НачалоМесяца(Месяц));
КонецПроцедуры
Функция ТаблицаДанныхОВремени()
ТаблицаДанныхОВремени = Новый ТаблицаЗначений;
ТаблицаДанныхОВремени.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
ТаблицаДанныхОВремени.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
ТаблицаДанныхОВремени.Колонки.Добавить("ВидВремени", Новый ОписаниеТипов("СправочникСсылка.ВидыИспользованияРабочегоВремени"));
ТаблицаДанныхОВремени.Колонки.Добавить("Дней", Новый ОписаниеТипов("Число"));
ТаблицаДанныхОВремени.Колонки.Добавить("Часов", Новый ОписаниеТипов("Число"));
ТаблицаДанныхОВремени.Колонки.Добавить("ВЦеломЗаПериод", Новый ОписаниеТипов("Булево"));
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокТЧ.Сотрудник,
| СУММА(РАЗНОСТЬДАТ(ДокТЧ.ВремяВхода, ДокТЧ.ВремяВыхода, МИНУТА) / 60) КАК Часов,
| ДокТЧ.Дата
|ИЗ
| Документ.ДанныеПропускнойСистемы_2.ДанныеОВремени КАК ДокТЧ
|ГДЕ
| ДокТЧ.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ДокТЧ.Сотрудник,
| ДокТЧ.Дата";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ДанныеПоВидуВремениНаДату = ТаблицаДанныхОВремени.Добавить();
ДанныеПоВидуВремениНаДату.Дата = ВыборкаДетальныеЗаписи.Дата;
ДанныеПоВидуВремениНаДату.Сотрудник = ВыборкаДетальныеЗаписи.Сотрудник;
ДанныеПоВидуВремениНаДату.ВидВремени = ВидВремени;
ДанныеПоВидуВремениНаДату.Дней = 1;
ДанныеПоВидуВремениНаДату.Часов = ВыборкаДетальныеЗаписи.Часов;
ДанныеПоВидуВремениНаДату.ВЦеломЗаПериод = Ложь;
ДанныеПоВидуВремениНаДату = ТаблицаДанныхОВремени.Добавить();
ДанныеПоВидуВремениНаДату.Дата = ВыборкаДетальныеЗаписи.Дата;
ДанныеПоВидуВремениНаДату.Сотрудник = ВыборкаДетальныеЗаписи.Сотрудник;
ДанныеПоВидуВремениНаДату.ВидВремени = Справочники.ВидыИспользованияРабочегоВремени.Явка;
ДанныеПоВидуВремениНаДату.Дней = 1;
ДанныеПоВидуВремениНаДату.Часов = 12;
ДанныеПоВидуВремениНаДату.ВЦеломЗаПериод = Ложь;
КонецЦикла;
ТЗ = РезультатЗапроса.Выгрузить();
Если ТЗ.Количество() > 0 Тогда
ТЗ.Свернуть("Сотрудник","Часов");
Движения.Отгулы_2.Записывать = Истина;
Для каждого ВыборкаДетальныеЗаписи Из ТЗ Цикл
Движение = Движения.Отгулы_2.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Месяц;
Движение.Сотрудник = ВыборкаДетальныеЗаписи.Сотрудник;
Движение.Часов = ВыборкаДетальныеЗаписи.Часов;
КонецЦикла;
КонецЕсли;
Возврат ТаблицаДанныхОВремени;
КонецФункции
#КонецЕсли
- Док.Отгул движения РН.Отгулы, РН.ДанныеТабельногоУчетаРабочегоВремениСотрудников одной строкой, МО:
#Если Не ТолстыйКлиентУправляемоеПриложение Или Сервер Тогда
перем ТЗ;
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект);
ДанныеДляПроведения = ТаблицаДанныхОВремени();
Если ТЗ.Количество() > 0 Тогда
ТЗ.Свернуть("Сотрудник","ЧасовОстаток");
Движения.Отгулы_2.Записывать = Истина;
Для каждого ВыборкаДетальныеЗаписи Из ТЗ Цикл
Движение = Движения.Отгулы_2.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = ДеньОтгула;
Движение.Сотрудник = ВыборкаДетальныеЗаписи.Сотрудник;
Движение.Часов = 4;
КонецЦикла;
иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "У сотрудника "+Сотрудник+" осталось не достаточно часов для отгула на "+ ДеньОтгула;
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
УчетРабочегоВремени.ЗарегистрироватьДанныеТабеля(Движения, ДанныеДляПроведения, НачалоМесяца(ДеньОтгула));
КонецПроцедуры
Функция ТаблицаДанныхОВремени()
ТаблицаДанныхОВремени = Новый ТаблицаЗначений;
ТаблицаДанныхОВремени.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
ТаблицаДанныхОВремени.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
ТаблицаДанныхОВремени.Колонки.Добавить("ВидВремени", Новый ОписаниеТипов("СправочникСсылка.ВидыИспользованияРабочегоВремени"));
ТаблицаДанныхОВремени.Колонки.Добавить("Дней", Новый ОписаниеТипов("Число"));
ТаблицаДанныхОВремени.Колонки.Добавить("Часов", Новый ОписаниеТипов("Число"));
ТаблицаДанныхОВремени.Колонки.Добавить("ВЦеломЗаПериод", Новый ОписаниеТипов("Булево"));
ТаблицаДанныхОВремени.Колонки.Добавить("Территория", Новый ОписаниеТипов("СправочникСсылка.ТерриторииВыполненияРабот"));
ТаблицаДанныхОВремени.Колонки.Добавить("УсловияТруда", Новый ОписаниеТипов("СправочникСсылка.УсловияТруда"));
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Отгулы_2Остатки.Сотрудник,
| Отгулы_2Остатки.ЧасовОстаток
|ИЗ
| РегистрНакопления.Отгулы_2.Остатки(&ДеньОтгула, Сотрудник = &Сотрудник) КАК Отгулы_2Остатки
|ГДЕ
| Отгулы_2Остатки.ЧасовОстаток >= 4";
Запрос.УстановитьПараметр("ДеньОтгула", ДеньОтгула);
Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
ДанныеПоВидуВремениНаДату = ТаблицаДанныхОВремени.Добавить();
ДанныеПоВидуВремениНаДату.Дата = ДеньОтгула;
ДанныеПоВидуВремениНаДату.Сотрудник = ВыборкаДетальныеЗаписи.Сотрудник;
ДанныеПоВидуВремениНаДату.ВидВремени = ВидВремени;
ДанныеПоВидуВремениНаДату.Дней = 1;
ДанныеПоВидуВремениНаДату.Часов = 12;
ДанныеПоВидуВремениНаДату.ВЦеломЗаПериод = Ложь;
КонецЕсли;
ТЗ = РезультатЗапроса.Выгрузить();
Возврат ТаблицаДанныхОВремени;
КонецФункции
#КонецЕсли
- Отчет СКД:
ВЫБРАТЬ НачисленияДанныеГрафика.ПериодРегистрации КАК Период, НачисленияДанныеГрафика.Сотрудник КАК Сотрудник, НачисленияДанныеГрафика.ОсновноеЗначениеПериодДействия КАК ОсновноеЗначениеПериодДействия, // Вариант решения второй(сложнее), когда надо расчитывать свой показатель "_КоличествоЧасовВыполненияВредныхРабот_2" //НачисленияДанныеГрафика.НачисленияДанныеГрафика.ДополнительноеЗначениеПериодДействия КАК ОсновноеЗначениеПериодДействия, НачисленияДанныеГрафика.ВидУчетаВремени КАК Доплата, НачисленияДанныеГрафика.Результат КАК Результат ПОМЕСТИТЬ ВТДоплаты ИЗ РегистрРасчета.Начисления.ДанныеГрафика( ВидУчетаВремени = &ВРДоплата И (ПериодДействия МЕЖДУ &Дата1 И &Дата2)) КАК НачисленияДанныеГрафика ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТДоплаты.Период, ВТДоплаты.Сотрудник ПОМЕСТИТЬ ВТНачисления ИЗ ВТДоплаты КАК ВТДоплаты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК Организация, ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник, ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) КАК Подразделение, ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность ПОМЕСТИТЬ Представления_СрезПоследних_КадроваяИсторияСотрудников ИЗ ВТНачисления КАК ВТНачисления ГДЕ "ТолькоРазрешенные" = ИСТИНА ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ НачисленияДанныеГрафика.ПериодРегистрации КАК Период, НачисленияДанныеГрафика.Сотрудник КАК Сотрудник, НачисленияДанныеГрафика.ВидУчетаВремени КАК Доплата, НачисленияДанныеГрафика.ДополнительноеЗначениеПериодДействия КАК ПредоставленоОтгулов, НачисленияДанныеГрафика.Результат КАК Результат ПОМЕСТИТЬ ВТОтгулы ИЗ РегистрРасчета.Начисления.ДанныеГрафика( ВидУчетаВремени = &ВРОтгул И (ПериодДействия МЕЖДУ &Дата1 И &Дата2)) КАК НачисленияДанныеГрафика ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ВТДоплаты.Период КАК Месяц, ВТДоплаты.Сотрудник КАК Сотрудник, ВТДоплаты.ОсновноеЗначениеПериодДействия КАК ОтработаноЧасовВКислотномЦеху, ВТДоплаты.Результат КАК НачисленоДоплаты, ВТОтгулы.Результат КАК НачисленоЗаОтгулы, ВТОтгулы.ПредоставленоОтгулов, ЕСТЬNULL(Отгулы_2ОстаткиИОбороты.ЧасовНачальныйОстаток, 0) / 4 КАК ОстатокОтгуловНаНачалоПериода, ЕСТЬNULL(Отгулы_2ОстаткиИОбороты.ЧасовКонечныйОстаток, 0) / 4 КАК ОстатокОтгуловНаКонецПериода, Представления_СрезПоследних_КадроваяИсторияСотрудников.Должность ИЗ ВТДоплаты КАК ВТДоплаты ЛЕВОЕ СОЕДИНЕНИЕ ВТОтгулы КАК ВТОтгулы ПО (ВТОтгулы.Сотрудник = ВТДоплаты.Сотрудник) И ВТДоплаты.Период = ВТОтгулы.Период ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Отгулы_2.ОстаткиИОбороты(&Дата1, &Дата2, Месяц, , ) КАК Отгулы_2ОстаткиИОбороты ПО ВТДоплаты.Сотрудник = Отгулы_2ОстаткиИОбороты.Сотрудник И ВТДоплаты.Период = Отгулы_2ОстаткиИОбороты.Период ЛЕВОЕ СОЕДИНЕНИЕ Представления_СрезПоследних_КадроваяИсторияСотрудников КАК Представления_СрезПоследних_КадроваяИсторияСотрудников ПО ВТДоплаты.Сотрудник = Представления_СрезПоследних_КадроваяИсторияСотрудников.Сотрудник
2. Клиент:
- Откл "Штатное р.", вкл."Использовать тарифные группы", документа «Утверждение тарифной сетки».
- Создать график работы. Принять на работу:
- Создать ВР "Отгулы за работы в кислотном цеху" копированием ВР "За наставничество". Формула "ТарифнаяСтавкаЧасовая * ОтработаноЧасовВПределахНормыВремени", только если введен вид времени "Отгулы за работы в кислотном цеху".
- Создать ВР "Доплата за работу в кислотном цеху" копированием ВР "За наставничество". Формула "ВремяВЧасах* 50 / 100 * ТарифнаяСтавкаЧасовая", только если введен вид времени "Работа в кислотном цеху".
БИЛЕТ 3
1. Конфигуратор:
- Подсистема - движения РС.РаботыВПроектах, РС.ПлановыеНачисления, РС.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников
- Док.ФормированиеРабочейГруппыПроекта движения РС.ПлановеНачисления и РС.РаботаВПроектах МО:
#Если Не ТолстыйКлиентУправляемоеПриложение Или Сервер Тогда Процедура ОбработкаПроведения(Отказ, Режим) ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект); ДаннныеДляПроведения = получитьДанныеДляПроведения(); РасчетЗарплаты.СформироватьДвиженияПлановыхНачислений(ЭтотОбъект, Движения, ДаннныеДляПроведения); Движения.РаботаВПоектах_3.Записывать = Истина; Для Каждого ТекСтрокаТаблицаУчастников Из ТаблицаУчастников Цикл Движение = Движения.РаботаВПоектах_3.Добавить(); Движение.Сотрудник = ТекСтрокаТаблицаУчастников.Сотрудник; Движение.Проект = Проект; Движение.Роль = ТекСтрокаТаблицаУчастников.Роль; Движение.Период = ТекСтрокаТаблицаУчастников.ДатаСобытия; Движение.ДатаОкончания = ТекСтрокаТаблицаУчастников.ДействуетДо; КонецЦикла; КонецПроцедуры Функция получитьДанныеДляПроведения() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ФормированиеРабочейГруппыПроекта_3ТаблицаУчастников.Сотрудник, | ФормированиеРабочейГруппыПроекта_3ТаблицаУчастников.Ссылка.Начисление, | ИСТИНА КАК Используется, | ФормированиеРабочейГруппыПроекта_3ТаблицаУчастников.Сотрудник.ФизическоеЛицо КАК ФизическоеЛицо, | ФормированиеРабочейГруппыПроекта_3ТаблицаУчастников.ДатаСобытия, | ФормированиеРабочейГруппыПроекта_3ТаблицаУчастников.ДействуетДо, | ФормированиеРабочейГруппыПроекта_3ТаблицаУчастников.Ссылка КАК ДокументОснование, | ФормированиеРабочейГруппыПроекта_3ТаблицаУчастников.Сотрудник.ГоловнаяОрганизация КАК ГоловнаяОрганизация |ИЗ | Документ.ФормированиеРабочейГруппыПроекта_3.ТаблицаУчастников КАК ФормированиеРабочейГруппыПроекта_3ТаблицаУчастников |ГДЕ | ФормированиеРабочейГруппыПроекта_3ТаблицаУчастников.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", Ссылка); РезультатЗапроса = Запрос.ВыполнитьПакет(); ДаннныеДляПроведения = Новый Структура; // Набор данных для формирования плановых начислений ПлановыеНачисления = РезультатЗапроса[0].Выгрузить(); ДаннныеДляПроведения.Вставить("ДанныеОПлановыхНачислениях", ПлановыеНачисления); Возврат ДаннныеДляПроведения КонецФункции #КонецЕсли
- Док.ИсключениеИзРабочейГруппыПроекта движения РС.ПлановеНачисления и РС.РаботаВПроектах МО:
#Если Не ТолстыйКлиентУправляемоеПриложение Или Сервер Тогда Процедура ОбработкаПроведения(Отказ, Режим) ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект); ДаннныеДляПроведения = получитьДанныеДляПроведения(); РасчетЗарплаты.СформироватьДвиженияПлановыхНачислений(ЭтотОбъект, Движения, ДаннныеДляПроведения); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РаботаВПоектах_3СрезПоследних.Сотрудник, | РаботаВПоектах_3СрезПоследних.Проект, | РаботаВПоектах_3СрезПоследних.Роль |ИЗ | РегистрСведений.РаботаВПоектах_3.СрезПоследних(&Дата, ) КАК РаботаВПоектах_3СрезПоследних |ГДЕ | РаботаВПоектах_3СрезПоследних.Сотрудник = &Сотрудник"; Запрос.УстановитьПараметр("Сотрудник", Сотрудник); Запрос.УстановитьПараметр("Дата", ДатаСобытия); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Движения.РаботаВПоектах_3.Записывать = Истина; Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Движение = Движения.РаботаВПоектах_3.Добавить(); Движение.Сотрудник = Сотрудник; Движение.Проект = Проект; Движение.Роль = ВыборкаДетальныеЗаписи.Роль; Движение.Период = ДатаСобытия; Движение.ДатаОкончания = ДатаСобытия; КонецЦикла; КонецПроцедуры Функция получитьДанныеДляПроведения() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ИсключениеИзРабочейГруппыПроекта_3.Сотрудник, | ИсключениеИзРабочейГруппыПроекта_3.Начисление, | ЛОЖЬ КАК Используется, | ИсключениеИзРабочейГруппыПроекта_3.Сотрудник.ФизическоеЛицо КАК ФизическоеЛицо, | ИсключениеИзРабочейГруппыПроекта_3.ДатаСобытия, | ИсключениеИзРабочейГруппыПроекта_3.Ссылка КАК ДокументОснование, | ИсключениеИзРабочейГруппыПроекта_3.Сотрудник.ГоловнаяОрганизация КАК ГоловнаяОрганизация |ИЗ | Документ.ИсключениеИзРабочейГруппыПроекта_3 КАК ИсключениеИзРабочейГруппыПроекта_3"; Запрос.УстановитьПараметр("Ссылка", Ссылка); РезультатЗапроса = Запрос.ВыполнитьПакет(); ДаннныеДляПроведения = Новый Структура; ПлановыеНачисления = РезультатЗапроса[0].Выгрузить(); ДаннныеДляПроведения.Вставить("ДанныеОПлановыхНачислениях", ПлановыеНачисления); Возврат ДаннныеДляПроведения КонецФункции #КонецЕсли
- Док.ОценкаРаботПоПроекту движение РС.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников МФ
&НаСервере Процедура ЗаполнитьНаСервере() ОбъектФормы = РеквизитФормыВЗначение("Объект"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РаботаВПоектах_3СрезПоследних.Проект, | РаботаВПоектах_3СрезПоследних.Сотрудник, | РаботаВПоектах_3СрезПоследних.ДатаОкончания |ИЗ | РегистрСведений.РаботаВПоектах_3.СрезПоследних(&ДатаОкончания, ) КАК РаботаВПоектах_3СрезПоследних |ГДЕ | РаботаВПоектах_3СрезПоследних.Роль = &Роль | И РаботаВПоектах_3СрезПоследних.Проект = &Проект | И РаботаВПоектах_3СрезПоследних.ДатаОкончания >= &ДатаОкончания"; Запрос.УстановитьПараметр("ДатаОкончания", НачалоМесяца( ОбъектФормы.Месяц ) ); Запрос.УстановитьПараметр("Роль", ОбъектФормы.Режим); Запрос.УстановитьПараметр("Проект", ОбъектФормы.Проект); Если ОбъектФормы.Режим = Перечисления.Роли_3.Исполнитель Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст,"И РаботаВПоектах_3СрезПоследних.Проект = &Проект",""); ОбъектФормы.Проект = Справочники.Проекты_3.ПустаяСсылка(); КонецЕсли; Запрос.УстановитьПараметр("Проект", ОбъектФормы.Проект); РезультатЗапроса = Запрос.Выполнить(); ОбъектФормы.Оценки.Загрузить( РезультатЗапроса.Выгрузить() ); ЗначениеВРеквизитФормы(ОбъектФормы,"Объект"); КонецПроцедуры &НаКлиенте Процедура Заполнить(Команда) ЗаполнитьНаСервере(); КонецПроцедуры
МО
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Процедура ОбработкаПроведения(Отказ, Режим)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НАЧАЛОПЕРИОДА(ТЧ.Ссылка.Месяц, МЕСЯЦ) КАК Период,
| ДОБАВИТЬКДАТЕ(КОНЕЦПЕРИОДА(ТЧ.Ссылка.Месяц, МЕСЯЦ), ДЕНЬ, 1) КАК ДействуетДо,
| ТЧ.Ссылка.Организация,
| ТЧ.Сотрудник.ФизическоеЛицо КАК ФизическоеЛицо,
| ТЧ.Сотрудник,
| ТЧ.Ссылка.Показатель,
| ВЫБОР
| КОГДА ТЧ.Ссылка.Режим = ЗНАЧЕНИЕ(Перечисление.Роли_3.Исполнитель)
| ТОГДА ВЫБОР
| КОГДА ТЧ.Проект.СтепеньСекретности = 1
| ТОГДА 50
| ИНАЧЕ ВЫБОР
| КОГДА ТЧ.Проект.СтепеньСекретности = 2
| ТОГДА 70
| ИНАЧЕ 90
| КОНЕЦ
| КОНЕЦ
| ИНАЧЕ ВЫБОР
| КОГДА ТЧ.Проект.СтепеньСекретности = 1
| ТОГДА 40
| ИНАЧЕ ВЫБОР
| КОГДА ТЧ.Проект.СтепеньСекретности = 2
| ТОГДА 60
| ИНАЧЕ 80
| КОНЕЦ
| КОНЕЦ
| КОНЕЦ * ЕСТЬNULL(ТЧ.Срок, 0) * ЕСТЬNULL(ТЧ.Качество, 0) КАК Значение
|ИЗ
| Документ.ОценкаРаботПоПроекту_3.Оценки КАК ТЧ
|ГДЕ
| ТЧ.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Движения.РС..Записывать = Истина;
Пока Выборка.Следующий() Цикл
Движение = Движения.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Добавить();
ЗаполнитьЗначенияСвойств(Движение, Выборка);
КонецЦикла;
КонецПроцедуры
#КонецЕсли
- Отчет СКД:
ВЫБРАТЬ НачисленияДанныеГрафика.Результат КАК Результат, НачисленияДанныеГрафика.ОтработаноДней КАК ОтработаноДней, НачисленияДанныеГрафика.Сотрудник КАК Сотрудник, НачисленияДанныеГрафика.ВидРасчета КАК ВидРасчета, НачисленияДанныеГрафика.ОсновноеЗначениеФактическийПериодДействия КАК ОсновноеЗначениеФактическийПериодДействия, НачисленияДанныеГрафика.ОсновноеЗначениеПериодДействия КАК ОсновноеЗначениеПериодДействия, НачисленияДанныеГрафика.ПериодРегистрации КАК ПериодРегистрации ПОМЕСТИТЬ ВТПремия ИЗ РегистрРасчета.Начисления.ДанныеГрафика( ПериодРегистрации МЕЖДУ &Дата1 И &Дата2 И ВидРасчета = &ВидРасчетаПремия) КАК НачисленияДанныеГрафика ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТПремия.ПериодРегистрации КАК Период, ВТПремия.Сотрудник ПОМЕСТИТЬ ВТНачисления ИЗ ВТПремия КАК ВТПремия ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК Организация, ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник, ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) КАК Подразделение, ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность ПОМЕСТИТЬ Представления_СрезПоследних_КадроваяИсторияСотрудников ИЗ ВТНачисления КАК ВТНачисления ГДЕ "ТолькоРазрешенные" = ИСТИНА ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ НачисленияДанныеГрафика.Результат КАК Результат, НачисленияДанныеГрафика.ОтработаноДней КАК ОтработаноДней, НачисленияДанныеГрафика.Сотрудник КАК Сотрудник, НачисленияДанныеГрафика.ВидРасчета КАК ВидРасчета, НачисленияДанныеГрафика.ПериодРегистрации КАК ПериодРегистрации ПОМЕСТИТЬ ВТДневнаяСтавка ИЗ РегистрРасчета.Начисления.ДанныеГрафика( ПериодРегистрации МЕЖДУ &Дата1 И &Дата2 И ВидРасчета = &ВидРасчетаПоДневнойСтавке) КАК НачисленияДанныеГрафика ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ВТДневнаяСтавка.ПериодРегистрации КАК ПериодРегистрации, РаботаВПоектах_3СрезПоследних.Проект КАК Проект, ВТПремия.Сотрудник КАК Сотрудник, РаботаВПоектах_3СрезПоследних.Роль КАК Роль, Представления_СрезПоследних_КадроваяИсторияСотрудников.Должность, ВТПремия.ОсновноеЗначениеФактическийПериодДействия КАК ОтработаноДней, ВТДневнаяСтавка.Результат КАК НачисленоПоДневнойСтавке, ВТПремия.Результат / ВТДневнаяСтавка.Результат * 100 КАК ФактическийПроцент, ВТПремия.Результат КАК НачисленоПремии ИЗ ВТПремия КАК ВТПремия ЛЕВОЕ СОЕДИНЕНИЕ ВТДневнаяСтавка КАК ВТДневнаяСтавка ПО (ВТДневнаяСтавка.Сотрудник = ВТПремия.Сотрудник) И ВТПремия.ПериодРегистрации = ВТДневнаяСтавка.ПериодРегистрации ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботаВПоектах_3.СрезПоследних(&Дата2, ) КАК РаботаВПоектах_3СрезПоследних ПО ВТПремия.Сотрудник = РаботаВПоектах_3СрезПоследних.Сотрудник ЛЕВОЕ СОЕДИНЕНИЕ Представления_СрезПоследних_КадроваяИсторияСотрудников КАК Представления_СрезПоследних_КадроваяИсторияСотрудников ПО ВТПремия.Сотрудник = Представления_СрезПоследних_КадроваяИсторияСотрудников.Сотрудник
2. Клиент:
- Вкл. Использовать подневную оплату:
- Создать ВР "Премия за проекты". В текущем месяце:
- Из редактировать форму создаём показатель:
- Вести документ "Формирование рг", "Исключение из рг", "Оценка", "Начисление".
БИЛЕТ 4
1. Конфигуратор:
- Подсистема - движения РН.Лимиты, РС.ПлановыеНачисления, РС.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.
- Док.ВозмещениеСоциальныхРасходов движение РН.Лимиты МО:
Процедура ОбработкаПроведения(Отказ, Режим) Движения.Лимиты_4.Записывать = Истина; // закрываем все предыдущие лимиты Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения, | ДОБАВИТЬКДАТЕ(ЛимитыОстатки.Год, ГОД, 1) КАК Период, | ЛимитыОстатки.Сотрудник, | ЛимитыОстатки.Год, | ЕСТЬNULL(ЛимитыОстатки.СуммаОстаток, 0) КАК Сумма |ИЗ | РегистрНакопления.Лимиты_4.Остатки(&КонецПериода, ) КАК ЛимитыОстатки"; Запрос.УстановитьПараметр("КонецПериода", НачалоГода(Дата) - 1 ); РезультатЗапроса = Запрос.Выполнить(); Если НЕ РезультатЗапроса.Пустой() Тогда Движения.Лимиты.Загрузить( РезультатЗапроса.Выгрузить() ); КонецЕсли; // пишем новые записи Для Каждого ТекСтрокаДанныеРасходов Из ДанныеРасходов Цикл Движение = Движения.Лимиты_4.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Приход; Движение.Период = Дата; Движение.Сотрудник = ТекСтрокаДанныеРасходов.Сотрудник; Движение.Год = НачалоГода(Дата); Движение.Сумма = ТекСтрокаДанныеРасходов.Расход; КонецЦикла; КонецПроцедуры
- Док.РасчетЛимитов движения РС.ПлановеНачисления, РН.Лимиты РС.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников МФ:
&НаСервере Процедура ЗаполнитьНаСервере() ОбъектФормы = РеквизитФормыВЗначение("Объект"); ПараметрыПолученияСотрудников = КадровыйУчет.ПараметрыПолученияСотрудниковОрганизацийПоСпискуФизическихЛиц(); ПараметрыПолученияСотрудников.Организация = ОбъектФормы.Организация; ПараметрыПолученияСотрудников.Подразделение = ОбъектФормы.Подразделение; ПараметрыПолученияСотрудников.НачалоПериода = НачалоМесяца(ОбъектФормы.Месяц); ПараметрыПолученияСотрудников.ОкончаниеПериода = КонецМесяца(ОбъектФормы.Месяц); Сотрудники = КадровыйУчет.СотрудникиОрганизации(Истина, ПараметрыПолученияСотрудников); ТаблицаСотрудников = Сотрудники.Скопировать( ,"Сотрудник"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | КадроваяИсторияСотрудниковСрезПоследних.Должность, | КадроваяИсторияСотрудниковСрезПоследних.Сотрудник, | ПлановыеНачисленияСрезПоследних.Размер КАК Оклад, | ЕСТЬNULL(СуммаВыплатПоДолжностям.КратностьСуммыВыплат, 0) КАК КратностьСуммыВыплат, | РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&Период, МЕСЯЦ), КОНЕЦПЕРИОДА(&Период, МЕСЯЦ), ДЕНЬ) + 1 КАК ДнейВМесяце, | ЕСТЬNULL(ВложенныйЗапрос.ОтработаноДней, 0) КАК ДнейВОтпуске |ИЗ | РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних(&Период, Сотрудник В (&ВТСотрудники)) КАК КадроваяИсторияСотрудниковСрезПоследних | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПлановыеНачисления.СрезПоследних(, Начисление = &Начисление) КАК ПлановыеНачисленияСрезПоследних | ПО КадроваяИсторияСотрудниковСрезПоследних.Сотрудник = ПлановыеНачисленияСрезПоследних.Сотрудник | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СуммаВыплатПоДолжностям_4 КАК СуммаВыплатПоДолжностям | ПО КадроваяИсторияСотрудниковСрезПоследних.Должность = СуммаВыплатПоДолжностям.Должность | ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ | ОтработанноеВремяПоСотрудникам.Сотрудник КАК Сотрудник, | ОтработанноеВремяПоСотрудникам.ОтработаноДней КАК ОтработаноДней | ИЗ | РегистрНакопления.ОтработанноеВремяПоСотрудникам КАК ОтработанноеВремяПоСотрудникам | ГДЕ | ОтработанноеВремяПоСотрудникам.Регистратор ССЫЛКА Документ.ОтпускБезСохраненияОплаты | И ОтработанноеВремяПоСотрудникам.ПериодДействия = НАЧАЛОПЕРИОДА(&Период, МЕСЯЦ)) КАК ВложенныйЗапрос | ПО КадроваяИсторияСотрудниковСрезПоследних.Сотрудник = ВложенныйЗапрос.Сотрудник | |СГРУППИРОВАТЬ ПО | КадроваяИсторияСотрудниковСрезПоследних.Должность, | КадроваяИсторияСотрудниковСрезПоследних.Сотрудник, | ПлановыеНачисленияСрезПоследних.Размер, | СуммаВыплатПоДолжностям.КратностьСуммыВыплат, | ЕСТЬNULL(ВложенныйЗапрос.ОтработаноДней, 0)"; Запрос.УстановитьПараметр("ВТСотрудники", ТаблицаСотрудников.ВыгрузитьКолонку("Сотрудник")); Запрос.УстановитьПараметр("Начисление", ОбъектФормы.НачислениеПоОкладу); Запрос.УстановитьПараметр("Период", КонецДня(ОбъектФормы.Месяц)); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); ОбъектФормы.ВыплатыПоРаботникам.Очистить(); Пока Выборка.Следующий() Цикл СтрокаТЧ = ОбъектФормы.ВыплатыПоРаботникам.Добавить(); СтрокаТЧ.Сотрудник = Выборка.Сотрудник; СтрокаТЧ.РазмерОклада = Выборка.Оклад; СтрокаТЧ.КатегорияДолжности = Выборка.Должность.РазрядКатегория; СтрокаТЧ.ПлановыйЛимит = (Выборка.Оклад * Выборка.КратностьСуммыВыплат)/12; СтрокатЧ.КоэффициентВремени = (Выборка.ДнейВМесяце-Выборка.ДнейВОтпуске)/Выборка.ДнейВМесяце; СтрокаТЧ.ЗаработанныйЛимит = СтрокаТЧ.ПлановыйЛимит*СтрокатЧ.КоэффициентВремени; КонецЦикла; ЗначениеВРеквизитФормы(ОбъектФормы, "Объект"); КонецПроцедуры &НаКлиенте Процедура Заполнить(Команда) ЗаполнитьНаСервере(); КонецПроцедуры
МО:#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда Процедура ОбработкаПроведения(Отказ, РежимПроведения) ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект); ДанныеДляПроведения = ПолучитьДанныеДляПроведения(); РасчетЗарплаты.СформироватьДвиженияПлановыхНачислений(ЭтотОбъект, Движения, ДанныеДляПроведения); Движения.Лимиты_4.Записывать = Истина; Для каждого Стр Из ДанныеДляПроведения.ЗначенияПоказателей Цикл Если Стр.Показатель = ПоказательСумма Тогда Движение = Движения.Лимиты_4.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Сотрудник = Стр.Сотрудник; Движение.Год = НачалоГода(Дата); Движение.Сумма = Стр.Значение; КонецЕсли; КонецЦикла; КонецПроцедуры Функция ПолучитьДанныеДляПроведения() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Сотрудник, | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Ссылка.Начисление, | ИСТИНА КАК Используется, | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Сотрудник.ФизическоеЛицо КАК ФизическоеЛицо, | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Ссылка.Месяц КАК ДатаСобытия |ИЗ | Документ.РасчетЛимитов_4.ВыплатыПоРаботникам КАК РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам |ГДЕ | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Ссылка = &Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Сотрудник, | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Сотрудник.ФизическоеЛицо КАК ФизическоеЛицо, | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Ссылка.Месяц КАК ДатаСобытия, | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Ссылка.Организация, | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Ссылка.ПоказательСумма КАК Показатель, | ВЫБОР | КОГДА ЕСТЬNULL(РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.ПлановыйЛимит, 0) > ЕСТЬNULL(Лимиты_4Остатки.СуммаОстаток, 0) | ТОГДА ЕСТЬNULL(Лимиты_4Остатки.СуммаОстаток, 0) | ИНАЧЕ ЕСТЬNULL(РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.ПлановыйЛимит, 0) | КОНЕЦ КАК Значение, | ДОБАВИТЬКДАТЕ(КОНЕЦПЕРИОДА(РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Ссылка.Месяц, МЕСЯЦ), СЕКУНДА, 1) КАК ДействуетДо |ИЗ | Документ.РасчетЛимитов_4.ВыплатыПоРаботникам КАК РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Лимиты_4.Остатки(&КонецПериода, ) КАК Лимиты_4Остатки | ПО РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Сотрудник = Лимиты_4Остатки.Сотрудник |ГДЕ | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Ссылка = &Ссылка | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Сотрудник, | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Сотрудник.ФизическоеЛицо, | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Ссылка.Месяц, | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Ссылка.Организация, | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Ссылка.ПоказательКоэффициент, | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.КоэффициентВремени, | ДОБАВИТЬКДАТЕ(КОНЕЦПЕРИОДА(РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Ссылка.Месяц, МЕСЯЦ), СЕКУНДА, 1) |ИЗ | Документ.РасчетЛимитов_4.ВыплатыПоРаботникам КАК РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам |ГДЕ | РасчетИНачислениеСуммСоциальныхВыплатВыплатыПоРаботникам.Ссылка = &Ссылка"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Месяц)); РезультатЗапроса = Запрос.ВыполнитьПакет(); ДанныеДляПроведения = Новый Структура; //Набор данных для формирования плановых начислений ПлановыеНачисления = РезультатЗапроса[0].Выгрузить(); ДанныеДляПроведения.Вставить("ДанныеОПлановыхНачислениях", ПлановыеНачисления); //Набор данных для формирования значений показателей ЗначенияПоказателей = РезультатЗапроса[1].Выгрузить(); ДанныеДляПроведения.Вставить("ЗначенияПоказателей", ЗначенияПоказателей); Возврат ДанныеДляПроведения; КонецФункции // () #КонецЕсли
- Отчет СКД:
ВЫБРАТЬ Начисления.ПериодДействия, Начисления.Сотрудник, ЛимитыОстаткиИОбороты.СуммаНачальныйОстаток КАК ОстатокЛимитаНаНачалоПериода, ЛимитыОстаткиИОбороты.СуммаРасход КАК ЗаработаноЛимитаЗаПериод, ЛимитыОстаткиИОбороты.СуммаПриход КАК ПодтвержденныеРасходы, Начисления.Результат КАК ФактическиВозмещенныеРасходы, ЛимитыОстаткиИОбороты.СуммаКонечныйОстаток КАК ОстатокЛимитаНаКонецПериода ПОМЕСТИТЬ ВТ ИЗ РегистрРасчета.Начисления КАК Начисления ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Лимиты_4.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Месяц, , ) КАК ЛимитыОстаткиИОбороты ПО Начисления.ПериодРегистрации = ЛимитыОстаткиИОбороты.Период И Начисления.Сотрудник = ЛимитыОстаткиИОбороты.Сотрудник ГДЕ Начисления.ВидРасчета = &ВидРасчета ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТ.ПериодДействия КАК Период, ВТ.Сотрудник ПОМЕСТИТЬ ВТНачисления ИЗ ВТ КАК ВТ ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка) КАК Организация, ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник, ЗНАЧЕНИЕ(Справочник.ПодразделенияОрганизаций.ПустаяСсылка) КАК Подразделение, ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность ПОМЕСТИТЬ Представления_СрезПоследних_КадроваяИсторияСотрудников ИЗ ВТНачисления КАК ВТНачисления ГДЕ "ТолькоРазрешенные" = ИСТИНА ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗЛИЧНЫЕ ВТ.ПериодДействия, ВТ.Сотрудник, ВТ.ОстатокЛимитаНаНачалоПериода, ВТ.ЗаработаноЛимитаЗаПериод, ВТ.ПодтвержденныеРасходы, ВТ.ФактическиВозмещенныеРасходы, ВТ.ОстатокЛимитаНаКонецПериода, Представления_СрезПоследних_КадроваяИсторияСотрудников.Должность ИЗ ВТ КАК ВТ ЛЕВОЕ СОЕДИНЕНИЕ Представления_СрезПоследних_КадроваяИсторияСотрудников КАК Представления_СрезПоследних_КадроваяИсторияСотрудников ПО ВТ.Сотрудник = Представления_СрезПоследних_КадроваяИсторияСотрудников.Сотрудник
БИЛЕТ 5
1. Конфигуратор:
- Подсистема - движения РН.ДанныеИндивидуальныхГрафиковСотрудников, РН.ДанныеТабельногоУчетаРабочегоВремениСотрудников, РС.ГрупповыеЗанятия:
- Док.РасписаниеГрупповыхЗанятий движение РС.ГрупповыеЗанятия и РН.ДанныеИндивидуальныхГрафиковСотрудников МО:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда Функция ПустаяТаблицаДанныхОВремени() ТаблицаДанныхОВремени = Новый ТаблицаЗначений; ТаблицаДанныхОВремени.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата")); ТаблицаДанныхОВремени.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники")); ТаблицаДанныхОВремени.Колонки.Добавить("ВидВремени", Новый ОписаниеТипов("СправочникСсылка.ВидыИспользованияРабочегоВремени")); ТаблицаДанныхОВремени.Колонки.Добавить("Дней", Новый ОписаниеТипов("Число")); ТаблицаДанныхОВремени.Колонки.Добавить("Часов", Новый ОписаниеТипов("Число")); ТаблицаДанныхОВремени.Колонки.Добавить("ВЦеломЗаПериод", Новый ОписаниеТипов("Булево")); ТаблицаДанныхОВремени.Колонки.Добавить("Территория", Новый ОписаниеТипов("СправочникСсылка.ТерриторииВыполненияРабот")); ТаблицаДанныхОВремени.Колонки.Добавить("УсловияТруда", Новый ОписаниеТипов("СправочникСсылка.УсловияТруда")); Возврат ТаблицаДанныхОВремени; КонецФункции Процедура ОбработкаПроведения(Отказ, Режим) ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект); ДанныеДляПроведения = получитьДанныеДляПроведения(); УчетРабочегоВремени.ЗарегистрироватьДанныеИндивидуальногоГрафика(Движения, ДанныеДляПроведения, НачалоМесяца(ДатаНачалаПериода)); КонецПроцедуры Функция получитьДанныеДляПроведения() ДатаНачалаПериода = НачалоМесяца(ДатаНачалаПериода); ДатаОкончанияПериода = КонецМесяца(ДатаОкончанияПериода); ВыборкаДанныхОВремени = Документы.ИндивидуальныйГрафик.ДанныеОВремениСотрудников(ЭтотОбъект); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РасписаниеГрупповыхЗанятийТаблицаРасписания.Тренер КАК Тренер, | ЧАС(РасписаниеГрупповыхЗанятийТаблицаРасписания.ДатаНачала) * 60 * 60 + МИНУТА(РасписаниеГрупповыхЗанятийТаблицаРасписания.ДатаНачала) * 60 КАК ВремяНачала, | ЧАС(РасписаниеГрупповыхЗанятийТаблицаРасписания.ДатаОкончания) * 60 * 60 + МИНУТА(РасписаниеГрупповыхЗанятийТаблицаРасписания.ДатаОкончания) * 60 КАК ВремяОкончания, | ВЫБОР | КОГДА РасписаниеГрупповыхЗанятийТаблицаРасписания.ДеньЗанятия = ЗНАЧЕНИЕ(Перечисление.ДниНедели_5.Понедельник) | ТОГДА 1 | КОГДА РасписаниеГрупповыхЗанятийТаблицаРасписания.ДеньЗанятия = ЗНАЧЕНИЕ(Перечисление.ДниНедели_5.Вторник) | ТОГДА 2 | КОГДА РасписаниеГрупповыхЗанятийТаблицаРасписания.ДеньЗанятия = ЗНАЧЕНИЕ(Перечисление.ДниНедели_5.Среда) | ТОГДА 3 | КОГДА РасписаниеГрупповыхЗанятийТаблицаРасписания.ДеньЗанятия = ЗНАЧЕНИЕ(Перечисление.ДниНедели_5.Четверг) | ТОГДА 4 | КОГДА РасписаниеГрупповыхЗанятийТаблицаРасписания.ДеньЗанятия = ЗНАЧЕНИЕ(Перечисление.ДниНедели_5.Пятница) | ТОГДА 5 | КОГДА РасписаниеГрупповыхЗанятийТаблицаРасписания.ДеньЗанятия = ЗНАЧЕНИЕ(Перечисление.ДниНедели_5.Суббота) | ТОГДА 6 | КОГДА РасписаниеГрупповыхЗанятийТаблицаРасписания.ДеньЗанятия = ЗНАЧЕНИЕ(Перечисление.ДниНедели_5.Воскресенье) | ТОГДА 7 | КОНЕЦ КАК ДеньЗанятия, | РасписаниеГрупповыхЗанятийТаблицаРасписания.Занятие |ПОМЕСТИТЬ ВТТаблицаРасписания |ИЗ | Документ.РасписаниеГрупповыхЗанятий_5.ТаблицаРасписания КАК РасписаниеГрупповыхЗанятийТаблицаРасписания |ГДЕ | РасписаниеГрупповыхЗанятийТаблицаРасписания.Ссылка = &Ссылка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ДанныеОВремениСотрудников.Сотрудник КАК Сотрудник, | ДанныеОВремениСотрудников.Дата, | ДанныеОВремениСотрудников.Часы |ПОМЕСТИТЬ ВТДанныеОВремениСотрудников |ИЗ | &ДанныеОВремениСотрудников КАК ДанныеОВремениСотрудников |ГДЕ | ДанныеОВремениСотрудников.ВидУчетаВремени = &ВидУчетаВремениЯвка |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТДанныеОВремениСотрудников.Дата, | ВТТаблицаРасписания.Тренер КАК Тренер, | ДОБАВИТЬКДАТЕ(ВТДанныеОВремениСотрудников.Дата, СЕКУНДА, ВТТаблицаРасписания.ВремяНачала) КАК ДатаНачала, | ДОБАВИТЬКДАТЕ(ВТДанныеОВремениСотрудников.Дата, СЕКУНДА, ВТТаблицаРасписания.ВремяОкончания) КАК ДатаОкончания, | ВТТаблицаРасписания.Занятие, | ВТТаблицаРасписания.ВремяОкончания - ВТТаблицаРасписания.ВремяНачала КАК ВремяЗанятия, | ВТДанныеОВремениСотрудников.Часы |ПОМЕСТИТЬ ВТИтоговыеДанные |ИЗ | ВТТаблицаРасписания КАК ВТТаблицаРасписания | ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТДанныеОВремениСотрудников КАК ВТДанныеОВремениСотрудников | ПО (ВТТаблицаРасписания.ДеньЗанятия = ДЕНЬНЕДЕЛИ(ВТДанныеОВремениСотрудников.Дата)) | И ВТТаблицаРасписания.Тренер = ВТДанныеОВремениСотрудников.Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТИтоговыеДанные.Тренер, | ВТИтоговыеДанные.ДатаНачала, | ВТИтоговыеДанные.ДатаОкончания, | ВТИтоговыеДанные.Занятие |ИЗ | ВТИтоговыеДанные КАК ВТИтоговыеДанные |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТИтоговыеДанные.Дата, | ВТИтоговыеДанные.Тренер КАК Сотрудник, | СУММА(ВТИтоговыеДанные.ВремяЗанятия) КАК ВремяЗанятия, | ВТИтоговыеДанные.Часы КАК ЧасыЯвка |ИЗ | ВТИтоговыеДанные КАК ВТИтоговыеДанные | |СГРУППИРОВАТЬ ПО | ВТИтоговыеДанные.Тренер, | ВТИтоговыеДанные.Дата, | ВТИтоговыеДанные.Часы"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("ДанныеОВремениСотрудников", ВыборкаДанныхОВремени.Владелец().Выгрузить() ); Запрос.УстановитьПараметр("ВидУчетаВремениЯвка", ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.Явка") ); РезультатыЗапроса = Запрос.ВыполнитьПакет(); // пишем в РС ГрупповыеЗанятия Движения.ГрупповыеЗанятия_5.Записывать = Истина; Движения.ГрупповыеЗанятия_5.Загрузить( РезультатыЗапроса[3].Выгрузить() ); // пишем в РН РабочееВремяСотрудников ТаблицаДанныхОВремени = ПустаяТаблицаДанныхОВремени(); Выборка = РезультатыЗапроса[4].Выбрать(); Пока Выборка.Следующий() Цикл Часов = Выборка.ВремяЗанятия / 60 / 60; Если Выборка.ЧасыЯвка >= Часов Тогда ДанныеПоВидуВремениНаДату = ТаблицаДанныхОВремени.Добавить(); ДанныеПоВидуВремениНаДату.Дата = Выборка.Дата; ДанныеПоВидуВремениНаДату.Сотрудник = Выборка.Сотрудник; ДанныеПоВидуВремениНаДату.ВидВремени = ВидВремени; ДанныеПоВидуВремениНаДату.Дней = 1; ДанныеПоВидуВремениНаДату.Часов = Часов; ДанныеПоВидуВремениНаДату.ВЦеломЗаПериод = Ложь; ДанныеПоВидуВремениНаДату = ТаблицаДанныхОВремени.Добавить(); ДанныеПоВидуВремениНаДату.Дата = Выборка.Дата; ДанныеПоВидуВремениНаДату.Сотрудник = Выборка.Сотрудник; ДанныеПоВидуВремениНаДату.ВидВремени = ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.Явка"); ДанныеПоВидуВремениНаДату.Дней = 1; ДанныеПоВидуВремениНаДату.Часов = Выборка.ЧасыЯвка - Часов; ДанныеПоВидуВремениНаДату.ВЦеломЗаПериод = Ложь; Иначе Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Больше "+Выборка.ЧасыЯвка+" часов не сможет работать сотрудник: "+Выборка.Сотрудник+" в этот день: "+Выборка.Дата; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; КонецЦикла; Возврат ТаблицаДанныхОВремени КонецФункции #КонецЕсли
- Док.ПерсональныеТренировки движения РН.ДанныеТабельногоУчетаРабочегоВремениСотрудников МО:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Функция ПустаяТаблицаДанныхОВремени()
ТаблицаДанныхОВремени = Новый ТаблицаЗначений;
ТаблицаДанныхОВремени.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
ТаблицаДанныхОВремени.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
ТаблицаДанныхОВремени.Колонки.Добавить("ВидВремени", Новый ОписаниеТипов("СправочникСсылка.ВидыИспользованияРабочегоВремени"));
ТаблицаДанныхОВремени.Колонки.Добавить("Дней", Новый ОписаниеТипов("Число"));
ТаблицаДанныхОВремени.Колонки.Добавить("Часов", Новый ОписаниеТипов("Число"));
ТаблицаДанныхОВремени.Колонки.Добавить("ВЦеломЗаПериод", Новый ОписаниеТипов("Булево"));
ТаблицаДанныхОВремени.Колонки.Добавить("Территория", Новый ОписаниеТипов("СправочникСсылка.ТерриторииВыполненияРабот"));
ТаблицаДанныхОВремени.Колонки.Добавить("УсловияТруда", Новый ОписаниеТипов("СправочникСсылка.УсловияТруда"));
Возврат ТаблицаДанныхОВремени;
КонецФункции
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект);
ДатаНачалаПериода = ПериодРегистрации;
ДатаОкончанияПериода = ПериодРегистрации;
ВыборкаДанныхОВремени = Документы.ТабельУчетаРабочегоВремени.ДанныеОВремениСотрудников(ЭтотОбъект);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПерсональныеТренировкиТаблицаТренировок.НомерСтроки,
| ПерсональныеТренировкиТаблицаТренировок.Тренер КАК Тренер,
| ДОБАВИТЬКДАТЕ(&Дата, СЕКУНДА, ЧАС(ПерсональныеТренировкиТаблицаТренировок.ДатаНачала) * 60 * 60 + МИНУТА(ПерсональныеТренировкиТаблицаТренировок.ДатаНачала) * 60) КАК ДатаНачала,
| ДОБАВИТЬКДАТЕ(&Дата, СЕКУНДА, ЧАС(ПерсональныеТренировкиТаблицаТренировок.ДатаОкончания) * 60 * 60 + МИНУТА(ПерсональныеТренировкиТаблицаТренировок.ДатаОкончания) * 60) КАК ДатаОкончания
|ПОМЕСТИТЬ ВТ
|ИЗ
| Документ.ПерсональныеТренировки_5.ТаблицаТренировок КАК ПерсональныеТренировкиТаблицаТренировок
|ГДЕ
| ПерсональныеТренировкиТаблицаТренировок.Ссылка = &Ссылка
|
|ИНДЕКСИРОВАТЬ ПО
| Тренер
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВыборкаДанныхОВремени.Сотрудник,
| ВыборкаДанныхОВремени.Часы КАК Часов
|ПОМЕСТИТЬ ВТВыборкаДанныхОВремени
|ИЗ
| &ВыборкаДанныхОВремени КАК ВыборкаДанныхОВремени
|ГДЕ
| ВыборкаДанныхОВремени.ВидУчетаВремени = &ВидУчетаВремениЯвка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВыборкаДанныхОВремени.Сотрудник,
| ВыборкаДанныхОВремени.Часы КАК Часов
|ПОМЕСТИТЬ ВТВыборкаДанныхОВремениГруппа
|ИЗ
| &ВыборкаДанныхОВремени КАК ВыборкаДанныхОВремени
|ГДЕ
| ВыборкаДанныхОВремени.ВидУчетаВремени = &ВидВремениДляГрупповых
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ.Тренер,
| РАЗНОСТЬДАТ(ВТ.ДатаНачала, ВТ.ДатаОкончания, СЕКУНДА) КАК ВремяЗанятия,
| ВЫБОР
| КОГДА ЕСТЬNULL(ГрупповыеЗанятия.НомерСтроки, 0) = 0
| ТОГДА 0
| ИНАЧЕ ВТ.НомерСтроки
| КОНЕЦ КАК НомерОшибки
|ПОМЕСТИТЬ ВТРезультат
|ИЗ
| ВТ КАК ВТ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрупповыеЗанятия_5 КАК ГрупповыеЗанятия
| ПО ВТ.Тренер = ГрупповыеЗанятия.Тренер
| И (ГрупповыеЗанятия.Активность = ИСТИНА)
| И (ГрупповыеЗанятия.ДатаНачала >= ВТ.ДатаНачала
| И ГрупповыеЗанятия.ДатаНачала < ВТ.ДатаОкончания
| ИЛИ ВТ.ДатаНачала >= ГрупповыеЗанятия.ДатаНачала
| И ВТ.ДатаНачала < ГрупповыеЗанятия.ДатаОкончания)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТРезультат.НомерОшибки
|ИЗ
| ВТРезультат КАК ВТРезультат
|ГДЕ
| ВТРезультат.НомерОшибки > 0
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТРезультат.Тренер,
| СУММА(ВТРезультат.ВремяЗанятия) КАК ВремяЗанятия,
| ВТВыборкаДанныхОВремени.Часов,
| ЕСТЬNULL(ВТВыборкаДанныхОВремениГруппа.Часов, 0) КАК ЧасовГруппа
|ИЗ
| ВТРезультат КАК ВТРезультат
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТВыборкаДанныхОВремени КАК ВТВыборкаДанныхОВремени
| ПО ВТРезультат.Тренер = ВТВыборкаДанныхОВремени.Сотрудник
| ЛЕВОЕ СОЕДИНЕНИЕ ВТВыборкаДанныхОВремениГруппа КАК ВТВыборкаДанныхОВремениГруппа
| ПО ВТРезультат.Тренер = ВТВыборкаДанныхОВремениГруппа.Сотрудник
|
|СГРУППИРОВАТЬ ПО
| ВТРезультат.Тренер,
| ВТВыборкаДанныхОВремени.Часов,
| ЕСТЬNULL(ВТВыборкаДанныхОВремениГруппа.Часов, 0)";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Дата", ПериодРегистрации);
Запрос.УстановитьПараметр("ВыборкаДанныхОВремени", ВыборкаДанныхОВремени.Владелец().Выгрузить() );
Запрос.УстановитьПараметр("ВидУчетаВремениЯвка", ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.Явка") );
Запрос.УстановитьПараметр("ВидВремениДляГрупповых", ВидВремениДляГрупповых );
РезультатыЗапроса = Запрос.ВыполнитьПакет();
Выборка = РезультатыЗапроса[4].Выбрать();
Пока Выборка.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "В это время тренер занят на групповых тренировках!";
Сообщение.Поле = "ТаблицаТренировок["+(Выборка.НомерОшибки-1)+"].Тренер";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЦикла;
Если Отказ = Ложь Тогда
ТаблицаДанныхОВремени = ПустаяТаблицаДанныхОВремени();
Выборка = РезультатыЗапроса[5].Выбрать();
Пока Выборка.Следующий() Цикл
ДанныеПоВидуВремениНаДату = ТаблицаДанныхОВремени.Добавить();
ДанныеПоВидуВремениНаДату.Дата = ПериодРегистрации;
ДанныеПоВидуВремениНаДату.Сотрудник = Выборка.Тренер;
ДанныеПоВидуВремениНаДату.ВидВремени = ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.Явка");
ДанныеПоВидуВремениНаДату.Дней = 1;
ДанныеПоВидуВремениНаДату.Часов = Выборка.Часов - Выборка.ВремяЗанятия / 60 / 60;
ДанныеПоВидуВремениНаДату.ВЦеломЗаПериод = Ложь;
ДанныеПоВидуВремениНаДату = ТаблицаДанныхОВремени.Добавить();
ДанныеПоВидуВремениНаДату.Дата = ПериодРегистрации;
ДанныеПоВидуВремениНаДату.Сотрудник = Выборка.Тренер;
ДанныеПоВидуВремениНаДату.ВидВремени = ВидВремени;
ДанныеПоВидуВремениНаДату.Дней = 1;
ДанныеПоВидуВремениНаДату.Часов = Выборка.ВремяЗанятия / 60 / 60;
ДанныеПоВидуВремениНаДату.ВЦеломЗаПериод = Ложь;
Если Выборка.ЧасовГруппа > 0 Тогда
ДанныеПоВидуВремениНаДату = ТаблицаДанныхОВремени.Добавить();
ДанныеПоВидуВремениНаДату.Дата = ПериодРегистрации;
ДанныеПоВидуВремениНаДату.Сотрудник = Выборка.Тренер;
ДанныеПоВидуВремениНаДату.ВидВремени = ВидВремениДляГрупповых;
ДанныеПоВидуВремениНаДату.Дней = 1;
ДанныеПоВидуВремениНаДату.Часов = Выборка.ЧасовГруппа;
ДанныеПоВидуВремениНаДату.ВЦеломЗаПериод = Ложь;
КонецЕсли;
КонецЦикла;
УчетРабочегоВремени.ЗарегистрироватьДанныеТабеля(Движения, ТаблицаДанныхОВремени, НачалоМесяца(ПериодРегистрации));
//УчетРабочегоВремени.ЗарегистрироватьДанныеИндивидуальногоГрафика(Движения, ТаблицаДанныхОВремени, НачалоМесяца(ДатаНачалаПериода));
КонецЕсли;
КонецПроцедуры
#КонецЕсли
- Отчет СКД:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
НачисленияДанныеГрафика.ПериодДействия,
НачисленияДанныеГрафика.Сотрудник,
НачисленияДанныеГрафика.Результат,
НачисленияДанныеГрафика.ОсновноеЗначениеФактическийПериодДействия,
СУММА(ВЫБОР
КОГДА НачисленияДанныеГрафика.ОсновноеЗначениеНормаФактическийПериодДействия = 0
ТОГДА ГрафикиРаботыПоВидамВремени.ОсновноеЗначениеНорма
ИНАЧЕ НачисленияДанныеГрафика.ОсновноеЗначениеНормаФактическийПериодДействия
КОНЕЦ) КАК ОсновноеЗначениеНормаФактическийПериодДействия
ПОМЕСТИТЬ ВТДежурство
ИЗ
РегистрРасчета.Начисления.ДанныеГрафика(
ВидРасчета = &Дежурство
И (ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода)) КАК НачисленияДанныеГрафика
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени
ПО (ГрафикиРаботыПоВидамВремени.Месяц = НачисленияДанныеГрафика.ПериодДействия)
И (ГрафикиРаботыПоВидамВремени.ВидУчетаВремени.Наименование = "Рабочее время")
И (ГрафикиРаботыПоВидамВремени.ГрафикРаботы = НачисленияДанныеГрафика.Сотрудник)
И (ГрафикиРаботыПоВидамВремени.ВремяВЧасах = ИСТИНА)
ГДЕ
НачисленияДанныеГрафика.Активность = ИСТИНА
И НачисленияДанныеГрафика.Сторно = ЛОЖЬ
СГРУППИРОВАТЬ ПО
НачисленияДанныеГрафика.ПериодДействия,
НачисленияДанныеГрафика.Сотрудник,
НачисленияДанныеГрафика.Результат,
НачисленияДанныеГрафика.ОсновноеЗначениеФактическийПериодДействия
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
НачисленияДанныеГрафика.ПериодДействия,
НачисленияДанныеГрафика.Сотрудник,
НачисленияДанныеГрафика.Результат,
НачисленияДанныеГрафика.ОсновноеЗначениеФактическийПериодДействия
ПОМЕСТИТЬ ВТГрупповыеЗанятия
ИЗ
РегистрРасчета.Начисления.ДанныеГрафика(
ВидРасчета = &ГрупповыеЗанятия
И (ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода)) КАК НачисленияДанныеГрафика
ГДЕ
НачисленияДанныеГрафика.Активность = ИСТИНА
И НачисленияДанныеГрафика.Сторно = ЛОЖЬ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
НачисленияДанныеГрафика.ПериодДействия,
НачисленияДанныеГрафика.Сотрудник,
НачисленияДанныеГрафика.Результат,
НачисленияДанныеГрафика.ОсновноеЗначениеФактическийПериодДействия
ПОМЕСТИТЬ ВТПерсональныеТренировки
ИЗ
РегистрРасчета.Начисления.ДанныеГрафика(
ВидРасчета = &ПерсональныеТренировки
И (ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода)) КАК НачисленияДанныеГрафика
ГДЕ
НачисленияДанныеГрафика.Активность = ИСТИНА
И НачисленияДанныеГрафика.Сторно = ЛОЖЬ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТДежурство.ПериодДействия,
ВТДежурство.Сотрудник,
ВТДежурство.ОсновноеЗначениеНормаФактическийПериодДействия КАК ЧасовПоГрафикуРаботы,
ВТДежурство.ОсновноеЗначениеФактическийПериодДействия КАК ЧасовДежурства,
ВТДежурство.Результат КАК Начислено1,
ВТГрупповыеЗанятия.ОсновноеЗначениеФактическийПериодДействия КАК ЧасовЗанятий,
ВТГрупповыеЗанятия.Результат КАК Начислено2,
ВТПерсональныеТренировки.ОсновноеЗначениеФактическийПериодДействия КАК ЧасовПерсональныхТренировок,
ВТПерсональныеТренировки.Результат КАК Начислено3
ПОМЕСТИТЬ ВТРезультат
ИЗ
ВТДежурство КАК ВТДежурство
ЛЕВОЕ СОЕДИНЕНИЕ ВТГрупповыеЗанятия КАК ВТГрупповыеЗанятия
ПО ВТДежурство.ПериодДействия = ВТГрупповыеЗанятия.ПериодДействия
И ВТДежурство.Сотрудник = ВТГрупповыеЗанятия.Сотрудник
ЛЕВОЕ СОЕДИНЕНИЕ ВТПерсональныеТренировки КАК ВТПерсональныеТренировки
ПО ВТДежурство.ПериодДействия = ВТПерсональныеТренировки.ПериодДействия
И ВТДежурство.Сотрудник = ВТПерсональныеТренировки.Сотрудник
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТРезультат.Сотрудник,
ВТРезультат.ПериодДействия КАК Период
ПОМЕСТИТЬ ВТСотрудники
ИЗ
ВТРезультат КАК ВТРезультат
СГРУППИРОВАТЬ ПО
ВТРезультат.Сотрудник,
ВТРезультат.ПериодДействия
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность,
ВТСотрудники.Период
ПОМЕСТИТЬ Представления_КадровыеДанныеСотрудников
ИЗ
ВТСотрудники КАК ВТСотрудники
ГДЕ
"ТолькоРазрешенные" = ИСТИНА
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТРезультат.ПериодДействия,
Представления_КадровыеДанныеСотрудников.Должность,
ВТРезультат.Сотрудник,
ВТРезультат.ЧасовПоГрафикуРаботы,
ВТРезультат.ЧасовДежурства,
ВТРезультат.Начислено1,
ВТРезультат.ЧасовЗанятий,
ВТРезультат.Начислено2,
ВТРезультат.ЧасовПерсональныхТренировок,
ВТРезультат.Начислено3
ИЗ
ВТРезультат КАК ВТРезультат
ЛЕВОЕ СОЕДИНЕНИЕ Представления_КадровыеДанныеСотрудников КАК Представления_КадровыеДанныеСотрудников
ПО ВТРезультат.ПериодДействия = Представления_КадровыеДанныеСотрудников.Период
И ВТРезультат.Сотрудник = Представления_КадровыеДанныеСотрудников.Сотрудник
- Создать график "4 дня по 10 часов в неделю":
- Создать ВР "Оплата за групповые" из типового "Оплаты по часовому тарифу": формула "ЧасовойТарифПоДолжности_5 * ОтработаноЧасовВПределахНормыВремени", Ежемесячно, ), вид времени "Групповые тренировки"; и ВР "Оплата за персональные": формула "...*20/100", если введен вид времени "Персоналная тренировка".
- Создать показатель. При приеме указать ВР и показатель:
- Ввести документ отпуск без сохранения, док."Расписание групп", док "Персональные тренировки", Больничный, Начисление.
БИЛЕТ 6
1. Конфигуратор:
- Подсистема - движения РС.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников, РН.ДанныеТабельногоУчетаРабочегоВремениСотрудников, РН.Бонусы:
- Док. ДанныеОЗвонках движения РС.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников, РН.ДанныеТабельногоУчетаРабочегоВремениСотрудников МФ:
&НаКлиенте Процедура ЗагрузитьИзФайла(Команда) Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); Если ДиалогОткрытияФайла.Выбрать() Тогда Объект.ТаблицаЗвонков.Очистить(); ТекстФайла = Новый ТекстовыйДокумент; ТекстФайла.Прочитать( ДиалогОткрытияФайла.ВыбранныеФайлы[0] ); ТекстФайла = ТекстФайла.ПолучитьТекст(); Для Счетчик = 1 По СтрЧислоСтрок( ТекстФайла ) Цикл ТекСтрока = СтрПолучитьСтроку( ТекстФайла, Счетчик ); МассивСтроки = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ТекСтрока,";"); Звонок = Объект.ТаблицаЗвонков.Добавить(); Звонок.ВремяНачала = Дата(МассивСтроки[0]+":00"); Звонок.ВремяОкончания = Дата(МассивСтроки[1]+":00"); Звонок.КодОператора = МассивСтроки[2]; Звонок.Оценка = МассивСтроки[3]; КонецЦикла; КонецЕсли; КонецПроцедуры
МО:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Функция ПустаяТаблицаДанныхОВремени()
ТаблицаДанныхОВремени = Новый ТаблицаЗначений;
ТаблицаДанныхОВремени.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));
ТаблицаДанныхОВремени.Колонки.Добавить("Сотрудник", Новый ОписаниеТипов("СправочникСсылка.Сотрудники"));
ТаблицаДанныхОВремени.Колонки.Добавить("ВидВремени", Новый ОписаниеТипов("СправочникСсылка.ВидыИспользованияРабочегоВремени"));
ТаблицаДанныхОВремени.Колонки.Добавить("Дней", Новый ОписаниеТипов("Число"));
ТаблицаДанныхОВремени.Колонки.Добавить("Часов", Новый ОписаниеТипов("Число"));
ТаблицаДанныхОВремени.Колонки.Добавить("ВЦеломЗаПериод", Новый ОписаниеТипов("Булево"));
ТаблицаДанныхОВремени.Колонки.Добавить("Территория", Новый ОписаниеТипов("СправочникСсылка.ТерриторииВыполненияРабот"));
ТаблицаДанныхОВремени.Колонки.Добавить("УсловияТруда", Новый ОписаниеТипов("СправочникСсылка.УсловияТруда"));
Возврат ТаблицаДанныхОВремени;
КонецФункции
Процедура ОбработкаПроведения(Отказ, Режим)
ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект);
ДатаНачалаПериода = НачалоМесяца(Дата);
ДатаОкончанияПериода = КонецМесяца(Дата);
ПериодРегистрации = Дата;
ВыборкаДанныхОВремени = Документы.ТабельУчетаРабочегоВремени.ДанныеОВремениСотрудников(ЭтотОбъект);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаЗвонков.КодОператора,
| ТаблицаЗвонков.Оценка,
| РАЗНОСТЬДАТ(ТаблицаЗвонков.ВремяНачала, ТаблицаЗвонков.ВремяОкончания, СЕКУНДА) КАК Время,
| НАЧАЛОПЕРИОДА(ТаблицаЗвонков.ВремяНачала, ДЕНЬ) КАК Дата
|ПОМЕСТИТЬ ВТТаблицаЗвонков
|ИЗ
| &ТаблицаЗвонков КАК ТаблицаЗвонков
|
|ИНДЕКСИРОВАТЬ ПО
| ТаблицаЗвонков.КодОператора
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВыборкаДанныхОВремени.Сотрудник КАК Сотрудник,
| ВыборкаДанныхОВремени.Дата КАК Дата,
| ВыборкаДанныхОВремени.ВидУчетаВремени,
| ВыборкаДанныхОВремени.Дни,
| ВыборкаДанныхОВремени.Часы
|ПОМЕСТИТЬ ВТВыборкаДанныхОВремени
|ИЗ
| &ВыборкаДанныхОВремени КАК ВыборкаДанныхОВремени
|ГДЕ
| ВыборкаДанныхОВремени.ВидУчетаВремени = &ВидУчетаВремениЯвка
|
|ИНДЕКСИРОВАТЬ ПО
| Сотрудник,
| Дата
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СотрудникиДополнительныеРеквизиты.Ссылка КАК Сотрудник,
| ВТТаблицаЗвонков.Оценка КАК Оценка,
| ВТТаблицаЗвонков.Время КАК Время,
| ВТТаблицаЗвонков.Дата
|ПОМЕСТИТЬ ВТЗвонкиПоСотрудникам
|ИЗ
| ВТТаблицаЗвонков КАК ВТТаблицаЗвонков
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Сотрудники.ДополнительныеРеквизиты КАК СотрудникиДополнительныеРеквизиты
| ПО ВТТаблицаЗвонков.КодОператора = СотрудникиДополнительныеРеквизиты.Значение
| И (СотрудникиДополнительныеРеквизиты.Свойство = &Свойство)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТЗвонкиПоСотрудникам.Сотрудник,
| СРЕДНЕЕ(ВТЗвонкиПоСотрудникам.Оценка) КАК Оценка,
| СУММА(ВТЗвонкиПоСотрудникам.Время) КАК Время
|ИЗ
| ВТЗвонкиПоСотрудникам КАК ВТЗвонкиПоСотрудникам
|
|СГРУППИРОВАТЬ ПО
| ВТЗвонкиПоСотрудникам.Сотрудник
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТВыборкаДанныхОВремени.Сотрудник,
| ВТВыборкаДанныхОВремени.Дата,
| ВТВыборкаДанныхОВремени.Дни,
| ВТВыборкаДанныхОВремени.Часы,
| СУММА(ВТЗвонкиПоСотрудникам.Время) КАК Время
|ИЗ
| ВТВыборкаДанныхОВремени КАК ВТВыборкаДанныхОВремени
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТЗвонкиПоСотрудникам КАК ВТЗвонкиПоСотрудникам
| ПО ВТВыборкаДанныхОВремени.Дата = ВТЗвонкиПоСотрудникам.Дата
| И ВТВыборкаДанныхОВремени.Сотрудник = ВТЗвонкиПоСотрудникам.Сотрудник
|
|СГРУППИРОВАТЬ ПО
| ВТВыборкаДанныхОВремени.Дни,
| ВТВыборкаДанныхОВремени.Часы,
| ВТВыборкаДанныхОВремени.Сотрудник,
| ВТВыборкаДанныхОВремени.Дата";
Запрос.УстановитьПараметр("ТаблицаЗвонков", ТаблицаЗвонков);
Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Код оператора (билет 6)"));
Запрос.УстановитьПараметр("ВыборкаДанныхОВремени", ВыборкаДанныхОВремени.Владелец().Выгрузить() );
Запрос.УстановитьПараметр("ВидУчетаВремениЯвка", ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.Явка") );
ТаблицаДанныхОВремени = ПустаяТаблицаДанныхОВремени();
РезультатыЗапроса = Запрос.ВыполнитьПакет();
Выборка = РезультатыЗапроса[3].Выбрать();
Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Записывать = истина;
Пока Выборка.Следующий() Цикл
Если Выборка.Оценка >= 4 Тогда
Показатель = Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Добавить();
Показатель.ПериодДействия = НачалоМесяца(Дата);
Показатель.Сотрудник = Выборка.Сотрудник;
Показатель.Показатель = ПоказательСредняяОценкаЗаЗвонки;
Показатель.Организация = Организация;
Показатель.Значение = Выборка.Оценка ;
КонецЕсли;
КонецЦикла;
Выборка = РезультатыЗапроса[4].Выбрать();
Пока Выборка.Следующий() Цикл
ДанныеПоВидуВремениНаДату = ТаблицаДанныхОВремени.Добавить();
ДанныеПоВидуВремениНаДату.Дата = Выборка.Дата;
ДанныеПоВидуВремениНаДату.Сотрудник = Выборка.Сотрудник;
ДанныеПоВидуВремениНаДату.ВидВремени = ВидВремени;
ДанныеПоВидуВремениНаДату.Дней = Выборка.Дни;
ДанныеПоВидуВремениНаДату.Часов = Выборка.Время / 60 / 60;
ДанныеПоВидуВремениНаДату.ВЦеломЗаПериод = Ложь;
ДанныеПоВидуВремениНаДату = ТаблицаДанныхОВремени.Добавить();
ДанныеПоВидуВремениНаДату.Дата = Выборка.Дата;
ДанныеПоВидуВремениНаДату.Сотрудник = Выборка.Сотрудник;
ДанныеПоВидуВремениНаДату.ВидВремени = ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ВидыИспользованияРабочегоВремени.Явка");
ДанныеПоВидуВремениНаДату.Дней = Выборка.Дни;
ДанныеПоВидуВремениНаДату.Часов = Выборка.Часы;
ДанныеПоВидуВремениНаДату.ВЦеломЗаПериод = Ложь;
КонецЦикла;
УчетРабочегоВремени.ЗарегистрироватьДанныеТабеля(Движения, ТаблицаДанныхОВремени, НачалоМесяца(ПериодРегистрации) );
КонецПроцедуры
#КонецЕсли
- Док. НачислениеБонусов РН.Бонусы МФ:
&НаСервере Процедура ЗаполнитьНаСервере() ОбъектФорма = РеквизитФормыВЗначение("Объект"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | НачисленияДанныеГрафика.Сотрудник, | СУММА(ВЫБОР | КОГДА НачисленияДанныеГрафика.ВидРасчета = &ВидРасчетаРабота | ТОГДА НачисленияДанныеГрафика.ДополнительноеЗначениеФактическийПериодДействия | ИНАЧЕ 0 | КОНЕЦ) КАК ОтработаноЧасов, | СУММА(ВЫБОР | КОГДА НачисленияДанныеГрафика.ВидРасчета = &ВидРасчетаЗвонки | ТОГДА НачисленияДанныеГрафика.ДополнительноеЗначениеФактическийПериодДействия | ИНАЧЕ 0 | КОНЕЦ) КАК ДлительностьОбработанныхЗвонков |ПОМЕСТИТЬ ВТ |ИЗ | РегистрРасчета.Начисления.ДанныеГрафика( | ПериодДействия = &ПериодДействия | И (ВидРасчета = &ВидРасчетаРабота | ИЛИ ВидРасчета = &ВидРасчетаЗвонки) | И Сторно = ЛОЖЬ | И Активность = ИСТИНА) КАК НачисленияДанныеГрафика | |СГРУППИРОВАТЬ ПО | НачисленияДанныеГрафика.Сотрудник |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ВТ.Сотрудник, | ВТ.ОтработаноЧасов, | ВТ.ДлительностьОбработанныхЗвонков, | ВТ.ДлительностьОбработанныхЗвонков * 100 КАК НачисленоБонусов |ИЗ | ВТ КАК ВТ |ГДЕ | ВТ.ДлительностьОбработанныхЗвонков >= ВТ.ОтработаноЧасов * 60 / 100"; Запрос.УстановитьПараметр("ВидРасчетаЗвонки", ОбъектФорма.НачислениеЗвонки); Запрос.УстановитьПараметр("ВидРасчетаРабота", ОбъектФорма.НачислениеОклад ); Запрос.УстановитьПараметр("ПериодДействия", НачалоМесяца(ДобавитьМесяц(ОбъектФорма.Дата,-1)) ); РезультатЗапроса = Запрос.Выполнить(); ОбъектФорма.ТаблицаНачислений.Загрузить( РезультатЗапроса.Выгрузить() ); ЗначениеВРеквизитФормы( ОбъектФорма, "Объект" ); КонецПроцедуры &НаКлиенте Процедура Заполнить(Команда) ЗаполнитьНаСервере(); КонецПроцедуры
МО:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Процедура ОбработкаПроведения(Отказ, Режим)
// регистр Бонусы Приход
Движения.Бонусы_6.Записывать = Истина;
Для Каждого ТекСтрокаТаблицаНачислений Из ТаблицаНачислений Цикл
Движение = Движения.Бонусы_6.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Сотрудник = ТекСтрокаТаблицаНачислений.Сотрудник;
Движение.Количество = ТекСтрокаТаблицаНачислений.НачисленоБонусов;
КонецЦикла;
КонецПроцедуры
#КонецЕсли
- Док. СписаниеБонусов РН.Бонусы и РС.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников МФ:
&НаСервере Процедура ЗаполнитьНаСервере() ОбъектФорма = РеквизитФормыВЗначение("Объект"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | БонусыОстатки.Сотрудник, | СУММА(ЕСТЬNULL(БонусыОстатки.КоличествоОстаток, 0)) КАК ИзрасходованоБонусов, | СУММА(ЕСТЬNULL(БонусыОстатки.КоличествоОстаток, 0)) КАК СуммаДохода |ИЗ | РегистрНакопления.Бонусы_6.Остатки(&КонецМесяца, ) КАК БонусыОстатки | |СГРУППИРОВАТЬ ПО | БонусыОстатки.Сотрудник"; Запрос.УстановитьПараметр("ВидРасчетаЗвонки", ОбъектФорма.НачислениеЗвонки); Запрос.УстановитьПараметр("ВидРасчетаРабота", ОбъектФорма.НачислениеОклад ); Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(ОбъектФорма.Дата) ); РезультатЗапроса = Запрос.Выполнить(); ОбъектФорма.ТаблицаСписаний.Загрузить( РезультатЗапроса.Выгрузить() ); ЗначениеВРеквизитФормы( ОбъектФорма, "Объект" ); КонецПроцедуры &НаКлиенте Процедура Заполнить(Команда) ЗаполнитьНаСервере(); КонецПроцедуры
МО:
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Бонусы_6.Записать();
Движения.Бонусы_6.Записывать = Истина;
Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Очистить();
Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СписаниеБонусовТаблицаСписаний.Сотрудник КАК Сотрудник,
| СУММА(ЕСТЬNULL(СписаниеБонусовТаблицаСписаний.ИзрасходованоБонусов, 0)) КАК ИзрасходованоБонусов,
| СУММА(ЕСТЬNULL(СписаниеБонусовТаблицаСписаний.СуммаДохода, 0)) КАК СуммаДохода
|ПОМЕСТИТЬ ВТТаблицаСписания
|ИЗ
| Документ.СписаниеБонусов_6.ТаблицаСписаний КАК СписаниеБонусовТаблицаСписаний
|ГДЕ
| СписаниеБонусовТаблицаСписаний.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| СписаниеБонусовТаблицаСписаний.Сотрудник
|
|ИНДЕКСИРОВАТЬ ПО
| Сотрудник
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| БонусыОстатки.Сотрудник,
| ЕСТЬNULL(БонусыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ВТТаблицаСписания.ИзрасходованоБонусов,
| ВТТаблицаСписания.СуммаДохода
|ИЗ
| ВТТаблицаСписания КАК ВТТаблицаСписания
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.Бонусы_6.Остатки(
| &КонецМесяца,
| Сотрудник В
| (ВЫБРАТЬ
| ВТТаблицаСписания.Сотрудник
| ИЗ
| ВТТаблицаСписания КАК ВТТаблицаСписания)) КАК БонусыОстатки
| ПО ВТТаблицаСписания.Сотрудник = БонусыОстатки.Сотрудник";
Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(Дата) );
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.КоличествоОстаток < Выборка.ИзрасходованоБонусов Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "У сотрудника "+Выборка.Сотрудник+" осталось только "+Выборка.КоличествоОстаток+" бонусов в этом месяце";
Сообщение.Сообщить();
Отказ = Истина;
Иначе
Движение = Движения.Бонусы_6.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Сотрудник = Выборка.Сотрудник;
Движение.Количество = Выборка.ИзрасходованоБонусов;
Показатель = Движения.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников.Добавить();
Показатель.ПериодДействия = НачалоМесяца(Дата);
Показатель.Сотрудник = Выборка.Сотрудник;
Показатель.Показатель = Справочники.ПоказателиРасчетаЗарплаты.НайтиПоРеквизиту("Идентификатор", "НатуральныйДоход");
Показатель.Организация = Организация;
Показатель.Значение = Выборка.ИзрасходованоБонусов;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецЕсли
- Отчет СКД:
ВЫБРАТЬ НачисленияДанныеГрафика.ПериодДействия КАК ПериодДействия, НачисленияДанныеГрафика.Сотрудник КАК Сотрудник, СУММА(ВЫБОР КОГДА НачисленияДанныеГрафика.ВидРасчета = &ОплатаПоОкладу ТОГДА ЕСТЬNULL(НачисленияДанныеГрафика.ОтработаноЧасов, 0) ИНАЧЕ 0 КОНЕЦ) КАК ОтработаноЧасов, СУММА(ВЫБОР КОГДА НачисленияДанныеГрафика.ВидРасчета = &ОплатаПоОкладу ТОГДА ЕСТЬNULL(НачисленияДанныеГрафика.Результат, 0) ИНАЧЕ 0 КОНЕЦ) КАК НачисленоПоОкладу, СУММА(ВЫБОР КОГДА НачисленияДанныеГрафика.ВидРасчета = &ОплатаЗаЗвонки ТОГДА ЕСТЬNULL(НачисленияДанныеГрафика.Результат, 0) ИНАЧЕ 0 КОНЕЦ) КАК НачисленоПремии, СУММА(ВЫБОР КОГДА НачисленияДанныеГрафика.ВидРасчета = &ОплатаЗаЗвонки ТОГДА ЕСТЬNULL(НачисленияДанныеГрафика.ДополнительноеЗначениеФактическийПериодДействия, 0) ИНАЧЕ 0 КОНЕЦ) КАК ДлительностьЗвонков, СУММА(ВЫБОР КОГДА НачисленияДанныеГрафика.ВидРасчета = &НатуральныйДоход ТОГДА ЕСТЬNULL(НачисленияДанныеГрафика.Результат, 0) ИНАЧЕ 0 КОНЕЦ) КАК СуммаНатуральногоДохода, ЕСТЬNULL(ЗначенияПоказателейНачислений.Значение, 0) КАК СредняяОценкаКлиентов ПОМЕСТИТЬ ВТНачисления ИЗ РегистрРасчета.Начисления.ДанныеГрафика( ПериодДействия МЕЖДУ &НачалоПериода И &КонецПериода И Сторно = ЛОЖЬ И Активность = ИСТИНА) КАК НачисленияДанныеГрафика ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияРазовыхПоказателейРасчетаЗарплатыСотрудников КАК ЗначенияПоказателейНачислений ПО (ЗначенияПоказателейНачислений.Активность = ИСТИНА) И (ЗначенияПоказателейНачислений.Показатель = &СредняяОценка) И (ЗначенияПоказателейНачислений.Сотрудник = НачисленияДанныеГрафика.Сотрудник) И (ЗначенияПоказателейНачислений.ПериодДействия = НачисленияДанныеГрафика.ПериодДействия) СГРУППИРОВАТЬ ПО НачисленияДанныеГрафика.ПериодДействия, НачисленияДанныеГрафика.Сотрудник, ЕСТЬNULL(ЗначенияПоказателейНачислений.Значение, 0) ИНДЕКСИРОВАТЬ ПО ПериодДействия, Сотрудник ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТРезультат.Сотрудник, ВТРезультат.ПериодДействия КАК Период ПОМЕСТИТЬ ВТСотрудники ИЗ ВТНачисления КАК ВТРезультат СГРУППИРОВАТЬ ПО ВТРезультат.Сотрудник, ВТРезультат.ПериодДействия ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РАЗРЕШЕННЫЕ ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник, ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность, ВТСотрудники.Период ПОМЕСТИТЬ Представления_КадровыеДанныеСотрудников ИЗ ВТСотрудники КАК ВТСотрудники ГДЕ "ТолькоРазрешенные" = ИСТИНА ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТНачисления.ПериодДействия, ВТНачисления.Сотрудник, ВТНачисления.ОтработаноЧасов, ВТНачисления.НачисленоПоОкладу, ВТНачисления.СредняяОценкаКлиентов, ВТНачисления.НачисленоПремии, ВТНачисления.ДлительностьЗвонков, ЕСТЬNULL(БонусыОстаткиИОбороты.КоличествоПриход, 0) КАК НачисленоБонусов, ЕСТЬNULL(БонусыОстаткиИОбороты.КоличествоНачальныйОстаток, 0) КАК ОстатокБонусовНаНачалоПериода, ЕСТЬNULL(БонусыОстаткиИОбороты.КоличествоРасход, 0) КАК ПотраченоБонусов, ВТНачисления.СуммаНатуральногоДохода, ЕСТЬNULL(БонусыОстаткиИОбороты.КоличествоКонечныйОстаток, 0) КАК ОстатокБонусовНаКонецПериода, Представления_КадровыеДанныеСотрудников.Должность ИЗ ВТНачисления КАК ВТНачисления ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Бонусы_6.ОстаткиИОбороты( &НачалоПериода, &КонецПериода, Месяц, , Сотрудник В (ВЫБРАТЬ ВТНачисления.Сотрудник ИЗ ВТНачисления КАК ВТНачисления)) КАК БонусыОстаткиИОбороты ПО ВТНачисления.ПериодДействия = БонусыОстаткиИОбороты.Период И ВТНачисления.Сотрудник = БонусыОстаткиИОбороты.Сотрудник ЛЕВОЕ СОЕДИНЕНИЕ Представления_КадровыеДанныеСотрудников КАК Представления_КадровыеДанныеСотрудников ПО ВТНачисления.Сотрудник = Представления_КадровыеДанныеСотрудников.Сотрудник
- Создать ВР "Премия за звонки" как новый. Создать показатели:
- Создать ВР "Доход в натуральной форме". Установить флаг в настройках:
- 1 -й месяц ввести документ "Данные о звонках", док. "Начисление ЗП". 2-й месяц ввести документ "Данные о звонках", док "Начисление Бонусов", док "Списание бонусов", потом "Начисление ЗП".
P.S. Решения в выгруженной ИБ и методики могут быть неверными.