Сценарии бюджетирования / Модуль менеджера

файл
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

// Возвращает имена блокируемых реквизитов для механизма блокирования реквизитов БСП.
// 
// Возвращаемое значение:
// 	Массив - имена блокируемых реквизитов:
//		* БлокируемыйРеквизит - Строка - Имя блокируемого реквизита.
//
Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт
	
	Результат = Новый Массив;
	
	Результат.Добавить("Периодичность");
	Результат.Добавить("Валюта");
	Результат.Добавить("БазоваяВалютаКурсов");
	
	Возврат Результат;
	
КонецФункции

// Возвращает наименьшую из переданной периодичности и периодичностей сценариев
//
// Параметры:
//  Сценарии  - Массив - СправочникСсылка.Сценарии, сценарии для которых 
//						требуется сравнить периодичность.
//  Периодичность  - ПеречислениеСсылка.Периодичность - Периодичность, с которой требуется сравнить
//						периодичность сценариев.
//
// Возвращаемое значение:
// 	ПеречислениеСсылка.Периодичность - вычисленная периодичность.
//
Функция ПривестиПериодичностьКПериодичностиСценария(Сценарии, Периодичность) Экспорт
	
	ПериодичностиСценариев = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(Сценарии, "Периодичность");
	ПериодичностиПоПорядку = Перечисления.Периодичность.УпорядоченныеПериодичности();
	
	ПериодичностьСценариев       = Перечисления.Периодичность.ПустаяСсылка();
	ИндексПериодичностиСценариев = 0;
	Для каждого Элемент Из ПериодичностиСценариев Цикл
		Индекс = ПериодичностиПоПорядку.Найти(Элемент.Значение);
		Если Индекс > ИндексПериодичностиСценариев Тогда
			ИндексПериодичностиСценариев = Индекс;
			ПериодичностьСценариев       = Элемент.Значение;
		КонецЕсли;
	КонецЦикла;
	
	Если Не ЗначениеЗаполнено(Периодичность) Тогда
		Периодичность = ПериодичностьСценариев;
	ИначеЕсли ИндексПериодичностиСценариев > ПериодичностиПоПорядку.Найти(Периодичность) Тогда 
		Периодичность = ПериодичностьСценариев;
	КонецЕсли;

	Возврат Периодичность;
	
КонецФункции

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

// Возвращает таблицу, содержащую информацию о незаполненных курсах сценариев. 
//
// Параметры:
//  Сценарии 		 - Массив - СправочникСсылка.Сценарии, сценарии, для которых необходимо выполнить проверку заполнения курсов.
//  Валюты 			 - Массив - Валюты, по которым необходимо выполнить проверку заполнения курсов.
//  ДатаНачала 		 - Дата - Начало периода проверки.
//  ДатаОкончания 	 - Дата - Окончание периода проверки.
//
// Возвращаемое значение:
// 	ТаблицаЗначений - таблица незаполненных курсов:
//		* Сценарий - СправочникСсылка.Сценарии - Сценарий.
//      * Валюта - СправочникСсылка.Валюты - Валюта.
//		* Период - Дата - Период курса валют.
//
Функция ПроверитьЗаполнениеКурсовСценариев(Сценарии, Валюты, ДатаНачала, ДатаОкончания) Экспорт
	
	ПериодичностиСценариев = ОбщегоНазначения.ЗначениеРеквизитаОбъектов(Сценарии, "Периодичность");
	КурсыСценариев = Справочники.Сценарии.ТаблицаКурсовСценария(Сценарии, Валюты, ДатаНачала, ДатаОкончания);
	КурсыСценариев.Индексы.Добавить("Сценарий, Валюта, Период");
	
	НезаполненныеКурсы = КурсыСценариев.СкопироватьКолонки("Сценарий, Валюта, Период");
	
	Для каждого Сценарий Из Сценарии Цикл
		Периоды = БюджетнаяОтчетностьВыводСервер.ПериодыБюджетногоОтчета(ДатаНачала, ДатаОкончания, ПериодичностиСценариев[Сценарий]);
		Для каждого Период Из Периоды Цикл
			Для каждого Валюта Из Валюты Цикл
				СтруктураПоиска = Новый Структура("Сценарий, Валюта, Период", Сценарий, Валюта, Период);
				Если КурсыСценариев.НайтиСтроки(СтруктураПоиска).Количество() = 0 Тогда
					НоваяСтрока = НезаполненныеКурсы.Добавить();
					ЗаполнитьЗначенияСвойств(НоваяСтрока, СтруктураПоиска);
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;
	
	Возврат НезаполненныеКурсы;
	
КонецФункции

// Определяет настройки начального заполнения элементов
//
// Параметры:
//  Настройки - Структура - настройки заполнения:
//   * ПриНачальномЗаполненииЭлемента - Булево - Если Истина, то для каждого элемента будет
//      вызвана процедура индивидуального заполнения ПриНачальномЗаполненииЭлемента.
Процедура ПриНастройкеНачальногоЗаполненияЭлементов(Настройки) Экспорт
	
	Настройки.ПриНачальномЗаполненииЭлемента = Истина;
	
КонецПроцедуры

// Вызывается при начальном заполнении справочника.
//
// Параметры:
//  КодыЯзыков - Массив - список языков конфигурации. Актуально для мультиязычных конфигураций.
//  Элементы   - ТаблицаЗначений - данные заполнения. Состав колонок соответствует набору реквизитов
//                                 справочника.
//  ТабличныеЧасти - Структура - Ключ - Имя табличной части объекта.
//                               Значение - Выгрузка в таблицу значений пустой табличной части.
//
Процедура ПриНачальномЗаполненииЭлементов(КодыЯзыков, Элементы, ТабличныеЧасти) Экспорт

	КодОсновногоЯзыка = ОбщегоНазначения.КодОсновногоЯзыка();

	#Область ИсполнениеБюджета
	Элемент = Элементы.Добавить();
	Элемент.ИмяПредопределенныхДанных = "ИсполнениеБюджета";
	Элемент.Наименование = НСтр("ru = 'Исполнение бюджета'", КодОсновногоЯзыка);
	Элемент.Код = "00001";
	Элемент.БазоваяВалютаКурсов = ЗначениеНастроекПовтИсп.БазоваяВалютаПоУмолчанию();
	#КонецОбласти

	#Область ФактическиеДанные
	Элемент = Элементы.Добавить();
	Элемент.ИмяПредопределенныхДанных = "ФактическиеДанные";
	Элемент.Наименование = НСтр("ru = 'Фактические данные'", КодОсновногоЯзыка);
	Элемент.Код = "00002";
	Элемент.БазоваяВалютаКурсов = ЗначениеНастроекПовтИсп.БазоваяВалютаПоУмолчанию();
	#КонецОбласти

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


// Вызывается при начальном заполнении создаваемого элемента.
//
// Параметры:
//  Объект                  - СправочникОбъект.Сценарии - заполняемый объект.
//  Данные                  - СтрокаТаблицыЗначений - данные заполнения.
//  ДополнительныеПараметры - Структура - Дополнительные параметры.
//
Процедура ПриНачальномЗаполненииЭлемента(Объект, Данные, ДополнительныеПараметры) Экспорт
	
	
	
КонецПроцедуры

#Область ДляВызоваИзДругихПодсистем

// СтандартныеПодсистемы.УправлениеДоступом

// Параметры:
//   Ограничение - см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт

	Ограничение.Текст =
	"РазрешитьЧтениеИзменение
	|ГДЕ
	|	ЭтоГруппа ИЛИ
	|	ЗначениеРазрешено(Ссылка)";

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

// Конец СтандартныеПодсистемы.УправлениеДоступом

#КонецОбласти

#КонецОбласти

#КонецЕсли

#Область ОбработчикиСобытий

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
	
	БюджетнаяОтчетностьВызовСервера.СценарииСФильтром(ДанныеВыбора, Параметры, СтандартнаяОбработка);
	
КонецПроцедуры

#КонецОбласти

Связанные материалы