#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
#Область ДляВызоваИзДругихПодсистем
Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт
Результат = Новый Массив;
Результат.Добавить("СпособУстановкиКурса");
Результат.Добавить("Наценка");
Результат.Добавить("ОсновнаяВалюта");
Результат.Добавить("ФормулаРасчетаКурса");
Возврат Результат;
КонецФункции
#КонецОбласти
Процедура ЗаполнитьВалютыПоУмолчанию() Экспорт
КодВалюты = НастройкиСистемыЛокализация.КодВалютыПоУмолчанию();
Коды = Новый Массив;
Коды.Добавить(КодВалюты);
РаботаСКурсамиВалют.ДобавитьВалютыПоКоду(Коды);
КонецПроцедуры
Функция КоличествоВалют() Экспорт
УстановитьПривилегированныйРежим(Истина);
Количество = 0;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КОЛИЧЕСТВО(*) КАК Количество
|ИЗ
| Справочник.Валюты КАК Валюты";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Количество = Выборка.Количество;
КонецЕсли;
Возврат Количество;
Конецфункции
Функция ПолучитьВалютуПоУмолчанию() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 2
| Валюты.Ссылка КАК Валюта
|ИЗ
| Справочник.Валюты КАК Валюты";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() И Выборка.Количество() = 1 Тогда
Валюта = Выборка.Валюта;
Иначе
Валюта = Справочники.Валюты.ПустаяСсылка();
КонецЕсли;
Возврат Валюта;
КонецФункции
Процедура ПриОпределенииНастроекВерсионированияОбъектов(Настройки) Экспорт
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытий
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
Если Параметры.Свойство("ВалютаОснованияСчетаФактуры") Тогда
СтандартнаяОбработка = Ложь;
ВалютаРегламентированногоУчета = Константы.ВалютаРегламентированногоУчета.Получить();
ДанныеВыбора = Новый СписокЗначений;
ДанныеВыбора.Добавить(ВалютаРегламентированногоУчета);
Если ЗначениеЗаполнено(Параметры.ВалютаОснованияСчетаФактуры)
И Параметры.ВалютаОснованияСчетаФактуры <> ВалютаРегламентированногоУчета Тогда
ДанныеВыбора.Добавить(Параметры.ВалютаОснованияСчетаФактуры);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
Если ВидФормы = "ФормаСписка" И Не ПолучитьФункциональнуюОпцию("ИспользоватьНесколькоВалют")
И КоличествоВалют() = 1 Тогда
Параметры.Вставить("Ключ", ДоходыИРасходыСервер.ПолучитьВалютуУправленческогоУчета());
ВыбраннаяФорма = "ФормаЭлемента";
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция КодыВалют() Экспорт
ТекстЗапроса =
"ВЫБРАТЬ
| Валюты.Ссылка КАК Ссылка,
| Валюты.Наименование КАК СимвольныйКод,
| Валюты.НаименованиеПолное КАК Представление
|ИЗ
| Справочник.Валюты КАК Валюты
|ГДЕ
| Валюты.СпособУстановкиКурса <> ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.НаценкаНаКурсДругойВалюты)
| И Валюты.СпособУстановкиКурса <> ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.РасчетПоФормуле)";
Запрос = Новый Запрос(ТекстЗапроса);
Валюты = Запрос.Выполнить().Выгрузить();
КопируемыеСтроки = Новый Массив;
Для Каждого Валюта Из Валюты Цикл
Если ЗначениеЗаполнено(СтрСоединить(СтрРазделить(Валюта.СимвольныйКод, "0123456789", Ложь), "")) Тогда
КопируемыеСтроки.Добавить(Валюта);
КонецЕсли;
КонецЦикла;
Результат = Валюты.Скопировать(КопируемыеСтроки);
Результат.Индексы.Добавить("Ссылка");
Возврат Результат;
КонецФункции
Функция КурсВалютыПоФормуле(Формула, Период, КодыВалют = Неопределено) Экспорт
Если КодыВалют = Неопределено Тогда
КодыВалют = Справочники.Валюты.КодыВалют();
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ
| Валюты.Ссылка КАК Ссылка,
| Валюты.СимвольныйКод КАК СимвольныйКод
|ПОМЕСТИТЬ Валюты
|ИЗ
| &КодыВалют КАК Валюты
|;
|
|
|ВЫБРАТЬ
| Валюты.СимвольныйКод КАК СимвольныйКод,
| ВЫБОР
| КОГДА ЕСТЬNULL(КурсыВалютСрезПоследних.Кратность, 1) > 0
| ТОГДА ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 1) / ЕСТЬNULL(КурсыВалютСрезПоследних.Кратность, 1)
| ИНАЧЕ 1
| КОНЕЦ КАК Курс
|ИЗ
| Валюты КАК Валюты
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК КурсыВалютСрезПоследних
| ПО (КурсыВалютСрезПоследних.Валюта = Валюты.Ссылка)";
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("КодыВалют", КодыВалют);
Запрос.УстановитьПараметр("Период", Период);
Выражение = ФорматироватьЧисла(Формула);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Выражение = СтрЗаменить(Выражение, Выборка.СимвольныйКод, Формат(Выборка.Курс, "ЧРД=.; ЧГ=0"));
КонецЦикла;
Возврат ОбщегоНазначения.ВычислитьВБезопасномРежиме(Выражение);
КонецФункции
Функция ФорматироватьЧисла(Строка) Экспорт
Результат = "";
Число = "";
ЕстьРазделительВЧисле = Ложь;
ПредыдущийСимвол = "";
ДлинаСтроки = СтрДлина(Строка);
Для Индекс = 1 По ДлинаСтроки Цикл
Если Индекс < ДлинаСтроки Тогда
СледующийСимвол = Сред(Строка, Индекс + 1, 1);
Иначе
СледующийСимвол = "";
КонецЕсли;
Символ = Сред(Строка, Индекс, 1);
ПредыдущийСимволЭтоРазделитель = ПредыдущийСимвол = "" Или СтрНайти("()[]/*-+%=<>, ", ПредыдущийСимвол) > 0;
Если ЭтоЦифра(Символ) И (ПредыдущийСимволЭтоРазделитель Или ЭтоЦифра(ПредыдущийСимвол) И ЗначениеЗаполнено(Число)) Тогда
Число = Число + Символ;
ИначеЕсли Не ЕстьРазделительВЧисле И (Символ = "," Или Символ = ".") И ЭтоЦифра(СледующийСимвол)
И (ЭтоЦифра(ПредыдущийСимвол) Или ПредыдущийСимволЭтоРазделитель) И ЗначениеЗаполнено(Число) Тогда
Число = Число + ".";
ЕстьРазделительВЧисле = Истина;
Иначе
Результат = Результат + Число + Символ;
Число = "";
ЕстьРазделительВЧисле = Ложь;
КонецЕсли;
ПредыдущийСимвол = Символ;
Символ = "";
КонецЦикла;
Результат = Результат + Число + Символ;
Возврат Результат;
КонецФункции
Функция ЭтоЦифра(Символ)
Возврат СтрНайти("1234567890", Символ) > 0;
КонецФункции
Функция ВалютыЗагружаемыеИзИнтернета() Экспорт
УстановитьПривилегированныйРежим(Истина);
ТекстЗапроса =
"ВЫБРАТЬ
| Валюты.Ссылка КАК Ссылка,
| Валюты.Код КАК Код
|ИЗ
| Справочник.Валюты КАК Валюты
|ГДЕ
| НЕ Валюты.ПометкаУдаления
| И Валюты.СпособУстановкиКурса = ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета)";
Запрос = Новый Запрос(ТекстЗапроса);
Валюты = Запрос.Выполнить().Выгрузить();
КодыВалютЗагружаемыхИзИнтернета = Валюты.ВыгрузитьКолонку("Код");
РаботаСКурсамиВалютЛокализация.ПриОпределенииКодовВалютЗагружаемыхИзИнтернета(КодыВалютЗагружаемыхИзИнтернета);
Результат = Новый Массив;
Для Каждого Валюта Из Валюты Цикл
Если КодыВалютЗагружаемыхИзИнтернета.Найти(Валюта.Код) <> Неопределено Тогда
Результат.Добавить(Валюта.Ссылка);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
#КонецОбласти
#КонецЕсли