Имя: Пароль:
1C
1С v8
Подскажите по запросу
, ,
0 Barbossa
 
17.08.11
13:36
Доброе время суток.
Не получается построить такой запрос:

Обращаемся к регистру, оттуда получаем поля "Документ" и "Дата" и в эту же табличку нужно вывести еще одну расчетную дату, которая будет либо равна полю "Дата", либо, если "Дата" - выходной, равна ближайшему предыдущему рабочему дню (т.е. ближайший рабочий день находим в прошлом периоде).

Подскажите как можно получить такую выборку.
1 John83
 
17.08.11
13:54
делай соединение с производственным календарем - там ищи ближайший рабочий день
2 Barbossa
 
17.08.11
14:01
(1) Это понятно. Но как из той таблицы вытянуть ОДНУ запись, не целый набор ?
3 DrHiHi
 
17.08.11
14:10
если посмотришь в УТП, то там устанавливается в заказе покупателя дата оплата, в договоре устанавливается количество дней просрочки, а в константе определяется по какому методу (по календарным или по рабочим дням)
4 Barbossa
 
17.08.11
14:20
(3) Так...а чем это мне поможет ?
Я сам делал этот функционал в самописке, реализовать  это не вопрос для такого не критичного по производительности места.

У меня огромная выборка и хочу сделать все в одном запросе, но никак не допрет, как получить соответствие 1 к 1 (1 дата из регистра = 1 дата предыдущего рабочего дня)
5 Barbossa
 
17.08.11
16:52
Возник еще вопрос в процессе разбирательств:

Есть некая заранее сформированная выборка данных.
В СКД есть вычисляемая переменная, расчитывается в общем модуле.
Есть ли возможность при расчете данной переменной использовать вышеупомянутую выборку? Как ее можно передать в общий модуль ?
6 mikecool
 
17.08.11
16:54
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
                  |    Календарь.ДатаКалендаря КАК ДатаКалендаря,
                  |    КОЛИЧЕСТВО(*) КАК Ранг
                  |ПОМЕСТИТЬ Календарь
                  |ИЗ
                  |    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
                  |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК КалендарьКопия
                  |        ПО Календарь.ДатаКалендаря <= КалендарьКопия.ДатаКалендаря
                  |ГДЕ
                  |    Календарь.ДатаКалендаря >= ДОБАВИТЬКДАТЕ(&КонецПериода, ДЕНЬ, -365)
                  |    И Календарь.ДатаКалендаря <= &КонецПериода
                  |    И (Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
                  |            ИЛИ Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
                  |    И КалендарьКопия.ДатаКалендаря >= ДОБАВИТЬКДАТЕ(&КонецПериода, ДЕНЬ, -365)
                  |    И КалендарьКопия.ДатаКалендаря <= &КонецПериода
                  |    И (КалендарьКопия.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
                  |            ИЛИ КалендарьКопия.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
                  |
                  |СГРУППИРОВАТЬ ПО
                  |    Календарь.ДатаКалендаря
                  |
                  |ИНДЕКСИРОВАТЬ ПО
                  |    ДатаКалендаря,
                  |    Ранг
                  |;
                  |
                  |////////////////////////////////////////////////////////////////////////////////
                  |ВЫБРАТЬ РАЗРЕШЕННЫЕ
                  |    Календарь.ДатаКалендаря КАК ДатаКалендаря,
                  |    КОЛИЧЕСТВО(*) КАК Ранг
                  |ПОМЕСТИТЬ КалендарьБудущий
                  |ИЗ
                  |    РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК Календарь
                  |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК КалендарьКопия
                  |        ПО Календарь.ДатаКалендаря >= КалендарьКопия.ДатаКалендаря
                  |ГДЕ
                  |    Календарь.ДатаКалендаря > &КонецПериода
                  |    И Календарь.ДатаКалендаря <= ДОБАВИТЬКДАТЕ(&КонецПериода, ДЕНЬ, 365)
                  |    И (Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
                  |            ИЛИ Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
                  |    И КалендарьКопия.ДатаКалендаря > &КонецПериода
                  |    И КалендарьКопия.ДатаКалендаря <= ДОБАВИТЬКДАТЕ(&КонецПериода, ДЕНЬ, 365)
                  |    И (КалендарьКопия.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
                  |            ИЛИ КалендарьКопия.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
                  |
                  |СГРУППИРОВАТЬ ПО
                  |    Календарь.ДатаКалендаря
                  |
                  |ИНДЕКСИРОВАТЬ ПО
                  |    ДатаКалендаря,
                  |    Ранг
                  |;
7 mikecool
 
17.08.11
16:54
первая часть - предыдущий год
вторая - следующий
8 Barbossa
 
17.08.11
17:16
(6) Большое спасибо за код, но мне несколько иное надо.
Пример:

Документ       Дата      ДатаКорректная
Документ1      14.08.11   12.08.11

Так как 14 - выходной, выставляется ближайший в прошлом рабочий день - 12.
9 mikecool
 
17.08.11
17:25
(8) ну дык - бери из календаря ближайшую рабочую
10 Barbossa
 
17.08.11
17:32
Так в этом то у меня и вопрос!
Как мне взять соединением из второй выборки одну запись, причем для каждой строки первой выборки.
11 Barbossa
 
17.08.11
17:34
т.е. вот примерная "идеальная таблица"

Документ       Дата      ДатаКорректная
Документ1      14.08.11   12.08.11
Документ2      13.08.11   12.08.11
Документ1      15.08.11   15.08.11
Документ1      14.08.11   12.08.11
Документ1      12.08.11   12.08.11
12 mikecool
 
17.08.11
17:37
|        ЛЕВОЕ СОЕДИНЕНИЕ Календарь КАК Календарь
                  |        ПО (НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(РеализацияТоваровУслуг.ДатаПоставки, ДЕНЬ, ВЫБОР
                  |                        КОГДА ДЕНЬНЕДЕЛИ(РеализацияТоваровУслуг.ДатаПоставки) = 6
                  |                            ТОГДА 2
                  |                        КОГДА ДЕНЬНЕДЕЛИ(РеализацияТоваровУслуг.ДатаПоставки) = 7
                  |                            ТОГДА 1
                  |                        ИНАЧЕ 0
                  |                    КОНЕЦ), ДЕНЬ) = Календарь.ДатаКалендаря)
                  |        ЛЕВОЕ СОЕДИНЕНИЕ Календарь КАК КалендарьНаДоговор
                  |        ПО (ВЫБОР
                  |                КОГДА РеализацияТоваровУслуг.ДоговорКонтрагента.КонтролироватьЧислоДнейЗадолженности
                  |                    ТОГДА ВЫБОР
                  |                            КОГДА Календарь.Ранг ЕСТЬ NULL
                  |                                ТОГДА 0
                  |                            ИНАЧЕ Календарь.Ранг - (РеализацияТоваровУслуг.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности - 1)
                  |                        КОНЕЦ
                  |                ИНАЧЕ 0
                  |            КОНЕЦ = КалендарьНаДоговор.Ранг)
                  |        ЛЕВОЕ СОЕДИНЕНИЕ КалендарьБудущий КАК КалендарьБудущий
                  |        ПО (НАЧАЛОПЕРИОДА(ДОБАВИТЬКДАТЕ(РеализацияТоваровУслуг.ДатаПоставки, ДЕНЬ, ВЫБОР
                  |                        КОГДА ДЕНЬНЕДЕЛИ(РеализацияТоваровУслуг.ДатаПоставки) = 6
                  |                            ТОГДА 2
                  |                        КОГДА ДЕНЬНЕДЕЛИ(РеализацияТоваровУслуг.ДатаПоставки) = 7
                  |                            ТОГДА 1
                  |                        ИНАЧЕ 0
                  |                    КОНЕЦ), ДЕНЬ) = КалендарьБудущий.ДатаКалендаря)
                  |        ЛЕВОЕ СОЕДИНЕНИЕ КалендарьБудущий КАК КалендарьНаДоговорБудущий
                  |        ПО (ВЫБОР
                  |                КОГДА РеализацияТоваровУслуг.ДоговорКонтрагента.КонтролироватьЧислоДнейЗадолженности
                  |                    ТОГДА ВЫБОР
                  |                            КОГДА КалендарьБудущий.Ранг ЕСТЬ NULL
                  |                                ТОГДА 0
                  |                            ИНАЧЕ КалендарьБудущий.Ранг + (РеализацияТоваровУслуг.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности - 1)
                  |                        КОНЕЦ
                  |                ИНАЧЕ 0
                  |            КОНЕЦ = КалендарьНаДоговорБудущий.Ранг)

может так будет понятнее ))
а из календаря брать ДатаКалендаря
13 Barbossa
 
17.08.11
17:48
(12)
Такая идея была, но у контрукции есть минус.
Например - многодневные праздники или спец. дни отдыха компании будут пролетать мимо, если я ничего под вечер не путаю :)
14 mikecool
 
17.08.11
17:48
(13) если они будут отмечены в произв. календаре, то нет
15 Barbossa
 
17.08.11
17:53
(14) Ладно, спасибо большое за идею, буду осуществлять реализацию :)