wakadakawaka d6783569cf init
2025-06-02 20:57:43 +05:00

198 lines
9.8 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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