Добрый день!

В работе столкнулись с такой проблемой, как некорректная конвертация валютных платежей. В справочники курс валют были загружены курсы валют помесячно за период с 2009 по 2020 год. Далее мы произвели импорт платежей с помощью Excel за период с 2009 по январь 2020 г.

Обратили внимание что платеж, в карточке Платежа отражается по курсу, который соответствует Дате создания записи в системе. Т.е. в том случае когда загружаются платежи за ранние периоды, конвертация курса валют не учитывает дату платежа (хотя правильная логика - это конвертировать валютный платеж по курсу, соответствующему дате платежа). 

Выяснили что, в методе setCurrencyRate используется коробочный метод LoadCurrencyRate модуля MoneyModule, в который передается текущая дата платежа (т.е. дата создания записи в системе) Т.о. если импорт платежей был создан в системе в январе 2020 года, но, например - дата импортируемого платежа за ноябрь 2009 года, то платеж будет конвертироваться по курсу января 2020 года.

Возникает вопрос: почему логика опирается на дату создания записи, а не на дату фактического платежа?

Можно ли изменить логику в методе LoadCurrencyRate модуля MoneyModule?

 

Нравится

1 комментарий

Судя по коду, LoadCurrencyRate  получает дату извне в параметре, а заполняет её функция setCurrencyRate на конкретной карточке. Видимо, у Вас в ней берётся дата не из того поля. Нужно менять там, а не в MoneyModule.

/**
 * Calls onLoadCurrencyRate and sets specified currencyRateAttribute if currencyAttribute isn't empty.
 * @param currencyAttribute - Currency attribute.
 * @param currencyRateAttribute - Currency rate attribute.
 * @param startDate - Currency start date.
 * @param {function} callback
 */
moneyModule.LoadCurrencyRate = function(currencyAttribute, currencyRateAttribute, startDate, callback) {
	var currency = this.get(currencyAttribute);
	if (Ext.isEmpty(currency)) {
		return;
	}
	moneyModule.self.onLoadCurrencyRate.call(this, currency.value, startDate,
		function(item) {
			this.set(currencyRateAttribute, item.Rate);
			if (callback) {
				callback.call(this);
			}
		}, function() {
			this.set(currencyRateAttribute, null);
		});
};

Не вижу раздела «Платежи», видимо, он разработан в ходе проекта или переименован. Как называется схема карточки?

Мультивалютное поле работает с теми данными, которые есть в связанных с ним полях объекта: сумма, сумма в базовой валюте, выбранная валюта и курс. Вам нужно, чтобы уже при заливке были корректные данные во всех этих полях.

Показать все комментарии

Коллеги, добрый день! 

Подскажите какими инструментами вывести значение курса валют из справочника, чтобы он  всегда был виден пользователю.. располагался над реестром во всех разделах перед полем Что сделать, например?

Изображение удалено.

 

Нравится

1 комментарий
Лучший ответ

В MainHeaderSchemaNUI добавить полей, реализовать логику по загрузке значений

В MainHeaderSchemaNUI добавить полей, реализовать логику по загрузке значений

Показать все комментарии

Добрый день!
Версия 7.9
Коллеги, подскажите пжлст как решаете вопрос ведения курсов именно по датам... насколько трудоемка разработка и подводные камни.
Применение - Счет может быть выставлен вчерашним днем.. и с текущим функционалом "сразу приезхали" что называется).
Спасибо!

Нравится

8 комментариев

Здравствуйте, Елена!
А почему бы просто не загружать каждый день курсы с актуальных ресурсов через интеграцию себе на сайт? Подобные вопросы уже неоднократно поднимались здесь на форуме и есть примеры. Таким образом ведения счета "за вчера" и потянет вчерашний курс. Если пройтись по ключевым словам то можно найти несколько нужных Вам примеров, например http://www.community.terrasoft.ru/forum/topic/13012 и др.

Мария, спасибо!
Да, например , и эту тему вижу http://www.community.terrasoft.ru/blogs/7673.
Но здесь мы получаем курс на текущую дату. А если менеджер забыл выставить счет за вчера, а мы уже загрузили сегодняшний курс, то все получается...сумма будет некорректной...

