Имя: Пароль:
1C
 
Как в запросе получить курсы валют на даты документов?
0 tciban
 
30.09.09
12:12
Доброго дня всем! Есть следующий запрос:
ВЫБРАТЬ
   СУММА(ОплатаПоставщику.СуммаДокумента * КурсыВалютСрезПоследних.Курс) КАК СуммаДокумента,
   СУММА(ОплатаПоставщику.СуммаЗатрат * КурсыВалютСрезПоследних.Курс) КАК СуммаЗатрат
ИЗ
   Документ.ОплатаПоставщику КАК ОплатаПоставщику
   ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
       ПО ОплатаПоставщику.ВалютаДокумента = КурсыВалютСрезПоследних.Валюта
ГДЕ
   ОплатаПоставщику.Сделка = &Сделка

Но хотелось бы переводить суммы в рубли не по последнему курсу, а для каждого документа на его дату. Ума не приложу как это сделать и возможно ли? Заранее благодарен за все толковые советы!
1 ShoGUN
 
30.09.09
12:15
Баян... Ща дам ссылку...
2 ShoGUN
 
30.09.09
12:16
3 tciban
 
30.09.09
12:22
Ага! Вдумчиво курим ссылку...
4 tciban
 
30.09.09
12:46
Читал, не понял - что нужно поместить во временную таблицу? Получается весь регистр курсов валют? Я ведь не знаю какие валюты и на какие даты мне понадобятся.
5 мудазвон митичкин356
 
30.09.09
12:46
да код не причем 100%
но если просишь..............

Функция Импорт_Файла_ДБФ(Параметр)
   ФайлБД = СоздатьОбъект("XBase");
   Попытка
       ФайлБД.ОткрытьФайл(Путь,,1);
   Исключение
       Предупреждение(Путь + РазделительСтрок + "Ошибка открытия файла!");
       Возврат 0;
   КонецПопытки;
   Если ФайлБД.Открыта() = 0 Тогда
       Предупреждение(Путь + РазделительСтрок + "Ошибка открытия файла!" + РазделительСтрок + "Возможно, файл используется другим приложением.");
       Возврат 0;
   КонецЕсли;
   ФайлБД.КодоваяСтраница(2-Кодировка);
   ФайлБД.Первая();
   Пока (ФайлБД.вКонце() = 0)  Цикл
       Если ФайлБД.ЗаписьУдалена() = 1 Тогда
           ФайлБД.Следующая();
           Продолжить;
       КонецЕсли;

       Состояние("Обрабатывается строка №" + ФайлБД.НомерЗаписи());
       
       
       ДатаОплаты = СокрЛП(ФайлБД.DATA);
       ДатаОплаты = Дата(Число(Сред(ДатаОплаты,7,4)),Число(Сред(ДатаОплаты,4,2)),Число(Сред(ДатаОплаты,1,2)));
6 Живой Ископаемый
 
30.09.09
12:47
У меня получилось при помощи СКД - метод, который в той статье внизу...
7 ShoGUN
 
30.09.09
12:48
(4) Во временную таблицу можно поместить валюты и даты документов. Можно, но необязательно.
8 tciban
 
30.09.09
12:50
Как я могу поместить в таблицу даты документов? Я ведь их не знаю до запроса. И почему это необязательно?
9 ShoGUN
 
30.09.09
12:52
(8) Врубись в то, что делает описанный запрос. Очень детально и тщательно. После этого - всё поймешь.
10 wason
 
30.09.09
12:56
ВЫБРАТЬ
 СУММА(таб1.СуммаДокумента * таб2.Курс) КАК СуммаДокумента,
   СУММА(таб1.СуммаЗатрат * таб2.Курс) КАК СуммаЗатрат

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

теперь возми и обдумай всё ето
11 мудазвон митичкин378
 
30.09.09
12:58
да код не причем 100%
но если просишь..............

