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

Дело в том, что есть месяцы для которых в регистре нет записи. Как мне вывести ВСЕ месяцы? Если записи регистра нет, то ноль для ДОХОД.
Совал ЕстьNULL в разные места - бестолку )

Или это невозможно? И когда засуну в таблицу РезультатЗапроса - то только там как-то анализировать пропуск месяца и добавлять строку с нулём дохода?
1 Voronve
 
26.08.25
19:52
(0) Выстимо как. Построить таблицу месяцев и к ней левым соединением твой запрос пришпандорить.
Месяц будет даже там где нет записи
2 PR
 
26.08.25
19:55
Там вроде как дополнение в тексте запроса можно же сделать
3 Гена
 
гуру
26.08.25
19:55
(1) Вот продолжение:
Запрос.УстановитьПараметр("КонецИнтервала", КонецИнтервала);
    Запрос.УстановитьПараметр("НачалоИнтервала", НачалоИнтервала);
    Запрос.УстановитьПараметр("Сотрудник", Отчет.Сотрудник);     
    
    РезультатЗапроса = Запрос.Выполнить().Выгрузить();
    Отчет.ТаблицаДоходов.Очистить();
    Для Каждого Строка Из РезультатЗапроса Цикл
        НоваяСтрока = Отчет.ТаблицаДоходов.Добавить();
        НоваяСтрока.Месяц  = Строка.Месяц;
        НоваяСтрока.Доход  = Строка.Доход;
    КонецЦикла;    

Где тут левосоединить и как?
4 PR
 
26.08.25
19:56
И не надо делать ветки "Ветка для всех дилетантских вопросов"
Одна ветка — один вопрос
5 Маленький Вопросик
 
26.08.25
19:56
(0) сделай таблицу месяцев и соедини либо левым либо полным
6 Гена
 
гуру
26.08.25
19:56
(4) Ок
7 Маленький Вопросик
 
26.08.25
19:57
(3) так тоже можно
8 Bigbro
 
26.08.25
19:58
перед где
правое соединение месяцы
по месяцы.месяц = СведенияОДоходахСтраховыеВзносы.месяц

ну и месяцы туда засунуть все.
9 Гена
 
гуру
26.08.25
19:59
(7) А дальше? Как нулевой доход добавить для отсутствующего в РезультатеЗапроса месяца?
10 Гена
 
гуру
26.08.25
20:00
Мне бы текст... я бы сразу и проверил. Не хочу залезать в основы работы с левыми и правыми соединениями. Мерси.
11 Маленький Вопросик
 
26.08.25
20:01
https://infostart.ru/1c/reports/1074905/ - моя древнейшая обработка по этому вопросу
12 Voronve
 
26.08.25
20:06
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
|    ТаблицаМесяцы.Месяц КАК Месяц
|ПОМЕСТИТЬ втМесяцы
|ИЗ
|    &ТаблицаМесяцы КАК ТаблицаМесяцы
|;
|
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
|    втМесяцы.Месяц  КАК Месяц,
|    СУММА(СведенияОДоходахСтраховыеВзносы.Сумма - СведенияОДоходахСтраховыеВзносы.Скидка) КАК Доход
|ИЗ
|    втМесяцы КАК втМесяцы
|
|    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СведенияОДоходахСтраховыеВзносы КАК СведенияОДоходахСтраховыеВзносы
|    ПО втМесяцы.Месяц = НАЧАЛОПЕРИОДА(СведенияОДоходахСтраховыеВзносы.Период, МЕСЯЦ)
|ГДЕ
|    СведенияОДоходахСтраховыеВзносы.Сотрудник = &Сотрудник
|    И СведенияОДоходахСтраховыеВзносы.Период МЕЖДУ &НачалоИнтервала И &КонецИнтервала
|
|СГРУППИРОВАТЬ ПО
|    втМесяцы.Месяц
....

    Запрос.УстановитьПараметр("ТаблицаМесяцы ", ТаблицаМесяцы);



ТаблицаМесяцы - тз с месяцами
13 Маленький Вопросик
 
26.08.25
20:05
(12) а че мудришь с менеджером.. собрать запросом месяцы не катит?

и зачем разрешенные? че умничаешь)))
14 Маленький Вопросик
 
26.08.25
20:07
(12) тогда пиши
СведенияОДоходахСтраховыеВзносы.Сотрудник В &Сотрудник

и обыграй условие в запросе, если не выбран сотрудник
15 Voronve
 
26.08.25
20:07
(13) попроще пока, с входным параметром
умный - вот и умничаю ))
16 Voronve
 
26.08.25
20:07
(14) Пусть сам махается с этим
17 Гена
 
гуру
26.08.25
20:15
Ничего не понял. Ладно. Придётся ждать до завтра программиста )
Я думал - мне текст дадут и я его сразу проверю )
Есть одна идея, интересная...
18 Timon1405
 
26.08.25
20:21
"ВЫБРАТЬ
    |    ВсеДаты.Месяц КАК Месяц,
    |    ЕСТЬNULL(СУММА(СведенияОДоходахСтраховыеВзносы.Сумма - СведенияОДоходахСтраховыеВзносы.Скидка), 0) КАК Доход
    |ИЗ
    |    (ВЫБРАТЬ
    |                НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоИнтервала, МЕСЯЦ, aa.a * 1000 + bb.a * 100 + cc.a * 10 + dd.a), МЕСЯЦ) КАК Месяц
    |            ИЗ
    |                (ВЫБРАТЬ 0 КАК a ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК aa
    |                СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК a ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК bb ПО ИСТИНА
    |                СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК a ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК cc ПО ИСТИНА
    |                СОЕДИНЕНИЕ (ВЫБРАТЬ 0 КАК a ОБЪЕДИНИТЬ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВЫБРАТЬ 3 ОБЪЕДИНИТЬ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВЫБРАТЬ 6 ОБЪЕДИНИТЬ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВЫБРАТЬ 9) КАК dd ПО ИСТИНА
    |            ГДЕ
    |                ДОБАВИТЬКДАТЕ(&НачалоИнтервала, МЕСЯЦ, aa.a * 1000 + bb.a * 100 + cc.a * 10 + dd.a) <= &КонецИнтервала
    |            ) КАК ВсеДаты
    |ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СведенияОДоходахСтраховыеВзносы КАК СведенияОДоходахСтраховыеВзносы
    |ПО ВсеДаты.Месяц = НАЧАЛОПЕРИОДА(СведенияОДоходахСтраховыеВзносы.Период, МЕСЯЦ)
    |    И СведенияОДоходахСтраховыеВзносы.Сотрудник = &Сотрудник
    |
    |СГРУППИРОВАТЬ ПО
    |    ВсеДаты.Месяц
    |
    |УПОРЯДОЧИТЬ ПО
    |    ВсеДаты.Месяц"
19 Маленький Вопросик
 
26.08.25
20:19
(17) не дай бог с тобой работать...
20 Гена
 
гуру
26.08.25
20:19
Похоже проще всего в усечённую таблицу добавить отсутствующие месяцы как ТаблицаДоходов.Добавить
21 Волшебник
 
26.08.25
20:22
22 Гена
 
гуру
26.08.25
20:22
(19) Спасибо, добрый человек )
23 Voronve
 
26.08.25
20:22
(18) Жесть. У тебя подзапрос на 9999 строк выполнится такое количество раз сколько строк будет в соединении.
24 Волшебник
 
26.08.25
20:23
(22) Геннадий, сделайте временную таблицу из ваших ВЫБРАТЬ 0...9
25 Волшебник
 
26.08.25
20:24
ВЫБРАТЬ 0
ОБЪЕДИНИТЬ 
ВЫБРАТЬ 1
...
ВЫБРАТЬ 9
ПОМЕСТИТЬ Цифры;


далее следующий запрос
26 Гена
 
гуру
26.08.25
20:25
(24) Это надо изучать основы ВТ - не хочу забивать голову )
27 Волшебник
 
26.08.25
20:26
(26) Там две строки кода. У Вас получится!
28 Гена
 
гуру
26.08.25
20:27
(27) И так видно - что в Цифры ляжет )
29 Волшебник
 
26.08.25
20:28
(28) Гена, за такой запрос Вас могут избить ногами.
30 Гена
 
гуру
26.08.25
20:28
(29) Вот я и не пишу )
31 Timon1405
 
26.08.25
20:28
(21) изначальный запрос про таблицу дат встроен в конструктор запросов ИР. там и другие полезные вещи есть
32 Волшебник
 
26.08.25
20:32
(30) Вы должны пытаться сделать хорошо. Я понимаю, что Вы отлично кликаете и разбираетесь во внутренней архитектуре чужого решения. Но теперь Вы сами себе поставили задачу выше, опубликовали первое расширение на Инфостарте. Вы явно переходите на уровень ВЫШЕ с точки зрения СЕБЯ, но с точки зрения НАС, Вы переходите на уровень НИЖЕ, на уровень запросов. И тут немного другие правила. Нужен сухой код, без повторений.
33 Гена
 
гуру
26.08.25
20:36
(32) Проще всего, похоже, взять номера месяцев от 1 до 12 (не индек строки, а именно что НомерМесяца (в году) и какого нет в таблице - просто добавить. В конце отсортировать.
Нет?
34 Маленький Вопросик
 
26.08.25
20:43
|ВЫБРАТЬ
|	ДАТАВРЕМЯ(2025,1,1) КАК Месяцы
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
|	ДАТАВРЕМЯ(2025,2,1)
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
|	ДАТАВРЕМЯ(2025,3,1)


(31) ты просто жесть.... "полезные" вещи)))
35 Волшебник
 
26.08.25
20:44
(33) Не путайте функции встроенного языка 1С и функции языка запросов 1С. Это два разных языка.
А ещё есть язык выражений СКД. Это третий язык
36 Гена
 
гуру
26.08.25
20:47
(35) Да я не путаю. Раз в запросах добавлять строку сложно, то можно пойти и на вариант добавления строки в готовую таблицу. Она всегда 12 мес и их номера месяца для таблицы уникальны.
37 Timon1405
 
26.08.25
20:46
(34) браво, а сделаете теперь также с параметрами с [датаНачала] по [датаОкончания]?
38 Маленький Вопросик
 
26.08.25
20:47
(37) я это сделал уже все давным-давно в (11)
39 Волшебник
 
26.08.25
20:51
Программист 1С знает примерно 4-5 языков, которые все применяются:

- встроенный язык (иногда делится на контексты: сервер/клиент)
- язык запросов
- язык форматной строки
- язык ограничений доступа
40 Гена
 
гуру
26.08.25
20:56
Кстати, если кто не понял - леплю калькулятор расчёта пособия по безработице как нас видит биржа труда, по их данным.
Если кто собирается грохнуть Plane сервис, то всегда может выбрать себя, дату и глянуть сумму )
На всякий случай )))
41 ЕRPe
 
26.08.25
21:10
(3) По пацански колхозному без этих ваших мудренных запросов
Отчет.ТаблицаДоходов.Очистить();
    ТекМесяц = НачалоМесяца(НачалоИнтервала);
    Пока ТекМесяц <= НачалоМесяца(КонецИнтервала) Цикл
        НоваяСтрока = Отчет.ТаблицаДоходов.Добавить();
        НоваяСтрока.Месяц  = ТекМесяц;
        НоваяСтрока.Доход  = 0;
        ТекМесяц = КонецМесяца(ТекМесяц) + 1;
    КонецЦикла;                  
    
    Для Каждого Строка Из РезультатЗапроса Цикл
        НоваяСтрока = Отчет.ТаблицаДоходов.Добавить();
        НоваяСтрока.Месяц  = Строка.Месяц;
        НоваяСтрока.Доход  = Строка.Доход;
    КонецЦикла;
42 Timon1405
 
26.08.25
21:22
(38) в этом и ценность форума, узнать разные подходы к решению задачи. а в ссылке на не бесплатную обработку ценности, увы, мало, хотя Вы, конечно, думаете иначе.
43 Гена
 
гуру
26.08.25
21:23
(41) Хорошая идея. Получится, правда, для доходных месяцев две строки: с нулём и доходом... а в бездоходных месяцах нужная одна строка.

Потом снова прогнать третий цикл и как-то сплюсовать одномесячные строки?
44 Гена
 
гуру
26.08.25
21:25
Может всё-таки как-то воспользоваться уникальным номером месяца в году?
45 Волшебник
 
26.08.25
21:39
(44) Гена, Вы недооцениваете себя
Вам эти языки как пальцем обо асфальт. Просто выражайте свою мысль на другом языке. Ведь главное это мысль!
46 X Leshiy
 
26.08.25
21:54
(0) Запрос в цикле уже предлагали?)
47 Гена
 
гуру
26.08.25
21:55
(45) А... да, спасибо. Забыл, что я задачу расписал в другой ветке.

Заново. Есть 12-месячный интервал. Помесячно собрали запросом Результат как Месяц ... Доход. Из-за того, что в отдельных месяцах не было записей (и, понятно, дохода) мы имеем меньшее количество месяцев не подряд:
Август 2024 ... 1564.12
Сентябрь 2024 ... 1255.00
Январь 2025 ... 5854.56
Апрель 2025 ... 45478.47

Нам надо теперь получить таблицу в нормальном 12-месячном виде:
Июль 2024 ... 0
Август 2024 ... 1564.12
Сентябрь 2024 ... 1255.00
Октябрь 2024 ... 0
Ноябрь 2024 ... 0
Декабрь 2024 ... 0
Январь 2025 ... 5854.56
Февраль 2025 ... 0
Март 2025 ... 0
Апрель 2025 ... 45478.47
Май 2025 ... 0
Июнь 2025 ... 0
48 Гена
 
гуру
26.08.25
21:56
Дальше я сам разберусь с треблами, даблами и уно.
49 Гена
 
гуру
26.08.25
21:58
Может какой-то цикл по номеру месяца от 1 до 12 на проверку НомерМесяца(Месяц) и добавление при отсутствии?
50 Timon1405
 
26.08.25
21:59
(43) ТаблицаДоходов.Свернуть("Месяц","Доход");
ТаблицаДоходов.Сортировать("Месяц");
в конце (41)
51 Гена
 
гуру
26.08.25
21:59
Просто, создавая ветку, я думал, что есть какой оператор для запроса, чтобы сразу 0 выводил )
52 Timon1405
 
26.08.25
22:02
(51) вспомнил, есть такое https://its.1c.ru/db/metod8dev/content/2660/hdoc
53 Волшебник
 
26.08.25
22:21
(48) по-другому и быть не может.
54 2S
 
26.08.25
22:53
Геннадий, Вам это нужно?
https://fastcode.im/Templates/6756/sozdat-vremennuyu-tabliczu-periodov-s-zadannoj-periodichnostyu

Как соберете вт периодов, затем соедините левым соединением с данными
55 RomanYS
 
26.08.25
23:26
Поймали программисты консультанта на своей территории и давай издеваться))


(0) В ЗУПе должно работать, но там нет измерения Сотрудник
"ВЫБРАТЬ
|    РС.Месяц КАК Месяц,
|    ЕСТЬNULL(РН.СуммаОборот - РН.СкидкаОборот, 0) КАК Сумма
|ИЗ
|    РегистрСведений.ДанныеПроизводственногоКалендаряПомесячно КАК РС
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СведенияОДоходахСтраховыеВзносы.Обороты(&Начало, &Конец, Месяц, ФизическоеЛицо = &ФизическоеЛицо) КАК РН
|        ПО (РС.Месяц = РН.Период)
|ГДЕ
|    РС.Месяц МЕЖДУ НАЧАЛОПЕРИОДА(&Начало, МЕСЯЦ) И &Конец"
56 Волшебник
 
26.08.25
23:30
(55) Когда делаете запросы в ЗУП к мифическим таблицам, указывайте их структуру
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн