1с формула пересчета валюты

Обновлено: 06.07.2024

Расширение «Курсы валют в формулах расчета динамических цен» позволяет использовать в формулах расчета динамических цен операнды текущих курсов валют [КурсДоллара], [КурсЕвро], [КурсЮаня] без внесения изменений в типовую конфигурацию "Управление нашей фирмой".

Операнды курсов валют отображаются в конструкторе формул при включении в настройках программы возможности использования нескольких валют, а также при наличии в справочнике соответствующих валют с кодами "840" для USD, "978" для EUR, "156" для CNY.

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

  • Записи курса валюты пользователем
  • Загрузке курсов валют штатной обработкой
  • Загрузке курсов валют штатным регламентным заданием

Для регламентного задания "Загрузка курсов валют" рекомендуется настроить расписание выполнения один раз в день (в начале суток).

Автоматический прерасчет динамических цен выполняется штатным регламентным заданием "Обработка очереди цен".

Расширение протестировано в конфигурациях УНФ начиная с версии 1.6.12.4 (режим совместимости 8.3.10) и далее по версию 1.6.25.236 (режим совместимости 8.3.16).
Для нормальной работы расширения необходимо снять галочку "Безопасный режим. " в свойствах расширения. Также может потребоваться изменить режим совместимости расширения на соответствующий режиму совместимости конфигурации (см. прилагающуюся инструкцию по установке расширения) при установке расширения или обновлении конфигурации УНФ.

ВНИМАНИЕ! В базовых версиях прикладных решений работа с расширениями не поддерживается.

ВАЖНО! Расширение версий с 1.0 по 1.6 предназначено для конфигураций УНФ по 1.6.16.219 включительно, расширение версии 1.7 - для УНФ начиная с 1.6.17.101, расширение версии 1.8 - для УНФ начиная с 1.6.19. расширение версии 1.9 - для УНФ начиная с 1.6.20. расширение версии 1.10 - для УНФ начиная с 1.6.21. расширение версии 1.11 - для УНФ начиная с 1.6.22. расширение версии 1.12 - для УНФ начиная с 1.6.25.

В типовой конфигурации УНФ начиная c редакции 1.6.17 реализован типовой пересчет по курсу валюты базовой цены:

"Автоматический пересчет динамических цен в валюте

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

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

Если курс валюты задаете вручную, динамические цены автоматически пересчитаются.

Если вы установили курс в зависимости от загружаемых курсов валют. Тогда запускайте пересчет кнопкой Регистрировать новые цены и закрыть при существенном для вас изменении курса..."

После обновления на УНФ 1.6.17 необходимо убрать множители курсов валют из формул расчета динамических цен для исключения удвоенной конвертации.

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

Для подключения имеющейся в данном расширении функции автоматического пересчета цены при загрузке курса, введите в формулу расчета операнд курса валюты, по примеру формулы №7.

Примеры формул с использованием операндов (только для версий расширения ниже 1.7):

1) Динамическая цена в рублях с расчетом от базовой цены в долларах по текущему курсу доллара

2) Динамическая цена в рублях с расчетом от базовой цены в евро по текущему курсу евро +1%

[Ценавевро] * [КурсЕвро] * (100 + 1) / 100

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

([Ценавдолларах] * [КурсДоллара]) + ([Ценавевро] * [КурсЕвро]) + [Ценаврублях]

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

МИН( ( [Ценавдолларах] * [КурсДоллара] ) , ( [Ценавевро] * [КурсЕвро] ) , [Ценаврублях] )

5) Динамическая цена в рублях с расчетом от базовых цен в разных валютах по текущим курсам соответствующих валют по логическому условию

? ( ([Ценаврублях] > 0) И ([Ценаврублях] < 1000) , [Ценаврублях] , МАКС( ( [Ценавдолларах] * [КурсДоллара] ) , ( [Ценавевро] * [КурсЕвро] ) ) )

где Ценавдолларах, Ценавевро, Ценаврублях - примеры идентификаторов базовых видов цен в справочнике