Ну в таком случае просто в счете установить вчерашнюю дату. В таком случае система вам автоматически и пересчитает по "вчерашнему" курсу, а не по новому загруженному.

Мария,вот в этом и вопрос. Вы говорите о создании своей таблицы, где курс будет к дате привязан и тогда будет пересчет выполняться? В стандарте же мы затираем вчерашний курс новым...

В стандарте как раз есть история курса по датам. И при смене даты счета происходит смена курса. (Если ничего не изменилось в последней версии)

"Владимир Соколов" написал:

В стандарте как раз есть история курса по датам. И при смене даты счета происходит смена курса. (Если ничего не изменилось в последней версии)


Владимир, что то я не могу найти таких данных.. В справочнике Валюты никаких дат нету(. Подскажите пжлст где вы выдели). Спасибо!

"Елена К" написал:Подскажите пжлст где вы выдели

В справочнике валюты.
У меня английская версия, но суть та же (см. screenshot).

Коллеги, если кому-то нужно обеспечить актуальность курсов USD/EUR по данным ЦБ РФ, милости просим :) скачивайте наше бесплатное расширение https://marketplace.terrasoft.ru/app/bws-central-bank-exchange-rates-bp…

Показать все комментарии
Здравствуйте, коллеги.В системе реализованы курсы валют с двумя знаками после запятой. Этого не всегда достаточно, так как банки дают курсы с 4 знаками после запятой. Хотелось бы в последующих версиях системы увидеть доработку курсов, где будет возможность вводить курс с 4 знаками после запятой. Спасибо за внимание.
3 комментария

А можно сейчас ввести с курс*100 и division=100?

Как бы скоро не пришлось вместо четырёх цифр после запятой в курсе лишние нули скрывать.:mrgreen:

Алексей, здравствуйте!

Данная задача уже находится в бэклоге команды Sales.
Планируется к реализации в будущих версиях (ориентировочно 7.8).

Спасибо!

Показать все комментарии
Здравствуйте, коллеги.Возникла идея: автоматически синхронизировать курс валюты с официальным курсом, например, евро (например, для тех компаний, которые работают с оф. курсом), чтобы не вводить его вручную каждый день.
5 комментариев

Для официальных курсов разных стран и для разных платформ (особенно Terrasoft 3.Х) есть много готовых решений разной степени работоспособности и удобства. Я в своё время насчитал более 5 штук.

Я имел в виду, что этот функционал будет реализован в коробочной версии для основных стран - потребителей продуктов Террасофт (таких как Россия, Украина и т.д.), в новой версии продуктов.

"Резник Алексей Сергеевич" написал:Я имел в виду, что этот функционал будет реализован в коробочной версии для основных стран - потребителей продуктов Террасофт (таких как Россия, Украина и т.д.), в новой версии продуктов.

Ну, если TS разработает для Украины, России, США, то остальные партнеры по подобию разработают для других стран. И всё будет в коробке

У ЦБ РФ есть довольно хороший веб-сервис, с которым можно проинтегрироваться. У НБУ — разве что парсить HTML-страницу и надеяться, что дизайн не поменяют. Такое в коробку класть стыдно. А в США курсы валют мало кому нужны.

Здравствуйте!

Реализация этого функционала не предполагается. Проблема состоит в том, что в разных странах разные курсы валют и сделать универсальный функционал не получится.

Показать все комментарии

Здравствуйте, коллеги.
Заинтересовал вопрос, возможно ли автоматически синхронизировать курс валюты с официальным курсом, например, евро (например, для тех компаний, которые работают с оф. курсом), чтобы не вводить его вручную каждый день.

Нравится

2 комментария

Можно воспользоваться открытыми веб-сервисами ЦБ РФ для синхронизации:
http://www.cbr.ru/scripts/Root.asp?PrtId=DWS

И, например, настроить БП по расписанию, который будет своевременно обновлять информацию.

Лучше это вынести в идею, чтобы реализовали в базовом пакете

Показать все комментарии

Здравствуйте, форумчане!

В процессе работы с Sales 7.6 возник вопрос, как изменить количество знаков после запятой в курсе валют (по умолчанию 2 знака(хх,хх), нужно сделать 4 знака(хх,хххх)). Как это сделать?

Заранее благодарен за ответы.

