Имя: Пароль:
1C
1С v8
Помогите с запросом
,
0 Botanik
 
21.08.12
20:47
Есть периодический регистр сведений.
Запрос к нему:

ВЫБРАТЬ
   ИсторияИзменеиняКонтрагентов.СтароеЗначение,
   ИсторияИзменеиняКонтрагентов.ДействеутС,
   ИсторияИзменеиняКонтрагентов.Контрагент
ИЗ
   РегистрСведений.ИсторияИзменеиняКонтрагентов КАК ИсторияИзменеиняКонтрагентов
ГДЕ
   ИсторияИзменеиняКонтрагентов.Контрагент В(&Массив)
   И ИсторияИзменеиняКонтрагентов.Объект = "Наименование"

Результат запрота:
СтарНазвание Дата1 Контрагент1
СтарНазвание Дата2 Контрагент1
СтарНазвание Дата Контрагент2

Задача:
Мне нужно выбрать так, чтоб по каждому контрагенту было выбрано единственное и последнее значение регистра по отбору и периоду.
Срез последних не подходит, так как "ИсторияИзменеиняКонтрагентов.Объект" может иметь различные строковые значения.
Очень важно, что параметр массив, так как это часть большого запроса, где этот запрос виртуальная таблица, которую нельзя итожить.

Как это сделать?

Надеюсь понятно изложил.
Заранее спасибо!!!!
1 DrShad
 
21.08.12
20:53
а где срез последних?
2 m-serg74
 
21.08.12
20:55
(1) да стандартный ему скорее всего не подойдет, надо  типа самодельного)

ТС делай по аналогии

ВЫБРАТЬ
   Участники.Ссылка КАК ФизичискоеЛицо,
   ПрохождениеКурсов.Курс
ИЗ
   Справочник.Участники КАК Участники
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ПоследняяДата.Период КАК Период,
           ПоследняяДата.Физлицо КАК Физлицо,
           ПоследнийКурс.Курс КАК Курс
       ИЗ
           (ВЫБРАТЬ
               МАКСИМУМ(регКурсы.Период) КАК Период,
               регКурсы.Физлицо КАК Физлицо
           ИЗ
               РегистрСведений.ПрохождениеКурсов КАК регКурсы
         
           СГРУППИРОВАТЬ ПО
               регКурсы.Физлицо) КАК ПоследняяДата
               ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПрохождениеКурсов КАК ПоследнийКурс
               ПО ПоследняяДата.Физлицо = ПоследнийКурс.Физлицо
                   И ПоследняяДата.Период = ПоследнийКурс.Период) КАК ПрохождениеКурсов
       ПО (ПрохождениеКурсов.Физлицо = Участники.Ссылка)
3 m-serg74
 
21.08.12
20:57
лень самому было писать, а вообще все тута, как обычно
www.google.ru/search?q=сделать+срез+последних+1С
4 Botanik
 
21.08.12
21:24
Спасибо! Все получилось))
Мой запрос:
ВЫБРАТЬ РАЗЛИЧНЫЕ
   ИсторияИзменеиняКонтрагентов_Дионикс.Контрагент,
   ИсторияИзменеиняКонтрагентов_Дионикс.СтароеЗначение,
   ИсторияИзменеиняКонтрагентов_Дионикс.ДействеутС
ИЗ
   (ВЫБРАТЬ РАЗЛИЧНЫЕ
       ИсторияИзменеиняКонтрагентов.Контрагент КАК Контрагент,
       МАКСИМУМ(ИсторияИзменеиняКонтрагентов.ДействеутС) КАК ДействеутС
   ИЗ
       РегистрСведений.ИсторияИзменеиняКонтрагентов_Дионикс КАК ИсторияИзменеиняКонтрагентов
   ГДЕ
       ИсторияИзменеиняКонтрагентов.Контрагент В (&Массив)
       И ИсторияИзменеиняКонтрагентов.Объект = "Наименование"
   
   СГРУППИРОВАТЬ ПО
       ИсторияИзменеиняКонтрагентов.Контрагент) КАК ВложенныйЗапрос
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсторияИзменеиняКонтрагентов_Дионикс КАК ИсторияИзменеиняКонтрагентов_Дионикс
       ПО ВложенныйЗапрос.Контрагент = ИсторияИзменеиняКонтрагентов_Дионикс.Контрагент
           И ВложенныйЗапрос.ДействеутС = ИсторияИзменеиняКонтрагентов_Дионикс.ДействеутС
