Модуль документа "Формирование рабочей группы":
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.РаботаНаПроектах.Записать();
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("Проект", Проект);
Запрос.Текст = "ВЫБРАТЬ
| Док.НомерСтроки,
| Док.Сотрудник,
| Док.НачалоПериода,
| Док.КонецПериода,
| Док.РольНаПроекте
|ПОМЕСТИТЬ ДанныеДокумента
|ИЗ
| Документ.ФормированиеРабочейГруппы.Данные КАК Док
|ГДЕ
| Док.Ссылка = &Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВЗ.Сотрудник,
| ВЗ.НачалоПериода,
| ВЫБОР
| КОГДА ВЗ.КонецПериода < ВЗ.ДатаДосрочногоВыбытия
| ТОГДА ВЗ.КонецПериода
| ИНАЧЕ ДОБАВИТЬКДАТЕ(ВЗ.ДатаДосрочногоВыбытия, ДЕНЬ, -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)
| КОНЕЦ КАК КонецПериода,
| ВЫБОР
| КОГДА Данные.Роль = ЗНАЧЕНИЕ(Перечисление.РольНаПроекте.Исполнитель)
| ТОГДА ПлановыйРазмерПремииЗаРаботуНаПроекте.Исполнитель
| ИНАЧЕ ПлановыйРазмерПремииЗаРаботуНаПроекте.Руководитель
| КОНЕЦ КАК ПлановыйПроцентПремии
|ИЗ
| Данные КАК Данные
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПлановыйРазмерПремииЗаРаботуНаПроекте КАК ПлановыйРазмерПремииЗаРаботуНаПроекте
| ПО Данные.Проект.СтепеньСекретности = ПлановыйРазмерПремииЗаРаботуНаПроекте.СтепеньСекретности";
Если Объект.ВидОперации = Перечисления.ВидОперации_ОценкаРаботНаПроектах.Исполнители Тогда
Запрос.УстановитьПараметр("Проект", Объект.Проект);
Запрос.Текст = Запрос.Текст + " Где Данные.Роль = Значение(Перечисление.РольНаПроекте.Исполнитель) И Данные.Проект = &Проект";
Иначе
Запрос.Текст = Запрос.Текст + " Где Данные.Роль = Значение(Перечисление.РольНаПроекте.Руководитель)";
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать();
Объект.Данные.Очистить();
Пока Выборка.Следующий() Цикл
СтрокаТаблицыДанные = Объект.Данные.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаТаблицыДанные, Выборка);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ИзменитьОтображениеЭлементов();
КонецПроцедуры
Процедура ИзменитьОтображениеЭлементов()
Если Объект.ВидОперации = Перечисления.ВидОперации_ОценкаРаботНаПроектах.Исполнители Тогда
Элементы.Проект.Видимость = Истина;
Элементы.ДанныеПроект.Видимость = Ложь;
Иначе
Элементы.Проект.Видимость = Ложь;
Элементы.ДанныеПроект.Видимость = Истина;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВидОперацииПриИзменении(Элемент)
ИзменитьОтображениеЭлементов();
КонецПроцедуры
&НаКлиенте
Процедура ДанныеОценкаКачестваПриИзменении(Элемент)
Пересчитать();
КонецПроцедуры
&НаКлиенте
Процедура Пересчитать()
ТекущаяСтрока = Элементы.Данные.ТекущиеДанные;
Если ТекущаяСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
ТекущаяСтрока.ФактическийПроцент = ТекущаяСтрока.ПлановыйПроцентПремии * ТекущаяСтрока.ОценкаКачества * ТекущаяСтрока.ОценкаСкорости;
КонецПроцедуры
&НаКлиенте
Процедура ДанныеПлановыйПроцентПремииПриИзменении(Элемент)
Пересчитать();
КонецПроцедуры
&НаКлиенте
Процедура ДанныеОценкаСкоростиПриИзменении(Элемент)
Пересчитать();
КонецПроцедуры