Имя: Пароль:
1C
1С v8
v8: Запрос. Последние документы
0 tempaccount
 
20.09.13
16:20
Есть документ А, у него есть реквизит Б, как вывести все последние документы на каждый Б. Т.е. выводить Максимальную ССЫЛКУ А, для каждого возможного Б.

Т.е. Для Б создано 3 А, а для другого Б создано 2 А, хочу вывести 2  последних А, для первого и 2ого Б соответственно

П.с. надеюсь понятно объяснил. Заранее спасибо.
1 Ненавижу 1С
 
гуру
20.09.13
16:22
максимальную ссылку или ссылки с максимальной датой?
2 tempaccount
 
20.09.13
16:26
(1) Ссылку. Ник хорош!
3 Лефмихалыч
 
20.09.13
16:37
Б! на ко Х это надо?
4 Лефмихалыч
 
20.09.13
16:37
(2) а ты уверен, что понимаешь разницу?
5 tempaccount
 
20.09.13
16:39
(4) О какой разнице идет речь?
Для дома есть несколько проведенных документов, как в ЗАПРОСЕ посмотреть для всех домов последние по ссылке документы?
Это что невозможно?
6 ale-sarin
 
20.09.13
16:42
(5) А что есть для Вас "последние по ссылке документы"? Может последние по времени?
7 Maxus43
 
20.09.13
16:42
Группирой по  Дому и  МАКСИМУМ(документ.Ссылка)

или чего?
8 Лефмихалыч
 
20.09.13
16:42
(5) о разнице между максимальной ссылкой и ссылкой на документ с максимальной датой. Она есть и огромная
9 tempaccount
 
20.09.13
16:43
(6) Нет, по ссылке, Документы могут заносить задним числом.
Я может некорректно выразил свою мысль? Не совсем понимаю в чем проблема? Или придется получать все, и циклом обходить в поисках последних ссылок
10 Сторно абсурда
 
20.09.13
16:44
(5) таrая формулировка подходит?

посмотреть для всех домов последние по моменту времени документы?
11 Поросенок Петр
 
20.09.13
16:44
Телепатирую: то что хочет автор, не взлетит.
12 ale-sarin
 
20.09.13
16:46
(9) Нет, проблем нет. Это возможно. Просто в (0) Вы пишете про последние документы. Вот мы и спрашиваем, что есть "последние"?
Может те, которые введены в программу позже?
13 tempaccount
 
20.09.13
16:46
(7) Группировка по дому, тогда как мне поймать ТАБЛИЧНУЮ часть этого документа? Актуальна именно она, и лишь та, что последней внесена :)
14 Лефмихалыч
 
20.09.13
16:48
ммм, интрига разворачивается!
постойте - я за попкорном сгоняю
15 ale-sarin
 
20.09.13
16:49
(13) А кто Вам сказал, что последний внесенный документ - это последняя ссылка?
16 Maxus43
 
20.09.13
16:49
(13) документ сначала достань, запули это в ВТ, потом соеденишь ТЧ последнего дока, ранее найденного со ссылкой на док
17 tempaccount
 
20.09.13
16:50
(15) Ошибся, скажите как вывести просто последнии, пускай по дате
18 ale-sarin
 
20.09.13
16:51
(17) Группировка по Максимум(Док.Дата)
19 ale-sarin
 
20.09.13
16:52
+18 Не дословно...
20 Анцеранана
 
20.09.13
16:53
я конечно дико извиняюсь если не так понял
Автор.. может поможет тебе вот такая статья или типа нее:
http://akim-off.blogspot.ru/2013/02/1c8.html
Имхо тут нужен коррелированный запрос,хотя могу ошибаться
21 tempaccount
 
20.09.13
16:53
(18) Группировка выдаст последний? И как Вы прописываете функцию? У меня пишет ошибка "Операция запрещена в сгруппировать..."
22 ale-sarin
 
20.09.13
16:59
(21)
ВЫБРАТЬ
    ФормированиеЗаписейКнигиПродажРеализация.Ссылка,
    МАКСИМУМ(РеализацияТоваровУслуг.Дата) КАК Дата
ПОМЕСТИТЬ ВТ_МаксДата
ИЗ
    Документ.ФормированиеЗаписейКнигиПродаж.Реализация КАК ФормированиеЗаписейКнигиПродажРеализация
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ПО ФормированиеЗаписейКнигиПродажРеализация.СчетФактура = РеализацияТоваровУслуг.Ссылка

СГРУППИРОВАТЬ ПО
    ФормированиеЗаписейКнигиПродажРеализация.Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    МАКСИМУМ(РеализацияТоваровУслуг.Ссылка) КАК Ссылка,
    ВТ_МаксДата.Ссылка КАК Ссылка1
ИЗ
    ВТ_МаксДата КАК ВТ_МаксДата
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ПО ВТ_МаксДата.Дата = РеализацияТоваровУслуг.Дата