ГДЕ
   ИсторияИзменеиняКонтрагентов_Дионикс.Контрагент В (&Массив)
   И ИсторияИзменеиняКонтрагентов_Дионикс.Объект = "Наименование"
5 m-serg74
 
21.08.12
21:39
фигню какую то налепил))) ну главное что работает, если работает конечно)))
6 Botanik
 
21.08.12
21:42
А чё фигню то?
Что посоветовал, то и налепил)))))
7 Botanik
 
21.08.12
21:43
И главное работает))))
8 m-serg74
 
21.08.12
21:45
зачем два ГДЕ? нафига РАЗЛИЧНЫЕ? МАКСИМУМ Период из регистра брать надо, хотя откуда мне знать что там у тебя вообще в регистр пишется)))
9 m-serg74
 
21.08.12
21:46
но (7) главное)))
10 m-serg74
 
21.08.12
21:48
ДействеутС = ДействУЕтС вообще то в русском языке вроде
11 Botanik
 
21.08.12
21:53
Первое "где" для вложенного запроса, по которому делаю группировку по МАКСИМУМ "ДействуетС".
Второе "где" для таблицы, которая присоединяется левым соединением к результату вложенного.
Без второго "где" эта таблица больше и дольше выполняется запрос.
А Различные, это можно и убрать))) Привычка.
ДействеутС - очепятка)))
12 m-serg74
 
21.08.12
21:55
ЛЕВОЕ соединение это когда из левой таблицы (твой ВложенныйЗапрос, а там уже отбор был) берутся все записи, а из правой только те которые подходят под условие в ПО ....
13 m-serg74
 
21.08.12
22:01
думаю вот так:


ВЫБРАТЬ
   ИсторияИзменеиняКонтрагентов_Дионикс.Контрагент,
   ИсторияИзменеиняКонтрагентов_Дионикс.СтароеЗначение,
   ИсторияИзменеиняКонтрагентов_Дионикс.ДействеутС
ИЗ
   (ВЫБРАТЬ
   ИсторияИзменеиняКонтрагентов.Объект КАК Объект
       ИсторияИзменеиняКонтрагентов.Контрагент КАК Контрагент,
       МАКСИМУМ(ИсторияИзменеиняКонтрагентов.ДействеутС) КАК ДействеутС
   ИЗ
       РегистрСведений.ИсторияИзменеиняКонтрагентов_Дионикс КАК ИсторияИзменеиняКонтрагентов
   ГДЕ
       ИсторияИзменеиняКонтрагентов.Контрагент В (&Массив)
       И ИсторияИзменеиняКонтрагентов.Объект = "Наименование"
   
   СГРУППИРОВАТЬ ПО
       ИсторияИзменеиняКонтрагентов.Контрагент,
   ИсторияИзменеиняКонтрагентов.Объект) КАК ВложенныйЗапрос
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсторияИзменеиняКонтрагентов_Дионикс КАК ИсторияИзменеиняКонтрагентов_Дионикс
       ПО ВложенныйЗапрос.Контрагент = ИсторияИзменеиняКонтрагентов_Дионикс.Контрагент
           И ВложенныйЗапрос.Объект = ИсторияИзменеиняКонтрагентов_Дионикс.Объект
           И ВложенныйЗапрос.ДействеутС = ИсторияИзменеиняКонтрагентов_Дионикс.ДействеутС
14 Botanik
 
21.08.12
22:09
Но ведь получается, что присоединяешь всю таблицу целиком
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИсторияИзменеиняКонтрагентов_Дионикс КАК ИсторияИзменеиняКонтрагентов_Дионикс
Не накладывая на неё отбор она полностью пытается присоединится по полям:
ВложенныйЗапрос.Контрагент = ИсторияИзменеиняКонтрагентов_Дионикс.
И ВложенныйЗапрос.Объект = ИсторияИзменеиняКонтрагентов_Дионикс.Объект
И ВложенныйЗапрос.ДействеутС = ИсторияИзменеиняКонтрагентов_Дионикс.ДействеутС
И те значения которые подходят, присоединяются.
А с отбором, таблица становится меньше и быстрее.
15 m-serg74
 
21.08.12
22:12
по отбор на присоединяемую таблицу а вот товой посдедний ГДЕ был не на нее а уже на результат а по сути он вообще ничего не отбирал ибо ЛЕВАЯ таблица так сказать ведущая
16 m-serg74
 
21.08.12
22:13
товой посдедний = твой последний
17 m-serg74
 
21.08.12
22:15
я конечно же могу ошибаться)))