Имя: Пароль:
1C
 
Помогите новичку с запросом
0 1С_новый
 
21.06.11
23:19
Есть запрос:

   
   ТабличнаяЧасть.Очистить();    
   Запрос=Новый Запрос;
   Запрос.Текст=
   "ВЫБРАТЬ
   |    ПлановыеНачисленияРаботниковСрезПоследних.ФизЛицо,
   |    ПлановыеНачисленияРаботниковСрезПоследних.ВидРасчета,
   |    ПлановыеНачисленияРаботниковСрезПоследних.Показатель1,
   |    ПлановыеНачисленияРаботниковСрезПоследних.Ведомость КАК Ведомость,
   |    ПлановыеНачисленияРаботниковСрезПоследних.Действие КАК Действие,
   |    ПлановыеНачисленияРаботниковСрезПоследних.Период,
   |    ПлановыеНачисленияРаботниковСрезПоследних.ЦФО
   |ИЗ
   |    РегистрСведений.ПлановыеНачисленияРаботников.СрезПоследних КАК ПлановыеНачисленияРаботниковСрезПоследних
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОтработанноеВремяСводный КАК ОтработанноеВремяРабочее
   |        ПО ПлановыеНачисленияРаботниковСрезПоследних.ФизЛицо = ОтработанноеВремяРабочее.ФИЗЛицо
   |            И (ОтработанноеВремяРабочее.ВидУчетаРабВремени.РабочееВремя)
   |            И (НАЧАЛОПЕРИОДА(ОтработанноеВремяРабочее.Период, МЕСЯЦ) = НАЧАЛОПЕРИОДА(&Период, МЕСЯЦ))
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОтработанноеВремяСводный КАК ОтработанноеВремяОтпуск
   |        ПО ПлановыеНачисленияРаботниковСрезПоследних.ФизЛицо = ОтработанноеВремяОтпуск.ФИЗЛицо
   |            И (ОтработанноеВремяОтпуск.ВидУчетаРабВремени = ЗНАЧЕНИЕ(Справочник.КлассификаторИспользованияРабочегоВремени.ОсновнойОтпуск))
   |            И (НАЧАЛОПЕРИОДА(ОтработанноеВремяОтпуск.Период, МЕСЯЦ) = НАЧАЛОПЕРИОДА(&Период, МЕСЯЦ))
   |
   |СГРУППИРОВАТЬ ПО
   |    ПлановыеНачисленияРаботниковСрезПоследних.ФизЛицо,
   |    ПлановыеНачисленияРаботниковСрезПоследних.ВидРасчета,
   |    ПлановыеНачисленияРаботниковСрезПоследних.Показатель1,
   |    ПлановыеНачисленияРаботниковСрезПоследних.Ведомость,
   |    ПлановыеНачисленияРаботниковСрезПоследних.Действие,
   |    ПлановыеНачисленияРаботниковСрезПоследних.Период;
   
   Запрос.УстановитьПараметр("Период", ПериодРегистрации);
   Выборка = Запрос.Выполнить().Выбрать();



Получаем дынне так:

Пока Выборка.Следующий() Цикл                        
                   Заполнение=ТабличнаяЧасть.Добавить();
Заполнение.Колонка1     = Выборка.Период;
Заполнение.Колонка2     = Выборка.Период; // вот тут проблема

КонецЦикла;


По нему выводится таблица, заполняется так:

-------------------------------
| Дата начала| Дата окончания |
-------------------------------
| Дата1      | Дата2          |
-------------------------------
| Дата2      | Дата3          |
-------------------------------
| Дата3      | Дата3+1        |
-------------------------------

надо в правую колонку вывести данные из левой колонки только сместить
её, сделать так чтобы в правую колонку записалась дата из следующей строки левой колонке
Должно в итоге выглядеть так:

-------------------------------
| Дата начала| Дата окончания |
-------------------------------
| 01.01.2011 |  18.01.2011    |
-------------------------------
| 18.01.2011 |  21.01.2011    |
-------------------------------
| 21.01.2011 |  22.01.2011    |
-------------------------------
1 luckyluke
 
21.06.11
23:32
Делается это через левое соединение таблицы самой на себя с условием "По таблица1.Период < Таблица2.Период" и группировкой по минимуму периода второй таблицы, что-то вроде:
Выбрать
Таблица1.Период КАК ДатаНачала,
Минимум(Таблица2.Период) КАК ДатаОкончания
Из Таблица КАК Таблица1
Левое Соединение Таблица КАК Таблица2
По таблица1.Период < Таблица2.Период
Сгруппировать ПО Таблица1.Период
2 Лефмихалыч
 
21.06.11
23:33
наиух столько соединений, если поля используются только из самой левой таблицы? Удали все соединения, результат не изменится. Зачем группировка, если выборка из виртуальной таблицы? Оно уже и так сгруппировано.
3 Лефмихалыч
 
