Форум программистов, компьютерный форум, киберфорум
Наши страницы
1С: Собственные программы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
Godunov
3 / 3 / 6
Регистрация: 29.03.2016
Сообщений: 116
1

Рабочие дни в запросе СКД

11.11.2016, 10:43. Просмотров 2205. Ответов 16
Метки нет (Все метки)

Здравствуйте всем.
Сделал самописный отчёт в СКД, нужные значения считает правильно. Но поставили условие, чтобы считались только рабочие дни, с вычетом выходных и праздничных. В инете прочёл, что надо использовать РегламентированныйПроизводственныйКалендарь из РегистровСведений.

Так работает без календаря.
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ВЫБРАТЬ
    ОтветНаЗапрос.Номер КАК НомерОтвета,
    ОтветНаЗапрос.Дата КАК ДатаОтвета,
    ОтветНаЗапрос.Ответственный КАК ОтветственныйЗаОтветНаЗапрос,
    ОтветНаЗапрос.ДокументОснование.Номер КАК НомерЗапроса,
    ОтветНаЗапрос.ДокументОснование.Дата КАК ДатаЗапроса,
    ОтветНаЗапрос.ДокументОснование.Ответственный КАК СоздавшийЗапрос,
    ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ОтветНаЗапрос.ДокументОснование.Дата, ОтветНаЗапрос.Дата, МИНУТА) / 60 КАК ЧИСЛО(10, 2)) КАК ВремяПотребовавшеесяНаОтветВЧасах,
    ОтветНаЗапрос.ДокументОснование.Комментарий КАК Комментарий,
    ОтветНаЗапрос.ДокументОснование.Ссылка,
    ОтветНаЗапрос.Ссылка КАК Ссылка
ИЗ
    Документ.ОтветНаЗапрос КАК ОтветНаЗапрос
ГДЕ
    ОтветНаЗапрос.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
    И ОтветНаЗапрос.Ответственный = &Пользователи
    И ОтветНаЗапрос.Проведен
Если добавляю календарь, то ничего не получаю вообще, по ходу неправильно делаю...
1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ВЫБРАТЬ
    ОтветНаЗапрос.Номер КАК НомерОтвета,
    ОтветНаЗапрос.Дата КАК ДатаОтвета,
    ОтветНаЗапрос.Ответственный КАК ОтветственныйЗаОтветНаЗапрос,
    ОтветНаЗапрос.ДокументОснование.Номер КАК НомерЗапроса,
    ОтветНаЗапрос.ДокументОснование.Дата КАК ДатаЗапроса,
    ОтветНаЗапрос.ДокументОснование.Ответственный КАК СоздавшийЗапрос,
    ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ОтветНаЗапрос.ДокументОснование.Дата, ОтветНаЗапрос.Дата, МИНУТА) / 60 КАК ЧИСЛО(10, 2)) КАК ВремяПотребовавшеесяНаОтветВЧасах,
    ОтветНаЗапрос.ДокументОснование.Комментарий КАК Комментарий,
    ОтветНаЗапрос.ДокументОснование.Ссылка,
    ОтветНаЗапрос.Ссылка КАК Ссылка
ИЗ
    Документ.ОтветНаЗапрос КАК ОтветНаЗапрос
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
        ПО ОтветНаЗапрос.ДокументОснование.Дата = РегламентированныйПроизводственныйКалендарь.ВидДня
            И ОтветНаЗапрос.Дата = РегламентированныйПроизводственныйКалендарь.ВидДня
ГДЕ
    ОтветНаЗапрос.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
    И ОтветНаЗапрос.Ответственный = &Пользователи
    И ОтветНаЗапрос.Проведен
    И РегламентированныйПроизводственныйКалендарь.ВидДня = &РабочийДень
Нужен ваш совет, как правильно сделать?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2016, 10:43
Ответы с готовыми решениями:

СтрЗаменить() в запросе или в СКД
Как реализовать замену символа в строке на языке запросов 1С или на языке выражений СКД ? Есть...

Ошибка в запросе. Но в СКД запрос корректно работает!
Вопрос. В СКД сделал запрос с вложенными завпросами. Все нормально отображается. При использовании...

Как в программе отсчитать рабочие дни?
Как в программе отсчитать каледарные дни? Бухгалтерия. Добавлено через 18 минут Виноват....

Ошибка в запросе СКД при откате версии
Здравствуйте. Прошу помощи в следующем вопросе. При откате в 8.2.13 на 8.2.10.77 (УПП 1.3.14.1) в...

Убрать поля в запросе (скрыть поля в отчете скд)
В запросе я создаю временную таблицу. В ней сгруппировав поля получаю нужную таблицу. Но некоторые...

16
renat_dmitriev
391 / 293 / 121
Регистрация: 26.08.2016
Сообщений: 902
11.11.2016, 10:51 2
Цитата Сообщение от Godunov Посмотреть сообщение
И ОтветНаЗапрос.Дата = РегламентированныйПроизводственныйКалендарь.ВидДня
Очевидно, что тип поля ВидДня не является датой. Видимо нужно использовать поле ДатаКалендаря
0
Godunov
3 / 3 / 6
Регистрация: 29.03.2016
Сообщений: 116
11.11.2016, 11:57  [ТС] 3
renat_dmitriev, сделал так, всё равно ничего не выводит.

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ВЫБРАТЬ
    ОтветНаЗапрос.Номер КАК НомерОтвета,
    ОтветНаЗапрос.Дата КАК ДатаОтвета,
    ОтветНаЗапрос.Ответственный КАК ОтветственныйЗаОтветНаЗапрос,
    ОтветНаЗапрос.ДокументОснование.Номер КАК НомерЗапроса,
    ОтветНаЗапрос.ДокументОснование.Дата КАК ДатаЗапроса,
    ОтветНаЗапрос.ДокументОснование.Ответственный КАК СоздавшийЗапрос,
    ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ОтветНаЗапрос.ДокументОснование.Дата, ОтветНаЗапрос.Дата, МИНУТА) / 60 КАК ЧИСЛО(10, 2)) КАК ВремяПотребовавшеесяНаОтветВЧасах,
    ОтветНаЗапрос.ДокументОснование.Комментарий КАК Комментарий,
    ОтветНаЗапрос.ДокументОснование.Ссылка,
    ОтветНаЗапрос.Ссылка КАК Ссылка
ИЗ
    Документ.ОтветНаЗапрос КАК ОтветНаЗапрос
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
        ПО ОтветНаЗапрос.Дата = РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
            И ОтветНаЗапрос.ДокументОснование.Дата = РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
ГДЕ
    ОтветНаЗапрос.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
    И ОтветНаЗапрос.Ответственный = &Пользователи
    И ОтветНаЗапрос.Проведен
0
renat_dmitriev
391 / 293 / 121
Регистрация: 26.08.2016
Сообщений: 902
11.11.2016, 12:10 4
Вообще это странное условие. Если эти даты разные, а они очевидно разные, то условие никогда не будет работать.

1C
1
2
ПО ОтветНаЗапрос.Дата = РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
И ОтветНаЗапрос.ДокументОснование.Дата = РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
Если вы хотите чтобы и дата и дата документа основания были рабочими, то нужно их соединять с разными таблицами.
Скорей всего так:

1C
1
2
3
4
5
6
ИЗ
    Документ.ОтветНаЗапрос КАК ОтветНаЗапрос
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
        ПО ОтветНаЗапрос.Дата = РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь2
           ПО ОтветНаЗапрос.ДокументОснование.Дата = РегламентированныйПроизводственныйКалендарь2.ДатаКалендаря
1
11.11.2016, 12:10
Godunov
3 / 3 / 6
Регистрация: 29.03.2016
Сообщений: 116
14.11.2016, 09:57  [ТС] 5
renat_dmitriev, в первом рисунке показан работающий отчёт (первый код в заголовке темы) с нужными данными, где необходимо учитывать только рабочие дни.

Во втором рисунке получаю ничего, когда подставляю:

1C
1
2
3
4
5
6
ИЗ
    Документ.ОтветНаЗапрос КАК ОтветНаЗапрос
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
        ПО ОтветНаЗапрос.Дата = РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь2
           ПО ОтветНаЗапрос.ДокументОснование.Дата = РегламентированныйПроизводственныйКалендарь2.ДатаКалендаря
Не пойму, что ему не нравится...?
0
Миниатюры
Рабочие дни в запросе СКД   Рабочие дни в запросе СКД  
Dethmontt
Модератор
Эксперт 1С
2700 / 2464 / 432
Регистрация: 10.03.2011
Сообщений: 8,928
Записей в блоге: 1
Завершенные тесты: 1
14.11.2016, 10:53 6
1C
1
2
3
4
5
6
ИЗ
    Документ.ОтветНаЗапрос КАК ОтветНаЗапрос
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
        ПО НачалоПериода(ОтветНаЗапрос.Дата, ДЕНЬ) = РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь2
           ПО НачалоПериода(ОтветНаЗапрос.ДокументОснование.Дата, ДЕНЬ) = РегламентированныйПроизводственныйКалендарь2.ДатаКалендаря
Добавлено через 42 секунды
Цитата Сообщение от Godunov Посмотреть сообщение
Не пойму, что ему не нравится...?
разнородность данных
0
Godunov
3 / 3 / 6
Регистрация: 29.03.2016
Сообщений: 116
14.11.2016, 10:56  [ТС] 7
Dethmontt, можете подсказать, как исправить?
0
Dethmontt
Модератор
Эксперт 1С
2700 / 2464 / 432
Регистрация: 10.03.2011
Сообщений: 8,928
Записей в блоге: 1
Завершенные тесты: 1
14.11.2016, 10:58 8
Godunov, чуть выше посмотри

Добавлено через 18 секунд
НачалоПериода()
1
Godunov
3 / 3 / 6
Регистрация: 29.03.2016
Сообщений: 116
14.11.2016, 11:11  [ТС] 9
Dethmontt, выдал отчёт, с теми же данными...
0
Миниатюры
Рабочие дни в запросе СКД  
Dethmontt
Модератор
Эксперт 1С
2700 / 2464 / 432
Регистрация: 10.03.2011
Сообщений: 8,928
Записей в блоге: 1
Завершенные тесты: 1
14.11.2016, 11:29 10
Godunov, верно, теперь нужно наложить условие на "Рабочие дни"
0
Godunov
3 / 3 / 6
Регистрация: 29.03.2016
Сообщений: 116
14.11.2016, 11:35  [ТС] 11
Dethmontt, условия наложил такие, но всё равно получаю отчёт без изменений...

1C
1
2
3
4
5
6
ГДЕ
    ОтветНаЗапрос.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
    И ОтветНаЗапрос.Ответственный = &Пользователи
    И ОтветНаЗапрос.Проведен
    И РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
    И РегламентированныйПроизводственныйКалендарь2.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
0
Godunov
3 / 3 / 6
Регистрация: 29.03.2016
Сообщений: 116
14.02.2017, 12:12  [ТС] 12
Чтобы закрыть вопрос отписываюсь в теме с рабочим кодом. Может кому-то ещё пригодится.

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
ВЫБРАТЬ
    ЕСТЬNULL(СУММА(ВЫБОР
                КОГДА РегламентированныйПроизводственныйКалендарь.ВидДня = &Суббота
                        ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &Воскресенье
                    ТОГДА 1
                ИНАЧЕ 0
            КОНЕЦ), 0) КАК ЧислоВыходныхДней
ПОМЕСТИТЬ ВТ
ИЗ
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &ДатаНачала И &ДатаОкончания
;
 
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ОтветНаЗапрос.Номер КАК НомерОтвета,
    ОтветНаЗапрос.Дата КАК ДатаОтвета,
    ОтветНаЗапрос.Ответственный КАК ОтветственныйЗаОтветНаЗапрос,
    ОтветНаЗапрос.ДокументОснование.Номер КАК НомерЗапроса,
    ОтветНаЗапрос.ДокументОснование.Дата КАК ДатаЗапроса,
    ОтветНаЗапрос.ДокументОснование.Ответственный КАК СоздавшийЗапрос,
    ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ОтветНаЗапрос.ДокументОснование.Дата, ОтветНаЗапрос.Дата, МИНУТА) / 60 КАК ЧИСЛО(10, 2)) КАК ВремяПотребовавшеесяНаОтветВЧасах,
    ОтветНаЗапрос.ДокументОснование.Комментарий КАК Комментарий,
    ОтветНаЗапрос.ДокументОснование.Ссылка,
    ОтветНаЗапрос.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТ_2
ИЗ
    Документ.ОтветНаЗапрос КАК ОтветНаЗапрос
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ
        ПО ОтветНаЗапрос.Дата = ВТ.ЧислоВыходныхДней
            И ОтветНаЗапрос.ДокументОснование.Дата = ВТ.ЧислоВыходныхДней
ГДЕ
    ОтветНаЗапрос.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
    И ОтветНаЗапрос.Ответственный = &Пользователи
    И ОтветНаЗапрос.Проведен
;
 
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_2.НомерЗапроса,
    ВТ_2.ДатаЗапроса,
    ВТ_2.НомерОтвета,
    ВТ_2.ДатаОтвета,
    ВТ_2.СоздавшийЗапрос,
    ВТ_2.ОтветственныйЗаОтветНаЗапрос,
    ВТ_2.Комментарий,
    ВТ_2.ДокументОснованиеСсылка,
    ВТ_2.Ссылка,
    ВЫРАЗИТЬ(ВТ_2.ВремяПотребовавшеесяНаОтветВЧасах - ВТ.ЧислоВыходныхДней / 24 КАК ЧИСЛО(10, 2)) КАК ВремяПотребовавшеесяНаОтветВЧасах
ИЗ
    ВТ КАК ВТ,
    ВТ_2 КАК ВТ_2
0
Godunov
3 / 3 / 6
Регистрация: 29.03.2016
Сообщений: 116
12.04.2017, 13:41  [ТС] 13
Пардон муа, вот правильный код, предыдущий с ошибкой. Решил оставить тут на всякий случай, вдруг кому пригодится.

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
ВЫБРАТЬ                             
    ОтветНаЗапрос.ДокументОснование.Номер,                          
    ОтветНаЗапрос.ДокументОснование.Дата,                           
    ОтветНаЗапрос.ДокументОснование.Ответственный,                          
    ОтветНаЗапрос.Номер,                            
    ОтветНаЗапрос.Дата,                         
    ОтветНаЗапрос.Ответственный,                            
    ОтветНаЗапрос.ДокументОснование.Ссылка,                         
    ОтветНаЗапрос.Ссылка,                           
    ЕСТЬNULL(СУММА(ВЫБОР                            
                КОГДА РегламентированныйПроизводственныйКалендарь.ВидДня = &Суббота             
                        ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &Воскресенье       
                    ТОГДА 1         
                ИНАЧЕ 0             
            КОНЕЦ), 0) КАК ЧислоВыходныхДней                    
ПОМЕСТИТЬ ВТ                                
ИЗ                              
    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь,                            
    Документ.ОтветНаЗапрос КАК ОтветНаЗапрос                            
ГДЕ                             
    РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ ОтветНаЗапрос.ДокументОснование.Дата И ОтветНаЗапрос.Дата                           
    И ОтветНаЗапрос.ДокументОснование.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания                           
//  И ОтветНаЗапрос.Ответственный = &Пользователи                           
    И ОтветНаЗапрос.Проведен                            
                                
СГРУППИРОВАТЬ ПО                                
    ОтветНаЗапрос.ДокументОснование.Дата,                           
    ОтветНаЗапрос.Ссылка,                           
    ОтветНаЗапрос.Номер,                            
    ОтветНаЗапрос.Дата,                         
    ОтветНаЗапрос.Ответственный,                            
    ОтветНаЗапрос.ДокументОснование.Ссылка,                         
    ОтветНаЗапрос.ДокументОснование.Номер,                          
    ОтветНаЗапрос.ДокументОснование.Ответственный                           
;                               
                                
////////////////////////////////////////////////////////////////////////////////                                
ВЫБРАТЬ                             
    ВТ.ДокументОснованиеНомер КАК НомерЗапроса,                         
    ВТ.ДокументОснованиеДата КАК ДатаЗапроса,                           
    ВТ.ДокументОснованиеОтветственный КАК СоздавшийЗапрос,                          
    ВТ.Номер КАК НомерОтвета,                           
    ВТ.Дата КАК ДатаОтвета,                         
    ВТ.Ответственный КАК ОтветственныйЗаОтветНаЗапрос,                          
    (ВЫРАЗИТЬ(РАЗНОСТЬДАТ(ВТ.ДокументОснованиеДата, ВТ.Дата, МИНУТА) / 60 КАК ЧИСЛО(10, 2))) - (ВЫРАЗИТЬ(ВТ.ЧислоВыходныхДней * 24 КАК ЧИСЛО(10, 2))) КАК ВремяПотребовавшеесяНаОтветВЧасах,                            
    ВТ.ДокументОснованиеСсылка,                         
    ВТ.Ссылка                           
ИЗ                              
    ВТ КАК ВТ
1
Yulunga
456 / 325 / 83
Регистрация: 22.04.2013
Сообщений: 2,126
Записей в блоге: 1
Завершенные тесты: 1
12.04.2017, 15:18 14
Цитата Сообщение от Godunov Посмотреть сообщение
Но поставили условие, чтобы считались только рабочие дни, с вычетом выходных и праздничных.
Цитата Сообщение от Godunov Посмотреть сообщение
ВЫБОР
КОГДА РегламентированныйПроизводственныйКалендарь.ВидДня = &Суббота
ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = &Воскресенье
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ
что-то тут не так.
у меня в ЗУПе есть Регистр Сведений
ДанныеПроизводственногоКалендаря
с ресурсом ВидДня. который может быть субботой, вскр, предпразд, празд и рабочим
поэтому мне кажется, что надо написать что-то типа такого :

1C
1
2
3
4
5
КОГДА ДанныеПроизводственногоКалендаря.ВидДня 
В (Перечисления.ВидыДнейПроизводственногоКалендаря.Суббота,
Перечисления.ВидыДнейПроизводственногоКалендаря.Воскресенье, 
Перечисления.ВидыДнейПроизводственногоКалендаря.Праздник)                        
                    ТОГДА 1
0
Godunov
3 / 3 / 6
Регистрация: 29.03.2016
Сообщений: 116
12.04.2017, 20:40  [ТС] 15
Yulunga, у меня в УТ так считает и правильные данные выдаёт.
Можно добавить:

1C
1
РегламентированныйПроизводственныйКалендарь.ВидДня = &Праздничный
0
Yulunga
456 / 325 / 83
Регистрация: 22.04.2013
Сообщений: 2,126
Записей в блоге: 1
Завершенные тесты: 1
12.04.2017, 20:47 16
Godunov, можно )
и потом заполнять три параметра ровно этими же значениями перечислений.
но оно наверно равнозначно. что так что сяк в базу уйдёт один и тот же запрос.
0
Godunov
3 / 3 / 6
Регистрация: 29.03.2016
Сообщений: 116
12.04.2017, 21:23  [ТС] 17
Yulunga, да, равнозначно)
0
12.04.2017, 21:23
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2017, 21:23

Разница между СКД и консолью СКД
Доброго дня! Есть запрос в СКД следующего вида: ВЫБРАТЬ ПродажиОбороты.Контрагент,...

рабочие дни
как мне расчитать спомощью скрипта рабочие дни в году а потом положить по месяцам их в разные...

Рабочие дни
есть формула =Рабдень(дата;кол-во) но она расчитывает как то невнятно, только рабочие, а надо так,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.