Нравится

10 комментариев

Добрый день, Алексей.

Ответ Вы можете прочитать во вложенном pdf файле.

Здравствуйте, Алексей!

Для изменения количества знаков после запятой в курсе валют необходимо редактировать код карточки "Страница редактирования валюты", а так же проверить на совместимость все сущности, которые используют пересчет по курсу.

Спасибо!

Скажите, какой метод в CurrencyRateEditPage отвечает за количество знаков после запятой?

Нашел метод
private void UpdateRateEdit() {
RateEdit.Image = new ControlImage {};
RateEdit.DecimalPrecision = 4;
RateEdit.ModifiedInSchemaUId = new Guid("dffcf096-6982-4a07-92da-973f4261fd07");
}

изменил RateEdit.DecimalPrecision с 2 на 4, но при этом ничего не поменялось, все еще 2 знака после запятой. Подскажите, может я что-то упустил?

Добрый день!
У Вас есть объект CurrencyRate, который содержит колонку Rate. Эта колонка имеет тип Currency, который имеет Precision = 2. Чтобы вы могли использовать 4 знака после запятой, то у Вас есть 2 варианта:
1. Добавить свой объект CurrencyRateEx (к примеру) и создать в нем поле Rate как decimal (0.0001)
Далее по всей конфигурации заменить имя схемы CurrencyRate на CurrencyRateEx (во всех клиентских модулях)

2. Расширить объект CurrenctRate и добавить свое поле RateEx (к примеру), которое будет decimal (0.0001). Далее заменить по всех конфигурации использование поля Rate на RateEx, а в расширяющем объекте для старого поля Rate установить режим использования "никогда".

Также, не зависимо от этих двух вариантов Вам нужно будет изменять страницу редактирования справочника (CurrencyRateEditPage)

А нельзя просто поменять тип колонки Rate, поставив Precision = 4?

"Владимир Соколов" написал:А нельзя просто поменять тип колонки Rate, поставив Precision = 4?

Владимир, простая замена типа с изменением значения поля на 4 не решит вопрос корректно.

"Артем Гура" написал:(во всех клиентских модулях)

И во всех процессах (например, в InvoiceProduct и других)

Вообщем, надо решать этот вопрос глобально, а не у каждого клиента в каждом проекте, так как все центробанки дают курс валют с точностью 4 знака

Владимир, данную информацию уже передали в отдел разработки для реализации в последующих версиях продукта.

"Артем Гура" написал:

Добрый день!

У Вас есть объект CurrencyRate, который содержит колонку Rate. Эта колонка имеет тип Currency, который имеет Precision = 2. Чтобы вы могли использовать 4 знака после запятой, то у Вас есть 2 варианта:

1. Добавить свой объект CurrencyRateEx (к примеру) и создать в нем поле Rate как decimal (0.0001)

Далее по всей конфигурации заменить имя схемы CurrencyRate на CurrencyRateEx (во всех клиентских модулях)

2. Расширить объект CurrenctRate и добавить свое поле RateEx (к примеру), которое будет decimal (0.0001). Далее заменить по всех конфигурации использование поля Rate на RateEx, а в расширяющем объекте для старого поля Rate установить режим использования "никогда".

Также, не зависимо от этих двух вариантов Вам нужно будет изменять страницу редактирования справочника (CurrencyRateEditPage)

Спасибо, Артем, буду реализовывать.

Показать все комментарии

Вниманию предлагается набор функций для загрузки в Terrasoft 3.X актуального курса доллара к гривне по версии Нацбанка Украины. Можно получать как официальный, так и средневзвешенный рыночный курс.
 Национальный банк Украины

Функция непосредственного получения курса. Если входной параметр true – получает официальный курс, если false или без параметра – средневзвешенный.

Результат - объект с двумя полями. Rate – количество украинских гривен за 1 доллар США (например, 7.993). Date – указанная на сайте дата этого курса. Для официального – следующий рабочий день, для среднего – предыдущий.