Примеры формул с использованием операндов (только для версий расширения начиная с 1.7):

6) Динамическая цена в рублях с расчетом от базовых цен в разных валютах по текущим курсам соответствующих валют по логическому условию

? ( ([Ценаврублях] > 0) И ([Ценаврублях] < 1000) , [Ценаврублях] , МАКС( [Ценавдолларах] , [Ценавевро] ) )

7) Динамическая цена в рублях с расчетом от базовых цен в юанях по логическому условию

Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования (Linus Torvalds).

среда, 12 марта 2014 г.

Типовая функция для пересчета из валюты в валюту

Для пересчета из валюты в валюту в типовых конфигурациях используется функция ПересчитатьИзВалютыВВалюту, расположенная в общем модуле - МодульВалютногоУчета.

Текст функции такой:

// Эта функция пересчитывает сумму из валюты ВалютаНач по курсу ПоКурсуНач
// в валюту ВалютаКон по курсу ПоКурсуКон
//
// Параметры:
// Сумма - сумма, которую следует пересчитать;
// ВалютаНач - ссылка на элемент справочника Валют;
// определяет валюты из которой надо пересчитвать;
// ВалютаКон - ссылка на элемент справочника Валют;
// определяет валюты в которую надо пересчитвать;
// ПоКурсуНач - курс из которого надо пересчитать;
// ПоКурсуКон - курс в который надо пересчитать;
// ПоКратностьНач - кратность из которого надо пересчитать (по умолчанию = 1);
// ПоКратностьКон - кратность в который надо пересчитать (по умолчанию = 1);
//
// Возвращаемое значение:
// Сумма, пересчитанная в другую валюту
//
Функция ПересчитатьИзВалютыВВалюту ( Сумма , ВалютаНач , ВалютаКон , ПоКурсуНач , ПоКурсуКон ,
ПоКратностьНач = 1 , ПоКратностьКон = 1 , Погрешность = 0 ,
СоответствиеПогрешностей = Неопределено, Ключ = Неопределено) Экспорт

Если ( ВалютаНач = ВалютаКон ) Тогда

// Считаем, что пересчет не нужен.
Возврат Сумма ;
КонецЕсли;

Если ( ПоКурсуНач = ПоКурсуКон )
и ( ПоКратностьНач = ПоКратностьКон ) Тогда

// пересчет суммы не требуется
Возврат Сумма ;
КонецЕсли;

Если ПоКурсуНач = 0
или ПоКурсуКон = 0
или ПоКратностьНач = 0
или ПоКратностьКон = 0 Тогда
ОбщегоНазначения . СообщитьОбОшибке ( "При пересчете из валюты '" + ВалютаНач + "' в валюту '" + ВалютаКон + "' обнаружен нулевой курс. Пересчет не произведен!" );
Возврат 0 ;
КонецЕсли;


НоваяСумма = ( Сумма * ПоКурсуНач * ПоКратностьКон ) / ( ПоКурсуКон * ПоКратностьНач );
Возврат ОбщегоНазначения . ОкруглитьСУчетомПогрешности ( НоваяСумма , 2 , Погрешность , СоответствиеПогрешностей , Ключ );

В УПП также существует функция ПересчитатьВСуммуРегл, которая предназначена для пересчета суммы управленческого учета в сумму регламентированного учета.

// Функция производит пересчет суммы в валюте упр. учета в валюту регл. учета.
//
Функция ПересчитатьВСуммуРегл ( СуммаУпр , ВалютаРегламентированногоУчета , ВалютаУправленческогоУчета , Дата ) Экспорт

ВалютаРегл = ВалютаРегламентированногоУчета ;
ВалютаУпр = ВалютаУправленческогоУчета ;

КурсВал = ПолучитьКурсВалюты ( ВалютаРегл , Дата );
КурсРегл = КурсВал . Курс ;
КратРегл = КурсВал . Кратность ;

КурсВал = ПолучитьКурсВалюты ( ВалютаУпр , Дата );
КурсУпр = КурсВал . Курс ;
КратУпр = КурсВал . Кратность ;

СуммаРегл = ПересчитатьИзВалютыВВалюту ( СуммаУпр , ВалютаУпр , ВалютаРегл , КурсУпр , КурсРегл , КратУпр , КратРегл );

Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования (Linus Torvalds).

среда, 12 марта 2014 г.

Типовая функция для получения курса валют на дату

// Возвращает курс валюты на дату
//
// Параметры:
// Валюта - Валюта (элемент справочника "Валюты")
// ДатаКурса - Дата, на которую следует получить курс
// ПроверятьКурс - Если Истина и курс или кратность для валюты не установлены (=0),
// то им будет присвоено значение 1 (для избежания дальнейших ошибок деления на 0)
//
// Возвращаемое значение:
// Структура, содержащая:
// Курс - курс валюты
// Кратность - кратность валюты
//
Функция ПолучитьКурсВалюты ( Валюта , ДатаКурса , ПроверятьКурс = Истина) Экспорт


Если НЕ ЗначениеЗаполнено ( Валюта ) Тогда
ОбщегоНазначения . СообщитьСлужебнуюИнформацию ( "ПолучитьКурсВалюты() - не заполнена валюта" );

Возврат Новый Структура ( "Курс, Кратность" , 1 , 1 );

СтруктураКурсов = РегистрыСведений . КурсыВалют . ПолучитьПоследнее ( ДатаКурса , Новый Структура ( "Валюта" , Валюта ));

Если СтруктураКурсов . Курс = 0 и ПроверятьКурс Тогда

