Загрузка данных



&НаСервере
Процедура ЗаполнитьПоШаблонуНаСервере(СохранятьРучноеРедактирование = Ложь)
	
	// 1. Если в регистре сведений данных за год нет, подтягиваем производственный календарь из макета
	ТЗДанные = Справочники.ГрафикРаботы.ДанныеПроизводственногоКалендаря(Объект.Ссылка, НомерТекущегоГода);
	Если ТЗДанные.Количество() = 0 И ЗначениеЗаполнено(Объект.ПроизводственныйКалендарь) Тогда
		
		КодКалендаря = ?(ТипЗнч(Объект.ПроизводственныйКалендарь) = Тип("Строка"), 
			Объект.ПроизводственныйКалендарь, Объект.ПроизводственныйКалендарь.Код);
		
		ТЗДанные = Справочники.ГрафикРаботы.РезультатЗаполненияПроизводственногоКалендаряПоУмолчанию(
			КодКалендаря, НомерТекущегоГода, КодКалендаря
		);
	КонецЕсли;
	
	Если ТЗДанные.Количество() > 0 Тогда
		ПреобразоватьДанныеПроизводственногоКалендаря(ТЗДанные);
	КонецЕсли;

	// 2. Расчет включения дней в график по шаблону
	ПараметрыЗаполнения = РегистрыСведений.КалендарныеГрафики.ПараметрыЗаполненияГрафика();
	ПараметрыЗаполнения.КодПроизводственногоКалендаря = Объект.Код;
	ПараметрыЗаполнения.ШаблонЗаполнения = Объект.РабочиеДни;
	ПараметрыЗаполнения.ПроизводственныйКалендарь = Объект.Ссылка;
	ПараметрыЗаполнения.УчитыватьПраздники = Объект.УчитыватьПраздничныеДни;
	ПараметрыЗаполнения.УчитыватьНерабочиеПериоды = Объект.УчитыватьНерабочиеПериоды;
	
	ДниВключенныеВГрафик = РегистрыСведений.КалендарныеГрафики.ДниВключенныеВГрафик(
		Объект.ДатаНачала, Объект.ДатаОкончания, ПараметрыЗаполнения
	);
	
	ДниГрафикаСоответствие = Новый Соответствие(ДниГрафика);
	ДатаДня = Объект.ДатаНачала;
	ДатаОкончания = Объект.ДатаОкончания;
	Если Не ЗначениеЗаполнено(ДатаОкончания) Тогда
		ДатаОкончания = КонецГода(Объект.ДатаНачала);
	КонецЕсли;
	
	Пока ДатаДня <= ДатаОкончания Цикл
		ДеньВключенВГрафик = ДниВключенныеВГрафик[ДатаДня];
		Если ДеньВключенВГрафик = Неопределено Тогда
			ДниГрафикаСоответствие.Удалить(ДатаДня);
		Иначе
			ДниГрафикаСоответствие.Вставить(ДатаДня, ДеньВключенВГрафик);
		КонецЕсли;
		ДатаДня = ДатаДня + 86400;
	КонецЦикла;
	
	ДниГрафика = Новый ФиксированноеСоответствие(ДниГрафикаСоответствие);
	
КонецПроцедуры

&НаСервере
Процедура ОбработатьИзменениеГода(ЗаписыватьДанныеГрафика)
	
	Если ЗаписыватьДанныеГрафика Тогда
		Если Объект.Ссылка.Пустая() Тогда
			Записать(Новый Структура("НомерГода", НомерТекущегоГода));
		Иначе
			ЗаписатьДанныеПроизводственногоКалендаряНаСервере(НомерТекущегоГода, РеквизитФормыВЗначение("Объект"));
		КонецЕсли;
	КонецЕсли;

	ЗаполнитьДаннымиТекущегоГода();
	
КонецПроцедуры


Функция ОбновитьПериодыНерабочихДней(ТаблицаПериодов, КодПроизводственногоКалендаря) Экспорт
	
	ТаблицаИзменений = ТаблицаИзмененийПроизводственногоКалендаря();
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("ТаблицаПериодов", ТаблицаПериодов);
	Запрос.УстановитьПараметр("КодПроизводственногоКалендаря", КодПроизводственногоКалендаря);
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	КлассификаторТаблица.КодПроизводственногоКалендаря КАК КодПроизводственногоКалендаря,
		|	КлассификаторТаблица.НомерПериода КАК НомерПериода,
		|	КлассификаторТаблица.ДатаНачала КАК ДатаНачала,
		|	КлассификаторТаблица.ДатаОкончания КАК ДатаОкончания,
		|	КлассификаторТаблица.Основание КАК Основание
		|ПОМЕСТИТЬ ВТКлассификаторТаблица
		|ИЗ
		|	&ТаблицаПериодов КАК КлассификаторТаблица
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ
		|	ВТКлассификаторТаблица.КодПроизводственногоКалендаря КАК КодПроизводственногоКалендаря,
		|	ВТКлассификаторТаблица.НомерПериода КАК НомерПериода,
		|	ВТКлассификаторТаблица.ДатаНачала КАК ДатаНачала,
		|	ВТКлассификаторТаблица.ДатаОкончания КАК ДатаОкончания,
		|	ВТКлассификаторТаблица.Основание КАК Основание
		|ИЗ
		|	ВТКлассификаторТаблица КАК ВТКлассификаторТаблица
		|ГДЕ
		|	ВТКлассификаторТаблица.КодПроизводственногоКалендаря = &КодПроизводственногоКалендаря";
	
	ТЗРезультат = Запрос.Выполнить().Выгрузить();
	
	НаборЗаписей = РегистрыСведений.ПериодыНерабочихДнейКалендаря.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.КодПроизводственногоКалендаря.Установить(КодПроизводственногоКалендаря);
	
	Для Каждого СтрокаТЗ Из ТЗРезультат Цикл
		ЗаполнитьЗначенияСвойств(НаборЗаписей.Добавить(), СтрокаТЗ);
		ЗаполнитьЗначенияСвойств(ТаблицаИзменений.Добавить(), СтрокаТЗ);
	КонецЦикла;
	
	НаборЗаписей.Записать();
	
	ТаблицаИзменений.Свернуть("КодПроизводственногоКалендаря, Год");
	
	Возврат ТаблицаИзменений;
	
КонецФункции