Имя: Пароль:
1C
1С v8
Запрос выбрать значение из регистра сведений
, ,
0 x-a-d
 
29.11.12
13:40
Тема не совсем корректно сформулирована, т.к. не знаю как точно ее сформулировать.
Вопрос следующий.
В РС (например, РС производственный календарь в типовых) храним какое-то значение на дату.
Дата1 "рабочий"
Дата2 "выходной"
Дата3 "рабочий"
Дата4 "выходной"
Дата5 "рабочий" и т.д.

Делаю запрос к другим данным (неважно каким), где одно из полей дата.
В зависимости от условий мне надо у этой дате прибавить "n" рабочих дней, чтобы получить Дату из производственного календаря.
Например, мне надо получить третью рабочую дату. Т.е. из приведенного выше списка это "Дата5". Отобрать все рабочие даты и поместить во временную таблицу - не проблема (чтобы потом по левому соединению обратиться).
Но не могу придумать алгоритм как получить именно "Дата5"
1 shuhard
 
29.11.12
13:45
(0) я бы использовал HAVING
2 LehhaK
 
29.11.12
13:45
Я бы запросом выбрал даты, где условие = рабочий и выбрать первые 3. Перебором доходишь до последней и вот она твоя дата, например
3 x-a-d
 
29.11.12
13:47
(1) имеющие используется только к агрегатным функциям. В данном случае не пойму, что агрегировать.
4 shuhard
 
29.11.12
13:48
(0) количество
5 МишКа
 
29.11.12
13:48
(2)
6 МишКа
 
29.11.12
13:49
А первые n, как будешь выбирать? Текст запроса парсить?
7 LehhaK
 
29.11.12
13:50
(6)Запрос.Текст = "Выбрать первые"+"n"+"Блаблабла"
8 x-a-d
 
29.11.12
13:50
(2) мне надо выбирать может 3, может 5 и по левому соединению. Думаю может как-то пронумеровать даты. И потом к своей дате, от которой ищу, выбрать ближайшую из временной таблицы, а потом к ее "порядку" прибавить нужную разницу и выбрать уже нужную дату
(6) будет условие в запросе типа ВЫБОР КОГДА ...
9 bzaugolnov
 
29.11.12
14:06
(8) Да, нумерация дат, кажется, самый простой способ. Можно в самой базе сделать нумерацию или добавить пару временных таблиц:
ВЫБРАТЬ Дата,Вид,1 КАК Позиция ПОМЕСТИТЬ ВТ_Даты
;
ВЫБРАТЬ Даты1.Дата КАК Дата, СУММА(Даты2.Позиция) КАК Позиция ПОМЕСТИТЬ ВТ_Список
ИЗ ВТ_Даты КАК Даты1
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Даты КАК Даты2 ПО Даты1.Дата>=Даты2.Дата И Даты2.Вид = Рабочая
Где Даты1.Вид = Рабочая
10 hhhh
 
29.11.12
14:12
(8) как-то так

Выбрать
   Календарь2.Дата,
  СУММА(Календарь1.РабочийДень)
ИЗ
  ПроизводственныйКалендарь КАК Календарь1
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПроизводственныйКалендарь КАК Календарь2
  ПО Календарь1.Дата <= Календарь2.Дата
СГРУППИРОВАТЬ ПО
  Календарь2.Дата

и потом для двух дат нужно взять две строчки этой таблицы и вычесть.
11 Kashemir
 
29.11.12
14:34
ВЫБРАТЬ
   РегламентированныйПроизводственныйКалендарь.ДатаКалендаря
ПОМЕСТИТЬ Календарь
ИЗ
   РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
   РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачалоПериода И &КонецПериода
   И РегламентированныйПроизводственныйКалендарь.ВидДня = &РабочийВидДня
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   Календарь.ДатаКалендаря КАК ДатаКалендаря,
   КОЛИЧЕСТВО(Календарь1.ДатаКалендаря) КАК НомерДня
ПОМЕСТИТЬ НумерованныйКалендарь
ИЗ
   Календарь КАК Календарь
       ЛЕВОЕ СОЕДИНЕНИЕ Календарь КАК Календарь1
       ПО Календарь.ДатаКалендаря >= Календарь1.ДатаКалендаря

СГРУППИРОВАТЬ ПО
   Календарь.ДатаКалендаря

ИНДЕКСИРОВАТЬ ПО
   ДатаКалендаря,
   НомерДня
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВЫРАЗИТЬ(ТаблицаДатСОтстрочками.Дата КАК ДАТА) КАК Дата,
   ВЫРАЗИТЬ(ТаблицаДатСОтстрочками.ОтсрочкаВРабочихДнях КАК ЧИСЛО(19, 0)) КАК ОтсрочкаВРабочихДнях
ПОМЕСТИТЬ ТЗДатОстрочек
ИЗ
   &Тз КАК ТаблицаДатСОтстрочками
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ВложенныйЗапрос.Дата,
   ВложенныйЗапрос.ОтсрочкаВРабочихДнях,
   ВложенныйЗапрос.НомерНужногоРабочегоДня,
   НумерованныйКалендарь.ДатаКалендаря КАК ДатаОкончанияОтсрочки
ИЗ
   (ВЫБРАТЬ
       ВложенныйЗапрос.Дата КАК Дата,
       ВложенныйЗапрос.ОтсрочкаВРабочихДнях КАК ОтсрочкаВРабочихДнях,
       ВложенныйЗапрос.ОтсрочкаВРабочихДнях + ЕСТЬNULL(НумерованныйКалендарь.НомерДня, 0) КАК НомерНужногоРабочегоДня
   ИЗ
       (ВЫБРАТЬ
           ТЗДатОстрочек.Дата КАК Дата,
           ТЗДатОстрочек.ОтсрочкаВРабочихДнях КАК ОтсрочкаВРабочихДнях,
           МИНИМУМ(НумерованныйКалендарь.ДатаКалендаря) КАК ДатаБлижайшегоРабочегоДня
       ИЗ
           ТЗДатОстрочек КАК ТЗДатОстрочек
               ЛЕВОЕ СОЕДИНЕНИЕ НумерованныйКалендарь КАК НумерованныйКалендарь
               ПО ТЗДатОстрочек.Дата <= НумерованныйКалендарь.ДатаКалендаря
       
       СГРУППИРОВАТЬ ПО
           ТЗДатОстрочек.Дата,
           ТЗДатОстрочек.ОтсрочкаВРабочихДнях) КАК ВложенныйЗапрос
           ЛЕВОЕ СОЕДИНЕНИЕ НумерованныйКалендарь КАК НумерованныйКалендарь
           ПО ВложенныйЗапрос.ДатаБлижайшегоРабочегоДня = НумерованныйКалендарь.ДатаКалендаря) КАК ВложенныйЗапрос
       ЛЕВОЕ СОЕДИНЕНИЕ НумерованныйКалендарь КАК НумерованныйКалендарь
       ПО ВложенныйЗапрос.НомерНужногоРабочегоДня = НумерованныйКалендарь.НомерДня