![]() |
![]() |
![]() |
|
Как правильно делается запрос по докам и их ТЧ | ☑ | ||
---|---|---|---|---|
0
Prestion
20.12.16
✎
22:12
|
Есть список документов за период. Мне нужно выгрузить в файл данные по документу и по его ТЧ
Формат типа: <Документы> <Документ> <Реквизиты документа> <Реквизиты документа> <Товары> <Товар> <Реквизиты товара> <Реквизиты товара> ... </Товар> </Товары> </Документ> </Документы> Сейчас делаю так: Первый запрос выбирает документы и в процессе обхода выборки получаю ссылку на док и передаю ее параметром во второй запрос, который уже выбирает данные по ТЧ. Т.е. у меня выходит на каждую ссылку выборки выполняется запрос по ТЧ. Подозреваю, что это не верное решение, в связи с чем прошу объяснить - как грамотно это делается? Благодарю! |
|||
1
Джинн
20.12.16
✎
22:21
|
Можно соединить таблицу ТЧ и таблицу документа, вывалить в плоскую таблицу и при переборе строк отслеживать смену документа.
Или в дерево выгрузить, а там обходить ветви. |
|||
2
bolder
20.12.16
✎
22:21
|
(0) Запрос нужно делать к табличной части сразу.В нем также будет Ссылка.Группировка По ссылке.
|
|||
3
Prestion
20.12.16
✎
22:24
|
Собственно да, я понимаю, что одним запросом это вытянуть не составляет проблем. Проблемы у меня именно в обходе такого запроса. Как правильно делать его? Подозреваю, что можно как-то красиво шагать по группам или есть еще варианты?
|
|||
4
Prestion
20.12.16
✎
22:25
|
Эмм...сейчас набросаю пример с конкретной таблицей.
|
|||
5
trdm
20.12.16
✎
22:31
|
(3) Воспользуйся конструктором запроса с обработкой результата.
|
|||
6
trdm
20.12.16
✎
22:31
|
и юзай его вывод.
|
|||
7
trdm
20.12.16
✎
22:45
|
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ | ЗаказКлиентаТовары.Ссылка КАК Ссылка, | СУММА(ЗаказКлиентаТовары.НомерСтроки) КАК НомерСтроки, | ЗаказКлиентаТовары.Товар, | СУММА(ЗаказКлиентаТовары.Количество) КАК Количество, | СУММА(ЗаказКлиентаТовары.Цена) КАК Цена, | СУММА(ЗаказКлиентаТовары.Сумма) КАК Сумма, | ЗаказКлиентаТовары.Ссылка.Клиент, | ЗаказКлиентаТовары.Ссылка.Склад |ИЗ | Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары | |СГРУППИРОВАТЬ ПО | ЗаказКлиентаТовары.Ссылка, | ЗаказКлиентаТовары.Товар, | ЗаказКлиентаТовары.Ссылка.Клиент, | ЗаказКлиентаТовары.Ссылка.Склад | |УПОРЯДОЧИТЬ ПО | Ссылка, | НомерСтроки"; вСтарСсылка = ""; РезультатЗапроса = Запрос.Выполнить(); вТаблицаЗначений = РезультатЗапроса.Выгрузить(); Для каждого вСтрокаТЧ Из вТаблицаЗначений Цикл Если вСтарСсылка <> вСтрокаТЧ.Ссылка Тогда // Новый Документ вСтарСсылка = вСтрокаТЧ.Ссылка; КонецЕсли; КонецЦикла; |
|||
8
Prestion
20.12.16
✎
23:29
|
Собственно, вот так сейчас (выкинул данные, оставил суть)
ЗаписьXML.ЗаписатьНачалоЭлемента("Docs"); Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | Реализация.Ссылка КАК Ссылка, | Реализация.Номер КАК num, | Реализация.Дата КАК date |ИЗ | Документ.Реализация КАК Реализация"; РезультатЗапроса = Запрос.Выполнить(); ВыборкаДок = РезультатЗапроса.Выбрать(); Пока ВыборкаДок.Следующий() Цикл ЗаписьXML.ЗаписатьНачалоЭлемента("Doc"); ЗаписатьЭлементХМЛ(ЗаписьXML, "num", ВыборкаДок.num); ЗаписатьЭлементХМЛ(ЗаписьXML, "date", ВыборкаДок.date); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РеализацияТовары.Номенклатура.Код КАК code, | РеализацияТовары.Количество КАК quantity |ИЗ | Документ.Реализация.Товары КАК РеализацияТовары |ГДЕ | РеализацияТовары.Ссылка.Ссылка = &Ссылка Запрос.УстановитьПараметр("Ссылка", ВыборкаДок.Ссылка); РезультатЗапроса2 = Запрос.Выполнить(); ЗаписьXML.ЗаписатьНачалоЭлемента("Table"); ВыборкаНом = РезультатЗапроса2.Выбрать(); Пока ВыборкаНом.Следующий() Цикл ЗаписьXML.ЗаписатьНачалоЭлемента("SKU"); ЗаписатьЭлементХМЛ(ЗаписьXML, "code", Строка(ВыборкаНом.code)); ЗаписатьЭлементХМЛ(ЗаписьXML, "quantity", Строка(ВыборкаНом.quantity)); ЗаписьXML.ЗаписатьКонецЭлемента(); //SKU КонецЦикла; ЗаписьXML.ЗаписатьКонецЭлемента(); //Table ЗаписьXML.ЗаписатьКонецЭлемента(); //Doc КонецЦикла; ЗаписьXML.ЗаписатьКонецЭлемента(); //Docs |
|||
9
trdm
20.12.16
✎
23:45
|
Тормозуха. Одним запросом быстрее.
|
|||
10
Prestion
21.12.16
✎
00:02
|
(9) Да, потому, собственно, и задался вопросом оптимизации...
Вопрос стоит скорей: как обойти единый запрос (а для этого как лучше его скомпоновать) для записи данных в описанном формате. |
|||
11
Лефмихалыч
21.12.16
✎
00:13
|
Выбрать Т.*, Т.Ссылка.НеобходимыеРеквзитыДокумента
Из Документ.ТвойДокумент.ТабличнаяЧасть как Т Итоги По Ссылка Результат = Запрос.Выполнить(); ВыборкаДокументы = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаДокументы.Следующий() Цикл // тут у тебя документы ВыборкаСтроки = ВыборкаДокументы.Выбрать(); Пока ВыборкаСТрока.Следующий Цикл // а тут строки ТЧ |
|||
12
Prestion
21.12.16
✎
00:16
|
(11) Вот это очень похоже на то, что я хочу сделать, только есть нюанс. Насколько я понимаю выборку по группировкам можно сделать только при заполненных итогах? Если так, то у меня есть помимо всего расчетные поля, по которым нельзя сделать итоги.. хотя, может я к ночи уже не соображаю. Завтра попробую обязательно, спасибо!
|
|||
13
shpioleg
21.12.16
✎
00:21
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |