Имя: Пароль:
1C
1С v8
Запрос с параметрами
0 buketovav
 
23.10.19
11:08
Доброго дня, дорогие Форумчане!
Вот такой вопрос у меня возник: как сформировать запрос не к таблицам БД, а имея, например, только параметры Дата1 и Дата2 в результат запроса вывести обе этих даты и те даты, которые между ними?
1 Ёпрст
 
23.10.19
11:10
Опять тестовое задание с собеседования ?
2 Chum
 
23.10.19
11:12
ВЫБРАТЬ
   ВЫРАЗИТЬ(&НачДата КАК ДАТА) КАК ДатаП
ИТОГИ ПО
   ДатаП ПЕРИОДАМИ(ДЕНЬ, &НачДата, &КонДата)
3 buketovav
 
23.10.19
11:13
ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) КАК Поле1,
    КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ) КАК Поле2

так могу вывести параметры
4 buketovav
 
23.10.19
11:14
(1) не, просто интересно ) раньше не сталкивался с таким )
5 buketovav
 
23.10.19
11:17
(1) кстати, кто их такие задания придумывает )))
и что в реальных задачах бывает потребность в таких решениях?
можно ведь взять РС с календарем ))) и там все есть
6 piter3
 
23.10.19
11:18
(5) Бывает самописки пользуют
7 buketovav
 
23.10.19
11:19
(6) а БСП не дает такой возможности разве?
8 piter3
 
23.10.19
11:20
(7) У меня вот есть времен до БСП
9 Ёпрст
 
23.10.19
11:22
10 Ёпрст
 
23.10.19
11:22
(5) у меня нет никакого календаря в базе
11 piter3
 
23.10.19
11:23
Да и календарь может быть не заполнен.
12 buketovav
 
23.10.19
11:23
(11) согласен
13 buketovav
 
23.10.19
11:23
(10) понял понял, просто размышляю, для чего такое может понадобиться )
14 buketovav
 
23.10.19
11:45
не, все равно чет не понимаю, как при таком запросе вывести все даты между &Дата1 и &Дата2

ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) КАК НачалоПериода,
    КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ) КАК КонецПериода
15 Ёпрст
 
23.10.19
11:48
(14) см. (9) там есть текст запроса
16 buketovav
 
23.10.19
12:07
чет не доходит (15)
17 Ёпрст
 
23.10.19
12:09
(16) чего не доходит ? Там готовый текст запроса в 10 посту
18 Жан Пердежон
 
23.10.19
12:10
(16)
ВЫБРАТЬ 0 КАК Б ПОМЕСТИТЬ вт ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1;
ВЫБРАТЬ вт0.Б+2*вт1.Б+4*вт2.Б+8*вт3.Б+16*вт4.Б+32*вт5.Б+64*вт6.Б+128*вт7.Б+256*вт8.Б+512*вт9.Б+1024*вт9.Б КАК ЧИСЛО
ПОМЕСТИТЬ втЧисла
ИЗ вт КАК вт0, вт КАК вт1, вт КАК вт2, вт КАК вт3, вт КАК вт4, вт КАК вт5, вт КАК вт6, вт КАК вт7, вт КАК вт8, вт КАК вт9, вт КАК вт10;

ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&Дата1, ДЕНЬ, втЧисла.Число)
ИЗ втЧисла
ГДЕ ДОБАВИТЬКДАТЕ(&Дата1, ДЕНЬ, втЧисла.Число)<=&Дата2;
19 buketovav
 
23.10.19
12:10
(17) чет у меня он пустой результат дает. поэтому не доходит )
20 Ёпрст
 
23.10.19
12:13
(19)  путаешь даты начала и конца в параметрах
21 DrWatson
 
23.10.19
12:13
В отчетах ЗУПа есть подобное.
22 DrWatson
 
