helpf.pro
Регистрация

Алгоритм разброса денежных средств для исключения курсовых разниц

maxus1
09.12.2010 22:43Прочитано: 1979
Голова уже пухнет от авралов, не соображаю, так что обращаюсь к коллективному разуму. )
Входящие данные:
Таблица№1 "Авансы поставщику":
01.01.2010 Пупкин $100 по курсу 30 рублей (сумма в рублях 3000)
02.01.2010 Пупкин $200 по курсу 31 рублей (сумма в рублях 3100)

Таблица №2 "Поступление от поставщика", курс на этот день 32 рубля за $1
03.01.2010 Пупкин Товар №1 1 штука на сумму $150
03.01.3020 Пупкин Товар №2 1 штука на сумму $100

Надо:
Сформировать рублёвые суммы поступлений товара, учитывая курсы авансов и остатка (если таковой будет) на дату поступления товара, чтобы исключить курсовые разницы.

Какой будет алгоритм?
Yandex
Возможно, вас также заинтересует
Реклама на портале
E_Migachev
10.12.2010 10:18Ответ № 1
(0) maxus1, попробуй v8: Функция выполняет пропорциональное распределение суммы в соответствии с заданными коэффициентами
IKSparrow
13.12.2010 13:07Ответ № 2
) Почти такой же задачкой занимаюсь )
Mokey
13.12.2010 17:15Ответ № 3
У меня немного другая задача стояла: Если авансовый платёж - то инвойс (поступление) в валюте учёта (необязательно рубли) проводится по курсу платежа. Если постоплата, то возникает запись с курсовой разницей.
Теперь по существу - первый вариант похож на Ваш. Тут либо действительно "размазывать", либо брать курс аванса, ведь товар уже оплачен и когда он отгрузился (поступил) не суть важно уже, от этого он не подорожает или подешевеет.
IKSparrow
13.12.2010 17:44Ответ № 4
Подобную задачку я примерно так решил:
Код 1C v 8.х
 
ЗапросНМА = Новый Запрос;
ЗапросНМА.Текст =
"ВЫБРАТЬ
| ПоступлениеНМА_МеждународныйОсновныеСредства.ОсновноеСредство КАК НМА,
| ПоступлениеНМА_МеждународныйОсновныеСредства.Сумма КАК СуммаВалютнаяНМА
|ИЗ
| Документ.ПоступлениеНМА_Международный.ОсновныеСредства КАК ПоступлениеНМА_МеждународныйОсновныеСредства
|ГДЕ
| ПоступлениеНМА_МеждународныйОсновныеСредства.Ссылка = &Ссылка";
ЗапросНМА.УстановитьПараметр("Ссылка",Ссылка);
ТЗНМА = ЗапросНМА.Выполнить().Выгрузить();
ТЗНМА.Колонки.Добавить("СуммаРублёваяНМА");
ТЗНМА.Колонки.Добавить("СуммаРублёваяКРаспределению");
ТЗНМА.Колонки.Добавить("СуммаВалютнаяКРаспределению");
ТЗНМА.Колонки.Добавить("КоэффициентРаспределенияРублёвый");
ТЗНМА.Колонки.Добавить("КоэффициентРаспределенияВалютный");

// Получим курс на дату проведения
Курс=РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Ссылка.Дата,Новый Структура("Валюта",Валюта)).Курс;
// Заполним рублёвые суммы
Для каждого СтрНМА Из ТЗНМА Цикл
СтрНМА.СуммаРублёваяНМА = СтрНМА.СуммаВалютнаяНМА*Курс;
КонецЦикла;

СуммаВалютнаяНМА = ТЗНМА.Итог("СуммаВалютнаяНМА");
СуммаВалютнаяАвансов = ТЗАвансов.Итог("СуммаВалютная");
СуммаРублёваяАвансов = ТЗАвансов.Итог("СуммаРублёвая");
КурсАванса = СуммаРублёваяАвансов/СуммаВалютнаяАвансов;

Если СуммаВалютнаяАвансов < СуммаВалютнаяНМА Тогда
Для каждого СтрНМА Из ТЗНМА Цикл
СтрНМА.КоэффициентРаспределенияВалютный = СтрНМА.СуммаВалютнаяНМА/СуммаВалютнаяАвансов;
КонецЦикла;
МассивВалютныхКоэффициентов = ТЗНМА.ВыгрузитьКолонку("КоэффициентРаспределенияВалютный");
РезультатРаспределения = РаспределитьПропорционально(СуммаВалютнаяАвансов,МассивВалютныхКоэффициентов);
Если РезультатРаспределения = Неопределено Тогда
Сообщить("Ошибка распределения аванса в валюте!",СтатусСообщения.ОченьВажное);
Возврат Ложь;
КонецЕсли;
ТЗНМА.ЗагрузитьКолонку(РезультатРаспределения,"СуммаВалютнаяКРаспределению");
Для каждого СтрНМА Из ТЗНМА Цикл
СтрНМА.СуммаРублёваяКРаспределению = СтрНМА.СуммаВалютнаяКРаспределению*КурсАванса+((СтрНМА.СуммаВалютнаяНМА-СтрНМА.СуммаВалютнаяКРаспределению)*Курс);
КонецЦикла;

Для каждого СтрПроводка Из ТЗПроводок Цикл
СтрНМА = ТЗНМА.Найти(СтрПроводка.СубконтоДебет1,"НМА");
Если СтрНМА <> Неопределено Тогда
СтрПроводка.Сумма = СтрНМА.СуммаРублёваяКРаспределению;
КонецЕсли;
КонецЦикла;

ИначеЕсли СуммаВалютнаяАвансов = СуммаВалютнаяНМА Тогда
СуммаРублёваяПоСтроке = СуммаРублёваяАвансов/ТЗНМА.Количество();
Для каждого СтрНМА Из ТЗНМА Цикл
СтрНМА.КоэффициентРаспределенияРублёвый = СтрНМА.СуммаРублёваяНМА/СуммаРублёваяПоСтроке;
КонецЦикла;
МассивРублёвыхКоэффициентов = ТЗНМА.ВыгрузитьКолонку("КоэффициентРаспределенияРублёвый");
РезультатРаспределения = РаспределитьПропорционально(СуммаРублёваяАвансов,МассивРублёвыхКоэффициентов);
Если РезультатРаспределения = Неопределено Тогда
Сообщить("Ошибка распределения авансов в рублях!",СтатусСообщения.ОченьВажное);
Возврат Ложь;
КонецЕсли;
ТЗНМА.ЗагрузитьКолонку(РезультатРаспределения,"СуммаРублёваяКРаспределению");

Для каждого СтрПроводка Из ТЗПроводок Цикл
СтрНМА = ТЗНМА.Найти(СтрПроводка.СубконтоДебет1,"НМА");
Если СтрНМА <> Неопределено Тогда
СтрПроводка.Сумма = СтрНМА.СуммаРублёваяКРаспределению;
КонецЕсли;
КонецЦикла;

//ИначеЕсли СуммаВалютнаяАвансов > СуммаВалютнаяНМА Тогда
// А ничего не делаем - система тут работает отлично
КонецЕсли;

Возврат ТЗПроводок;

maxus1
13.12.2010 21:54Ответ № 5
Всем спасибо! Задачка решена!
Подсказка: Для выделения Кода используйте (в редакторе).
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.