Решение:
1) Посмотрев на формы требуемых отчетов решил создать регистры следующей структуры:
Взаиморасчеты в валюте, продажи в рублях.
2) Документ "Расходная накладная"
Реквизиты шапки Контрагент, Валюта,СуммаПоДокументу (в валюте).
Процедура ОбработкаПроведения(Отказ, Режим)
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Взаиморасчеты");
ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Запрос = Новый("Запрос");
Запрос.Текст ="ВЫБРАТЬ
| ВзаиморасчетыОстатки.Контрагент,
| ВзаиморасчетыОстатки.СуммаВалОстаток КАК Аванс
|ИЗ
| РегистрНакопления.Взаиморасчеты.Остатки(
| &ТочкаИтогов,
| Контрагент = &Контрагент
| И Накладная = ЗНАЧЕНИЕ(Документ.РасходнаяНакладная.ПустаяСсылка)) КАК ВзаиморасчетыОстатки";
Запрос.УстановитьПараметр("Контрагент",Контрагент);
ТочкаИтогов =?(Режим = РежимПроведенияДокумента.Оперативный, Неопределено, Новый Граница(МоментВремени(),ВидГраницы.Исключая));
Запрос.УстановитьПараметр("ТочкаИтогов", ТочкаИтогов);
Отбор = Новый("Структура");
Отбор.Вставить("Валюта",Валюта);
ТекКурс = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата,Отбор).Курс;
Если ТекКурс =0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не установлен курс валюты "+ Валюта;
Сообщение.Сообщить();
Возврат;
КонецЕсли;
// сначала закрывается аванс
ОсталосьРаспределить = СуммаПоДокументу*ТекКурс;
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Списываем = Мин(ОсталосьРаспределить, Выборка.Аванс);
Движения.Взаиморасчеты.Записывать = Истина;
Движение = Движения.Взаиморасчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Валюта = Справочники.Валюты.РоссийскийРубль;
Движение.СуммаВал = Списываем;
ОсталосьРаспределить = ОсталосьРаспределить - Списываем;
КонецЕсли;
// теперь сама накладная
Если ОсталосьРаспределить>0 Тогда
Движения.Взаиморасчеты.Записывать = Истина;
Движение = Движения.Взаиморасчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Накладная = Ссылка;
Движение.Валюта = Валюта;
Движение.СуммаВал= ОсталосьРаспределить/ТекКурс;
КонецЕсли;
// регистр Продажи
Движения.Продажи.Записывать = Истина;
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Валюта = Валюта;
Движение.СуммаРуб = СуммаПоДокументу*ТекКурс;
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Взаиморасчеты.Записывать = Истина;
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Взаиморасчеты");
ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Запрос = Новый("Запрос");
Запрос.Текст ="ВЫБРАТЬ
| ВзаиморасчетыОстатки.Накладная,
| ВзаиморасчетыОстатки.Валюта,
| ВзаиморасчетыОстатки.СуммаВалОстаток КАК Долг,
| ВзаиморасчетыОстатки.Накладная.Дата КАК НакладнаяДата,
| ВзаиморасчетыОстатки.Контрагент,
| ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 0) КАК КурсВалюты
|ИЗ
| РегистрНакопления.Взаиморасчеты.Остатки(&ТочкаИтогов, Контрагент = &Контрагент) КАК ВзаиморасчетыОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаКурса, ) КАК КурсыВалютСрезПоследних
| ПО ВзаиморасчетыОстатки.Валюта = КурсыВалютСрезПоследних.Валюта
|
|УПОРЯДОЧИТЬ ПО
| НакладнаяДата";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
ТочкаИтогов =?(Режим = РежимПроведенияДокумента.Оперативный, Неопределено, Новый Граница(МоментВремени(),ВидГраницы.Исключая));
Запрос.УстановитьПараметр("ТочкаИтогов", ТочкаИтогов);
Запрос.УстановитьПараметр("ДатаКурса", Дата);
Результат = Запрос.Выполнить();
ОсталосьСписать = СуммаОплаты;
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Движение = Движения.Взаиморасчеты.ДобавитьРасход();
ЗаполнитьЗначенияСвойств(Движение,Выборка);
Движение.Период = Дата;
КСписанию = Мин(ОсталосьСписать, Выборка.Долг * Выборка.КурсВалюты);
Движение.СуммаВал = ?(Выборка.КурсВалюты <>0,КСписанию/Выборка.КурсВалюты,0);
ОсталосьСписать = ОсталосьСписать - КСписанию;
КонецЦикла;
//аванс
Если ОсталосьСписать >0 Тогда
Движение = Движения.Взаиморасчеты.ДобавитьПриход();
Движение.Контрагент = Контрагент;
Движение.Период = Дата;
Движение.СуммаВал = ОсталосьСписать;
Движение.Валюта = Справочники.Валюты.РоссийскийРубль;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
5) Отчет "Продажи"
В отчете происходит конвертация из рублей в валюту накладной по курсу на дату накладной.
ВЫБРАТЬ
ПродажиОбороты.Контрагент,
ПродажиОбороты.СуммаРубОборот,
МАКСИМУМ(КурсыВалют.Период) КАК ДатаКурса
ПОМЕСТИТЬ продажи
ИЗ
РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, Регистратор, ) КАК ПродажиОбороты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО ПродажиОбороты.Период >= КурсыВалют.Период
ГДЕ
КурсыВалют.Валюта = &Валюта
СГРУППИРОВАТЬ ПО
ПродажиОбороты.Контрагент,
ПродажиОбороты.СуммаРубОборот
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
продажи.Контрагент,
продажи.СуммаРубОборот КАК СуммаРуб,
КурсыВалют.Курс КАК Курс,
продажи.ДатаКурса,
ВЫБОР
КОГДА ЕСТЬNULL(КурсыВалют.Курс, 0) <> 0
ТОГДА Выразить(продажи.СуммаРубОборот / КурсыВалют.Курс как число(12,2))
ИНАЧЕ 0
КОНЕЦ КАК СуммаВал
ИЗ
продажи КАК продажи
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО продажи.ДатаКурса = КурсыВалют.Период
ГДЕ
КурсыВалют.Валюта = &Валюта
Скачать решение задачи 1.27 (1с специалист по платформе)
1) Посмотрев на формы требуемых отчетов решил создать регистры следующей структуры:
Взаиморасчеты в валюте, продажи в рублях.
2) Документ "Расходная накладная"
Реквизиты шапки Контрагент, Валюта,СуммаПоДокументу (в валюте).
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Взаиморасчеты.Записывать = Истина;
Движения.Взаиморасчеты.Записать();Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Взаиморасчеты");
ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Запрос = Новый("Запрос");
Запрос.Текст ="ВЫБРАТЬ
| ВзаиморасчетыОстатки.Контрагент,
| ВзаиморасчетыОстатки.СуммаВалОстаток КАК Аванс
|ИЗ
| РегистрНакопления.Взаиморасчеты.Остатки(
| &ТочкаИтогов,
| Контрагент = &Контрагент
| И Накладная = ЗНАЧЕНИЕ(Документ.РасходнаяНакладная.ПустаяСсылка)) КАК ВзаиморасчетыОстатки";
Запрос.УстановитьПараметр("Контрагент",Контрагент);
ТочкаИтогов =?(Режим = РежимПроведенияДокумента.Оперативный, Неопределено, Новый Граница(МоментВремени(),ВидГраницы.Исключая));
Запрос.УстановитьПараметр("ТочкаИтогов", ТочкаИтогов);
Отбор = Новый("Структура");
Отбор.Вставить("Валюта",Валюта);
ТекКурс = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата,Отбор).Курс;
Если ТекКурс =0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не установлен курс валюты "+ Валюта;
Сообщение.Сообщить();
Возврат;
КонецЕсли;
// сначала закрывается аванс
ОсталосьРаспределить = СуммаПоДокументу*ТекКурс;
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Списываем = Мин(ОсталосьРаспределить, Выборка.Аванс);
Движения.Взаиморасчеты.Записывать = Истина;
Движение = Движения.Взаиморасчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Валюта = Справочники.Валюты.РоссийскийРубль;
Движение.СуммаВал = Списываем;
ОсталосьРаспределить = ОсталосьРаспределить - Списываем;
КонецЕсли;
// теперь сама накладная
Если ОсталосьРаспределить>0 Тогда
Движения.Взаиморасчеты.Записывать = Истина;
Движение = Движения.Взаиморасчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Накладная = Ссылка;
Движение.Валюта = Валюта;
Движение.СуммаВал= ОсталосьРаспределить/ТекКурс;
КонецЕсли;
// регистр Продажи
Движения.Продажи.Записывать = Истина;
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Валюта = Валюта;
Движение.СуммаРуб = СуммаПоДокументу*ТекКурс;
КонецПроцедуры
3) Документ "Приход денег"
Реквизиты шапки Контрагент, СуммаОплаты (в рублях).Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Взаиморасчеты.Записывать = Истина;
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Взаиморасчеты");
ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать();
Запрос = Новый("Запрос");
Запрос.Текст ="ВЫБРАТЬ
| ВзаиморасчетыОстатки.Накладная,
| ВзаиморасчетыОстатки.Валюта,
| ВзаиморасчетыОстатки.СуммаВалОстаток КАК Долг,
| ВзаиморасчетыОстатки.Накладная.Дата КАК НакладнаяДата,
| ВзаиморасчетыОстатки.Контрагент,
| ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 0) КАК КурсВалюты
|ИЗ
| РегистрНакопления.Взаиморасчеты.Остатки(&ТочкаИтогов, Контрагент = &Контрагент) КАК ВзаиморасчетыОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаКурса, ) КАК КурсыВалютСрезПоследних
| ПО ВзаиморасчетыОстатки.Валюта = КурсыВалютСрезПоследних.Валюта
|
|УПОРЯДОЧИТЬ ПО
| НакладнаяДата";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
ТочкаИтогов =?(Режим = РежимПроведенияДокумента.Оперативный, Неопределено, Новый Граница(МоментВремени(),ВидГраницы.Исключая));
Запрос.УстановитьПараметр("ТочкаИтогов", ТочкаИтогов);
Запрос.УстановитьПараметр("ДатаКурса", Дата);
Результат = Запрос.Выполнить();
ОсталосьСписать = СуммаОплаты;
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Движение = Движения.Взаиморасчеты.ДобавитьРасход();
ЗаполнитьЗначенияСвойств(Движение,Выборка);
Движение.Период = Дата;
КСписанию = Мин(ОсталосьСписать, Выборка.Долг * Выборка.КурсВалюты);
Движение.СуммаВал = ?(Выборка.КурсВалюты <>0,КСписанию/Выборка.КурсВалюты,0);
ОсталосьСписать = ОсталосьСписать - КСписанию;
КонецЦикла;
//аванс
Если ОсталосьСписать >0 Тогда
Движение = Движения.Взаиморасчеты.ДобавитьПриход();
Движение.Контрагент = Контрагент;
Движение.Период = Дата;
Движение.СуммаВал = ОсталосьСписать;
Движение.Валюта = Справочники.Валюты.РоссийскийРубль;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
4) Отчет "Взаиморасчеты"
ВЫБРАТЬ
ВзаиморасчетыОстаткиИОбороты.Валюта,
ВЫБОР
КОГДА ВзаиморасчетыОстаткиИОбороты.Накладная = ЗНАЧЕНИЕ(Документ.РасходнаяНакладная.ПустаяСсылка)
ТОГДА "Аванс"
ИНАЧЕ ВзаиморасчетыОстаткиИОбороты.Накладная
КОНЕЦ КАК Накладная,
ВзаиморасчетыОстаткиИОбороты.СуммаВалНачальныйОстаток,
ВзаиморасчетыОстаткиИОбороты.СуммаВалПриход,
ВзаиморасчетыОстаткиИОбороты.СуммаВалРасход,
ВзаиморасчетыОстаткиИОбороты.СуммаВалКонечныйОстаток
ИЗ
РегистрНакопления.Взаиморасчеты.ОстаткиИОбороты(&ДатаНачала, &ДатаОкончания, , , ) КАК ВзаиморасчетыОстаткиИОбороты
5) Отчет "Продажи"
В отчете происходит конвертация из рублей в валюту накладной по курсу на дату накладной.
ВЫБРАТЬ
ПродажиОбороты.Контрагент,
ПродажиОбороты.СуммаРубОборот,
МАКСИМУМ(КурсыВалют.Период) КАК ДатаКурса
ПОМЕСТИТЬ продажи
ИЗ
РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, Регистратор, ) КАК ПродажиОбороты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО ПродажиОбороты.Период >= КурсыВалют.Период
ГДЕ
КурсыВалют.Валюта = &Валюта
СГРУППИРОВАТЬ ПО
ПродажиОбороты.Контрагент,
ПродажиОбороты.СуммаРубОборот
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
продажи.Контрагент,
продажи.СуммаРубОборот КАК СуммаРуб,
КурсыВалют.Курс КАК Курс,
продажи.ДатаКурса,
ВЫБОР
КОГДА ЕСТЬNULL(КурсыВалют.Курс, 0) <> 0
ТОГДА Выразить(продажи.СуммаРубОборот / КурсыВалют.Курс как число(12,2))
ИНАЧЕ 0
КОНЕЦ КАК СуммаВал
ИЗ
продажи КАК продажи
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО продажи.ДатаКурса = КурсыВалют.Период
ГДЕ
КурсыВалют.Валюта = &Валюта
Скачать решение задачи 1.27 (1с специалист по платформе)
Комментариев нет:
Отправить комментарий