СГРУППИРОВАТЬ ПО
    ВТ_МаксДата.Ссылка
23 Лефмихалыч
 
20.09.13
17:05
(22) ты вот зря так на неокрепший ум. Он же не сможет понять, где ошибка
24 tempaccount
 
20.09.13
17:06
(22) А без временных таблиц можно?
25 tempaccount
 
20.09.13
17:06
(24) Т.е. вообще возможно?
26 ale-sarin
 
20.09.13
17:07
(23) Есть, конечно, косячок. Но задачу решает.
27 ale-sarin
 
20.09.13
17:07
(24) Можно. Вложенной.
28 Ненавижу 1С
 
гуру
20.09.13
17:10
не взлетит, нигде в базе не хранится какой документ был внесен последним, если этого не сделали специально

более того, последний это который INSERT последний или который UPDATE OR INSERT?
29 Лефмихалыч
 
20.09.13
17:14
(28) в журнале регистрации хранится, если он включен и настроен. Но с ним сношаться - ну его нафиг, если предварительно не придуман специальный велосипед, облегчающий это дело
30 ale-sarin
 
20.09.13
17:17
(28) (29) Автор уже согласился с последним по времени доком.
31 Ненавижу 1С
 
гуру
20.09.13
17:21
(29) я говорю в базе, а не в журнале, там искать - себе дороже, согласен
32 tempaccount
 
20.09.13
17:24
Попробую коррелир написать.
33 tempaccount
 
20.09.13
19:57
Реализую запросом и на основе его в цикле буду запросы фигачить, но это очень плохая идея, мб кто-нибудь поможет превратит его в ВТ, близким к (22)