Функция Импорт_Файла_ДБФ(Параметр)
   ФайлБД = СоздатьОбъект("XBase");
   Попытка
       ФайлБД.ОткрытьФайл(Путь,,1);
   Исключение
       Предупреждение(Путь + РазделительСтрок + "Ошибка открытия файла!");
       Возврат 0;
   КонецПопытки;
   Если ФайлБД.Открыта() = 0 Тогда
       Предупреждение(Путь + РазделительСтрок + "Ошибка открытия файла!" + РазделительСтрок + "Возможно, файл используется другим приложением.");
       Возврат 0;
   КонецЕсли;
   ФайлБД.КодоваяСтраница(2-Кодировка);
   ФайлБД.Первая();
   Пока (ФайлБД.вКонце() = 0)  Цикл
       Если ФайлБД.ЗаписьУдалена() = 1 Тогда
           ФайлБД.Следующая();
           Продолжить;
       КонецЕсли;

       Состояние("Обрабатывается строка №" + ФайлБД.НомерЗаписи());
       
       
       ДатаОплаты = СокрЛП(ФайлБД.DATA);
       ДатаОплаты = Дата(Число(Сред(ДатаОплаты,7,4)),Число(Сред(ДатаОплаты,4,2)),Число(Сред(ДатаОплаты,1,2)));
       
       Если (ДатаОплаты <> Параметр.Получить("ДатаДок")) или (СокрЛП(ФайлБД.KL_CHK) <> РСчет) или (Цел(ФайлБД.CUR_ID) <> 980) Тогда
           ФайлБД.Следующая();
           Продолжить;
       КонецЕсли;

       Если ФайлБД.DK = 1 Тогда // расход

           Сп = СоздатьОбъект("СписокЗначений");
           Сп.Установить("Расход", ФайлБД.S);
           Сп.Установить("Приход", 0);
       ИначеЕсли ФайлБД.DK = 0 Тогда // приход
12 tciban
 
30.09.09
13:30
(10) Ваш запрос дал цифры в 33 раза больше :)
а запрос
ВЫБРАТЬ
   СУММА(ОплатаПоставщику.СуммаДокумента * КурсыВалют.Курс) КАК Оплата,
   СУММА(ОплатаПоставщику.СуммаЗатрат * КурсыВалют.Курс) КАК Затраты
ИЗ
   РегистрСведений.КурсыВалют КАК КурсыВалют
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ОплатаПоставщику КАК ОплатаПоставщику
       ПО (ОплатаПоставщику.ВалютаДокумента = КурсыВалют.Валюта)
           И (ОплатаПоставщику.Дата = КурсыВалют.Период)
ГДЕ
   ОплатаПоставщику.Сделка = &Сделка

Вообще ничего не дал... :(
13 tciban
 
30.09.09
13:31
(9) Про какой именно запрос идет речь в вашем посте?
14 Шурик71
 
30.09.09
14:21
(0) автор, вот тебе поясняющий мануал "на пальцах" /код писать не буду/:

1) выбрать все различные даты документов и валюты из самих документов,
получится табличка
-------------
Дата | Валюта
-------------
01.01 USD
10.01 USD
15.01 EUR

2) присоединить к этому по валюте регистр сведений курсов, так:

   ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Валюты
     ПО Валюты.Период <= Док.Дата И
     Валюты.Валюта = Док.ВалютаДокумента

--------------------------
Дата | Валюта | ДатаКурса
--------------------------
01.01 USD       01.01
10.01 USD       01.01
10.01 USD       05.01
10.01 USD       07.01
15.01 EUR       01.01
15.01 EUR       08.01

3) группируем по "валюта, дата" и добавляем ДатаКурса = MAX(Валюты.Период),
получим дату реальной записи в рег. сведений
--------------------------
Дата | Валюта | ДатаКурса
--------------------------
01.01 USD       01.01
10.01 USD       07.01
15.01 EUR       08.01


4) присоединяем сам курс из рег. сведений (не срез!) на дату "ДатаКурса".
Готово.

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

Код пиши сам.
15 Живой Ископаемый
 
30.09.09
14:33
Ну да, в общем-то основной фокус что нужно использовать не срезпоследних, а сами записи...
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.