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