1с пересчет валюты в запросе

Обновлено: 03.07.2024

В этой главе разберем практический пример задачи с переменным списком валют – реализуем требование задачи по погашению задолженности оплатой по методу FIFO. Переплату будем отражать как аванс по контрагенту. Сделаем это в обработке проведения документа «Поступление денег».

Проведение документа «Поступление денег»

Алгоритм погашения задолженности в разрезе накладных по FIFO уже разбирали ранее в блоке «Взаиморасчеты – автоматический зачет оплат и/или погашение задолженности».

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

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

Для всех имеющихся задолженностей будем определять курс валюты на дату оплаты и рассчитывать рублевый эквивалент. Для этого при получении данных по остаткам задолженностей в запросе будем делать соединение таблицы остатков РН «Взаиморасчеты» с данными виртуальной таблицы срез последних РС «Курсы валют»:

Схема соединения таблиц для получения данных о задолженностях

Рисунок 1 – Схема соединения таблиц для получения данных о задолженностях

При поступлении оплаты возможны три варианта:

  • Оплата меньше рублевого эквивалента долга по накладной
  • Оплата равна рублевому эквиваленту долга по накладной
  • Оплата больше рублевого эквивалента долга по накладной.

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

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

Сумма погашения = СуммаОплаты/Курс.

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

Сумма погашения = Сумма долга (вал.)

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

Сумма погашения = Сумма долга (вал.)

Также пересчет по курсу не выполняем.

Алгоритм на этом не заканчивается. Рассчитываем остаток оплаты после погашения долга: для этого от суммы оплаты отнимаем рублевый эквивалент погашенного долга.

Далее применяем ту же логику для анализа остатка оплаты.


Cумма погашения долга по Накладной № 1 составит 1 000 / 20 = 50,00 долларов.


Cумма погашения долга по Накладной № 1 равна Сумме долга (вал.) и составит 100,00 долларов.


Cумма погашения долга по Накладной № 1 равна Сумме долга (вал.) и составит 100,00 долларов. Cумма погашения долга по Накладной № 2 составит 1 000 / 30 = 33,33 Евро.

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

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

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

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


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

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

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

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

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

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

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

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

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

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

Получить данные из регистра сведений
Нужно получить данные из регистра сведений. Мне нужно вывести данные одного из полей регистра за.

Никак не могу получить данные из регистра сведений
Функция ПолучитьКоличествоДолжностей(Должность) Экспорт ЭтаДолжность = Новый Структура;.


Получить данные из регистра сведений
Добрый день! Помогите пожалуйста разобраться! Есть регистр сведений - независимый.


Получить курсы валют с сервера центробанка
До вчерашнего всё работало без проблем. Теперь не хочет. Чо надо ему, а? <?php .

В данном случае получите курс и кратность валюты ВашаВалюта на дату ВашаДата в таблице значений Результат.
Подтолкнете данные из таблицы в необходимые поля на форме.
Чтобы выполнялось при открытии, код в соответсвующий обработчик события формы - ПриОткрытии.
Чтобы выборка шла сразу по нескольким валютам можно заменить Валюта = &Валюта на Валюта В (&СписокВалют) и передавать в запрос список валют (в вашем случае USD и EUR).

Спасибо, но всё равно выводит ошибку.


Вставляю эту процедуру в модуль формы Номенклатура в процедуру ПриОткрытии.

: Переменная не определена (Справочники)
стДоллар = <<?>>Справочники.Валюты.НайтиПоНаименованию("USD"); (Проверка: Тонкий клиент)
: Переменная не определена (Справочники)
стЕвро = <<?>>Справочники.Валюты.НайтиПоНаименованию("EURO"); (Проверка: Тонкий клиент)
: Переменная не определена (РегистрыСведений)
КурсД = <<?>>РегистрыСведений.КурсыВалют.СрезПоследних(ТекущаяДата() ,Новый Структура("Валюта",стДоллар))[0].Курс; (Проверка: Тонкий клиент)
: Переменная не определена (РегистрыСведений)
КурсЕ = <<?>>РегистрыСведений.КурсыВалют.СрезПоследних(ТекущаяДата() ,Новый Структура("Валюта",стЕвро))[0].Курс; (Проверка: Тонкий клиент)

Распечатать

Как сделать Расшифровку в табличном документе  0
Вопрос: Подскажите пожалуйста, каким образом можно сделать следующее. У меня есть выводимый в табличный документ результат запроса, к ячейке есть расшифровка. Я хочу чтобы при двойном клике на ячейку выполнялась процедура которая к примеру зап Универсальная функция получения курса валюты  0
Функция ПересчетСуммыПоКурсу(ВалютнаяСумма, Валюта, Дата) Экспорт Запись = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата, Новый Структура(" Валюта" , Валюта)); Сумма = ВалютнаяСумма * Запись.Курс; Если Запись.Кратность 0 Тогда Сумма = С Функция пересчета валютной суммы по курсу на дату документа  0
Функция ПересчетСуммыПоКурсу(ВалютнаяСумма, Валюта, Дата) Экспорт Запись = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата, Новый Структура(" Валюта" , Валюта)); Сумма = ВалютнаяСумма * Запись.Курс / Запись.Кратность; Возврат Сумма; КонецФу Посмотреть все результаты поиска похожих

Еще в этой же категории

Момент Времени и Граница, назначение, примеры использования  38
Момент времени: Фирма 1С описывает так: Предназначен для получения и хранения момента времени для объекта в базе данных. Содержит дату и время, а также ссылку на объект базы данных. Используется в качестве значений свойств и параметров методо Преобразование даты 1С в unixtime (Unix Time Stamp)  17
Как известно, unixtime содержит количество секунд, прошедших с 1 января 1970 года. Поэтому, для преобразования даты 1С в дату unixtime нам всего то нужно от нашей даты отнять дату 01.01.1970 и перевести получившееся значения в удобоваримый формат. Функция месяц прописью  11
// пример от glory01 А = Формат(20020820153309, " ДФ=ММММ" ) // А = " Август" А = Формат(ТекущаяДата(), " ДФ=ММММ" ) // А = " Март" Функция МесяцПрописью(НомерМесяца) Экспорт НомерМесяца=Число(НомерМесяца); Если НомерМесяца = 1 Тогда Воз Как вычислить разницу между двумя датами в месяцах  11
Функция РазницаДатВМесяцах(Дата1, Дата2) Экспорт ДатаНач = ?(Дата1 Дата2, Дата1, Дата2); ДатаКон = ?(Дата1 Дата2, Дата2, Дата1); Годы = Год( датаКон ) - Год( датаНач ); Месяцы = Месяц( датаКон ) - Месяц( датаНач ); Разность = месяцы + Как вычислить разницу между двумя датами в часах и минутах  10
Функция РазностьВремени(Время1, Время2); Разность = Время1 - Время2; Если Разность 0 Тогда Часов = Цел(Разность / 3600); Минут = Цел((Разность - Часов * 3600) / 60); Возврат Дата(1, 1, 1, Часов, Минут, 0); Иначе Возврат Дата(1,1,1,0,0,0); Посмотреть все в категории Работа с Датами (Временем)

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