ВЫБРАТЬ КурсыВалют.Валюта, КурсыВалют.Курс, КурсыВалют.Период ИЗ РегистрСведений.КурсыВалют КАК КурсыВалют ГДЕ КурсыВалют.Валюта = &Валюта |
Валюта | Курс | Период |
USD | 29,000 | 01.01.2009 |
USD | 30,000 | 03.01.2009 |
ТаблицаДат=""; Запрос=Новый Запрос; Счетчик=0; Пока НачПериода+Счетчик*60*60*24<=КонПериода Цикл Если Счетчик=0 Тогда ТаблицаДат="ВЫБРАТЬ |&Дата"+Счетчик+" КАК Дата"; Иначе ТаблицаДат=ТаблицаДат+" |ОБЪЕДИНИТЬ ВСЕ |ВЫБРАТЬ &Дата"+Счетчик; КонецЕсли; Запрос. УстановитьПараметр ("Дата"+Счетчик, НачПериода+Счетчик*60*60*24); Счетчик=Счетчик+1; КонецЦикла; |
МВТ=Новый МенеджерВременныхТаблиц; Запрос=Новый Запрос; Запрос.МенеджерВременныхТаблиц=МВТ; ТЗ=Новый ТаблицаЗначений; КД=Новый КвалификаторыДаты (ЧастиДаты. ДатаВремя); Массив=Новый Массив; Массив.Добавить (Тип("Дата")); ОТД=Новый ОписаниеТипов (Массив,,КД); ТЗ.Колонки.Добавить ("Дата",ОТД); Счетчик=0; Пока НачалоДня(НачПериода)+ Счетчик*60*60*24<=КонПериода Цикл Стр=ТЗ.Добавить(); Стр.Дата=НачалоДня (НачПериода)+ Счетчик*60*60*24; Счетчик=Счетчик+1; КонецЦикла; Запрос.УстановитьПараметр ("ТЗ",ТЗ); Запрос.Текст ="ВЫБРАТЬ | Дата | |ПОМЕСТИТЬ | ВременнаяТаблица | |ИЗ &ТЗ КАК ТЗ | |ИНДЕКСИРОВАТЬ ПО Дата"; Запрос.Выполнить (); Запрос.Текст="ВЫБРАТЬ * ИЗ ВременнаяТаблица КАК ВременнаяТаблица"; Результат=Запрос.Выполнить(); |
Запрос=Новый Запрос ("ВЫБРАТЬ РАЗЛИЧНЫЕ |Даты.Дата |ИЗ |(ВЫБРАТЬ | Месяцы.Номер КАК Номер, | ТаблицаДней.Дни КАК Дни, | ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачДата, ГОД), МЕСЯЦ, Месяцы.Номер - 1), ДЕНЬ, ТаблицаДней.Дни - 1) КАК Дата |ИЗ | (ВЫБРАТЬ | 1 КАК Дни | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 2 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 3 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 4 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 5 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 6 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 7 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 8 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 9 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 10 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 11 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 12 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 13 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 14 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 15 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 16 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 17 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 18 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 19 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 20 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 21 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 22 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 23 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 24 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 25 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 26 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 27 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 28 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 29 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 30 | | ОБЪЕДИНИТЬ | | ВЫБРАТЬ | 31) КАК ТаблицаДней, | (ВЫБРАТЬ | 1 КАК Номер | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | 2 | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | 3 | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | 4 | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | 5 | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | 6 | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | 7 | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | 8 | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | 9 | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | 10 | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | 11 | | ОБЪЕДИНИТЬ ВСЕ | | ВЫБРАТЬ | 12) КАК Месяцы) КАК Даты |ГДЕ |Даты.Дата МЕЖДУ &НачДата И &КонДата"); Запрос.УстановитьПараметр ("НачДата",НачалоДня(НачПериода)); Запрос.УстановитьПараметр ("КонДата",НачалоДня(КонПериода)); Результат=Запрос.Выполнить(); |
Запрос=Новый Запрос ("ВЫБРАТЬ | 0 КАК зн |ПОМЕСТИТЬ т01 | |ОБЪЕДИНИТЬ ВСЕ | |ВЫБРАТЬ | 1 |; |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | т1.зн * 2 + т0.зн КАК зн |ПОМЕСТИТЬ т02 |ИЗ | т01 КАК т0, | т01 КАК т1 |; |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | т1.зн * 4 + т0.зн КАК зн |ПОМЕСТИТЬ Месяцы |ИЗ | т02 КАК т0, | т02 КАК т1 |; |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | т03.зн * 2 + т01.зн КАК Дни |ПОМЕСТИТЬ ТаблицаДней |ИЗ | Месяцы КАК т03, | т01 КАК т01 |ГДЕ | т03.зн * 2 + т01.зн <> 0 |; |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ РАЗЛИЧНЫЕ | Даты.Дата |ИЗ | (ВЫБРАТЬ | ДОБАВИТЬКДАТЕ(ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачДата, ГОД), МЕСЯЦ, Месяцы.зн - 1), ДЕНЬ, ТаблицаДней.Дни - 1) КАК Дата, | ТаблицаДней.Дни КАК Дни | ИЗ | Месяцы КАК Месяцы, | ТаблицаДней КАК ТаблицаДней) КАК Даты |ГДЕ |Даты.Дата МЕЖДУ &НачДата И &КонДата"); Запрос.УстановитьПараметр ("НачДата",НачалоДня(НачПериода)); Запрос.УстановитьПараметр ("КонДата",НачалоДня(КонПериода)); Результат=Запрос.Выполнить(); |
ВЫБРАТЬ
Даты.Дата КАК ДатаДок,
Валюты. Валюта КАК Валюта,
МАКСИМУМ(Валюты.Период) КАК ПериодДок
ИЗ
(//Первый запрос) КАК Даты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Валюты
ПО Валюты.Период <= Даты.Дата
ГДЕ Валюты.Валюта=&Валюта СГРУППИРОВАТЬ ПО Даты.Дата, Валюты.Валюта |
01.01.2009 0:00:00 | USD | 01.01.2009 |
02.01.2009 0:00:00 | USD | 01.01.2009 |
03.01.2009 0:00:00 | USD | 03.01.2009 |
04.01.2009 0:00:00 | USD | 03.01.2009 |
05.01.2009 0:00:00 | USD | 03.01.2009 |
ВЫБРАТЬ Таб1.ДатаДок, Таб2.Курс, Таб1.Валюта ИЗ (//Второй запрос) КАК Таб1 ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Таб2 ПО Таб1.ПериодДок = Таб2.Период И Таб1.Валюта=Таб2.Валюта ГДЕ Таб2.Валюта=&Валюта |
01.01.2009 0:00:00 | 29,000 | USD |
02.01.2009 0:00:00 | 29,000 | USD |
03.01.2009 0:00:00 | 30,000 | USD |
04.01.2009 0:00:00 | 30,000 | USD |
05.01.2009 0:00:00 | 30,000 | USD |
Спр=СоздатьОбъект("Справочник.Валюты"); Спр.НайтиЭлемент(ВыбТекущийЭлемент); Сообщить("Курс="+Спр.Курс.Получить (ВыбНачПериода)); |
Спр=СоздатьОбъект("Справочник.Валюты"); Спр.ИспользоватьДату (ВыбНачПериода); Спр.НайтиЭлемент (ВыбТекущийЭлемент); Сообщить("Курс="+Спр.Курс); |
|
Пер=СоздатьОбъект("Периодический"); Пер.ИспользоватьОбъект ("Курс",ВыбТекущийЭлемент); Пер.ВыбратьЗначения(ВыбНачПериода,ВыбКонПериода); Пока Пер.ПолучитьЗначение()=1 Цикл Сообщить("Изменение на дату "+ Пер.ДатаЗнач+ " значение курса равно "+ Пер.Значение); КонецЦикла; |
|
Запрос= СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с ВыбНачПериода по ВыбКонПериода; |ОбрабатыватьДокументы все; |Обрабатывать НеПомеченныеНаУдаление; |ТекущийЭлемент = Справочник.Валюты.ТекущийЭлемент; |Курс = Справочник.Валюты.Курс; |Функция КурсСумма = Сумма(Курс); |Группировка День все; |Условие(ТекущийЭлемент = ВыбТекущийЭлемент); |"//}}ЗАПРОС ; Если Запрос.Выполнить(ТекстЗапроса)= 0 Тогда Возврат ""; КонецЕсли; Пока Запрос.Группировка (1) = 1 Цикл Сообщить("Значение на дату "+ Запрос.День+ " курса равно "+ Запрос.КурсСумма); КонецЦикла; |
|
Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с ВыбНачПериода по ВыбКонПериода; |ОбрабатыватьДокументы все; |ТекущийДокумент = Документ.Точка.ТекущийДокумент; |Функция Счётчик = Счётчик(); |Группировка День все; |"//}}ЗАПРОС ; // Здесь в запросе выборка документов вида Точка по дням // один документ должен соответствовать одной дате Если Запрос.Выполнить (ТекстЗапроса) = 0 Тогда Возврат ""; КонецЕсли; Пока Запрос.Группировка (1) = 1 Цикл Если Запрос.Счётчик=0 Тогда //Если в дне докумена нет, то создаем РабочаяДата(Запрос.День); Док=СоздатьОбъект("Документ.Точка"); Док.Новый (); Док.Записать (); КонецЕсли; КонецЦикла; ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с ВыбНачПериода по ВыбКонПериода; |ОбрабатыватьДокументы все; |ТекущийДокумент = Документ.Точка.ТекущийДокумент; |ДатаДок = Документ.Точка.ДатаДок; |Функция Курс = Сумма(ВернутьКурс(ДатаДок)); |Функция ПолКурса = Сумма (ВернутьПолКурса()); |Группировка ТекущийДокумент; |"//}}ЗАПРОС ; Если Запрос.Выполнить (ТекстЗапроса) = 0 Тогда Возврат "" ; КонецЕсли; Пока Запрос.Группировка(1)= 1 Цикл Сообщить("Значение на дату "+ Запрос.ДатаДок+ " курса равно "+ Запрос.Курс+ " пол курса равно "+ Запрос.ПолКурса); КонецЦикла; |
Перем ПолКурса; Функция ВернутьКурс(ДатаДок) Спр=СоздатьОбъект("Справочник.Валюты"); Спр.НайтиЭлемент (ВыбТекущийЭлемент); Курс=Спр.Курс.Получить (ДатаДок); ПолКурса=Курс/2; //Присвоение значения переменной Возврат(Курс); КонецФункции Функция ВернутьПолКурса () Возврат(ПолКурса); КонецФункции |
|
Перем ДробьКурса,ДробьПолКурса; Функция ВернутьКурс2 (ДатаДок) Спр=СоздатьОбъект("Справочник.Валюты"); Спр.НайтиЭлемент (ВыбТекущийЭлемент); Курс=Спр.Курс.Получить (ДатаДок); ПолКурса=Курс/2; ДробьКурса=(Курс-Цел(Курс))* 10000; ДробьПолКурса=(ПолКурса-Цел(ПолКурса))*10000; Возврат(Курс); КонецФункции Функция ВернутьДробьКурса () Возврат(ДробьКурса); КонецФункции Функция ВернутьДробьПолКурса () Возврат(ДробьПолКурса); КонецФункции Функция ПравильноеЧисло (Само,Дробь) //А вдруг да на каком-то релизе данной ошибки не будет Если Само-Цел(Само)* 10000<>Дробь Тогда Возврат(Число(Строка(Само)+"." +Строка(Дробь))); Иначе Возврат(Само); КонецЕсли; КонецФункции |
ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с ВыбНачПериода по ВыбКонПериода; |ОбрабатыватьДокументы все; |ТекущийДокумент = Документ.Точка.ТекущийДокумент; |ДатаДок = Документ.Точка.ДатаДок; |Функция Курс = Сумма(ВернутьКурс2(ДатаДок)); |Функция ДробьКурса = Сумма(ВернутьДробьКурса()); |Функция ПолКурса = Сумма(ВернутьПолКурса()); |Функция ДробьПолКурса = Сумма(ВернутьДробьПолКурса()); |Группировка ТекущийДокумент; |"//}}ЗАПРОС ; Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат ""; КонецЕсли; Пока Запрос.Группировка (1) = 1 Цикл Сообщить("Значение на дату "+ Запрос.ДатаДок+ " курса равно"+ ПравильноеЧисло(Запрос.Курс,Запрос.ДробьКурса)+ " пол курса равно "+ ПравильноеЧисло (Запрос.ПолКурса,Запрос.ДробьПолКурса)); КонецЦикла; |
|
Процедура ОбработкаПроведения () Если ПустоеЗначение(Валюта)= 1 Тогда Сообщить("Не выбрана валюта!" ); СтатусВозврата(0); Возврат; КонецЕсли; Попытка ВремРегистры = СоздатьОбъект("Регистры"); Исключение Сообщить("Компонента оперативный учет не установлена"); СтатусВозврата(0); Возврат; КонецПопытки; ВремКурсыВалют = ВремРегистры. КурсыВалют; ВремКурсыВалют.УстановитьЗначениеФильтра ("Валюта",Валюта); Если ИтогиАктуальны()=0 Тогда ВремКурсыВалют.ВременныйРасчет(); ВремРегистры.Актуальность(1); ВремРегистры.РассчитатьРегистрыНа (ТекущийДокумент()); КонецЕсли; ТЗ=СоздатьОбъект("ТаблицаЗначений"); ВремКурсыВалют.ВыгрузитьИтоги(ТЗ,1,1); Если ТЗ.КоличествоСтрок ()>1 Тогда Сообщить("Системная ошибка!" ); СтатусВозврата(0); Возврат; КонецЕсли; Если ТЗ.КоличествоСтрок()=1 Тогда //Списываем старый курс Регистр.КурсыВалют.Валюта=Валюта; Регистр.КурсыВалют.Курс=ТЗ.ПолучитьЗначение (1,"Курс"); Регистр.КурсыВалют.ДвижениеРасходВыполнить (); КонецЕсли; Регистр.КурсыВалют.Валюта=Валюта; Регистр.КурсыВалют.Курс=Курс; Регистр.КурсыВалют.ДвижениеПриходВыполнить(); КонецПроцедуры |
Функция ПроверкаПериода (Фл=0) далее Функция РегистрСведений() Перем Запрос,ТекстЗапроса; Если ПроверкаПериода(2)=1 Тогда Возврат ""; КонецЕсли; Запрос = СоздатьОбъект("Запрос"); ТекстЗапроса = "//{{ЗАПРОС(Сформировать) |Период с ВыбНачПериода по ВыбКонПериода; |Обрабатывать НеПомеченныеНаУдаление; |Валюта = Регистр.КурсыВалют.Валюта; |Курс = Регистр.КурсыВалют.Курс; |Функция КурсКонОст = КонОст(Курс); |Группировка День все; |Условие(Валюта = ВыбТекущийЭлемент); |"//}}ЗАПРОС ; Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат ""; КонецЕсли; Пока Запрос.Группировка(1) = 1 Цикл Сообщить("На дату "+ Запрос.День+ " курс равен "+ Окр(Запрос.КурсКонОст,4)); КонецЦикла; КонецФункции |
|