function GetUSDRate(IsOfficial) {
        try {
            var Result = new Object();
                var webAddress = 'http://bank.gov.ua/control/uk/index';
                var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.6.0");
                xmlHttpReq.open("GET", webAddress, false);        
            xmlHttpReq.send();
            var HtmlText = xmlHttpReq.responseText.replace(/\s/g, "");
            if (IsOfficial) {
                var BeginText = '100 ДоларівСША';
                var EndText = '100 Євро';
               
                } else {
                        var BeginText = '-->грн.за100доларівСША';
                        var EndText =  '
Детальніше...';
                }

                var BeginIndex = HtmlText.indexOf(BeginText)+ BeginText.length;
                var EndIndex = HtmlText.indexOf(EndText);
            var HtmlFragment = HtmlText.substring(BeginIndex, EndIndex);
                var Rate = parseFloat(HtmlFragment);
                if (isNaN(Rate)) {
                        Log.Write(2, 'Ошибка при получении курса Нацбанка');
                        return null;
                }
                Result.Rate = Rate/100;
            if (IsOfficial) {          
                BeginText = 'Офіційнийкурсгривнідоіноземнихвалютз14.00';
                EndText = '';
                } else {
                    BeginText = 'Середньозваженийкурснаміжбанківськомуринку(начасвстановленняофіційногокурсугривні)';
                    EndText = '

Нравится

Поделиться

4 комментария

Александр, спасибо!
Правильно ли я понимаю, что функция рассчитана на текущую разметку официального сайта НБУ и Вы будете следить за ее изменениями, внося соответствующие правки в свое решение?

Да, так и есть. У НБУ, в отличие от ЦБРФ, нет публичного XML API.
За полгода дизайн сайта НБУ не менялся, пока работает нормально.

Александр! функция перестала работать!

выдает сообщение: "Ошибка при получении курса Нацбанка"

Поправьте скрипт как можно скорее!
Спасибо.

Исправлено.

Показать все комментарии

Здравствуйте, коллеги!

Так как курсы валют меняются каждый день, целесообразно написать свою функцию, которая будет "подтягивать" свежие курсы и записывать в справочник "Курсы валют".
Ниже приведен пример такой функции.

В параметр cur_code передается код валюты (840 - Доллар США, 978 - Евро и т.д.), после чего, в зависимости от указанного кода, в справочник "Курсы валют" записывается курс на текущую дату.

function GetExchangeRate(cur_code)
{  
        var CurDate = new Date();
        var year = CurDate.getFullYear().toString();
        var month = CurDate.getMonth().toString();
        if (month.length == 1)
        {
                month = "0" + month;
        }
        var day = CurDate.getDate().toString();
        if (day.length == 1)
        {
                day = "0" + day;
        }      
        var webAddress = "http://cbrates.rbc.ru/tsv/" + cur_code.toString() + "/" + year +"/" + month +"/" + day + ".tsv";
        var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.6.0");
        //xmlHttpReq.open("GET", "http://cbr.ru/scripts/XML_daily.asp", false);
        xmlHttpReq.open("GET", webAddress, false);         
        xmlHttpReq.send();
        var RUB_USD_curs = xmlHttpReq.responseText.replace(/\s/g, "");
        //получаем текущий курс             
        RUB_USD_curs= parseFloat(RUB_USD_curs);        
        //записываем тукущий курс
        var Dataset = Services.GetNewItemByUSI('ds_CurrencyRate');
        var CurrencyID = '';
        var Currency = '';
        switch (cur_code)
        {
                //840 - код доллара США, для других валют другой код, соответсвенно другой CurrencyID
                 case 840:
                        CurrencyID = '{D18AAED6-14F9-435C-9606-0E90CAE816F7}';
                        Currency = 'Доллар США';
                 break;
        }      
        ApplyDatasetFilter(Dataset, 'CurrencyID', CurrencyID, true);
        Dataset.Open();
        Dataset.Append();
        Dataset.Values('Rate') = RUB_USD_curs;
        Dataset.Values('InternalRate') = RUB_USD_curs; 
        Dataset.Values('StartDate') = GetLocalDate();
        Dataset.Values('CurrencyID') = CurrencyID;
        Dataset.Values('CurrencyName') = Currency;
        Dataset.Post();
        Dataset.Close();                       
}

Данную функцию можно запускать, к примеру, при старте Terrasoft, а также добавить кнопку "Получить последние курсы" для справочника "Валюты" и в обработчике OnClick для кнопки вызвать функцию приведенную выше.

Нравится

Поделиться

11 комментариев

Пример интересный. Но в качестве источника для курсов валют я бы советовал использовать веб сервис ЦБР, который находится здесь.

В приведенной функции выше, есть закоментированная строка:

//xmlHttpReq.open("GET", "http://cbr.ru/scripts/XML_daily.asp", false);

Здесь используется веб сервис ЦБР, который возвращает xml файл с курсами всех основных валют по отношению к российскому рублю на текущую дату:

var RUB_USD_curs = xmlHttpReq.responseText;

Можно также использовать этот сервис, "распарсив" xml.

Спасибо, Дмитрий! Напомню, что ранее функции по получению курсов валют уже публиковал Андрей Кихтенко: http://www.community.terrasoft.ua/blogs/2508

Баг #1
var month = CurDate.getMonth().toString();
возвращает например для марта значение '2', потом запрос к rbc идет с датой на месяц раньше:smile:
поэтому меняем на
var month = (CurDate.getMonth()+1).toString();

Баг #2
переменная получает например значение
RUB_USD_curs = 129.8923
что как бы еще не курс:smile: и записывать это в справочник курсов валют нельзя
поэтому например так
var RUB_USD_curs = xmlHttpReq.responseText.replace(/\s/g, "");
RUB_USD_curs = parseFloat(RUB_USD_curs.substr(1, RUB_USD_curs.length));
вот теперь будет 29.8923

Feature #3
строка при создании новой записи ближе к концу
Dataset.Values('CurrencyName') = Currency;
совсем ни к чему
аналогично совсем ни к чему
ApplyDatasetFilter(Dataset, 'CurrencyID', CurrencyID, true);
Dataset.Open();

и Dataset.Close() в конце, вы же пользуетесь Append, зачем предварительно открывать да фильтровать датасет?

+ я бы полученный курс писал к валюте рубль (меняем CurrencyID)

Я просто оставлю это здесь: реализация на стороне сервера.

Добрый день!

Скажите, пожалуйста, можно ли загрузить курсы валют ЦБ Чехии и каким образом?
http://www.cnb.cz

Курсы нужны только для трех валют Рубль, Доллар и Евро

Марина, аналогично с примером приведенным Выше.
Только отправлять запрос к веб-серверу по ссылке http://www.cnb.cz/cs/financni_trhy/devizovy_trh/kurzy_devizoveho_trhu/d… , и соответственно парсить его в соответствии с его форматом.

Добрый день!

Получилось в переменную записать данные с сайта.
Дмитрий, подскажите, пожалуйста, каким образом выбирать данные из переменной.

Здравствуйте Марина.

Не совсем понял суть вопроса. Можно поподробнее, желательно добавить код.

По сути Вам нужно отправить запрос:

var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.6.0");
xmlHttpReq.open("GET", webAddress, false);         
xmlHttpReq.send();

Далее, получаем ответ от сервера:

var RUB_USD_curs = xmlHttpReq.responseText;

В этой переменной и будут курсы. Далее разбейте эту строку на массив по ентеру (каждый элемент массива - курс отдельной валюты). И для нужных валют среди"мусора" выделите сам курс и преобразуйте полученное значение с типа строка в тип дробное число, и запишите в датасет.

//получаем текущий курс              
RUB_USD_curs= parseFloat(RUB_USD_curs);         
//записываем тукущий курс
var Dataset = Services.GetNewItemByUSI('ds_CurrencyRate');
//....

Здравствуйте! Дмитрий, спасибо! Получилось записать курсы. Сделала следующим образом:

var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.6.0");
xmlHttpReq.open("GET", URL, false);         
xmlHttpReq.send();
var Curs = xmlHttpReq.responseText.replace(/\s/g, "");
var ArrayCurr = Curs.split('|');

И уже из созданного массива выбирала нужные курсы.

Марина, не за что! Если буду дополнительные вопросы - обращайтесь.

Показать все комментарии

Проблема заключается в определении сегодняшней даты для курса валют...
Процедура:
1) Установил в справочнике курс евро на сегодня 16.09.2009
2) Открыл вчерашний счёт и переставил дату на сегодня.
3) На всякий случай переоткрыл счёт и выбрал доллар, затем евро(для обновления) - курс остался вчерашний.
4) Создал новый счёт(для проверки), и в новом счёте курс вчерашний.
4) Закрыл систему, открыл заново
5) Открыл оба счёта выбрал евро - курс установился сегодняшний.