21.06.11
23:34
Надо ПлановыеНачисленияРаботниковСрезПоследних
соединить с самой собой по условию Период < Период
4 1С_новый
 
21.06.11
23:38
(1) что то не работает
5 Лефмихалыч
 
21.06.11
23:41
(4) значит ты что-то не так делаешь
6 1С_новый
 
21.06.11
23:43
Лефмихалыч, а какой антиспам ответ у тебя в аське? )))
7 Лефмихалыч
 
21.06.11
23:43
кстати да, работать и не должно. Вот от этого соединения надо взять МАКСИМУМ(Таблица2.Период) и уже это соединит опять с исходной таблицей на равенство периодв и максимум периода из соединения.
Ни уя не понятно сказал, но зато по смыслу правильно
8 Лефмихалыч
 
21.06.11
23:44
(6) тхе, смотря чо спрашивает
9 1С_новый
 
21.06.11
23:44
Ну блин смешно, я и за ночь походу это не сделаю ))))
10 Лефмихалыч
 
21.06.11
23:44
Я эту ветку в аське обсуждат не буду, не трудись
11 1С_новый
 
21.06.11
23:45
(9)
StopSpam automatic message:
Авотнифига! У меня тут антиспам, заряженный фа...м пополам с обедненным ураном. Из раковины чего смотрит устрицей женщина, на которой, по словам Маяковского, "белила густо".
12 Лефмихалыч
 
21.06.11
23:46
(11) антиспам этот заточен в акурат, чтобы не допускать товарищей, которые в школе не учились и гуглить не умеют
13 Sakura
 
21.06.11
23:47
(12) зачетный антиспам, уважаю
14 Лефмихалыч
 
21.06.11
23:50
(13) спасибо, весьма польщен неожиданно для себя
15 1С_новый
 
21.06.11
23:50
народ реально помогите пожалйсто с этим
16 Jackman
 
21.06.11
23:50
(0) Не читал, но порицаю...
17 Лефмихалыч
 
21.06.11
23:56
Как-то так надо (не исключено, что где-то больше надо заменить на меньше или содениение в использовать правое вместо левого - не особо задумывался над этими тонкостями):

"Выбрать
|ПлановыеНачисленияРаботниковСрезПоследних.Период,
|ПлановыеНачисленияРаботниковСрезПоследних.ЦФО
|ПОМЕСТИТЬ Исходник
|ИЗ
|
|РегистрСведений.ПлановыеНачисленияРаботников.СрезПоследних КАК ПлановыеНачисленияРаботниковСрезПоследних
|;
|ВЫБРАТЬ
|МАКСИМУМ(Исходник.Период)
|ПОМЕСТИТЬ ПредыдущиеПериоды
|ИЗ Исходник
|ЛЕВОЕ СОЕДИНЕНИЕ Исходник КАК ИсходникЕще
|ПО ИсходникЕще.Период>Исходник.Период
|;
|ВЫБРАТЬ
|Исходник.Период,
|ПредыдущиеПериоды.Период КАК СмещенныйПериод
|ИЗ Исходник ЛЕВОЕ СОЕДИНЕНИЕ ПредыдущиеПериоды
|ПО ПредыдущиеПериоды.Период=Исходник.Период
18 1С_новый
 
22.06.11
00:08
в принципе сделал но ругается почему то на

|ПО ПредыдущиеПериоды.Период=Исходник.Период";


вот текст запроса

   Запрос=Новый Запрос;
   Запрос.Текст=
   
   "ВЫБРАТЬ
   |    ПлановыеНачисленияРаботниковСрезПоследних.ФизЛицо,
   |    ПлановыеНачисленияРаботниковСрезПоследних.ВидРасчета,
   |    ПлановыеНачисленияРаботниковСрезПоследних.Показатель1,
   |    ПлановыеНачисленияРаботниковСрезПоследних.Ведомость КАК Ведомость,
   |    ПлановыеНачисленияРаботниковСрезПоследних.Действие КАК Действие,
   |    ПлановыеНачисленияРаботниковСрезПоследних.Период,
   |    ПлановыеНачисленияРаботниковСрезПоследних.ЦФО
   |   ПОМЕСТИТЬ Исходник
   |ИЗ
   |    РегистрСведений.ПлановыеНачисленияРаботников.СрезПоследних КАК ПлановыеНачисленияРаботниковСрезПоследних
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОтработанноеВремяСводный КАК ОтработанноеВремяРабочее
   |        ПО ПлановыеНачисленияРаботниковСрезПоследних.ФизЛицо = ОтработанноеВремяРабочее.ФИЗЛицо
   |            И (ОтработанноеВремяРабочее.ВидУчетаРабВремени.РабочееВремя)
   |            И (НАЧАЛОПЕРИОДА(ОтработанноеВремяРабочее.Период, МЕСЯЦ) = НАЧАЛОПЕРИОДА(&Период, МЕСЯЦ))
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОтработанноеВремяСводный КАК ОтработанноеВремяОтпуск
   |        ПО ПлановыеНачисленияРаботниковСрезПоследних.ФизЛицо = ОтработанноеВремяОтпуск.ФИЗЛицо
   |            И (ОтработанноеВремяОтпуск.ВидУчетаРабВремени = ЗНАЧЕНИЕ(Справочник.КлассификаторИспользованияРабочегоВремени.ОсновнойОтпуск))
   |            И (НАЧАЛОПЕРИОДА(ОтработанноеВремяОтпуск.Период, МЕСЯЦ) = НАЧАЛОПЕРИОДА(&Период, МЕСЯЦ));
   |
   |ВЫБРАТЬ
|МАКСИМУМ(Исходник.Период)
|ПОМЕСТИТЬ ПредыдущиеПериоды
|ИЗ Исходник
|ЛЕВОЕ СОЕДИНЕНИЕ Исходник КАК ИсходникЕще
|ПО ИсходникЕще.Период>Исходник.Период
|;
|ВЫБРАТЬ
|Исходник.Период,
|ПредыдущиеПериоды.Период КАК СмещенныйПериод
|ИЗ Исходник ЛЕВОЕ СОЕДИНЕНИЕ ПредыдущиеПериоды
|ПО ПредыдущиеПериоды.Период=Исходник.Период";
   
   Запрос.УстановитьПараметр("Период", ПериодРегистрации);
   Выборка = Запрос.Выполнить().Выбрать();
       
           Пока Выборка.Следующий() Цикл
19 Лефмихалыч
 
22.06.11
00:11
ЫЫЫААРГГХХАААААА!!!
Вот эта мандятина зачечм?

  |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОтработанноеВремяСводный КАК ОтработанноеВремяРабочее
   |        ПО ПлановыеНачисленияРаботниковСрезПоследних.ФизЛицо = ОтработанноеВремяРабочее.ФИЗЛицо
   |            И (ОтработанноеВремяРабочее.ВидУчетаРабВремени.РабочееВремя)
   |            И (НАЧАЛОПЕРИОДА(ОтработанноеВремяРабочее.Период, МЕСЯЦ) = НАЧАЛОПЕРИОДА(&Период, МЕСЯЦ))
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОтработанноеВремяСводный КАК ОтработанноеВремяОтпуск
   |        ПО ПлановыеНачисленияРаботниковСрезПоследних.ФизЛицо = ОтработанноеВремяОтпуск.ФИЗЛицо
   |            И (ОтработанноеВремяОтпуск.ВидУчетаРабВремени = ЗНАЧЕНИЕ(Справочник.КлассификаторИспользованияРабочегоВремени.ОсновнойОтпуск))
   |            И (НАЧАЛОПЕРИОДА(ОтработанноеВремяОтпуск.Период, МЕСЯЦ) = НАЧАЛОПЕРИОДА(&Период, МЕСЯЦ));

?

как именно ругается, ты предлагаешь угадать?
20 1С_новый
 
22.06.11
00:15
Пишет  
Поле не найдено "ПредыдущиеПериоды.Период"
ПО ПредыдущиеПериоды.<<?>>Период=Исходник.Период
   Выборка = Запрос.Выполнить().Выбрать();


В принципе она так же ругается и без мандятены ))))

   ТабличнаяЧасть.Очистить();    
   Запрос=Новый Запрос;
   Запрос.Текст=
   
   "ВЫБРАТЬ
   |    ПлановыеНачисленияРаботниковСрезПоследних.ФизЛицо,
   |    ПлановыеНачисленияРаботниковСрезПоследних.ВидРасчета,
   |    ПлановыеНачисленияРаботниковСрезПоследних.Показатель1,
   |    ПлановыеНачисленияРаботниковСрезПоследних.Ведомость КАК Ведомость,
   |    ПлановыеНачисленияРаботниковСрезПоследних.Действие КАК Действие,
   |    ПлановыеНачисленияРаботниковСрезПоследних.Период,
   |    ПлановыеНачисленияРаботниковСрезПоследних.ЦФО
   |   ПОМЕСТИТЬ Исходник
   |ИЗ
   |    РегистрСведений.ПлановыеНачисленияРаботников.СрезПоследних КАК ПлановыеНачисленияРаботниковСрезПоследних;
   |
   |ВЫБРАТЬ
|МАКСИМУМ(Исходник.Период)
|ПОМЕСТИТЬ ПредыдущиеПериоды
|ИЗ Исходник
|ЛЕВОЕ СОЕДИНЕНИЕ Исходник КАК ИсходникЕще
|ПО ИсходникЕще.Период>Исходник.Период
|;
|ВЫБРАТЬ
|Исходник.Период,
|ПредыдущиеПериоды.Период КАК СмещенныйПериод
|ИЗ Исходник ЛЕВОЕ СОЕДИНЕНИЕ ПредыдущиеПериоды
|ПО ПредыдущиеПериоды.Период=Исходник.Период";
   
   Запрос.УстановитьПараметр("Период", ПериодРегистрации);
21 Лефмихалыч
 
22.06.11
00:18
Включи уже голову. Поле МАКСИМУМ(Исходник.Период) не названо ни как, то есть платформа дала ему имя поле1 вместо Период.
http://lurkmore.ru/Вон_из_профессии, халявщик. Мало того, что решение твоей задачи ты у посторонних дядей выклянчил, так еще и разжевать теперь просишь до молекул, чтобы ты просто скопиастил и всё само.
22 1С_новый
 
22.06.11
00:20
Причем тут халявщик просто разобраться пытаюсь, тем более только учусь
23 Лефмихалыч
 
22.06.11
00:21
(22) не пытаешься ты разобраться, не свисти
24 Лефмихалыч
 
22.06.11
00:21
+(23) все, что ты пытаешься, - чтобы завтра все было. С похером на способ достижения
25 1С_новый
 
22.06.11
00:32
ПОМЕСТИТЬ Исходник  - тут это виртуальная таблица так?

|ВЫБРАТЬ
|Исходник.Период,
|ПредыдущиеПериоды.Период КАК СмещенныйПериод
|ИЗ Исходник ЛЕВОЕ СОЕДИНЕНИЕ ПредыдущиеПериоды
|ПО ПредыдущиеПериоды.Период=Исходник.Период";

ПредыдущиеПериоды.Период  - это вроде существует виртуальная запись,

Исходник.Период - вроде тоже существует запись

хорошо сделал так
|ВЫБРАТЬ
|Исходник.Период,
|ПредыдущиеПериоды.Период КАК СмещенныйПериод
|ИЗ Исходник ЛЕВОЕ СОЕДИНЕНИЕ ПредыдущиеПериоды
|ПО ПредыдущиеПериоды.Поле1=Исходник.Поле1";


ругается вообще на последии данные Исходник.Поле1, хотя она вроде есть, потому сделал так

|ПО ПредыдущиеПериоды.Поле1=Исходник.Период";

теперь ругается на
|ПредыдущиеПериоды.Период это тоже несуществующая запись тогда как его платформа обозвала, |ПредыдущиеПериоды.Поле1 КАК СмещенныйПериод тоже не работает.

Получается в итоге так:

   |ВЫБРАТЬ
|МАКСИМУМ(Исходник.Период)
|ПОМЕСТИТЬ ПредыдущиеПериоды
|ИЗ Исходник
|ЛЕВОЕ СОЕДИНЕНИЕ Исходник КАК ИсходникЕще
|ПО ИсходникЕще.Период>Исходник.Период
|;
|ВЫБРАТЬ
|Исходник.Период,
|ПредыдущиеПериоды.Период КАК СмещенныйПериод
|ИЗ Исходник ЛЕВОЕ СОЕДИНЕНИЕ ПредыдущиеПериоды
|ПО ПредыдущиеПериоды.Поле1=Исходник.Период";

Но ругается на |ПредыдущиеПериоды.Период КАК СмещенныйПериод,  а именно |ПредыдущиеПериоды.Период поле период не найдено
26 Лефмихалыч
 
22.06.11
00:37
(25) все правильно платформа делает, я щас тоже ругаться начну.
Перечитывай (21) и много думай о том, почему в таблице ПредыдущиеПериоды нет поля Период и не по этому ли ругается платформа
27 Boudybuilder
 
22.06.11
11:41
|УПОРЯДОЧИТЬ ПО ВыбранРегистрСрезПоследних.Период";


Что тут добавить , чтоб упорядочивало по возрастанию?
На данный момент упорядочивает по убыванию.
28 Boudybuilder
 
22.06.11
12:05
?
29 Boudybuilder
 
22.06.11
14:37
(27) ну помогите с этим...
30 BuHu
 
22.06.11
14:39
(27) Возр
31 Boudybuilder
 
22.06.11
14:48
(30)Возр и Убыв ... Я знаю , но куда дописать?
Перепиши мою строку , чтоб нагляднее было...
32 BuHu
 
22.06.11
14:51
|УПОРЯДОЧИТЬ ПО ВыбранРегистрСрезПоследних.Период Возр
33 Boudybuilder
 
22.06.11
14:54
(32) Спасибо!