Имя: Пароль:
1C
1С v8
Как правильно делается запрос по докам и их ТЧ
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