Предварительное заключение:
Не обновляется курс согласно даты, так как отладчик в GetRate запускает правильную дату, но на выходе получает курс предидущей даты.

---
Конфигурация:
TSCRM 3.3.1.36
Firebird 2.0 (v.2.0.3.12981)

Нравится

11 комментариев

У меня была та же проблема, долго не могли разобраться! Нам помогло только использование Даты и времени (курс на 16.09.09 00:00:00 до 16.09.09 23:59:59). Странно конечно, но вопрос мы таким способом закрыли :wink:

--
www.it-sfera.com.ua

Здравствуйте.
Обновитесь как минимум до версии 3.3.1.38

"Клименко Николай" написал:Обновитесь как минимум до версии 3.3.1.38

Обновился до версии 3.3.1.45 - теперь курс на дату счёта вобще не находит...Говорит нет курса на 17.09.2009...

"Виталий Ковалишин aka samael" написал:

А можете детальнее рассказать что и где Вы правили?

---
Конфигурация:
TSCRM 3.3.1.36 - обновился до 3.3.1.45
Firebird 2.0 (v.2.0.3.12981)

Сервис wnd_CurrencyRateEdit
Для контролов edtStartDate и edtDuDate
Свойство Kind установить в dtkDateTime

--
www.it-sfera.com.ua

