Имя: Пароль:
1C
1С v8
Получить список дней в запросе
0 Vladislava-smile
 
08.12.16
03:29
Есть текущая дата, надо получить список дат, отнимая сначала от текущей 2 недели, а потом от каждой последней 2 недели. Можно ли решить этот вопрос средствами запроса?
1 Karlay
 
08.12.16
03:34
Конечно. Функция ДОБАВИТЬКДАТЕ в помощь
2 Vladislava-smile
 
08.12.16
03:49
(1) Допустим сегодня 08.12.2016, функцией ДобавитьКДате мы получим 24.11.2016, а дальше как зациклить?

нам надо список дат: 08.12.2016, 24.11.2016, 10.11.2016 и т.д. до начала года допустим
3 shadow_sw
 
08.12.16
04:08
зациклить в запросе - никак, обрабатывать результат запроса
4 Vladislava-smile
 
08.12.16
04:14
(3) - ну ясн, спс
5 vyaz
 
08.12.16
08:30
ВЫБРАТЬ
    0 КАК Цифры
ПОМЕСТИТЬ ВТ_Цифры

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    2

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    3

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    4

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    5

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    6

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    7

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    8

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    9
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, -(ВТ_Цифры.Цифры + ВТ_Цифры1.Цифры * 10 + ВТ_Цифры2.Цифры * 100 - 1) * 14) КАК Поле1
ИЗ
    ВТ_Цифры КАК ВТ_Цифры
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Цифры КАК ВТ_Цифры1
        ПО (ИСТИНА)
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Цифры КАК ВТ_Цифры2
        ПО (ИСТИНА)
ГДЕ
    (ВТ_Цифры.Цифры + ВТ_Цифры1.Цифры * 10 + ВТ_Цифры2.Цифры * 100 - 1) * 14 > 0

УПОРЯДОЧИТЬ ПО
    Поле1 УБЫВ
6 vyaz
 
08.12.16
08:31
это на 38 лет в глубину, но при желании можно увеличить
7 RomaH
 
naïve
08.12.16
08:37
отнимая сначала от текущей 2 недели, а потом от каждой последней 2 недели
что такое 2 недели?
8 RomaH
 
naïve
08.12.16
08:37
что вы под этим понимаете?
9 vyaz
 
08.12.16
08:44
последний запрос перемудрил, проще так

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(&ТекущаяДата, ДЕНЬ, -(ВТ_Цифры.Цифры + ВТ_Цифры1.Цифры * 10 + ВТ_Цифры2.Цифры * 100) * 14) КАК ДатаСИнтервалом2Недели
ИЗ
    ВТ_Цифры КАК ВТ_Цифры
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Цифры КАК ВТ_Цифры1
        ПО (ИСТИНА)
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Цифры КАК ВТ_Цифры2
        ПО (ИСТИНА)
10 Fedor-1971
 
08.12.16
08:49
(5) и когда это остановится?

(0) Нужно именно сформировать в запросе или получить в запрос?

неделя=60*60*24*7;
текДт=ТекущаяДата();
мас=новый ТаблицаЗначений;
мас.Колокнки.Добавить("НачНедели");
начГода=НачалоГода(текДт);
Пока текДт>начГода цикл
нов=мас.Добавить();
нов.НачНедели=текДт;
текДт=текДт-неделя;
КонецЦикла;

инф=новый Запрос;
инф.текст=
  "выбрать * поместить массивНедель из &масДт как Дт
  |дальше используешь даты в условиях";
инф.УстановитьПараметр("масДат", мас);
11 vyaz
 
08.12.16
08:51
(10) в 1978 году, но никто не мешает ограничить выборку по дате :)
12 Fedor-1971
 
08.12.16
09:02
(11) Условие прибьёт выполнение на первой же строке:
(ВТ_Цифры.Цифры + ВТ_Цифры1.Цифры * 10 + ВТ_Цифры2.Цифры * 100 - 1) * 14 > 0 соответствует (0+0*10+0*100-1)*14 = -14
13 vyaz
 
08.12.16
09:08
(12) все верно, я условие написал, чтоб убрать -14 и 0, но в (9) вообще отказался от условия, сразу затупил просто с N-1, в данном случае можно отказаться от этого
14 Fedor-1971
 
08.12.16
09:17
(13) можно и с условием из (5), только нужно цифру 0 поставить последней, а не первой
15 b_ru
 
08.12.16
09:20
Будьте проще.

ВЫБРАТЬ Календарь.Дата ИЗ Календарь КАК Календарь ГДЕ Календарь.Дата <= &ТекущаяДата И ВЫРАЗИТЬ(РАЗНОСТЬДАТ(Календарь.Дата, &ТекущаяДата, ДЕНЬ) / 7) КАК ЧИСЛО(10,0)) = РАЗНОСТЬДАТ(Календарь.Дата, &ТекущаяДата, ДЕНЬ) / 7

Календарь - какая-нибудь таблица со всеми числами. Производственный календарь в любой типовой найдется.
16 vyaz
 
08.12.16
09:28
(15) раз уж у тебя есть календарь сделай нам запрос, чтоб две недели состояли только из рабочих дней, исключаем выходные и праздники))))
17 Fedor-1971
 
08.12.16
09:35
(15) Конфигурация не озвучена, как и цель сего действа.
Серьёзно считаешь что сравнение будет работать быстрее чем вычитание?
Вот это феерично:

ВЫРАЗИТЬ(РАЗНОСТЬДАТ(Календарь.Дата, &ТекущаяДата, ДЕНЬ) / 7) КАК ЧИСЛО(10,0)) = РАЗНОСТЬДАТ(Календарь.Дата, &ТекущаяДата, ДЕНЬ) / 7

т.е. каждый раз дважды вычислить разность в днях и поделить, один раз округлить, и только потом сравнить проще чем отнять? Порадовал, ты сделал мой день.

ТС исчез.
18 Fedor-1971
 
08.12.16
09:37
17+ да, и какой результат получим если твой календарь тупо не заполнил пользователь
19 b_ru
 
08.12.16
10:09
(17) Кого-то тут волнует быстродействие? Если говорить о нем, то такие вещи в любом случае не стоит делать на языке запросов, он для такого не предназначен. Мой вариант просто читабельнее.
Кстати, если не знал, разностьдат разворачивается в одну единственную операцию вычитания лонгинтов.
20 Fedor-1971
 
08.12.16
10:32
(19) меня волнует. Большая проблема современного кодинга, практически на любом языке, наплевательское отношение к оптимизации быстродействия с обоснованием "Выполнится за 0,5 или за 0,7 сек пользователь этого не заметит", ещё и как заметит когда попытается пересчитать данные, например, за месяц. Тут 0,1 там 0,2 и сидим час ждём первой звезды. Сервер заметит, когда будет считать для N пользователей такую лабуду.
А потом 1С (или что другое) лажа, работает медленно, сырая и т.д. Сервера надо мощнее некуда и дороженные.

Читабельнее и удобнее (10), реализуемебельнее (5), при условии, что нужно получить именно запросом
21 b_ru
 
08.12.16
10:48
(20) Большая проблема современного кодинга - малообразованные кодеры, которые не соображают, что и когда нужно оптимизировать, не соображают как работают стеки современных технологий, ну и срутся на форуме вместо того, чтобы работу работать. Пойду бороться с третьей проблемой, а ты попробуй с первыми двумя.
Независимо от того, куда вы едете — это в гору и против ветра!