23.10.19
12:19
"ВЫБРАТЬ
        |    0 КАК Цифра
        |ПОМЕСТИТЬ ВТЦифры
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    1
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    2
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    3
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    4
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    5
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    6
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    7
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    8
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    9
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериодаИнтервала, ЧАС, Цифры.Цифра + ЕСТЬNULL(Цифры10.Цифра, 0) * 10 + ЕСТЬNULL(Цифры100.Цифра, 0) * 100 + ЕСТЬNULL(Цифры1000.Цифра, 0) * 1000 + ЕСТЬNULL(Цифры10000.Цифра, 0) * 10000 + ЕСТЬNULL(Цифры100000.Цифра, 0) * 100000), ЧАС) КАК ИмяПоляПериод
        |ПОМЕСТИТЬ ИмяВТ
        |ИЗ
        |    ВТЦифры КАК Цифры
        |        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры10
        |        ПО (РАЗНОСТЬДАТ(&НачалоПериодаИнтервала, &ОкончаниеПериодаИнтервала, ЧАС) > 9)
        |        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры100
        |        ПО (РАЗНОСТЬДАТ(&НачалоПериодаИнтервала, &ОкончаниеПериодаИнтервала, ЧАС) > 99)
        |        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры1000
        |        ПО (РАЗНОСТЬДАТ(&НачалоПериодаИнтервала, &ОкончаниеПериодаИнтервала, ЧАС) > 999)
        |        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры10000
        |        ПО (РАЗНОСТЬДАТ(&НачалоПериодаИнтервала, &ОкончаниеПериодаИнтервала, ЧАС) > 9999)
        |        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры100000
        |        ПО (РАЗНОСТЬДАТ(&НачалоПериодаИнтервала, &ОкончаниеПериодаИнтервала, ЧАС) > 99999)
        |ГДЕ
        |    НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(&НачалоПериодаИнтервала, ЧАС, Цифры.Цифра + ЕСТЬNULL(Цифры10.Цифра, 0) * 10 + ЕСТЬNULL(Цифры100.Цифра, 0) * 100 + ЕСТЬNULL(Цифры1000.Цифра, 0) * 1000 + ЕСТЬNULL(Цифры10000.Цифра, 0) * 10000 + ЕСТЬNULL(Цифры100000.Цифра, 0) * 100000), ЧАС) МЕЖДУ &НачалоИнтервала И &ОкончаниеИнтервала";
23 buketovav
 
23.10.19
12:25
хотелось бы понимать, что здесь происходит, а то я что-то все-таки не понимаю ((( может надо выспаться...
24 buketovav
 
23.10.19
12:28
(22) спасибо, но непонятно )))
25 buketovav
 
23.10.19
12:42
понятно, что надо к дате прибавлять по одному дню и выводить до тех пор пока дата меньше &Дата2

ВЫБРАТЬ
    НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) КАК НачалоПериода,
    ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ), ДЕНЬ, 1) КАК Дата,
    КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ) КАК КонецПериода

ну так это нужен типа цикл
26 Ёпрст
 
23.10.19
13:08
(25) ну так там типа табличка чисел и её фильтрация
27 buketovav
 
23.10.19
13:14
вт0.Б + 2 * вт1.Б + 4 * вт2.Б + 8 * вт3.Б + 16 * вт4.Б + 32 * вт5.Б + 64 * вт6.Б + 128 * вт7.Б + 256 * вт8.Б + 512 * вт9.Б + 1024 * вт9.Б - не понимаю это для чего?
28 buketovav
 
23.10.19
13:14
и как это работает?
29 Ёпрст
 
23.10.19
13:18
(27) в том запросе, (18) который, надо еще различные в селект воткнуть
30 Ёпрст
 
23.10.19
13:19
(28) не знаком с двоичной записью числа ?
31 Ёпрст
 
23.10.19
13:20
это для получения таблички цифр
32 buketovav
 
23.10.19
13:21
(30) неа )
33 buketovav
 
23.10.19
13:22
(31) хорошо, получили мы табличку чисел от 0 до 2048, а дальше что?
34 Ёпрст
 
23.10.19
13:22
и чему вас тока в школе учат..
35 Ёпрст
 
23.10.19
13:23
(33) дальше выбираем из неё  ДОБАВИТЬКДАТЕ(&Дата1, ДЕНЬ, втЧисла.Число) и ограничиваем &Дата2
36 DrWatson
 
23.10.19
13:23
Вот такой запрос будет с подстройкой его к периодичности по дням.

Запрос.ТекстЗапроса = "ВЫБРАТЬ
|    0 КАК Цифра
|ПОМЕСТИТЬ ВТЦифры
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    1
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    2
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    3
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    4
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    5
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    6
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    7
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    8
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|    9
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|    НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоИнтервала, ДЕНЬ), ДЕНЬ, Цифры.Цифра + ЕСТЬNULL(Цифры10.Цифра, 0) * 10 + ЕСТЬNULL(Цифры100.Цифра, 0) * 100 + ЕСТЬNULL(Цифры1000.Цифра, 0) * 1000 + ЕСТЬNULL(Цифры10000.Цифра, 0) * 10000 + ЕСТЬNULL(Цифры100000.Цифра, 0) * 100000), ДЕНЬ) КАК ИмяПоляПериод
|ИЗ
|    ВТЦифры КАК Цифры
|        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры10
|        ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоИнтервала, ДЕНЬ), НАЧАЛОПЕРИОДА(&ОкончаниеИнтервала, ДЕНЬ), ДЕНЬ) > 9)
|        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры100
|        ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоИнтервала, ДЕНЬ), НАЧАЛОПЕРИОДА(&ОкончаниеИнтервала, ДЕНЬ), ДЕНЬ) > 99)
|        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры1000
|        ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоИнтервала, ДЕНЬ), НАЧАЛОПЕРИОДА(&ОкончаниеИнтервала, ДЕНЬ), ДЕНЬ) > 999)
|        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры10000
|        ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоИнтервала, ДЕНЬ), НАЧАЛОПЕРИОДА(&ОкончаниеИнтервала, ДЕНЬ), ДЕНЬ) > 9999)
|        ЛЕВОЕ СОЕДИНЕНИЕ ВТЦифры КАК Цифры100000
|        ПО (РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&НачалоИнтервала, ДЕНЬ), НАЧАЛОПЕРИОДА(&ОкончаниеИнтервала, ДЕНЬ), ДЕНЬ) > 99999)
|ГДЕ
|    НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоИнтервала, ДЕНЬ), ДЕНЬ, Цифры.Цифра + ЕСТЬNULL(Цифры10.Цифра, 0) * 10 + ЕСТЬNULL(Цифры100.Цифра, 0) * 100 + ЕСТЬNULL(Цифры1000.Цифра, 0) * 1000 + ЕСТЬNULL(Цифры10000.Цифра, 0) * 10000 + ЕСТЬNULL(Цифры100000.Цифра, 0) * 100000), ДЕНЬ) МЕЖДУ &НачалоИнтервала И &ОкончаниеИнтервала";

Важно, что параметры должны быть заданы
37 Консультант Баранов
 
23.10.19
13:24
(5)> и что в реальных задачах бывает потребность в таких решениях?

Например в Налоге на имущество когда надо остатки получать на накачало каждого месяца.
38 Ёпрст
 
23.10.19
13:24
еслси не понял, посмотри так:

Выбать втЧисла.Число,ДОБАВИТЬКДАТЕ(&Дата1, ДЕНЬ, втЧисла.Число) из втЧисла
39 buketovav
 
23.10.19
13:26
(38) да вроде бы понял, спасибо большое )
40 buketovav
 
23.10.19
13:27
надо самому написать такое несколько раз проговаривая что и почему и как правильно делать ))) спасибо )
41 Ёпрст
 
23.10.19
13:38
Можно даже так написать


ВЫБРАТЬ
    АвтономерЗаписи() как Число,"Вася"
// вт0.Б+2*вт1.Б+4*вт2.Б+8*вт3.Б+16*вт4.Б+32*вт5.Б+64*вт6.Б+128*вт7.Б+256*вт8.Б+512*вт9.Б+1024*вт9.Б КАК ЧИСЛО


а вот если ваю потом убрать, посмотреть, как 1с-ина падает :)
42 buketovav
 
23.10.19
14:15
(41) почему падает?
43 Ёпрст
 
23.10.19
14:16
(42) вопросы не ко мне, а на Селезнёвку задавай.
44 Ёпрст
 
23.10.19
14:16
мне лень даже план запроса посмотреть
45 Eiffil123
 
24.10.19
11:37
(5) вообще стандартная задача. пользователь хочет на каждый день видеть остатки товаров/денег на счетах/ДЗ_КЗ на каждый из дней.
И решения вполне стандартные - одним запросом получаем все даты за период, вторым остатки на первую дату, а потом из таблицы оборотов и остатков на начало - остатки на каждую последующую дату.
46 Жан Пердежон
 
24.10.19
12:26
(29) там опечатка в последнем слагаемом, РАЗЛИЧНЫЕ не нужны
47 Ёпрст
 
24.10.19
12:29
(10) да увидел..