27.11.2015

Задача 1.40

Организация является учебным центром и занимается проведением
обучения слушателей. Обучение проводится в классах, каждый из которых
вмещает свое определенное количество слушателей.
В начале месяца составляется расписание курсов на следующий месяц и
вводится документ «Расписание», где указано, в каком классе, в какое время и
какой курс будет проводиться. Далее документом «Заявка» от слушателей
принимаются заявки на обучение.
При вводе расписания необходимо контролировать, что в одном классе, в
одно и то же время не могут проводиться разные курсы. Следует считать, что
курс длится произвольное количество дней, и занятия по нему длятся полный
день, т.е. в один день в одном классе может проводиться не более одного курса. В
зависимости от запланированного расписания занятия по курсу могут
проводиться в различных классах.
В заявке слушателя указывается, какой курс и в какой срок слушатель
собирается прослушать в учебном центре. При проведении заявки необходимо
контролировать, чтобы на курс не записалось больше слушателей, чем может
вместить класс, в котором этот курс проводится. В заявке слушателя класс не
указывается, слушатель автоматически должен быть записан в тот класс, где в
этот срок проводится курс. В том случае, если этот курс читается в эти даты в
разных классах, то заполнение классов происходит согласно их вместимости,
начиная с самого большого.
Специфика работы учебного центра предполагает неполное заполнение
классов, т.е. достаточно частой является ситуация, когда количество слушателей
меньше, чем вместимость класса.
Необходимо построить отчеты по анализу простоя учебных классов за
выбранный промежуток времени. Считать, что учебный центр работает по
пятидневному графику рабочего времени.
pic3.png
% по плану считается как отношение в процентах количества занятых
дней (на которые запланировано обучение) в классе к общему количеству
рабочих дней в периоде. Например, если в месяце 20 рабочих дней, а занятия в
классе запланированы на 15 дней, то загрузки класса по планированию составляет
75%
% по посещению считается как отношение в процентах количества
посещений на запланированные курсы, проводимые в этом классе в этот период к
общему количеству посещений, которые должны были быть. Например, если
вместимость класса 20 мест, в нем запланировано 2 курса на 3 и на 2 дня, на
первый курс записались 15 человек, а на второй 10, то процент посещения классасоставит (15*3+10*2) / (20*3+20*2) = 0.65 т.е. 65%

Итак, разберём последовательно данную задачу.

Вначале создадим необходимые документы и справочники:

pic1.png

Далее добавим нужные регистры 

pic2.png


Документ расписание формирует движения в регистр сведений  при помощи конструктора.

	Процедура ОбработкаПроведения(Отказ, Режим)
	//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

	// регистр ДанныеРасписания
	Движения.ДанныеРасписания.Записывать = Истина;
	Для Каждого ТекСтрокаРасписание Из Расписание Цикл
		Движение = Движения.ДанныеРасписания.Добавить();
		Движение.Класс = ТекСтрокаРасписание.Класс;
		Движение.Дата = ТекСтрокаРасписание.Дата;
		Движение.Курс = ТекСтрокаРасписание.Курс;
	КонецЦикла;

	//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры


Далее опишем обработку проведения для документа "Заявка слушателя":

	

Процедура ОбработкаПроведения(Отказ, Режим)

 Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ДанныеЗаявок");
ЭлементБлокировки.УстановитьЗначение("Дата", Новый Диапазон(ДатаНачала,ДатаОкончания));
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;

ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ДанныеРасписания");
ЭлементБлокировки.УстановитьЗначение("Дата", Новый Диапазон(ДатаНачала,ДатаОкончания));
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
 Блокировка.Заблокировать();



Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	ДанныеРасписания.Класс,
|	ДанныеРасписания.Дата,
|	ДанныеРасписания.Класс.КоличествоСлушателей КАК ВсегоМест
|ПОМЕСТИТЬ Расписание
|ИЗ
|	РегистрСведений.ДанныеРасписания КАК ДанныеРасписания
|ГДЕ
|	ДанныеРасписания.Курс = &Курс
|	И ДанныеРасписания.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	Расписание.Класс,
|	Расписание.Дата КАК Дата,
|	Расписание.ВсегоМест - ЕСТЬNULL(ДанныеЗаявокОбороты.КоличествоОборот, 0) КАК МестСвободно
|ИЗ
|	Расписание КАК Расписание
|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДанныеЗаявок.Обороты(
|				&ДатаНачала,
|				&ДатаОкончания,
|				,
|				Класс В
|					(ВЫБРАТЬ РАЗЛИЧНЫЕ
|						Расписание.Класс
|					ИЗ
|						Расписание КАК Расписание)) КАК ДанныеЗаявокОбороты
|		ПО Расписание.Класс = ДанныеЗаявокОбороты.Класс
|			И Расписание.Дата = ДанныеЗаявокОбороты.Дата
|
|УПОРЯДОЧИТЬ ПО
|	Расписание.ВсегоМест УБЫВ
|ИТОГИ ПО
|	Дата";

Запрос.УстановитьПараметр("Курс", Курс);

Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);

РезультатЗапроса = Запрос.Выполнить();


Движения.ДанныеЗаявок.Записывать = Истина;


ВыборкаПоДатам = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);


Пока ВыборкаПоДатам.Следующий() Цикл


  Выборка = ВыборкаПоДатам.Выбрать();

Пока Выборка.Следующий() Цикл
	
	Если Выборка.МестСвободно = 0 Тогда
		Продолжить;
	КонецЕсли;                                      

	
	Если Выборка.МестСвободно  <> 0 Тогда
		Движение = Движения.ДанныеЗаявок.Добавить();
		Движение.Период = Выборка.Дата;
		Движение.Класс = Выборка.Класс;
		Движение.Дата = Выборка.Дата;
		Движение.Количество = 1;
		Прервать;
	КонецЕсли;
	
	
	
КонецЦикла;
КонецЦикла;

КонецПроцедуры




И в завершении создадим отчет "Анализ простоя" с использованием следующего запроса

	
ВЫБРАТЬ
	Классы.Ссылка КАК Класс,
	Классы.КоличествоСлушателей КАК КоличествоМест
ПОМЕСТИТЬ Классы
ИЗ
	Справочник.Классы КАК Классы
ГДЕ
	НЕ Классы.ПометкаУдаления
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	СУММА(ГрафикиРаботы.ЗначениеДни) КАК КолРабДней
ПОМЕСТИТЬ РабДни
ИЗ
	РегистрСведений.ГрафикиРаботы КАК ГрафикиРаботы
ГДЕ
	ГрафикиРаботы.Дата МЕЖДУ &НачалоПериода И &КонецПериода
	И ГрафикиРаботы.График = ЗНАЧЕНИЕ(СПравочник.Графики.Пятидневка)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ДанныеРасписания.Класс,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ДанныеРасписания.Дата) КАК КолПланДней
ПОМЕСТИТЬ ПланДни
ИЗ
	РегистрСведений.ДанныеРасписания КАК ДанныеРасписания
ГДЕ
	ДанныеРасписания.Дата МЕЖДУ &НачалоПериода И &КонецПериода

СГРУППИРОВАТЬ ПО
	ДанныеРасписания.Класс
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ДанныеЗаявокОбороты.Класс,
	СУММА(ДанныеЗаявокОбороты.КоличествоОборот) КАК КоличествоПоЗаявкам
ПОМЕСТИТЬ ДанныеЗаписиДелимое
ИЗ
	РегистрНакопления.ДанныеЗаявок.Обороты(, , , ) КАК ДанныеЗаявокОбороты

СГРУППИРОВАТЬ ПО
	ДанныеЗаявокОбороты.Класс
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Классы.Класс,
	Классы.КоличествоМест,
	ВЫБОР
		КОГДА ЕСТЬNULL(РабДни.КолРабДней, 0) <> 0
			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ПланДни.КолПланДней, 0) / ЕСТЬNULL(РабДни.КолРабДней, 0) * 100 КАК ЧИСЛО(15, 2))
		ИНАЧЕ 0
	КОНЕЦ КАК ПоПлану,
	ВЫБОР
		КОГДА Классы.КоличествоМест * ЕСТЬNULL(ПланДни.КолПланДней, 0) <> 0
			ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ДанныеЗаписиДелимое.КоличествоПоЗаявкам, 0) / (Классы.КоличествоМест * ЕСТЬNULL(ПланДни.КолПланДней, 0)) * 100 КАК ЧИСЛО(15, 2))
		ИНАЧЕ 0
	КОНЕЦ КАК ПоПосещению
ИЗ
	Классы КАК Классы
		ЛЕВОЕ СОЕДИНЕНИЕ РабДни КАК РабДни
		ПО (ИСТИНА)
		ЛЕВОЕ СОЕДИНЕНИЕ ПланДни КАК ПланДни
		ПО Классы.Класс = ПланДни.Класс
		ЛЕВОЕ СОЕДИНЕНИЕ ДанныеЗаписиДелимое КАК ДанныеЗаписиДелимое
		ПО Классы.Класс = ДанныеЗаписиДелимое.Класс


Возврат к списку

  • Facebook
  • Вконтакте