&НаСервере
Процедура АктуальныеДанные()
    ДокументыЗапрос = Новый Запрос("ВЫБРАТЬ
                                   |    Документ.Дом,
                                   |    Документ.Номер
                                   |ИЗ
                                   |    Документ.Документ КАК Документ
                                   |ГДЕ
                                   |    Документ.Год МЕЖДУ &НачалоГода И &КонецГода
                                   |    И Документ.Проведен = ИСТИНА");
    ДокументыЗапрос.УстановитьПараметр("НачалоГода",НачалоГода(Объект.Период));
    ДокументыЗапрос.УстановитьПараметр("КонецГода",КонецГода(Объект.Период));
                        
    Результат = ДокументыЗапрос.Выполнить().Выбрать();
    
    АктуальныеДокументы = Новый Соответствие;
    
    Пока Результат.Следующий()Цикл  
        Содержит(АктуальныеДокументы, Результат.Дом, Результат.Номер);    
    КонецЦикла;
    
    ГотовыеДанные = Новый Структура("Месяц_1, Месяц_2, Месяц_3, Месяц_4, Месяц_5, Месяц_6, Месяц_7, Месяц_8, Месяц_9, Месяц_10, Месяц_11, Месяц_12");
    
    ЗапросТЧ = Новый Запрос("ВЫБРАТЬ
                            |    Документ.Дом,
                            |    ДокументПлан.ЯнвНат КАК Месяц_1,
                            |    ДокументПлан.ФевНат КАК Месяц_2,
                            |    ДокументПлан.МартНат КАК Месяц_3,
                            |    ДокументПлан.АпрНат КАК Месяц_4,
                            |    ДокументПлан.МайНат КАК Месяц_5,
                            |    ДокументПлан.ИюньНат КАК Месяц_6,
                            |    ДокументПлан.ИюльНат КАК Месяц_7,
                            |    ДокументПлан.АвгНат КАК Месяц_8,
                            |    ДокументПлан.СентНат КАК Месяц_9,
                            |    ДокументПлан.ОктНат КАК Месяц_10,
                            |    ДокументПлан.НояНат КАК Месяц_11,
                            |    ДокументПлан.ДекНат КАК Месяц_12
                            |ИЗ
                            |    Документ.Документ.План КАК ДокументПлан
                            |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.Документ КАК Документ
                            |        ПО ДокументПлан.Ссылка = Документ.Ссылка
                            |ГДЕ
                            |    Документ.Номер = &Номер");
                            
    Для Каждого Документик Из АктуальныеДокументы Цикл
        ЗапросТЧ.УстановитьПараметр("Номер", Документик.Значение);
        
        ВременныйРезультат = ЗапросТЧ.Выполнить().Выбрать();
        Пока ВременныйРезультат.Следующий() Цикл                        
            Для к = 1 по 12 Цикл      
                ГотовыеДанные["Месяц_" + к] = ВременныйРезультат["Месяц_" + к];    
            КонецЦикла;        
        КонецЦикла;
    КонецЦикла;                             
    
    
КонецПроцедуры

&НаСервере
Процедура  Содержит(Соответсвие, Ключ, Значение)
    Для Каждого Документ из Соответсвие Цикл
        Если (Документ.Ключ = Ключ) Тогда
            Соответсвие.Вставить(Ключ, ?(Документ.Значение > Значение, Документ.Значение, Значение));
            Возврат;
        КонецЕсли;
    КонецЦикла;
    Соответсвие.Вставить(Ключ, Значение);
КонецПроцедуры
34 tempaccount
 
20.09.13
19:58
Я не дописал, но Вы поняли что щит выходит, хотя на сервере при правильном запросе все равное не густо, но запрос всяко оптимизированей делается чем вручную запросы и циклы. Я не хочу такое! А ВТ писать не понимат как
35 tempaccount
 
20.09.13
20:40
Этот щит работает!
&НаСервере
Функция АктуальныеДанные()
    ДокТЧументыЗапрос = Новый Запрос("ВЫБРАТЬ
                                   |    Док.Дом,
                                   |    Док.Номер
                                   |ИЗ
                                   |    ДокТЧумент.Док КАК Док
                                   |ГДЕ
                                   |    Док.Год МЕЖДУ &НачалоГода И &КонецГода
                                   |    И Док.Проведен = ИСТИНА");
    ДокТЧументыЗапрос.УстановитьПараметр("НачалоГода",НачалоГода(Объект.Период));
    ДокТЧументыЗапрос.УстановитьПараметр("КонецГода",КонецГода(Объект.Период));
                        
    Результат = ДокТЧументыЗапрос.Выполнить().Выбрать();
    
    АктуальныеДокТЧументы = Новый Соответствие;
    
    Пока Результат.Следующий()Цикл  
        Содержит(АктуальныеДокТЧументы, Результат.Дом, Результат.Номер);    
    КонецЦикла;
    
    
    Готово = Новый Массив;
    ЗапросТЧ = Новый Запрос("ВЫБРАТЬ
                            |    Док.Дом,
                            |    ДокТЧ.ЯнвНат КАК Месяц_1,
                            |    ДокТЧ.ФевНат КАК Месяц_2,
                            |    ДокТЧ.МартНат КАК Месяц_3,
                            |    ДокТЧ.АпрНат КАК Месяц_4,
                            |    ДокТЧ.МайНат КАК Месяц_5,
                            |    ДокТЧ.ИюньНат КАК Месяц_6,
                            |    ДокТЧ.ИюльНат КАК Месяц_7,
                            |    ДокТЧ.АвгНат КАК Месяц_8,
                            |    ДокТЧ.СентНат КАК Месяц_9,
                            |    ДокТЧ.ОктНат КАК Месяц_10,
                            |    ДокТЧ.НояНат КАК Месяц_11,
                            |    ДокТЧ.ДекНат КАК Месяц_12
                            |ИЗ
                            |    ДокТЧумент.Док.План КАК ДокТЧ
                            |        ЛЕВОЕ СОЕДИНЕНИЕ ДокТЧумент.Док КАК Док
                            |        ПО ДокТЧ.Ссылка = Док.Ссылка
                            |ГДЕ
                            |    Док.Номер = &Номер
                            |    И ДокТЧ.ВидРабот = &ВидРабот");
    ЗапросТЧ.УстановитьПараметр("ВидРабот", Объект.Работа);
                            
    Для Каждого ДокТЧументик Из АктуальныеДокТЧументы Цикл
        ЗапросТЧ.УстановитьПараметр("Номер", ДокТЧументик.Значение);
        
        ВременныйРезультат = ЗапросТЧ.Выполнить().Выбрать();
        Пока ВременныйРезультат.Следующий() Цикл
            ГотовыеДанные = Новый Структура("Дом ,Месяц_1, Месяц_2, Месяц_3, Месяц_4, Месяц_5, Месяц_6, Месяц_7, Месяц_8, Месяц_9, Месяц_10, Месяц_11, Месяц_12");
            ГотовыеДанные.Дом = ВременныйРезультат.Дом;
            Для к = 1 по 12 Цикл      
                ГотовыеДанные["Месяц_" + к] = ВременныйРезультат["Месяц_" + к];    
            КонецЦикла;
            Готово.Добавить(ГотовыеДанные);
        КонецЦикла;
    КонецЦикла;
    
    Возврат Готово;    
КонецФункции

&НаСервере
Процедура  Содержит(Соответсвие, Ключ, Значение)
    Для Каждого ДокТЧумент из Соответсвие Цикл
        Если (ДокТЧумент.Ключ = Ключ) Тогда
            Соответсвие.Вставить(Ключ, ?(ДокТЧумент.Значение > Значение, ДокТЧумент.Значение, Значение));
            Возврат;
        КонецЕсли;
    КонецЦикла;
    Соответсвие.Вставить(Ключ, Значение);
КонецПроцедуры
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn