Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 04:17

Дополнить запрос данными регистра сведений по всему периоду

Автор Jazz1, 10 апр 2013, 13:12

0 Пользователей и 1 гость просматривают эту тему.

Jazz1

Здравствуйте.
Есть созданный регистр сведений,  хранящий данные о коэффициенте(ресурс), контрагенте(измерение) и дате. Регистр периодический с периодом день. Возьмем период 1.01.2013 - 10.01.2013. Например 01.01.2013 я установил контрагенту коэффициент 0,5, а 05.01.2013 коэффициент 0,7. Сделал запрос по контрагенту с полями дата, контрагент, коэффициент - он отобразил коэффициенты только а 01 и 05 число. А можно сделать как-то что если коэффициент если не менялся, то заполнять по датам значением этого коэффициента. Т.е. чтобы этот коэф заполнялся по всем датам?

MuI_I_Ika

Можно посмотреть текст запроса, который не получился?

Jazz1

Вот запрос


ВЫБРАТЬ
   Выборка.Дата КАК Дата,
   СУММА(Выборка.КоличествоПришло) КАК КоличествоПришло,
   СУММА(Выборка.СуммаПришло) КАК СуммаПришло,
   СУММА(Выборка.КоличествоПродано) КАК КоличествоПродано,
   СУММА(Выборка.СуммаПродано) КАК СуммаПродано,
   СУММА(Выборка.КоличествоВозвращеноПокупателем) КАК КоличествоВозвращеноПокупателем,
   СУММА(Выборка.СуммаВозвращеноПокупателем) КАК СуммаВозвращеноПокупателем,
   СУММА(Выборка.КоличествоВозвращеноПоставщику) КАК КоличествоВозвращеноПоставщику,
   СУММА(Выборка.СуммаВозвращеноПоставщику) КАК СуммаВозвращеноПоставщику,
   СУММА(Выборка.СуммаОплачено) КАК СуммаОплачено,
   МАКСИМУМ(Выборка.Коэффициент) КАК Коэффициент
ИЗ
   (ВЫБРАТЬ
      НАЧАЛОПЕРИОДА(ПартииТоваровНаСкладахОбороты.Период, ДЕНЬ) КАК Дата,
      СУММА(ПартииТоваровНаСкладахОбороты.КоличествоПриход) КАК КоличествоПришло,
      СУММА(ПартииТоваровНаСкладахОбороты.СтоимостьПриход) КАК СуммаПришло,
      0 КАК КоличествоПродано,
      0 КАК СуммаПродано,
      0 КАК КоличествоВозвращеноПокупателем,
      0 КАК СуммаВозвращеноПокупателем,
      0 КАК КоличествоВозвращеноПоставщику,
      0 КАК СуммаВозвращеноПоставщику,
      0 КАК СуммаОплачено,
      0 КАК Коэффициент
   ИЗ
      РегистрНакопления.ПартииТоваровНаСкладах.Обороты(
            &ДатаНачала,
            &ДатаОкончания,
            РЕГИСТРАТОР,
            СтатусПартии = ЗНАЧЕНИЕ(Перечисление.СтатусыПартийТоваров.НаКомиссию)
               И Склад.Поставщик = &Контрагент) КАК ПартииТоваровНаСкладахОбороты
   ГДЕ
      ПартииТоваровНаСкладахОбороты.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
   
   СГРУППИРОВАТЬ ПО
      НАЧАЛОПЕРИОДА(ПартииТоваровНаСкладахОбороты.Период, ДЕНЬ)
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
      ДАТАВРЕМЯ(1, 1, 1),
      СУММА(ПартииТоваровНаСкладахОстатки.КоличествоОстаток),
      СУММА(ПартииТоваровНаСкладахОстатки.СтоимостьОстаток),
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0
   ИЗ
      РегистрНакопления.ПартииТоваровНаСкладах.Остатки(
            &ДатаНачала,
            СтатусПартии = ЗНАЧЕНИЕ(Перечисление.СтатусыПартийТоваров.НаКомиссию)
               И Склад.Поставщик = &Контрагент) КАК ПартииТоваровНаСкладахОстатки
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
      ДАТАВРЕМЯ(1, 1, 1),
      0,
      0,
      0,
      ВЫБОР
         КОГДА &ДатаНачала = ДАТАВРЕМЯ(1, 1, 1)
            ТОГДА 0
         ИНАЧЕ СУММА(ПартииТоваровНаСкладахОбороты.СтоимостьРасход)
      КОНЕЦ,
      0,
      0,
      0,
      0,
      0,
      0
   ИЗ
      РегистрНакопления.ПартииТоваровНаСкладах.Обороты(
            ,
            &ДатаНачала,
            РЕГИСТРАТОР,
            СтатусПартии = ЗНАЧЕНИЕ(Перечисление.СтатусыПартийТоваров.НаКомиссию)
               И Склад.Поставщик = &Контрагент) КАК ПартииТоваровНаСкладахОбороты
   ГДЕ
      НЕ ПартииТоваровНаСкладахОбороты.Регистратор ССЫЛКА Документ.ВозвратТоваровПоставщику
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
      НАЧАЛОПЕРИОДА(ПартииТоваровНаСкладахОбороты.Период, ДЕНЬ),
      0,
      0,
      СУММА(ПартииТоваровНаСкладахОбороты.КоличествоРасход),
      СУММА(ПартииТоваровНаСкладахОбороты.СтоимостьРасход),
      0,
      0,
      0,
      0,
      0,
      0
   ИЗ
      РегистрНакопления.ПартииТоваровНаСкладах.Обороты(
            &ДатаНачала,
            &ДатаОкончания,
            РЕГИСТРАТОР,
            СтатусПартии = ЗНАЧЕНИЕ(Перечисление.СтатусыПартийТоваров.НаКомиссию)
               И Склад.Поставщик = &Контрагент) КАК ПартииТоваровНаСкладахОбороты
   ГДЕ
      НЕ ПартииТоваровНаСкладахОбороты.Регистратор ССЫЛКА Документ.ВозвратТоваровПоставщику
   
   СГРУППИРОВАТЬ ПО
      НАЧАЛОПЕРИОДА(ПартииТоваровНаСкладахОбороты.Период, ДЕНЬ)
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
      НАЧАЛОПЕРИОДА(ПартииТоваровНаСкладахОбороты.Период, ДЕНЬ),
      0,
      0,
      0,
      0,
      СУММА(ПартииТоваровНаСкладахОбороты.КоличествоПриход),
      СУММА(ПартииТоваровНаСкладахОбороты.СтоимостьПриход),
      0,
      0,
      0,
      0
   ИЗ
      РегистрНакопления.ПартииТоваровНаСкладах.Обороты(
            &ДатаНачала,
            &ДатаОкончания,
            РЕГИСТРАТОР,
            СтатусПартии = ЗНАЧЕНИЕ(Перечисление.СтатусыПартийТоваров.НаКомиссию)
               И Склад.Поставщик = &Контрагент) КАК ПартииТоваровНаСкладахОбороты
   ГДЕ
      НЕ ПартииТоваровНаСкладахОбороты.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
   
   СГРУППИРОВАТЬ ПО
      НАЧАЛОПЕРИОДА(ПартииТоваровНаСкладахОбороты.Период, ДЕНЬ)
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
      НАЧАЛОПЕРИОДА(ПартииТоваровНаСкладахОбороты.Период, ДЕНЬ),
      0,
      0,
      0,
      0,
      0,
      0,
      СУММА(ПартииТоваровНаСкладахОбороты.КоличествоРасход),
      СУММА(ПартииТоваровНаСкладахОбороты.СтоимостьРасход),
      0,
      0
   ИЗ
      РегистрНакопления.ПартииТоваровНаСкладах.Обороты(
            &ДатаНачала,
            &ДатаОкончания,
            РЕГИСТРАТОР,
            СтатусПартии = ЗНАЧЕНИЕ(Перечисление.СтатусыПартийТоваров.НаКомиссию)
               И Склад.Поставщик = &Контрагент) КАК ПартииТоваровНаСкладахОбороты
   ГДЕ
      ПартииТоваровНаСкладахОбороты.Регистратор ССЫЛКА Документ.ВозвратТоваровПоставщику
   
   СГРУППИРОВАТЬ ПО
      НАЧАЛОПЕРИОДА(ПартииТоваровНаСкладахОбороты.Период, ДЕНЬ)
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
      НАЧАЛОПЕРИОДА(ВзаиморасчетыСКонтрагентамиОбороты.Период, ДЕНЬ),
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      СУММА(ВзаиморасчетыСКонтрагентамиОбороты.СуммаУпрПриход),
      0
   ИЗ
      РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(
            &ДатаНачала,
            &ДатаОкончания,
            РЕГИСТРАТОР,
            ДоговорКонтрагента.Владелец = &Контрагент
               И ДоговорКонтрагента.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СКомитентом)) КАК ВзаиморасчетыСКонтрагентамиОбороты
   ГДЕ
      ВзаиморасчетыСКонтрагентамиОбороты.Регистратор ССЫЛКА Документ.ПлатежноеТребованиеПолученное
   
   СГРУППИРОВАТЬ ПО
      НАЧАЛОПЕРИОДА(ВзаиморасчетыСКонтрагентамиОбороты.Период, ДЕНЬ)
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
      ДАТАВРЕМЯ(1, 1, 1),
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      ВЫБОР
         КОГДА &ДатаНачала = ДАТАВРЕМЯ(1, 1, 1)
            ТОГДА 0
         ИНАЧЕ СУММА(ВзаиморасчетыСКонтрагентамиОбороты.СуммаУпрПриход)
      КОНЕЦ,
      0
   ИЗ
      РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(
            ,
            &ДатаНачала,
            РЕГИСТРАТОР,
            ДоговорКонтрагента.Владелец = &Контрагент
               И ДоговорКонтрагента.ВидДоговора = ЗНАЧЕНИЕ(Перечисление.ВидыДоговоровКонтрагентов.СКомитентом)) КАК ВзаиморасчетыСКонтрагентамиОбороты
   ГДЕ
      ВзаиморасчетыСКонтрагентамиОбороты.Регистратор ССЫЛКА Документ.ПлатежноеТребованиеПолученное
   
   ОБЪЕДИНИТЬ ВСЕ
   
   ВЫБРАТЬ
      НАЧАЛОПЕРИОДА(КоэффициентыКомитентов.Период, ДЕНЬ),
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      КоэффициентыКомитентов.Коэффициент
   ИЗ
      РегистрСведений.КоэффициентыКомитентов КАК КоэффициентыКомитентов) КАК Выборка

