вторник, 17 марта 2015 г.

1c специалист задача 1.27

Решение:
1) Посмотрев на формы требуемых отчетов решил создать регистры следующей структуры:
Взаиморасчеты в валюте, продажи в рублях.
  2) Документ "Расходная накладная"
Реквизиты шапки Контрагент, Валюта,СуммаПоДокументу (в валюте).
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Взаиморасчеты.Записывать = Истина;
Движения.Взаиморасчеты.Записать();

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Взаиморасчеты");
ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать(); 

Запрос = Новый("Запрос");
Запрос.Текст ="ВЫБРАТЬ
| ВзаиморасчетыОстатки.Контрагент,
| ВзаиморасчетыОстатки.СуммаВалОстаток КАК Аванс
|ИЗ
| РегистрНакопления.Взаиморасчеты.Остатки(
| &ТочкаИтогов,
| Контрагент = &Контрагент
| И Накладная = ЗНАЧЕНИЕ(Документ.РасходнаяНакладная.ПустаяСсылка)) КАК ВзаиморасчетыОстатки";

Запрос.УстановитьПараметр("Контрагент",Контрагент);
ТочкаИтогов =?(Режим = РежимПроведенияДокумента.Оперативный, Неопределено, Новый Граница(МоментВремени(),ВидГраницы.Исключая));
Запрос.УстановитьПараметр("ТочкаИтогов", ТочкаИтогов);

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

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

// регистр Продажи 
Движения.Продажи.Записывать = Истина;
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Валюта = Валюта;
Движение.СуммаРуб = СуммаПоДокументу*ТекКурс;

КонецПроцедуры

3) Документ "Приход денег"
Реквизиты шапки Контрагент, СуммаОплаты (в рублях).
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Взаиморасчеты.Записывать = Истина;

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.Взаиморасчеты");
ЭлементБлокировки.УстановитьЗначение("Контрагент", Контрагент);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
Блокировка.Заблокировать(); 


Запрос = Новый("Запрос");
Запрос.Текст ="ВЫБРАТЬ
             | ВзаиморасчетыОстатки.Накладная,
             | ВзаиморасчетыОстатки.Валюта,
             | ВзаиморасчетыОстатки.СуммаВалОстаток КАК Долг,
             | ВзаиморасчетыОстатки.Накладная.Дата КАК НакладнаяДата,
             | ВзаиморасчетыОстатки.Контрагент,
             | ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 0) КАК КурсВалюты
             |ИЗ
             | РегистрНакопления.Взаиморасчеты.Остатки(&ТочкаИтогов, Контрагент = &Контрагент) КАК ВзаиморасчетыОстатки
             | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаКурса, ) КАК КурсыВалютСрезПоследних
             | ПО ВзаиморасчетыОстатки.Валюта = КурсыВалютСрезПоследних.Валюта
             |
             |УПОРЯДОЧИТЬ ПО
             | НакладнаяДата";

Запрос.УстановитьПараметр("Контрагент", Контрагент);
ТочкаИтогов =?(Режим = РежимПроведенияДокумента.Оперативный, Неопределено, Новый Граница(МоментВремени(),ВидГраницы.Исключая));
Запрос.УстановитьПараметр("ТочкаИтогов", ТочкаИтогов);
Запрос.УстановитьПараметр("ДатаКурса", Дата);

Результат = Запрос.Выполнить();
ОсталосьСписать = СуммаОплаты;

Если Не Результат.Пустой() Тогда 

Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Движение = Движения.Взаиморасчеты.ДобавитьРасход();
ЗаполнитьЗначенияСвойств(Движение,Выборка);
Движение.Период    = Дата;
КСписанию = Мин(ОсталосьСписать, Выборка.Долг * Выборка.КурсВалюты);
Движение.СуммаВал  = ?(Выборка.КурсВалюты <>0,КСписанию/Выборка.КурсВалюты,0);
ОсталосьСписать    = ОсталосьСписать - КСписанию;
КонецЦикла;
//аванс
Если ОсталосьСписать >0 Тогда
Движение = Движения.Взаиморасчеты.ДобавитьПриход();
Движение.Контрагент = Контрагент;
Движение.Период   = Дата;
Движение.СуммаВал = ОсталосьСписать;
Движение.Валюта   = Справочники.Валюты.РоссийскийРубль;
КонецЕсли;
КонецЕсли;
КонецПроцедуры

4) Отчет "Взаиморасчеты"

ВЫБРАТЬ
ВзаиморасчетыОстаткиИОбороты.Валюта,
ВЫБОР
КОГДА ВзаиморасчетыОстаткиИОбороты.Накладная = ЗНАЧЕНИЕ(Документ.РасходнаяНакладная.ПустаяСсылка)
ТОГДА "Аванс"
ИНАЧЕ ВзаиморасчетыОстаткиИОбороты.Накладная
КОНЕЦ КАК Накладная,
ВзаиморасчетыОстаткиИОбороты.СуммаВалНачальныйОстаток,
ВзаиморасчетыОстаткиИОбороты.СуммаВалПриход,
ВзаиморасчетыОстаткиИОбороты.СуммаВалРасход,
ВзаиморасчетыОстаткиИОбороты.СуммаВалКонечныйОстаток
ИЗ
РегистрНакопления.Взаиморасчеты.ОстаткиИОбороты(&ДатаНачала, &ДатаОкончания, , , ) КАК ВзаиморасчетыОстаткиИОбороты

5) Отчет "Продажи"
В отчете происходит конвертация из рублей в валюту накладной по курсу на дату накладной.

ВЫБРАТЬ
ПродажиОбороты.Контрагент,
ПродажиОбороты.СуммаРубОборот,
МАКСИМУМ(КурсыВалют.Период) КАК ДатаКурса
ПОМЕСТИТЬ продажи
ИЗ
РегистрНакопления.Продажи.Обороты(&ДатаНач, &ДатаКон, Регистратор, ) КАК ПродажиОбороты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО ПродажиОбороты.Период >= КурсыВалют.Период
ГДЕ
КурсыВалют.Валюта = &Валюта

СГРУППИРОВАТЬ ПО
ПродажиОбороты.Контрагент,
ПродажиОбороты.СуммаРубОборот
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
продажи.Контрагент,
продажи.СуммаРубОборот КАК СуммаРуб,
КурсыВалют.Курс КАК Курс,
продажи.ДатаКурса,
ВЫБОР
КОГДА ЕСТЬNULL(КурсыВалют.Курс, 0) <> 0
ТОГДА Выразить(продажи.СуммаРубОборот / КурсыВалют.Курс как число(12,2))
ИНАЧЕ 0
КОНЕЦ КАК СуммаВал
ИЗ
продажи КАК продажи
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК КурсыВалют
ПО продажи.ДатаКурса = КурсыВалют.Период
ГДЕ

КурсыВалют.Валюта = &Валюта


Скачать решение задачи 1.27 (1с специалист по платформе)

Комментариев нет:

Отправить комментарий