СтруктураКурсов . Вставить ( "Курс" , 1 );
ОбщегоНазначения . СообщитьОбОшибке ( "По валюте """ + Валюта + """ на дату """ + ДатаКурса + """ обнаружен нулевой курс."
+ Символы . ПС + Символы . Таб + "Временно, для расчетов, присвоено значение 1." );

Если СтруктураКурсов . Кратность = 0 и ПроверятьКурс Тогда

СтруктураКурсов . Вставить ( "Кратность" , 1 );
ОбщегоНазначения . СообщитьОбОшибке ( "По валюте """ + Валюта + """ на дату """ + ДатаКурса + """ обнаружена нулевая кратность."
+ Символы . ПС + Символы . Таб + "Временно, для расчетов, присвоено значение 1." );

А это текст этой же функции только из УТ:

// Возвращает курс валюты на дату
//
// Параметры:
// Валюта - Валюта (элемент справочника "Валюты")
// ДатаКурса - Дата, на которую следует получить курс
//
// Возвращаемое значение:
// Структура, содержащая:
// Курс - курс валюты
// Кратность - кратность валюты
//
Функция ПолучитьКурсВалюты ( Валюта , ДатаКурса ) Экспорт

Структура = РегистрыСведений . КурсыВалют . ПолучитьПоследнее ( ДатаКурса , Новый Структура ( "Валюта" , Валюта ));
Возврат Структура ;

Дано: Один из типовых отчетов "1С: УТ", связанный с выводом цен или стоимостей в одном из видов цен.

Требуется: дополнить(изменить) вывод выбранных цен(стоимостей в выбранном виде цен) выводом цен (стоимостей) в выбранной пользователем валюте.

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

Таким образом, необходимо рассмотреть 5 вариантов:

Валюта цены

Выбранная валюта

Способ вычисления цены в выбранной валюте

Помножить на курс валюты цены и поделить на кратность валюты цены

Разделить на курс выбранной валюты и помножить на кратность выбранной валюты

Не рубли (совпадает с валютой цены)

Не рубли (не совпадает с валютой цены)

Рассчитать по кросс-курсу:

Получить цену в рублях:

Помножить на курс валюты цены и поделить на кратность валюты цены

Пересчитать цену в выбранную валюту:

Разделить на курс выбранной валюты и помножить на кратность выбранной валюты

Последний вариант является наиболее обобщенным случаем. Под этот алгоритм расчета подходят все предыдущие варианты.

Что же касается описанных выше заданий, то по ним предлагается наиболее очевидный способ решения. Отчет СКД дополняется пересчетом имеющихся данных в выбранную валюту.

Технически это выглядит следующим образом:

  1. В отчет добавляется виртуальная таблица – Регистр сведений – Валюты - СрезПоследних. В параметрах виртуальной таблицы указывается Период = &ВыбДата и Валюта = .Валюта. Задается имя таблицы – ВалютаЦены.
  2. В отчет добавляется вторая виртуальная таблица – Регистр сведений – Валюты - СрезПоследних. В параметрах виртуальной таблицы указывается Период = &ВыбДата и Валюта = &ВыбВалюта. Задается имя таблицы – ВалютаОтчета.
  3. Добавляются новые (или заменяются старые) поля расчета показателей по принципу.

= * ВалютаЦены.Курс*ВалютаОтчета.Кратность/ ВалютаЦены.Кратность/ ВалютаОтчета.Курс.

  1. Параметры отчета ВыбВалюта и ВыбДата добавляются в изменяемые параметры. Для гарантии заполнения следует включить требование обязательностьи заполнения.

В одной из задач про дату пересчета ничего не сказано. Можно спросить об этом экзаменатора. А можно понимать под датой пересчета – текущую дату. Для этого запретить изменение этого параметра пользователем, а в поле выражение задать формулу ТекущаяДата().

Решение очевидное и несложное, если не считать необходимость задания громоздких формул курсов и кратностей.

Однако на текущем релизе УТ 11 данное решение, увы, не заработало. Причина в том, что текст запроса, введенный в ЭХД в отчетах (по крайне мере тех, которые требуется доработать в данных задачах) в процессе формирования отчетов, подвергается программной доработке. Таким образом, если «родной» текст запроса изменен, то отчет «спотыкается» в связи с невозможностью его программно изменить.

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

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

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

Конечно же, такая функция обнаружилась:

Общий модуль – РаботаСКурсамиВалютУТ

Функция ПересчитатьСуммуДокументаВВалюту(СуммаДокумента, ТекущаяВалюта, НоваяВалюта, Дата) Экспорт

Рассмотрим ее описание в комментариях.


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

Известно, что в СКД можно вызывать экспортируемые функции общих модулей. Однако, как указано в описании, такой общий модуль должен исполняться на клиенте. В свойствах же общего модуля РаботаСКурсамиВалютУТ указаны параметры исполнения: Сервер и Внешнее соединение.

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

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

Добавим новый общий модуль (предварительно включив режим редактирования конфигурации). В материалах по подготовке к экзаменам добавляемые общие модули рекомендуют называть «Экзамен». В свойствах укажем галочки: Клиент, Сервер и Вызов сервера. В документации по стандартам 1С рекомендуется имя общего модуля дополнять вариантом исполнения. Для нашего варианта – Вызов сервера.

Таким образом, настройки модуля:


Созданный модуль будет содержать одну экспортируемую функцию, которую для ясности можно назвать ПересчитатьСуммуДокументаВВалюту. Назначение данной функции – вызвать одноименную функцию общего модуля РаботаСКурсамиВалютУТ и возвратить результат. Функцию необходимо снабдить инструкцией препроцессора НаСервере


Рассмотрим доработку СКД для типового отчета «Прайс-лист».

В СКД находим необходимые данные для пересчета – это поля Цена и Валюта:


Создадим параметр Валюта отчета. Параметр дата формирования уже имеется «Дата отчета».


Далее на закладке Вычисляемые поля добавляем вызов новой функции.


После этого добавляем новый ресурс. Заметим, что выражение агрегирования для Цены не является элементарным, поэтому следует его полностью скопировать и заменить аргумент Цена на ЦенаВВалюте.


В завершении на закладке Настройки требуется настроить отображение параметра Валюта отчета и добавить вывод ресурса ЦенаВВалюте на соответствующий уровень группировки.

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

Очевидным плюсом данного решения является то, что в этом случае дополнительных настроек, связанных с созданием ресурса и изменением структуры вывода не потребуется.

Читайте также: