Имя: Пароль:
1C
1С v8
Расчитать количество дней в запросе с учетом выходных и праздничных дней
,
0 ETurdymuratov
 
11.10.13
15:40
Всем привет!
Есть запрос, все отлично отрабатывает, но есть два поля Расчет6 и Расчет7. В этих полях подсчитывается количество дней с учетом  выходных и праздничных дней. Помогите правильно подцепить регистр РегламентированныйПроизводственныйКалендарь.

ВЫБРАТЬ
    ЗаявлениеОбУбыткахДСП.Дата КАК ДатаЗаявления,
    ЗаявлениеОбУбыткахДСП.Номер КАК НомерУбытка,
    ЗаявлениеОбУбыткахДСП.Организация КАК Подразделение,
    ЗаявлениеОбУбыткахДСП.Контрагент КАК Страхователь,
    ЗаявлениеОбУбыткахДСПЭкспертиза.Дата КАК ОценкаДата,
    ЗаявлениеОбУбыткахДСПЭкспертиза.НаименованиеОценщика КАК Оценщик,
    ЗаявлениеОбУбыткахДСПЭкспертиза.ОценочнаяСтоймость КАК СуммаУщерба,
    ЗаявлениеОбУбыткахДСПРасходыНаУрегулирование.СуммаЗаУслуги,
    ЗаявлениеОбУбыткахДСП.ДатаПостановления,
    ЗаявлениеОбУбыткахДСП.НаименованиеОргана КАК НаименованиеОценщика,
    ИзвещениеОбУбыткахДСП.Комментарий,
    ЗаявлениеОбУбыткахДСП.ПострадавшийОбъект.ГосНомер,
    СтраховойАкт.ДатаПоследнего КАК ДатаПоследнегоДокумента,
    СтраховойАкт.ДатаППИ КАК ДатаВыплаты,
    РАЗНОСТЬДАТ(ЗаявлениеОбУбыткахДСП.Дата, СтраховойАкт.ДатаППИ, ДЕНЬ) КАК Расчет6,
    РАЗНОСТЬДАТ(СтраховойАкт.ДатаПоследнего, СтраховойАкт.ДатаППИ, ДЕНЬ) КАК Расчет7,
    ЗаявлениеОбУбыткахДСП.СтраховойПродукт КАК ВидСтрахования
ИЗ
    Документ.ЗаявлениеОбУбыткахДСП КАК ЗаявлениеОбУбыткахДСП
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаявлениеОбУбыткахДСП.Экспертиза КАК ЗаявлениеОбУбыткахДСПЭкспертиза
        ПО ЗаявлениеОбУбыткахДСП.Ссылка = ЗаявлениеОбУбыткахДСПЭкспертиза.Ссылка
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаявлениеОбУбыткахДСП.РасходыНаУрегулирование КАК ЗаявлениеОбУбыткахДСПРасходыНаУрегулирование
        ПО ЗаявлениеОбУбыткахДСП.Ссылка = ЗаявлениеОбУбыткахДСПРасходыНаУрегулирование.Ссылка
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаявлениеОбУбыткахДСП.Состав КАК ЗаявлениеОбУбыткахДСПСостав
        ПО ЗаявлениеОбУбыткахДСП.Ссылка = ЗаявлениеОбУбыткахДСПСостав.Ссылка
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ИзвещениеОбУбыткахДСП КАК ИзвещениеОбУбыткахДСП
        ПО ЗаявлениеОбУбыткахДСП.Извещение = ИзвещениеОбУбыткахДСП.Ссылка
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ПлатежноеПоручениеИсходящее.Дата КАК ДатаППИ,
            СтраховойАкт.ДатаПоследнего КАК ДатаПоследнего,
            СтраховойАктСостав.Заявление.Ссылка КАК ЗаявлениеСсылка
        ИЗ
            Документ.СтраховойАкт КАК СтраховойАкт
                ЛЕВОЕ СОЕДИНЕНИЕ Документ.СтраховойАкт.Состав КАК СтраховойАктСостав
                ПО СтраховойАкт.Ссылка = СтраховойАктСостав.Ссылка
                ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПлатежноеПоручениеИсходящее КАК ПлатежноеПоручениеИсходящее
                ПО СтраховойАкт.Ссылка = ПлатежноеПоручениеИсходящее.ДокументОснование.Ссылка) КАК СтраховойАкт
        ПО ЗаявлениеОбУбыткахДСП.Ссылка = СтраховойАкт.ЗаявлениеСсылка.Ссылка
ГДЕ
    ЗаявлениеОбУбыткахДСП.Дата МЕЖДУ &ДатаС И &ДатаПо
1 Ненавижу 1С
 
гуру
11.10.13
15:42
а в чем там проблема с подцепить?
2 Kreont
 
11.10.13
15:45
Из стандартной такой код переделанный немного есть, мож пригодится (конф.бухг.):
    НормаДнейЗаМесяц = 0;
    Запрос = Новый Запрос;

    Запрос.УстановитьПараметр("парамПериодРегистрации", НачалоМесяца(ПериодРегистрации));
    ТекстЗапроса = "
    |ВЫБРАТЬ
    |    СУММА(ВЫБОР КОГДА Календарь.Пятидневка<>0 ТОГДА 1 ИНАЧЕ 0 КОНЕЦ) КАК НормаДнейЗаМесяц
    |    ИЗ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
    |    ГДЕ НАЧАЛОПЕРИОДА(Календарь.ДатаКалендаря, МЕСЯЦ) = &парамПериодРегистрации
    |";
    Запрос.Текст = ТекстЗапроса;
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        НормаДнейЗаМесяц = Выборка.НормаДнейЗаМесяц;
    КонецЕсли;
    Если НормаДнейЗаМесяц = 0 Тогда
        Сообщить("Увага! Не заповнений регламентований виробничий календар.");
    КонецЕсли;
3 ETurdymuratov
 
12.10.13
06:51
(1) Как бы вы это сделали без проблем?
4 ETurdymuratov
 
12.10.13
06:59
(2) Спасибо, посмотрю что можно сделать с этим.
5 Sammo
 
12.10.13
07:31
Если нужно с учетом праздничных и выходных, то нужно количество календарных. Для этого календарь не нужен. См. разностьдат
6 ETurdymuratov
 
12.10.13
07:36
(5) Хотите сказать что функция запроса РАЗНОСТЬ() подсчитывает  количество дней с учетом праздничных и выходных дней?
7 GANR
 
12.10.13
07:53
(0) к (1) +1 - и правда - в чем там может быть проблема - левым соединением по дате соединяем ЗаявлениеОбУбыткахДСП (далее ЗУ) с РС ПроизводственныйКалендарь (далее ПК) по условию ЗУ.Дата = ПК.Период и узнаем, какие дни - рабочие, какие - праздничные.
(5)(6) Включаем логику... Для этого в платформу 1С должен быть зашит производственный календарь, включающий праздники, а этот календарь может выйти  п о с л е  того, как выйдет релиз платформы, и платформу править нельзя, а РС Производственный Календарь можно подредактировать руками. День недели, вроде, можно узнать v8: Узнать день недели, а вот праздничные - только из РС.
8 GANR
 
12.10.13
07:54
(5) АААА... Это если надо в одну кучу и праздничные и выходные свалить - тогда да!
9 GANR
 
12.10.13
07:55
+(8) То есть и праздничные, и рабочие, и выходные
10 ETurdymuratov
 
12.10.13
07:58
(5) Проверил:
ВЫБРАТЬ
    ДСП.Номер,
    ДСП.Дата как ДатаДокумента,
    &ПарамДата,
    РАЗНОСТЬДАТ(ДСП.Дата, &ПарамДата, ДЕНЬ) КАК КолДней
ИЗ
    Документ.ДСП КАК ДСП
ГДЕ
    ДСП.Ссылка = &Ссылка

Считает с выходными днями...
11 ETurdymuratov
 
12.10.13
08:12
(9) Пожалуйста, покажите в последнем примере с использованием РегламентированногоПроизводственногоКалендарая.
12 ETurdymuratov
 
12.10.13
08:19
(9)
ВЫБРАТЬ
    &ПарамДата,
    РасходныйКассовыйОрдер.Дата КАК РКО,
    РАЗНОСТЬДАТ(РасходныйКассовыйОрдер.Дата, &ПарамДата, ДЕНЬ) КАК КолДней,
    РасходныйКассовыйОрдер.Номер
ИЗ
    Документ.РасходныйКассовыйОрдер КАК РасходныйКассовыйОрдер
ГДЕ
    РасходныйКассовыйОрдер.Ссылка = &Ссылка

есть документ РКО от 11-10-13
Если в параметре этого запроса задать &ПарамДата равную 14-10-13 он должен показать 1, а сейчас показыает 3.
13 GANR
 
12.10.13
08:38
(11)(12) 1С перед глазами нет, на словах скажу нужно внутренним соединением (левое не нужно, как я понял) соединить РКО с ПК по условию

    ПК.Период МЕЖДУ РКО.Дата и &ПарамДата

Сгруппировать по РКО.Ссылка, и подсчитать агрегатную функцию КОЛИЧЕСТВО(*) или СУММА(1).
14 ETurdymuratov
 
12.10.13
09:37
(13) Когда делаю связь
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
        ПО РасходныйКассовыйОрдер.Дата = РегламентированныйПроизводственныйКалендарь.ДатаКалендаря

вообще ничего не возвращает видимо из за того что РасходныйКассовыйОрдер.Дата с верменем, а РегламентированныйПроизводственныйКалендарь.ДатаКалендаря без времени.
15 ETurdymuratov
 
12.10.13
10:17
(13) Все разобрался как убрать время.
16 GANR
 
12.10.13
15:53
(15) В 1С можно воспользоваться НАЧАЛОПЕРИОДА(Дата, День) или/ КОНЕЦПЕРИОДА(Дата, День). А в SQL, к слову, можно и cast(datetime as date) my_date.
17 GANR
 
12.10.13
15:59
(15) Хотя, возможно, я неправ насчет того, что нужно внутреннее вместо левого - нужно ведь, чтобы запрос возвращал и те строки, по которым нет ни одного рабочего дня ведь? Если так - то левое соединение и проверка на NULL http://help1c.com/faq/view/93.html
18 ETurdymuratov
 
13.10.13
17:04
(17) Спасибо. Мне нужны были только рабочие дни.
19 GANR
 
13.10.13
17:26
(18) Внимание вопрос: если количество рабочих дней для заданного документа равняется 0, и данных по условию соединения (16) в производственном календаре нет, что-нибудь попадать в результат запроса должно??? Если да - то обязательно нужно именно левое, а не внутреннее соединение.