Демос написал, что за третий билет ему отняли два бала за неправильный выбор регистра. В связи с этим переделал этот билет. Писал периоды работы работников по проектам в РС ПлановыеНачислении. Исключение писал туда же, с Используется = ЛОЖЬ. Далее оценки писал в в РС ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Как в таком случае лучше получить сотрудников у которых есть действующее начисление (премия) в текущем месяце? самому писать запрос или есть типовая функция?
Все прекрасно работает. Получилось компактнее, легче. "Все гениальное просто" ;)
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.РаботаНаПроектах.Записать();
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Проект", Проект);
Запрос.Текст = "ВЫБРАТЬ
| Док.НомерСтроки,
| Док.Сотрудник,
| Док.НачалоПериода,
| Док.КонецПериода,
| Док.РольНаПроекте
|ПОМЕСТИТЬ ДанныеДокумента
|ИЗ
| Документ.ФормированиеРабочейГруппы.Данные КАК Док
|ГДЕ
| Док.Ссылка = &Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВЗ.Сотрудник,
| ВЗ.НачалоПериода,
| ВЫБОР
| КОГДА ВЗ.КонецПериода < ВЗ.ДатаДосрочногоВыбытия
| ТОГДА ВЗ.КонецПериода
| ИНАЧЕ ДОБАВИТЬКДАТЕ(ВЗ.ДатаДосрочногоВыбытия, ДЕНЬ, -1)
| КОНЕЦ КАК КонецПериода,
| ВЗ.РольНаПроекте
|ПОМЕСТИТЬ ПериодыРаботы
|ИЗ
| (ВЫБРАТЬ
| ДанныеДокумента.Сотрудник КАК Сотрудник,
| ДанныеДокумента.НачалоПериода КАК НачалоПериода,
| ВЫБОР
| КОГДА ДанныеДокумента.КонецПериода = ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА ДАТАВРЕМЯ(3999, 12, 31)
| ИНАЧЕ ДанныеДокумента.КонецПериода
| КОНЕЦ КАК КонецПериода,
| ДанныеДокумента.РольНаПроекте КАК РольНаПроекте,
| МИНИМУМ(ЕСТЬNULL(РаботаНаПроектах.Период, ДАТАВРЕМЯ(3999, 12, 31))) КАК ДатаДосрочногоВыбытия
| ИЗ
| ДанныеДокумента КАК ДанныеДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботаНаПроектах КАК РаботаНаПроектах
| ПО ДанныеДокумента.Сотрудник = РаботаНаПроектах.Сотрудник
| И (КОНЕЦПЕРИОДА(ДанныеДокумента.НачалоПериода, ДЕНЬ) < РаботаНаПроектах.Период)
| И (НЕ РаботаНаПроектах.Используется)
| И (РаботаНаПроектах.Проект = &Проект)
|
| СГРУППИРОВАТЬ ПО
| ДанныеДокумента.Сотрудник,
| ДанныеДокумента.НачалоПериода,
| ВЫБОР
| КОГДА ДанныеДокумента.КонецПериода = ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА ДАТАВРЕМЯ(3999, 12, 31)
| ИНАЧЕ ДанныеДокумента.КонецПериода
| КОНЕЦ,
| ДанныеДокумента.РольНаПроекте) КАК ВЗ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВЗ.Сотрудник,
| ВЗ.НачалоПериода,
| ВЗ.КонецПериода,
| ВЗ.РольНаПроекте,
| ВЗ.Проект
|ИЗ
| (ВЫБРАТЬ
| ВЗ.Сотрудник КАК Сотрудник,
| ВЗ.НачалоПериода КАК НачалоПериода,
| ВЗ.КонецПериода КАК КонецПериода,
| ВЗ.РольНаПроекте КАК РольНаПроекте,
| РаботаНаПроектах.Проект КАК Проект
| ИЗ
| (ВЫБРАТЬ
| ПериодыРаботы.Сотрудник КАК Сотрудник,
| ПериодыРаботы.НачалоПериода КАК НачалоПериода,
| ПериодыРаботы.КонецПериода КАК КонецПериода,
| ПериодыРаботы.РольНаПроекте КАК РольНаПроекте,
| МАКСИМУМ(РаботаНаПроектах.Период) КАК Период
| ИЗ
| ПериодыРаботы КАК ПериодыРаботы
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РаботаНаПроектах КАК РаботаНаПроектах
| ПО ПериодыРаботы.Сотрудник = РаботаНаПроектах.Сотрудник
| И (КОНЕЦПЕРИОДА(ПериодыРаботы.НачалоПериода, ДЕНЬ) >= РаботаНаПроектах.Период)
|
| СГРУППИРОВАТЬ ПО
| ПериодыРаботы.Сотрудник,
| ПериодыРаботы.НачалоПериода,
| ПериодыРаботы.КонецПериода,
| ПериодыРаботы.РольНаПроекте) КАК ВЗ
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РаботаНаПроектах КАК РаботаНаПроектах
| ПО ВЗ.Сотрудник = РаботаНаПроектах.Сотрудник
| И ВЗ.Период = РаботаНаПроектах.Период
| И (РаботаНаПроектах.Используется)
| И (РаботаНаПроектах.ДействуетДо >= НАЧАЛОПЕРИОДА(ВЗ.НачалоПериода, ДЕНЬ)
| ИЛИ РаботаНаПроектах.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1))
|
| ОБЪЕДИНИТЬ
|
| ВЫБРАТЬ
| ПериодыРаботы.Сотрудник,
| ПериодыРаботы.НачалоПериода,
| ПериодыРаботы.КонецПериода,
| ПериодыРаботы.РольНаПроекте,
| РаботаНаПроектах.Проект
| ИЗ
| ПериодыРаботы КАК ПериодыРаботы
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РаботаНаПроектах КАК РаботаНаПроектах
| ПО ПериодыРаботы.Сотрудник = РаботаНаПроектах.Сотрудник
| И (НАЧАЛОПЕРИОДА(ПериодыРаботы.НачалоПериода, ДЕНЬ) <= РаботаНаПроектах.Период)
| И (КОНЕЦПЕРИОДА(ПериодыРаботы.КонецПериода, ДЕНЬ) >= РаботаНаПроектах.Период)
| И (РаботаНаПроектах.Используется)) КАК ВЗ
|
|СГРУППИРОВАТЬ ПО
| ВЗ.Сотрудник,
| ВЗ.НачалоПериода,
| ВЗ.КонецПериода,
| ВЗ.РольНаПроекте,
| ВЗ.Проект
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Док.НомерСтроки
|ИЗ
| ДанныеДокумента КАК Док
| ЛЕВОЕ СОЕДИНЕНИЕ ДанныеДокумента КАК Док1
| ПО Док.Сотрудник = Док1.Сотрудник
| И Док.НомерСтроки <> Док1.НомерСтроки
| И (Док.НачалоПериода <= Док1.НачалоПериода
| И Док.КонецПериода >= Док1.НачалоПериода
| ИЛИ Док.НачалоПериода <= Док1.КонецПериода
| И Док.КонецПериода >= Док1.КонецПериода
| ИЛИ Док.НачалоПериода >= Док1.НачалоПериода
| И Док.КонецПериода <= Док1.КонецПериода)
|ГДЕ
| НЕ Док1.НомерСтроки ЕСТЬ NULL
|
|СГРУППИРОВАТЬ ПО
| Док.НомерСтроки";
Результат = Запрос.ВыполнитьПакет();
ВыборкаПроверка1 = Результат[2].Выбрать();
ВыборкаПроверка2 = Результат[3].Выбрать();
Пока ВыборкаПроверка1.Следующий() Цикл
СообщениеПользователю = Новый СообщениеПользователю;
СообщениеПользователю.Текст = "Сотрудник " + Строка(ВыборкаПроверка1.Сотрудник) + " в период с " + формат(ВыборкаПроверка1.НачалоПериода, "ДЛФ=DD") + " по " + формат(ВыборкаПроверка1.КонецПериода, "ДЛФ=DD") + " уже работает на проекте: " + Строка(ВыборкаПроверка1.Проект);
СообщениеПользователю.Сообщить();
Отказ = Истина;
КонецЦикла;
Пока ВыборкаПроверка2.Следующий() Цикл
СообщениеПользователю = Новый СообщениеПользователю;
СообщениеПользователю.Текст = "Пересекаются периоды в строке № " + Строка(ВыборкаПроверка2.НомерСтроки);
СообщениеПользователю.Сообщить();
Отказ = Истина;
КонецЦикла;
Если Отказ Тогда
Возврат;
КонецЕсли;
Движения.РаботаНаПроектах.Записывать = Истина;
Для Каждого ТекСтрокаДанные Из Данные Цикл
Движение = Движения.РаботаНаПроектах.Добавить();
Движение.Период = ТекСтрокаДанные.НачалоПериода;
Движение.Сотрудник = ТекСтрокаДанные.Сотрудник;
Движение.Проект = Проект;
Движение.Роль = ТекСтрокаДанные.РольНаПроекте;
Движение.ДействуетДо = ТекСтрокаДанные.КонецПериода;
Движение.Используется = Истина;
КонецЦикла;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Движения.РаботаНаПроектах.Записать();
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Проект", Проект);
Запрос.Текст = "ВЫБРАТЬ
| Док.Сотрудник,
| Док.ДатаИсключения,
| МАКСИМУМ(РаботаНаПроектах.Период) КАК Период
|ПОМЕСТИТЬ ДанныеДокумента
|ИЗ
| Документ.ИсключениеИзрабочейГруппы.Данные КАК Док
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботаНаПроектах КАК РаботаНаПроектах
| ПО (КОНЕЦПЕРИОДА(Док.ДатаИсключения, ДЕНЬ) >= РаботаНаПроектах.Период)
| И Док.Сотрудник = РаботаНаПроектах.Сотрудник
|ГДЕ
| Док.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| Док.Сотрудник,
| Док.ДатаИсключения
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДанныеДокумента.Сотрудник,
| ДанныеДокумента.ДатаИсключения
|ИЗ
| ДанныеДокумента КАК ДанныеДокумента
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботаНаПроектах КАК РаботаНаПроектах
| ПО ДанныеДокумента.Период = РаботаНаПроектах.Период
| И ДанныеДокумента.Сотрудник = РаботаНаПроектах.Сотрудник
| И (РаботаНаПроектах.Проект = &Проект)
| И (РаботаНаПроектах.Используется)
|ГДЕ
| (РаботаНаПроектах.Период ЕСТЬ NULL
| ИЛИ ВЫБОР
| КОГДА РаботаНаПроектах.ДействуетДо ЕСТЬ NULL
| ТОГДА ИСТИНА
| КОГДА РаботаНаПроектах.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1)
| ТОГДА ЛОЖЬ
| ИНАЧЕ НЕ РаботаНаПроектах.ДействуетДо > ДанныеДокумента.ДатаИсключения
| КОНЕЦ)";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СообщениеПользователю = Новый СообщениеПользователю;
СообщениеПользователю.Текст = "Сотрудник " + Строка(Выборка.Сотрудник) + " не работает на проекте " + Строка(Выборка.ДатаИсключения);
СообщениеПользователю.Сообщить();
Отказ = Истина;
КонецЦикла;
Если Отказ Тогда
Возврат;
КонецЕсли;
// регистр РаботаНаПроектах
Движения.РаботаНаПроектах.Записывать = Истина;
Для Каждого ТекСтрокаДанные Из Данные Цикл
Движение = Движения.РаботаНаПроектах.Добавить();
Движение.Период = ТекСтрокаДанные.ДатаИсключения;
Движение.Сотрудник = ТекСтрокаДанные.Сотрудник;
Движение.Проект = Проект;
Движение.Используется = Ложь;
КонецЦикла;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
Дата = ?(Объект.Дата = '00010101000000', ТекущаяДата(), Объект.Дата);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(Дата));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(Дата));
Запрос.Текст = "ВЫБРАТЬ
| ВЗ.Сотрудник,
| ВЗ.Проект,
| ВЗ.Роль,
| ВЗ.НачалоПериода,
| ВЗ.ДействуетДо,
| МИНИМУМ(ЕСТЬNULL(Рег.Период, ДАТАВРЕМЯ(3999, 12, 31))) КАК ДатаДосрочногоВыбытия
|ПОМЕСТИТЬ Данные
|ИЗ
| (ВЫБРАТЬ
| Рег.Сотрудник КАК Сотрудник,
| Рег.Проект КАК Проект,
| Рег.Роль КАК Роль,
| &НачалоПериода КАК НачалоПериода,
| ВЫБОР
| КОГДА Рег.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1)
| ИЛИ Рег.ДействуетДо > &КонецПериода
| ТОГДА &КонецПериода
| ИНАЧЕ Рег.ДействуетДо
| КОНЕЦ КАК ДействуетДо
| ИЗ
| РегистрСведений.РаботаНаПроектах.СрезПоследних(&НачалоПериода, ) КАК Рег
| ГДЕ
| Рег.Используется
| И (Рег.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1)
| ИЛИ Рег.ДействуетДо > &НачалоПериода)
|
| ОБЪЕДИНИТЬ
|
| ВЫБРАТЬ
| Рег.Сотрудник,
| Рег.Проект,
| Рег.Роль,
| Рег.Период,
| ВЫБОР
| КОГДА Рег.ДействуетДо = ДАТАВРЕМЯ(1, 1, 1)
| ИЛИ Рег.ДействуетДо > &КонецПериода
| ТОГДА &КонецПериода
| ИНАЧЕ Рег.ДействуетДо
| КОНЕЦ
| ИЗ
| РегистрСведений.РаботаНаПроектах КАК Рег
| ГДЕ
| Рег.Период > КОНЕЦПЕРИОДА(&НачалоПериода, ДЕНЬ)
| И Рег.Период <= &КонецПериода
| И Рег.Используется) КАК ВЗ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РаботаНаПроектах КАК Рег
| ПО (КОНЕЦПЕРИОДА(ВЗ.НачалоПериода, ДЕНЬ) < Рег.Период)
| И ВЗ.Сотрудник = Рег.Сотрудник
| И ВЗ.Проект = Рег.Проект
|
|СГРУППИРОВАТЬ ПО
| ВЗ.Сотрудник,
| ВЗ.Проект,
| ВЗ.Роль,
| ВЗ.НачалоПериода,
| ВЗ.ДействуетДо
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Данные.Сотрудник,
| Данные.Проект,
| Данные.Роль,
| Данные.НачалоПериода,
| ВЫБОР
| КОГДА Данные.ДействуетДо < Данные.ДатаДосрочногоВыбытия
| ТОГДА Данные.ДействуетДо
| ИНАЧЕ ДОБАВИТЬКДАТЕ(Данные.ДатаДосрочногоВыбытия, ДЕНЬ, -1)
| КОНЕЦ КАК КонецПериода,
| ВЫБОР
| КОГДА Данные.Роль = ЗНАЧЕНИЕ(Перечисление.РольНаПроекте.Исполнитель)
| ТОГДА ПлановыйРазмерПремииЗаРаботуНаПроекте.Исполнитель
| ИНАЧЕ ПлановыйРазмерПремииЗаРаботуНаПроекте.Руководитель
| КОНЕЦ КАК ПлановыйПроцентПремии
|ИЗ
| Данные КАК Данные
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПлановыйРазмерПремииЗаРаботуНаПроекте КАК ПлановыйРазмерПремииЗаРаботуНаПроекте
| ПО Данные.Проект.СтепеньСекретности = ПлановыйРазмерПремииЗаРаботуНаПроекте.СтепеньСекретности";
Если Объект.ВидОперации = Перечисления.ВидОперации_ОценкаРаботНаПроектах.Исполнители Тогда
Запрос.УстановитьПараметр("Проект", Объект.Проект);
Запрос.Текст = Запрос.Текст + " Где Данные.Роль = Значение(Перечисление.РольНаПроекте.Исполнитель) И Данные.Проект = &Проект";
Иначе
Запрос.Текст = Запрос.Текст + " Где Данные.Роль = Значение(Перечисление.РольНаПроекте.Руководитель)";
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать();
Объект.Данные.Очистить();
Пока Выборка.Следующий() Цикл
СтрокаТаблицыДанные = Объект.Данные.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТаблицыДанные, Выборка);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ИзменитьОтображениеЭлементов();
КонецПроцедуры
Процедура ИзменитьОтображениеЭлементов()
Если Объект.ВидОперации = Перечисления.ВидОперации_ОценкаРаботНаПроектах.Исполнители Тогда
Элементы.Проект.Видимость = Истина;
Элементы.ДанныеПроект.Видимость = Ложь;
Иначе
Элементы.Проект.Видимость = Ложь;
Элементы.ДанныеПроект.Видимость = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВидОперацииПриИзменении(Элемент)
ИзменитьОтображениеЭлементов();
КонецПроцедуры
&НаКлиенте
Процедура ДанныеОценкаКачестваПриИзменении(Элемент)
Пересчитать();
КонецПроцедуры
&НаКлиенте
Процедура Пересчитать()
ТекущаяСтрока = Элементы.Данные.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущаяСтрока.ФактическийПроцент = ТекущаяСтрока.ПлановыйПроцентПремии * ТекущаяСтрока.ОценкаКачества * ТекущаяСтрока.ОценкаСкорости;
КонецПроцедуры
&НаКлиенте
Процедура ДанныеПлановыйПроцентПремииПриИзменении(Элемент)
Пересчитать();
КонецПроцедуры
&НаКлиенте
Процедура ДанныеОценкаСкоростиПриИзменении(Элемент)
Пересчитать();
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Если Константы.Показатель_РаботаНаПроектах.Получить().Пустая() Тогда
СообщениеПользователю = Новый СообщениеПользователю;
СообщениеПользователю.Текст = "Не заполнен показатель ""Показатель_РаботаНаПроектах""";
СообщениеПользователю.Сообщить();
Отказ = Истина;
Возврат;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.Текст = "ВЫБРАТЬ
| Док.НомерСтроки
|ИЗ
| Документ.ОценкаРаботНаПроектах.Данные КАК Док
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОценкаРаботНаПроектах.Данные КАК Док1
| ПО Док.НомерСтроки <> Док1.НомерСтроки
| И Док.Сотрудник = Док1.Сотрудник
| И (Док.НачалоПериода <= Док1.НачалоПериода
| И Док.КонецПериода >= Док1.НачалоПериода
| ИЛИ Док.НачалоПериода <= Док1.КонецПериода
| И Док.КонецПериода >= Док1.КонецПериода
| ИЛИ Док.НачалоПериода >= Док1.НачалоПериода
| И Док.КонецПериода <= Док1.КонецПериода)
|ГДЕ
| Док.Ссылка = &Ссылка
| И НЕ Док1.НомерСтроки ЕСТЬ NULL
|
|СГРУППИРОВАТЬ ПО
| Док.НомерСтроки";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
СообщениеПользователю = Новый СообщениеПользователю;
СообщениеПользователю.Текст = "Пересекаются периоды в строке № " + Строка(Выборка.НомерСтроки);
СообщениеПользователю.Сообщить();
Отказ = Истина;
Возврат;
КонецЦикла;
// регистр ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников
Движения.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Записывать = Истина;
Движения.ПлановыеНачисления.Записывать = Истина;
Для Каждого ТекСтрокаДанные Из Данные Цикл
Движение = Движения.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.Добавить();
Движение.Период = ТекСтрокаДанные.НачалоПериода;
Движение.Сотрудник = ТекСтрокаДанные.Сотрудник;
Движение.Организация = Организация;
Движение.ФизическоеЛицо = ТекСтрокаДанные.Сотрудник.ФизическоеЛицо;
Движение.Показатель = Константы.Показатель_РаботаНаПроектах.Получить();
Движение.Значение = ТекСтрокаДанные.ФактическийПроцент;
Движение.ДействуетДо = ТекСтрокаДанные.КонецПериода +60*60*24;
Движение = Движения.ПлановыеНачисления.Добавить();
Движение.Период = ТекСтрокаДанные.НачалоПериода;
Движение.Сотрудник = ТекСтрокаДанные.Сотрудник;
Движение.ГоловнаяОрганизация = Организация;
Движение.ФизическоеЛицо = ТекСтрокаДанные.Сотрудник.ФизическоеЛицо;
Движение.Начисление = Константы.Начисление_РаботаНаПроектах.Получить();
Движение.Размер = ТекСтрокаДанные.ФактическийПроцент;
Движение.ДействуетДо = ТекСтрокаДанные.КонецПериода +60*60*24;
Движение.Используется = Истина;
КонецЦикла;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
ВЫБРАТЬ
НачисленияБазаНачисления.Сотрудник,
НАЧАЛОПЕРИОДА(НачисленияБазаНачисления.ПериодДействияНачало, МЕСЯЦ) КАК Месяц,
НачисленияБазаНачисления.ПериодДействияНачало КАК ПериодСреза,
НачисленияБазаНачисления.ОтработаноДнейБаза КАК ОтработаноДней,
НачисленияБазаНачисления.РезультатБаза КАК НачисленоПоДневнойСтавке,
НачисленияБазаНачисления.Результат КАК НачисленоПремии,
ЗначенияПоказателейНачислений.Значение КАК ФактическийПроцентПремии
ПОМЕСТИТЬ Данные
ИЗ
РегистрРасчета.Начисления.БазаНачисления(
&Измерения,
&Измерения,
,
ГоловнаяОрганизация = &Организация
И ВидРасчета = &ВидРасчета) КАК НачисленияБазаНачисления
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияПоказателейНачислений КАК ЗначенияПоказателейНачислений
ПО НачисленияБазаНачисления.Регистратор = ЗначенияПоказателейНачислений.РегистраторИзмерение
И НачисленияБазаНачисления.ИдентификаторСтроки = ЗначенияПоказателейНачислений.ИдентификаторСтроки
И (ЗначенияПоказателейНачислений.Показатель = &Показатель)
ГДЕ
НЕ НачисленияБазаНачисления.Сторно
И НачисленияБазаНачисления.Активность
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Данные.Сотрудник,
Данные.ПериодСреза
ПОМЕСТИТЬ ТаблицаСрезов
ИЗ
Данные КАК Данные
СГРУППИРОВАТЬ ПО
Данные.Сотрудник,
Данные.ПериодСреза
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
ДАТАВРЕМЯ(1, 1, 1) КАК ПериодСреза,
ЗНАЧЕНИЕ(Перечисление.РольНаПроекте.ПустаяСсылка) КАК Роль,
ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка) КАК Проект
ПОМЕСТИТЬ Представления_ДанныеПроекта
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
ДАТАВРЕМЯ(1, 1, 1) КАК ПериодСреза,
ЗНАЧЕНИЕ(Справочник.Должности.ПустаяСсылка) КАК Должность
ПОМЕСТИТЬ Представления_Должности
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Данные.Сотрудник,
Данные.Месяц,
СУММА(Данные.ОтработаноДней) КАК ОтработаноДней,
СУММА(Данные.НачисленоПоДневнойСтавке) КАК НачисленоПоДневнойСтавке,
СУММА(Данные.НачисленоПремии) КАК НачисленоПремии,
Данные.ФактическийПроцентПремии,
Представления_ДанныеПроекта.Роль,
Представления_ДанныеПроекта.Проект,
Представления_Должности.Должность
ИЗ
Данные КАК Данные
ЛЕВОЕ СОЕДИНЕНИЕ Представления_ДанныеПроекта КАК Представления_ДанныеПроекта
ПО Данные.Сотрудник = Представления_ДанныеПроекта.Сотрудник
И Данные.ПериодСреза = Представления_ДанныеПроекта.ПериодСреза
ЛЕВОЕ СОЕДИНЕНИЕ Представления_Должности КАК Представления_Должности
ПО Данные.Сотрудник = Представления_Должности.Сотрудник
И Данные.ПериодСреза = Представления_Должности.ПериодСреза
СГРУППИРОВАТЬ ПО
Данные.Сотрудник,
Данные.Месяц,
Данные.ФактическийПроцентПремии,
Представления_ДанныеПроекта.Роль,
Представления_ДанныеПроекта.Проект,
Представления_Должности.Должность
Демос написал, что за третий билет ему отняли два бала за неправильный выбор регистра. В связи с этим переделал этот билет. Писал периоды работы работников по проектам в РС ПлановыеНачислении. Исключение писал туда же, с Используется = ЛОЖЬ. Далее оценки писал в в РС ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.
Все прекрасно работает. Получилось компактнее, легче. "Все гениальное просто" ;)
Как в таком случае лучше получить сотрудников у которых есть действующее начисление (премия) в текущем месяце? самому писать запрос или есть типовая функция?
Подскажите, так что лучше использовать для хранения показателей. Показатель периодический, и писать его в "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников"? Или еще что-то... У меня в голове путаница. Как понять что использовать для периодических показателей - "ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников" или "ЗначенияОперативныхПоказателейРасчетаЗарплатыСотрудников"Это зависит от того какие настройки ставишь у самих показателей: "Во всех месяцах после ввода значения" - "ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников";
Что я не понимаю в задании и фразе: "премия начисляется на заработок работника по дневной тарифной ставке за период выполнения проекта"?
Ага. Но не совсем, формула должна быть: "РасчетнаяБаза * ПремияЗаРаботуНаПроекте / 100". Но как ни старался, РС РазовыеПоказатели... - дают премию за месяц. НЕ глядя на периоды в ПлановыхНачислениях. И тем не менее, экзаменаторы считают что это правильно.
Вот я и справшиваю: как удалось защитить решение? Какие контрольные примеры были введены, чтоб это прокатило?
Извините, не МОЖНО, а именно НУЖНО. Или -1 балл гарантирован (я сдавал этот билет: -1 балл за расчетную базу, -1 за назначение плановых начислений в Приеме на работу, -1 - за регистр). Но это детали.
Больше интересует, как все-таки, писать оценку. Я бы и второй раз на экзамене использовал ПериодическиеПоказатели...Потому что Оперативные - накопление,а Разовые - за весь период. Но коммент от 01.11. все портит.
-1 за назначение плановых начислений в Приеме на работу
-1 за назначение плановых начислений в Приеме на работу
Можно узнать, про какое назначение идет речь, какое было и какое нужно было? Если можно, то было бы хорошо увидеть скрин.
Я нервничал и вместо того, чтоб писать в РС ПлановыеНачисления, установил его в пользовательском режиме в документе Прием на работу с формулировкой:"Чтоб не дублировать типовые возможности системы"(примерно). Мне написали: "ошибка - назначение начисления ежемесячно, вместо установки только нужных периодов". Ступил, короче.
Что-то ничего не понял. Можете прикрепить скрин, в каком месте нужно было установить.
Добрый день. Пытаюсь написать отчет на СКД. В запросе использую :
........
Как в значение параметра "загнать" массив?
Сдавал данный билет 2 недели назад, успешно сдал.Поздравляю! Как решали?
Поздравляю! Как решали?
Сдавал экзамен 16.06.16 Для документа "ОценкаРаботПоПроекту" делал движения по регистру свед. "ЗначениеПериодическихПоказателейРасчетаЗарплатыСотрудников". И получил такой ответНе забываем, что текст билетов постоянно меняется...
" Не верно выбран регистр движений для документа "Оценка работ по проекту". Регистр сведений: ЗначениеПериодическихПоказателейРасчетаЗарплатыСотрудников предназначен для хранения плановых показателей, по условиям задания требовалось регистрировать ежемесячно изменяемые показатели."
А если сотрудник участвует в проекте не с первого дня месяца, как в отчете вывести "Начислено по дневной тарифно ставке" ? Получается у премии период действия 02.08-31.08, а у базового начисления 01.08-31.08а где в условиях задачи сказано что участие в проекте возможно только с 1 числа месяца и какая разница какой период у "базового начисления" и что такое вообще "базовое начисление" ?
В принципе отчет тоже не сложен, вот мой конечный запрос
ВЫБРАТЬ
ПроектыСотрудниковМесяц.Месяц КАК Месяц,
ПроектыСотрудниковМесяц.Сотрудник КАК Работник,
ПроектыСотрудниковМесяц.Проект КАК Проект,
ПроектыСотрудниковМесяц.РольНаПроекте КАК РольНаПроекте,
Представления_СрезПоследних_КадроваяИсторияСотрудников.Подразделение КАК Подразделение,
Представления_СрезПоследних_КадроваяИсторияСотрудников.Должность КАК Должность,
ЕСТЬNULL(ОтработанноеВремяПоСотрудникам.ОтработаноДней, 0) КАК ОтработаноДней,
ЕСТЬNULL(НачисленияУдержанияПоСотрудникамПрем.Сумма, 0) КАК НачисленоПремии,
ЕСТЬNULL(ЗначенияПоказателейНачислений.Значение, 0) КАК ФактическийПроцентПремии,
ЕСТЬNULL(НачисленияУдержанияПоСотрудникамОкл.Сумма, 0) КАК НачисленоПоДневнойСтавке
ИЗ
РегистрСведений.ПроектыСотрудниковМесяц КАК ПроектыСотрудниковМесяц
ЛЕВОЕ СОЕДИНЕНИЕ Представления_СрезПоследних_КадроваяИсторияСотрудников КАК Представления_СрезПоследних_КадроваяИсторияСотрудников
ПО ПроектыСотрудниковМесяц.Сотрудник = Представления_СрезПоследних_КадроваяИсторияСотрудников.Сотрудник
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОтработанноеВремяПоСотрудникам КАК ОтработанноеВремяПоСотрудникам
ПО ПроектыСотрудниковМесяц.Сотрудник = ОтработанноеВремяПоСотрудникам.Сотрудник
И ПроектыСотрудниковМесяц.Месяц = ОтработанноеВремяПоСотрудникам.ПериодДействия
И (ОтработанноеВремяПоСотрудникам.ПериодДействия МЕЖДУ &НачалоПериода И &ОкончаниеПериода)
И (ОтработанноеВремяПоСотрудникам.Начисление = &НачислениеПоТарифу)
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.НачисленияУдержанияПоСотрудникам КАК НачисленияУдержанияПоСотрудникамПрем
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияПоказателейНачислений КАК ЗначенияПоказателейНачислений
ПО НачисленияУдержанияПоСотрудникамПрем.Регистратор = ЗначенияПоказателейНачислений.Регистратор
И НачисленияУдержанияПоСотрудникамПрем.ИдентификаторСтроки = ЗначенияПоказателейНачислений.ИдентификаторСтроки
И (ЗначенияПоказателейНачислений.Показатель = &ПоказательПроцентаПремии)
ПО ПроектыСотрудниковМесяц.Месяц = НачисленияУдержанияПоСотрудникамПрем.ПериодДействия
И ПроектыСотрудниковМесяц.Сотрудник = НачисленияУдержанияПоСотрудникамПрем.Сотрудник
И (НачисленияУдержанияПоСотрудникамПрем.ПериодДействия МЕЖДУ &НачалоПериода И &ОкончаниеПериода)
И (НачисленияУдержанияПоСотрудникамПрем.НачислениеУдержание = &НачислениеПоПремии)
И ПроектыСотрудниковМесяц.ДатаНазначения = НачисленияУдержанияПоСотрудникамПрем.ДатаНачала
И ПроектыСотрудниковМесяц.ДатаОкончания = НачисленияУдержанияПоСотрудникамПрем.ДатаОкончания
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.НачисленияУдержанияПоСотрудникам КАК НачисленияУдержанияПоСотрудникамОкл
ПО ПроектыСотрудниковМесяц.Месяц = НачисленияУдержанияПоСотрудникамОкл.ПериодДействия
И ПроектыСотрудниковМесяц.Сотрудник = НачисленияУдержанияПоСотрудникамОкл.Сотрудник
И (НачисленияУдержанияПоСотрудникамОкл.ПериодДействия МЕЖДУ &НачалоПериода И &ОкончаниеПериода)
И (НачисленияУдержанияПоСотрудникамОкл.НачислениеУдержание = &НачислениеПоТарифу)
в регистр ПроектыСотрудниковМесяц я пишу документом ОценкаРаботПоПроекту периоды и все упрощается
Мое решение https://expert.chistov.pro/public/925189/
Также на экзамене попался этот билет. Решал так как в выложенном решении. Оценка 4.
Также на экзамене попался этот билет. Решал так как в выложенном решении. Оценка 4.Исходя из Вашего решения и полученной оценки, можно предположить, что допускаются отклонения от условий задачи?
В Билет 3 добавилось новое условие! Нельзя принять одновременно 2 работников на один проект. Кто знает как это реализовать?
В Билет 3 добавилось новое условие! Нельзя принять одновременно 2 работников на один проект. Кто знает как это реализовать?
Добрый день, коллега!
Откуда такая информация? Достоверная? Есть еще видоизменения в билетах? Была попытка сдачи?
В Билет 3 добавилось новое условие! Нельзя принять одновременно 2 работников на один проект. Кто знает как это реализовать?Сдавала этот билет 04.08, такого изменения не заметила. Был немного изменен отчет - добавлено поле Подразделение, но убрали Отработано дней. Оплата труда - оклад по часам. Остальное все по тексту совпадает.
Сдавала этот билет 04.08, такого изменения не заметила. Был немного изменен отчет - добавлено поле Подразделение, но убрали Отработано дней. Оплата труда - оклад по часам. Остальное все по тексту совпадает.
Отчет делала через механизм представлений - получала Подразделение и Должность.
Оценка пришла на следующий день - "хорошо".
А при проведении Формирования рабочей группы делали проверку, что сотрудник уже работает на другом проекте?В Билет 3 добавилось новое условие! Нельзя принять одновременно 2 работников на один проект. Кто знает как это реализовать?Сдавала этот билет 04.08, такого изменения не заметила. Был немного изменен отчет - добавлено поле Подразделение, но убрали Отработано дней. Оплата труда - оклад по часам. Остальное все по тексту совпадает.
Отчет делала через механизм представлений - получала Подразделение и Должность.
Оценка пришла на следующий день - "хорошо".
Сдавал 17.06.16. РС ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников. Обосновал тем, что нет условия кратности проекта месяцу.
Ответ: Есть такое условие: "Оценка работ исполнителей производится ежемесячно руководителем проекта ...". Что имел ввиду преподаватель - загадка. Либо регистр выбран правильно, но не не правильный ход мыслей, либо надо использовать РАЗОВЫЕ?
Расскажите, в какие регистры, в Вашем решение, документы делали движения?Сдавал 17.06.16. РС ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников. Обосновал тем, что нет условия кратности проекта месяцу.
Ответ: Есть такое условие: "Оценка работ исполнителей производится ежемесячно руководителем проекта ...". Что имел ввиду преподаватель - загадка. Либо регистр выбран правильно, но не не правильный ход мыслей, либо надо использовать РАЗОВЫЕ?
Да, именно, экзаменаторы считают что эту задачу нужно решать с использованием разовых показателей. В видеокурсе Логиновой для подготовкек специалисту она также говорит что эту задачу нужно решать с помощью разовых показателей. Я сначала тоже прорешал как и другие с помощью плановых начислений на мой взгляд это вполне логично, но раз экзаменаторы требуют переделал решение полностью с использованием разовых показателей и получилось так же вполне красиво. Используйте разовые показатели как того требуют экзаменаторы чтобы не ткрять баллы на экзамене
В видеокурсе Логиновой для подготовке к специалисту она также говорит что эту задачу нужно решать с помощью разовых показателей.
Если абстрагироваться от отчета, то решается вообще все очень просто, пишем первые два документа в плановые показатели, только учтите что во втором документе чтобы плановое начисление прекратилось обязательно при проведении должно быть ЛОЖЬ как Используется и ДействуетДО пустая дата
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ИсключениеИзРабочейГруппыПроектаСотрудники.Сотрудник КАК Сотрудник,
| ДАТАВРЕМЯ(1, 1, 1) КАК ДействуетДо,
| ИсключениеИзРабочейГруппыПроектаСотрудники.Ссылка.Начисление КАК Начисление,
| ЛОЖЬ КАК Используется,
| ИсключениеИзРабочейГруппыПроектаСотрудники.Сотрудник.ФизическоеЛицо КАК ФизическоеЛицо,
| ИсключениеИзРабочейГруппыПроектаСотрудники.Сотрудник.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
| ИсключениеИзРабочейГруппыПроектаСотрудники.Ссылка КАК ДокументОснование,
| ИсключениеИзРабочейГруппыПроектаСотрудники.ДатаОкончания КАК ДатаСобытия
|ИЗ
| Документ.ИсключениеИзРабочейГруппыПроекта.Сотрудники КАК ИсключениеИзРабочейГруппыПроектаСотрудники
|ГДЕ
| ИсключениеИзРабочейГруппыПроектаСотрудники.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Проект", Начисление);
Запрос.УстановитьПараметр("Дата", Дата);
Возврат Запрос.Выполнить().Выгрузить();
Третьим документом пишем фактический показатель премии в ЗначенияРазовыхПоказателейСотрудников.
При таком подходе как Логинова и говорит мы делаем плановые начисления и потом используем разовый показатель. И все отлично ложится в документе Начисление зарплаты и взносов, но вот беда, неоткуда при этом брать в отчет измерение проект и ресурс рольвпроекте.
Я пробовал решать подругому вообще использовал в первых двух документах свой регистр остатков с измерениями Сотрудник, Проект, Роль и ресурсом Дней, тогда плановые начисления вообще не нужны вычисляем разовый показатель ДнейНаПроекте и начисление считаем как ДнейНаПроекте * ТарифнаяСтавкаДневная. При втором подходе есть все данные для отчета