"Виталий Ковалишин aka samael" написал:Сервис wnd_CurrencyRateEdit
Для контролов edtStartDate и edtDuDate
Свойство Kind установить в dtkDateTime

На 3.3.1.45 теперь находит курс, но всё равно предидущий выставленный...
Имеет ли смысл откатится до 3.3.1.36 и проверить реакцию на эти изменения там?

---
Конфигурация:
TSCRM 3.3.1.36
Firebird 2.0 (v.2.0.3.12981)

Я это делал на 3.3.0

--
www.it-sfera.com.ua

Попробуйте 38-ые без изминений или обновитесь до 3.3.1.59(на данный момент - самый стабильный билд)

обновился до 3.3.1.59
всё равно определяет курс за дату первого открытого счёта
То есть:
Открыл счёт за сегодня курс опредилился за сегодня...
Закрыл счёт
Открыл счёт за 16.09.09 переставил валюту на дол.США
Сообщение "Курс на 16.09.09 не выставлен" (его просто нет)
Возвращаю валюту на Евро, - получаю курс не за 16.09.09, а за сегодня.

---
Конфигурация:
TSCRM 3.3.1.36
Firebird 2.0 (v.2.0.3.12981)

Курс выставляется в зависимости от валюты (в момент ее изменения в карточке счета) с учетом даты, а не в момент изменения даты.
Видимо проблема именно в Вашей базе. Необходимо протестировать данную проблему на Вашей базе.
Согласно Вашего обращения заведен инцидент №056218.

"Клименко Николай" написал:

Огромное спасибо за Вашу помощь.
Решение следующее:
1)Обновится до 3.3.1.59
2)
"Клименко Николай" написал:
Вам необходимо изменить сервис scr_CurrencyUtils в функции GetRate дописать строку EnableDatasetFilters(Dataset, false);
В месте, как указано на рис 1 во вложении.
После строки var Dataset = GetSingleItemByCode ....
Перед строкой ApplyDatasetFilter ....
Всё работает, но только если воспользоваться Вашим советом

3)
"Виталий Ковалишин aka samael" написал:У меня была та же проблема, долго не могли разобраться! Нам помогло только использование Даты и времени (курс на 16.09.09 00:00:00 до 16.09.09 23:59:59). Странно конечно, но вопрос мы таким способом закрыли :wink:

Только после таких танцев с бубном курс действительно стал определятся в соответствии с датой курса.
Ещё раз, всем спасибо за помощь.
---
Конфигурация:
TSCRM 3.3.1.59
Firebird 2.0 (v.2.0.3.12981)

Очень весело :)

--
www.it-sfera.com.ua

Показать все комментарии