Имя: Пароль:
1C
1С v8
Значение на каждый месяц, значение может не заполнятся
0 breezee
 
24.06.16
09:20
Уже классическая тема получения значения на каждый день(в моем случае месяц), только в у меня могут быть не заполнены значения. Накидал алгоритм, но, думаю, что он очень костыльный вышел, может подскажите как лучше сделать? Сама задача - есть плановая валюта, курс на которую может меняться не чаще раза в месяц. Может меняться раз в год или пол года(на пример) - мне нужно получать значения на каждый месяц, если значение не заполнено - брать последнее заполненное. И всё суммировать. Вот сам код:

Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    МЕСЯЦ(КурсыВалют.Период) КАК НомерМесяца,
    |    КурсыВалют.Курс
    |ИЗ
    |    РегистрСведений.КурсыВалют КАК КурсыВалют
    |ГДЕ
    |    КурсыВалют.Период МЕЖДУ &ПериодНачала И &ПериодКонца
    |    И КурсыВалют.Валюта.Код = ""001""
    |
    |УПОРЯДОЧИТЬ ПО
    |    НомерМесяца";
    
    Запрос.УстановитьПараметр("ПериодНачала", ПериодОтчета.ДатаНачала);
    Запрос.УстановитьПараметр("ПериодКонца", ПериодОтчета.ДатаОкончания);
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    СуммаПоследнийЗаполненныйМесяц = 0;
    резЗнач = 0;
    Для Ит = 1 По 12 Цикл
        староеРезЗнач = резЗнач;
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            Если ит = ВыборкаДетальныеЗаписи.НомерМесяца Тогда
                резЗнач           =  ВыборкаДетальныеЗаписи.КурсыВалют;
                СуммаПоследнийЗаполненныйМесяц =  ВыборкаДетальныеЗаписи.КурсыВалют;
            КонецЕсли;    
        КонецЦикла;
        Если староеРезЗнач = резЗнач Тогда //Сумма не изменилась - надо добавить последнее заполненное значение
            резЗнач = резЗнач + СуммаПоследнийЗаполненныйМесяц;
        КонецЕсли;        
    КонецЦикла;
1 xxTANATORxx
 
24.06.16
09:25
(0)цикл в цикле?

и я стесняюсь спросить, а зачем курсы суммировать?
2 aleks_default
 
24.06.16
09:26
на классический вопрос классический ответ
Книга знаний: Срез последних на каждую дату в запросе
3 breezee
 
24.06.16
09:29
(1) Чтобы посчитать средний курс
(2) Да я же сделал поправку, что у меня может быть не заполнен курс
4 aleks_default
 
24.06.16
09:31
(3) Какая разница? Ты же курс срезом берешь
5 xxTANATORxx
 
24.06.16
09:39
(3)делается одним запросом, и среднее тоже запросом считай
6 breezee
 
24.06.16
10:06
(5) Это не сработает. Я же правильно понимаю логику - мне всё равно нужна таблица дат, чтобы получить данные на эти даты?
7 catena
 
24.06.16
10:19
(6)Это сработает. Таблица дат делается из регламентированного календаря, либо на крайний случай отдельно.
8 aleks_default
 
24.06.16
10:22
Да. Сделай свою таблицу дат, в которой точно есть все месяцы. И к ней делай срез на каждую дату.
9 catena
 
24.06.16
10:30
Держи

ВЫБРАТЬ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК Период
ПОМЕСТИТЬ тзДаты
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНач И &ДатаКон
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    КурсыВалют.Период КАК Период,
    КурсыВалют.Курс
ПОМЕСТИТЬ тзКурсы
ИЗ
    РегистрСведений.КурсыВалют КАК КурсыВалют
ГДЕ
    КурсыВалют.Период МЕЖДУ &ДатаНач И &ДатаКон
    И КурсыВалют.Валюта = &Вал
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(тзДаты.Период, МЕСЯЦ) КАК Период,
    СРЕДНЕЕ(тзКурсы.Курс) КАК Курс
ИЗ
    (ВЫБРАТЬ
        тзДаты.Период КАК Период,
        МАКСИМУМ(тзКурсы.Период) КАК ПериодыСреза
    ИЗ
        тзДаты КАК тзДаты
            ЛЕВОЕ СОЕДИНЕНИЕ тзКурсы КАК тзКурсы
            ПО тзДаты.Период >= тзКурсы.Период
    
    СГРУППИРОВАТЬ ПО
        тзДаты.Период) КАК тзДаты
        ЛЕВОЕ СОЕДИНЕНИЕ тзКурсы КАК тзКурсы
        ПО тзДаты.ПериодыСреза = тзКурсы.Период

СГРУППИРОВАТЬ ПО
    НАЧАЛОПЕРИОДА(тзДаты.Период, МЕСЯЦ)
10 breezee
 
24.06.16
11:28
(9) Да это я и сам нашел, всё равно спасибо. У меня в конфигурации нет производственного календаря. Есть другой справочник периодов, но он может быть не заполнен как нужно, хотел бы опираться на месяцы
11 catena
 
24.06.16
11:46
(10)Тогда вместо первой таблицы подбрасывай свою таблицу с данными и дальше все то же самое. В итоге и получаются месяцы. Хочешь - выводи номер месяца.
12 catena
 
24.06.16
11:46
*"свою таблицу с данными"="свою таблицу с датами"