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

В СКД знаю как сделать. Хотелось бы именно в запросе. Пока рассматриваю вариант сделать таблицу значений с месяцами и соединение к ней.
1 Андроны едут
 
30.07.21
10:34
...вариант сделать таблицу значений с месяцами и соединение к ней.. считаю правильным
2 ДенисЧ
 
30.07.21
10:34
Создать таблицу месяцев, к ней слева подсоединить таблицу документов
3 Smallrat
 
30.07.21
10:38
Можно легко сделать запросом к регламентированному производственному календарю, если он ведется.
4 Said_We
 
30.07.21
10:40
(3) Обычный порождающий запрос и не надо завязываться на данные в каком-то регистре.
5 Бишбармак
 
30.07.21
10:41
Туплю... закрывайте тему.
6 Бишбармак
 
30.07.21
10:49
Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ КорректировкаРеализации.Ссылка) КАК Количество,
        |    НАЧАЛОПЕРИОДА(КорректировкаРеализации.Дата, МЕСЯЦ) КАК МесяцДоков
        |ИЗ
        |    Документ.КорректировкаРеализации КАК КорректировкаРеализации
        |ГДЕ
        |    КорректировкаРеализации.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
        |
        |СГРУППИРОВАТЬ ПО
        |    НАЧАЛОПЕРИОДА(КорректировкаРеализации.Дата, МЕСЯЦ)
        |
        |УПОРЯДОЧИТЬ ПО
        |    МесяцДоков
        |ИТОГИ
        |    СУММА(Количество)
        |ПО
        |    МесяцДоков ПЕРИОДАМИ(МЕСЯЦ, &ДатаНачала, &ДатаОкончания)";
    
    Запрос.УстановитьПараметр("ДатаНачала", Отчет.ДатаНачала);
    Запрос.УстановитьПараметр("ДатаОкончания", Отчет.ДатаОкончания);
    
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаМесяцДоков = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"МесяцДоков","Все");
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший