198 lines
9.8 KiB
Plaintext
198 lines
9.8 KiB
Plaintext
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
// Copyright (c) 2024, ООО 1С-Софт
|
||
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
|
||
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
|
||
// Текст лицензии доступен по ссылке:
|
||
// https://creativecommons.org/licenses/by/4.0/legalcode
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
|
||
|
||
#Область ПрограммныйИнтерфейс
|
||
|
||
#Область ДляВызоваИзДругихПодсистем
|
||
|
||
// СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов
|
||
|
||
// Возвращает реквизиты объекта, которые разрешается редактировать
|
||
// с помощью обработки группового изменения реквизитов.
|
||
//
|
||
// Возвращаемое значение:
|
||
// Массив из Строка
|
||
//
|
||
Функция РеквизитыРедактируемыеВГрупповойОбработке() Экспорт
|
||
|
||
Результат = Новый Массив;
|
||
Результат.Добавить("СпособУстановкиКурса");
|
||
Результат.Добавить("Наценка");
|
||
Результат.Добавить("ОсновнаяВалюта");
|
||
Результат.Добавить("ФормулаРасчетаКурса");
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
// Конец СтандартныеПодсистемы.ГрупповоеИзменениеОбъектов
|
||
|
||
#КонецОбласти
|
||
|
||
#КонецОбласти
|
||
|
||
#Область СлужебныеПроцедурыИФункции
|
||
|
||
Функция КодыВалют() Экспорт
|
||
|
||
ТекстЗапроса =
|
||
"ВЫБРАТЬ
|
||
| Валюты.Ссылка КАК Ссылка,
|
||
| Валюты.Наименование КАК СимвольныйКод,
|
||
| Валюты.НаименованиеПолное КАК Представление
|
||
|ИЗ
|
||
| Справочник.Валюты КАК Валюты
|
||
|ГДЕ
|
||
| Валюты.СпособУстановкиКурса <> ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.НаценкаНаКурсДругойВалюты)
|
||
| И Валюты.СпособУстановкиКурса <> ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.РасчетПоФормуле)";
|
||
|
||
Запрос = Новый Запрос(ТекстЗапроса);
|
||
|
||
Валюты = Запрос.Выполнить().Выгрузить();
|
||
КопируемыеСтроки = Новый Массив;
|
||
|
||
Для Каждого Валюта Из Валюты Цикл
|
||
// Валюта участвует в формуле, если символьный код содержит буквы.
|
||
Если ЗначениеЗаполнено(СтрСоединить(СтрРазделить(Валюта.СимвольныйКод, "0123456789", Ложь), "")) Тогда
|
||
КопируемыеСтроки.Добавить(Валюта);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
Результат = Валюты.Скопировать(КопируемыеСтроки);
|
||
Результат.Индексы.Добавить("Ссылка");
|
||
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция КурсВалютыПоФормуле(Формула, Период, КодыВалют = Неопределено) Экспорт
|
||
|
||
Если КодыВалют = Неопределено Тогда
|
||
КодыВалют = Справочники.Валюты.КодыВалют();
|
||
КонецЕсли;
|
||
|
||
ТекстЗапроса =
|
||
"ВЫБРАТЬ
|
||
| Валюты.Ссылка КАК Ссылка,
|
||
| Валюты.СимвольныйКод КАК СимвольныйКод
|
||
|ПОМЕСТИТЬ Валюты
|
||
|ИЗ
|
||
| &КодыВалют КАК Валюты
|
||
|;
|
||
|
|
||
|////////////////////////////////////////////////////////////////////////////////
|
||
|ВЫБРАТЬ
|
||
| Валюты.СимвольныйКод КАК СимвольныйКод,
|
||
| ВЫБОР
|
||
| КОГДА ЕСТЬNULL(КурсыВалютСрезПоследних.Кратность, 1) > 0
|
||
| ТОГДА ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 1) / ЕСТЬNULL(КурсыВалютСрезПоследних.Кратность, 1)
|
||
| ИНАЧЕ 1
|
||
| КОНЕЦ КАК Курс
|
||
|ИЗ
|
||
| Валюты КАК Валюты
|
||
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&Период, ) КАК КурсыВалютСрезПоследних
|
||
| ПО (КурсыВалютСрезПоследних.Валюта = Валюты.Ссылка)";
|
||
|
||
Запрос = Новый Запрос(ТекстЗапроса);
|
||
Запрос.УстановитьПараметр("КодыВалют", КодыВалют);
|
||
Запрос.УстановитьПараметр("Период", Период);
|
||
|
||
Выражение = ФорматироватьЧисла(Формула);
|
||
|
||
Выборка = Запрос.Выполнить().Выбрать();
|
||
Пока Выборка.Следующий() Цикл
|
||
Выражение = СтрЗаменить(Выражение, Выборка.СимвольныйКод, Формат(Выборка.Курс, "ЧРД=.; ЧГ=0"));
|
||
КонецЦикла;
|
||
|
||
Возврат ОбщегоНазначения.ВычислитьВБезопасномРежиме(Выражение);
|
||
|
||
КонецФункции
|
||
|
||
Функция ФорматироватьЧисла(Строка) Экспорт
|
||
|
||
Результат = "";
|
||
Число = "";
|
||
ЕстьРазделительВЧисле = Ложь;
|
||
ПредыдущийСимвол = "";
|
||
|
||
ДлинаСтроки = СтрДлина(Строка);
|
||
Для Индекс = 1 По ДлинаСтроки Цикл
|
||
Если Индекс < ДлинаСтроки Тогда
|
||
СледующийСимвол = Сред(Строка, Индекс + 1, 1);
|
||
Иначе
|
||
СледующийСимвол = "";
|
||
КонецЕсли;
|
||
Символ = Сред(Строка, Индекс, 1);
|
||
|
||
ПредыдущийСимволЭтоРазделитель = ПредыдущийСимвол = "" Или СтрНайти("()[]/*-+%=<>, ", ПредыдущийСимвол) > 0;
|
||
|
||
Если ЭтоЦифра(Символ) И (ПредыдущийСимволЭтоРазделитель Или ЭтоЦифра(ПредыдущийСимвол) И ЗначениеЗаполнено(Число)) Тогда
|
||
Число = Число + Символ;
|
||
ИначеЕсли Не ЕстьРазделительВЧисле И (Символ = "," Или Символ = ".") И ЭтоЦифра(СледующийСимвол)
|
||
И (ЭтоЦифра(ПредыдущийСимвол) Или ПредыдущийСимволЭтоРазделитель) И ЗначениеЗаполнено(Число) Тогда
|
||
Число = Число + ".";
|
||
ЕстьРазделительВЧисле = Истина;
|
||
Иначе
|
||
Результат = Результат + Число + Символ;
|
||
Число = "";
|
||
ЕстьРазделительВЧисле = Ложь;
|
||
КонецЕсли;
|
||
|
||
ПредыдущийСимвол = Символ;
|
||
Символ = "";
|
||
КонецЦикла;
|
||
|
||
Результат = Результат + Число + Символ;
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
Функция ЭтоЦифра(Символ)
|
||
|
||
Возврат СтрНайти("1234567890", Символ) > 0;
|
||
|
||
КонецФункции
|
||
|
||
// Возвращаемое значение:
|
||
// Массив из СправочникСсылка.Валюты
|
||
//
|
||
Функция ВалютыЗагружаемыеИзИнтернета() Экспорт
|
||
|
||
УстановитьПривилегированныйРежим(Истина);
|
||
|
||
ТекстЗапроса =
|
||
"ВЫБРАТЬ
|
||
| Валюты.Ссылка КАК Ссылка,
|
||
| Валюты.Код КАК Код
|
||
|ИЗ
|
||
| Справочник.Валюты КАК Валюты
|
||
|ГДЕ
|
||
| НЕ Валюты.ПометкаУдаления
|
||
| И Валюты.СпособУстановкиКурса = ЗНАЧЕНИЕ(Перечисление.СпособыУстановкиКурсаВалюты.ЗагрузкаИзИнтернета)";
|
||
|
||
Запрос = Новый Запрос(ТекстЗапроса);
|
||
Валюты = Запрос.Выполнить().Выгрузить();
|
||
|
||
КодыВалютЗагружаемыхИзИнтернета = Валюты.ВыгрузитьКолонку("Код");
|
||
РаботаСКурсамиВалютЛокализация.ПриОпределенииКодовВалютЗагружаемыхИзИнтернета(КодыВалютЗагружаемыхИзИнтернета);
|
||
|
||
Результат = Новый Массив;
|
||
|
||
Для Каждого Валюта Из Валюты Цикл
|
||
Если КодыВалютЗагружаемыхИзИнтернета.Найти(Валюта.Код) <> Неопределено Тогда
|
||
Результат.Добавить(Валюта.Ссылка);
|
||
КонецЕсли;
|
||
КонецЦикла;
|
||
|
||
Возврат Результат;
|
||
|
||
КонецФункции
|
||
|
||
#КонецОбласти
|
||
|
||
#КонецЕсли |