Валюты / Модуль менеджера

файл
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

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

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

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

// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов

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

// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов

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

//++ НЕ ГОСИС

// Процедура заполняет справочник валюты значениями по умолчанию.
//
Процедура ЗаполнитьВалютыПоУмолчанию() Экспорт
	
	КодВалюты = НастройкиСистемыЛокализация.КодВалютыПоУмолчанию();
	
	Коды = Новый Массив;
	Коды.Добавить(КодВалюты);
	РаботаСКурсамиВалют.ДобавитьВалютыПоКоду(Коды);
	
КонецПроцедуры

//-- НЕ ГОСИС

// Возвращает количество элементов справочника Валюты.
// Учитывает все элементы.
//
// Возвращаемое значение:
//     Число - количество валют.
//
Функция КоличествоВалют() Экспорт
	
	УстановитьПривилегированныйРежим(Истина);
	
	Количество = 0;
	
	Запрос = Новый Запрос;
	Запрос.Текст =
		"ВЫБРАТЬ
		|	КОЛИЧЕСТВО(*) КАК Количество
		|ИЗ
		|	Справочник.Валюты КАК Валюты";
	
	Выборка = Запрос.Выполнить().Выбрать();
	Если Выборка.Следующий() Тогда
		Количество = Выборка.Количество;
	КонецЕсли;
		
	Возврат Количество;
	
Конецфункции

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

// СтандартныеПодсистемы.ВерсионированиеОбъектов
// Определяет настройки объекта для подсистемы ВерсионированиеОбъектов.
//
// Параметры:
// Настройки - Структура - настройки подсистемы.
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт
КонецПроцедуры
// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов

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

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

Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
	
	//++ НЕ ГОСИС
	Если Параметры.Свойство("ВалютаОснованияСчетаФактуры") Тогда
		
		СтандартнаяОбработка = Ложь;
		
		ВалютаРегламентированногоУчета = Константы.ВалютаРегламентированногоУчета.Получить();
		
		ДанныеВыбора = Новый СписокЗначений;
		ДанныеВыбора.Добавить(ВалютаРегламентированногоУчета);
		
		Если ЗначениеЗаполнено(Параметры.ВалютаОснованияСчетаФактуры)
		 И Параметры.ВалютаОснованияСчетаФактуры <> ВалютаРегламентированногоУчета Тогда
			ДанныеВыбора.Добавить(Параметры.ВалютаОснованияСчетаФактуры);
		КонецЕсли;
		
	КонецЕсли;
	//-- НЕ ГОСИС
	
КонецПроцедуры

Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
	
	//++ НЕ ГОСИС
	Если ВидФормы = "ФормаСписка" И Не ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоВалют")
	И КоличествоВалют() = 1 Тогда
		
		Параметры.Вставить("Ключ", ДоходыИРасходыСервер.ПолучитьВалютуУправленческогоУчета());
		ВыбраннаяФорма = "ФормаЭлемента";
		СтандартнаяОбработка = Ложь;
		
	КонецЕсли;
	//-- НЕ ГОСИС
	
КонецПроцедуры

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

#Область СлужебныеПроцедурыИФункции

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

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

	Выражение = ФорматироватьЧисла(Формула);
	
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		Выражение = СтрЗаменить(Выражение, Выборка.СимвольныйКод, Формат(Выборка.Курс, "ЧРД=.; ЧГ=0"));
	КонецЦикла;
	
	Возврат ОбщегоНазначения.ВычислитьВБезопасномРежиме(Выражение);
	
КонецФункции

Функция ФорматироватьЧисла(Строка) Экспорт
	
	Результат = "";
	Число = "";
	ЕстьРазделительВЧисле = Ложь;
	ПредыдущийСимвол = "";
	
	ДлинаСтроки = СтрДлина(Строка);
	Для Индекс = 1 По ДлинаСтроки Цикл
		Если Индекс < ДлинаСтроки Тогда
			СледующийСимвол = Сред(Строка, Индекс + 1, 1);
		Иначе
			СледующийСимвол = "";
		КонецЕсли;
		Символ = Сред(Строка, Индекс, 1);
		
		ПредыдущийСимволЭтоРазделитель = ПредыдущийСимвол = "" Или СтрНайти("()[]/*-+%=<>, ", ПредыдущийСимвол) > 0;
		
		Если ЭтоЦифра(Символ) И (ПредыдущийСимволЭтоРазделитель Или ЭтоЦифра(ПредыдущийСимвол) И ЗначениеЗаполнено(Число)) Тогда
			Число = Число + Символ;
		ИначеЕсли Не ЕстьРазделительВЧисле И (Символ = "," Или Символ = ".") И ЭтоЦифра(СледующийСимвол)
			И (ЭтоЦифра(ПредыдущийСимвол) Или ПредыдущийСимволЭтоРазделитель) И ЗначениеЗаполнено(Число) Тогда
			Число = Число + ".";
			ЕстьРазделительВЧисле = Истина;
		Иначе
			Результат = Результат + Число + Символ;
			Число = "";
			ЕстьРазделительВЧисле = Ложь;
		КонецЕсли;
		
		ПредыдущийСимвол = Символ;
		Символ = "";
	КонецЦикла;
	
	Результат = Результат + Число + Символ;
	Возврат Результат;
	
КонецФункции

Функция ЭтоЦифра(Символ)
	
	Возврат СтрНайти("1234567890", Символ) > 0;
	
КонецФункции

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

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

#КонецЕсли

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