СГРУППИРОВАТЬ ПО
   Выборка.Дата

УПОРЯДОЧИТЬ ПО
   Выборка.Дата

SlazZy

В самом запросе это сделать нельзя, тут варианта два - если у вас просто запрос(не отчет), то добавляете итог по полю ДАТА

|ИТОГИ ПО
| Дата ПЕРИОДАМИ(ДЕНЬ, &ДатаНачала, &ДатаОкончания)"; //параметры не обязательны

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

ВыборкаПериод = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Дата", "Все");


И в запрос попадут все даты между первой и последней. Дату желательно привести к началу дня. Ну, а дальше дело техники :) просто запоминаете в переменной ваш коэффициент и проставляете его при обходе выборки до следующего установленного коэффициента.



Если же у вас отчет, то в СКД надо сделать группировку по полю Дата(но лучше изначально дату привести к началу дня) и сделать метод дополнения "день"

Jazz1

У меня в отчет идут эти данные.

Добавил в код строку:
ВыборкаПериод = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Дата", "Все");

Выдало ошибку {ВнешнийОтчет.ОтчетКомитенту.МодульОбъекта(287)}: Ошибка при вызове метода контекста (Выбрать)
   Результат = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Дата", "Все");
по причине:
Измерение не найдено "Дата"


Дата у меня приведена к началу. Я не совсем понимаю как запомнить в переменной коэффициент, например если задан период, в котором коэффициент не определен (т.е. определен датой раньше или позже, а с этой даты он пустой получается)?

Отчет не на СКД...

SlazZy

получить пустые записи нельзя, но можно дополнить период пустыми записями дат и для этих дат заполнять коэффициент, ну не заполнять, а выводить его в отчет.
например вы имеете на данный момент такие строки
01012013    1
05012013    2


Будете же иметь
01012013    1
02012013    null
03012013    null
04012013    null
05122013    2

Соответственно при обходе этой выборки вы можете в отчет выводить прошлое значение. (интересно Null или 0, но конечно же склоняюсь к null, проверять времени нет)


Ошибка видимо потому, что в этом методе указывают поля итогов, у меня это поле дата, у вас не знаю как вы назвали поле :)

Jazz1

Я к тому что могу иметь:

01012013    null
05012013    2

А за дату например 20122012 1
Вот как мне взять эту 1 от 20122012 и растянуть до 05012013, если значение 01012013  - null ?

SlazZy

А за дату например 20122012 1
Вот как мне взять эту 1 от 20122012 и растянуть до 05012013, если значение 01012013  - null ?


покажите код как вы выводите эти значения в отчет

Jazz1

Если коротко, то так:

Запрос.УстановитьПараметр("Контрагент", Контрагент);
Запрос.УстановитьПараметр("ДатаНачала", ?(ДатаНачала = Дата("00010101000000"), Дата("20130101000000"), ДатаНачала));
Запрос.УстановитьПараметр("ДатаОкончания", ?(ДатаОкончания = Дата("00010101000000"), ДатаОкончания, КонецДня(ДатаОкончания)));

Результат = Результат.Выбрать();
//Результат = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Дата", "Все");
   
Область = Макет.ПолучитьОбласть("Строка");
      
Пока Результат.Следующий() Цикл
   Коэффициент = Результат.Коэффициент;
        Область.Параметры.Коэффициент = Коэффициент;
   ТабличныйДокумент.Вывести(Область);
КонецЦикла;

SlazZy

Цитата: Jazz1 от 10 апр 2013, 15:41Пока Результат.Следующий() Цикл
   Коэффициент = Результат.Коэффициент;
        Область.Параметры.Коэффициент = Коэффициент;
   ТабличныйДокумент.Вывести(Область);
КонецЦикла;

Что вам мешает сделать вот так?


Коэффициент =0;
Пока Результат.Следующий() Цикл
   Если Результат.Коэфициент<>null Тогда
       Коэффициент = Результат.Коэффициент;
   КонецЕсли;

   Область.Параметры.Коэффициент = Коэффициент;

   ТабличныйДокумент.Вывести(Область);
КонецЦикла;

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск