Имя: Пароль:
1C
1С v8
Вывод результата запроса через условие другого запроса
,
0 jonik_joker
 
16.10.13
11:51
Всем добрый день. Посоветуйте как быть: есть запрос из которого впоследствии делается 2 выборки, по результатам каждой выборки заполняется табличный документ. В 1-й выборке соединение документа и регистра накоплений, во 2-м - ТЧ этого документа и другого регистра накоплений. Смысл отчета: если в результате выполнения 1-го запроса во 2-й выборке не окажется необходимых мне параметров( нет записей в регистре накоплений ), то выполнить 2-й запрос,где эти параметры есть и соответственно соединить с данными из 1-й выборки.

Привожу код (немного длинноват):

Запрос=Новый Запрос;
    Запрос.УстановитьПараметр("Клиент",Клиент);
    Запрос.УстановитьПараметр("Грузополучатель",Грузополучатель);
    Запрос.Параметры.Вставить("Инвойс",Инвойс);
    Запрос.Параметры.Вставить("Заявка",Заявка);
    Запрос.Параметры.Вставить("ДатаНачала",НачалоДня(ДатаНачала));
    Запрос.Параметры.Вставить("ДатаКонца",КонецДня(ДатаКонца));
    
    
    Запрос.Текст="ВЫБРАТЬ
                 |    ОборотыДенежныхСредствОстаткиИОбороты.СуммаПриход КАК СуммаИнвойс,
                 |    ОборотыДенежныхСредствОстаткиИОбороты.Инвойс,
                 |    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка КАК Заявка,
                 |    ОборотыДенежныхСредствОстаткиИОбороты.Инвойс.Номер КАК НомерИнвойс,
                 |    ОборотыДенежныхСредствОстаткиИОбороты.Инвойс.Дата КАК ДатаИнвойс,
                 |    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.ВнутреннийНомер КАК НомерЗаказ,
                 |    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.ВнутреннийНомерЗаказаНаПроизводство КАК НомерЗаявка,
                 |    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Дата КАК ДатаЗаявка,
                 |    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.СоставИтогСтоимость КАК СуммаЗаявка,
                 |    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Клиент,
                 |    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Грузополучатель,
                 |    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Валюта,
                 |    ЗаявкаНаПоставкуУсловиеОплаты.ВариантОплаты КАК ВариантОплаты,
                 |    ЗаявкаНаПоставкуУсловиеОплаты.Процент,
                 |    ЗаявкаНаПоставкуУсловиеОплаты.СДаты КАК СДаты,
                 |    ЗаявкаНаПоставкуУсловиеОплаты.ВТечение,
                 |    ОборотыДенежныхСредствОстаткиИОбороты.Период
                 |ИЗ
                 |    Документ.ЗаявкаНаПоставку.УсловиеОплаты КАК ЗаявкаНаПоставкуУсловиеОплаты
                 |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОборотыДенежныхСредств.ОстаткиИОбороты(, , Регистратор, , ) КАК ОборотыДенежныхСредствОстаткиИОбороты
                 |        ПО ЗаявкаНаПоставкуУсловиеОплаты.Ссылка = ОборотыДенежныхСредствОстаткиИОбороты.Заявка
                 |ГДЕ
                 |    (&Клиент = ЗНАЧЕНИЕ(Справочник.Клиенты.ПустаяСсылка)
                 |            ИЛИ ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Клиент = &Клиент)
                 |    И (&Грузополучатель = ЗНАЧЕНИЕ(Справочник.Клиенты.ПустаяСсылка)
                 |            ИЛИ ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Грузополучатель = &Грузополучатель)
                 |    И ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
                 |    И (&Заявка = ЗНАЧЕНИЕ(Документ.ЗаявкаНаПоставку.ПустаяСсылка)
                 |            ИЛИ ЗаявкаНаПоставкуУсловиеОплаты.Ссылка = &Заявка)
                 |    И (&Инвойс = ЗНАЧЕНИЕ(Документ.ПрохождениеТаможни.ПустаяСсылка)
                 |            ИЛИ ОборотыДенежныхСредствОстаткиИОбороты.Инвойс = &Инвойс)
                 |ИТОГИ ПО
                 |    Заявка";    
    
    РезультатЗапроса=Запрос.Выполнить();
    ДокументДанных=Новый ТабличныйДокумент;
    
    ДатаНачалаФормат=Формат(ДатаНачала,"ДФ=dd.MM.yyyy");
    ДатаКонцаФормат=Формат(ДатаКонца,"ДФ=dd.MM.yyyy");
        
    Макет=Отчеты.Отчет1.ПолучитьМакет("Макет1");
    ОбластьШапкаЗаявки=Макет.ПолучитьОбласть("ШапкаЗаявки");
    ОбластьЗаголовок=Макет.ПолучитьОбласть("Заголовок");
    ОбластьСтрока=Макет.ПолучитьОбласть("Строка");
    ОбластьИтог=Макет.ПолучитьОбласть("Итог");
    ОбластьСтрЗаявки=Макет.ПолучитьОбласть("ШапкаЗаявки");
    ОбластьШапкаОплаты=Макет.ПолучитьОбласть("ШапкаОплаты");
    ОбластьШапкаОтчета=Макет.ПолучитьОбласть("ШапкаОтчета");
    ОбластьШапкаКонтрагент=Макет.ПолучитьОбласть("ШапкаКонтрагент");
        
    ОбластьШапкаОтчета.Параметры.ДатаНачала=ДатаНачалаФормат;
    ОбластьШапкаОтчета.Параметры.ДатаКонца=ДатаКонцаФормат;
    ДокументДанных.Вывести(ОбластьШапкаОтчета);
    
    ВыборкаПоЗаявке=РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                                  
    Пока ВыборкаПоЗаявке.Следующий() Цикл
        
        ОбластьЗаголовок.Параметры.Валюта=ВыборкаПоЗаявке.Валюта;    
        ОбластьШапкаЗаявки.Параметры.Заявка=ВыборкаПоЗаявке.Заявка;
        ОбластьШапкаКонтрагент.Параметры.Клиент=ВыборкаПоЗаявке.Клиент;
        ОбластьШапкаКонтрагент.Параметры.Грузополучатель=ВыборкаПоЗаявке.Грузополучатель;
        ОбластьШапкаОтчета.Параметры.ДатаНачала=ДатаНачалаФормат;
        ОбластьШапкаОтчета.Параметры.ДатаКонца=ДатаКонцаФормат;
        ДокументДанных.Вывести(ОбластьШапкаКонтрагент);
        ДокументДанных.Вывести(ОбластьШапкаЗаявки);
        ДокументДанных.Вывести(ОбластьЗаголовок);    
                  
         ВыборкаПоИнвойсу=ВыборкаПоЗаявке.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
                
         Пока ВыборкаПоИнвойсу.Следующий() Цикл
            
             ДатаИнвойс=ВыборкаПоИнвойсу.ДатаИнвойс;
             ТекЗаявка=ВыборкаПоИнвойсу.Заявка;
                      
                  Если ДатаИнвойс=Null Тогда
                                                
                        Текст="ВЫБРАТЬ РАЗЛИЧНЫЕ
                                             |    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка КАК Заявка,
                                             |    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.ВнутреннийНомер КАК НомерЗаказ,
                                             |    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.ВнутреннийНомерЗаказаНаПроизводство КАК НомерЗаявка,
                                             |    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Дата КАК ДатаЗаявка,
                                             |    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.СоставИтогСтоимость КАК СуммаЗаявка,
                                             |    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Клиент,
                                             |    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Грузополучатель,
                                             |    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка.Валюта,
                                             |    ЗаявкаНаПоставкуУсловиеОплаты.ВариантОплаты КАК ВариантОплаты,
                                             |    ЗаявкаНаПоставкуУсловиеОплаты.Процент,
                                             |    ЗаявкаНаПоставкуУсловиеОплаты.СДаты КАК СДаты,
                                             |    ЗаявкаНаПоставкуУсловиеОплаты.ВТечение,
                                             |    ПрохождениеТаможенногоОформления.Период,
                                             |    ПрохождениеТаможенногоОформления.Регистратор КАК Инвойс,
                                             |    ПрохождениеТаможенногоОформления.Регистратор.Номер КАК НомерИнвойс,
                                             |    ПрохождениеТаможенногоОформления.Регистратор.Дата КАК ДатаИнвойс,
                                             |    ПрохождениеТаможенногоОформления.Регистратор.СтоимостьИтог КАК СуммаИнвойс
                                             |ИЗ
                                             |    Документ.ЗаявкаНаПоставку.УсловиеОплаты КАК ЗаявкаНаПоставкуУсловиеОплаты
                                             |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПрохождениеТаможенногоОформления КАК ПрохождениеТаможенногоОформления
                                             |        ПО ЗаявкаНаПоставкуУсловиеОплаты.Ссылка = ПрохождениеТаможенногоОформления.Заявка
                                             |ГДЕ
                                             |    ЗаявкаНаПоставкуУсловиеОплаты.Ссылка = &ТекЗаявка
                                             |ИТОГИ ПО
                                             |    Заявка";
                                            
                    ЗапросТаможня=Новый Запрос;
                    ЗапросТаможня.УстановитьПараметр("ТекЗаявка",ТекЗаявка);
                    ЗапросТаможня.Текст=Текст;
                    ТекРезультат=ЗапросТаможня.Выполнить().Выгрузить();
                
                        
                     КонецЕсли;
                      
              ДатаЗаявкаФормат=Формат(ВыборкаПоИнвойсу.ДатаЗаявка,"ДФ=dd.MM.yyyy");
              ДатаИнвойсФормат=Формат(ВыборкаПоИнвойсу.ДатаИнвойс,"ДФ=dd.MM.yyyy");
              ОбластьИтог.Параметры.СуммаЗаявка=ВыборкаПоИнвойсу.СуммаЗаявка;
              
              ДниОплаты=ВыборкаПоИнвойсу.ВТечение;
              СрокОплаты=ДатаИнвойс+ДниОплаты*24*60*60;
              СрокОплатыФормат=Формат(СрокОплаты,"ДФ=dd.MM.yyyy");
              ОбластьСтрока.Параметры.СрокОплаты=СрокОплатыФормат;
                      
              Период=ВыборкаПоИнвойсу.Период;
              ПериодФормат=Формат(Период,"ДФ=dd.MM.yyyy");
                      
              Если Период=Неопределено И ТекущаяДата()>СрокОплаты Тогда
                  Долг="Да";
              Иначе
                  Долг="Нет";
              КонецЕсли;
                      
              ОбластьСтрока.Параметры.Долг=Долг;
              ОбластьСтрока.Параметры.ДатаОплаты=ПериодФормат;
              ОбластьСтрока.Параметры.НомерЗаявка=ВыборкаПоИнвойсу.НомерЗаявка;
              ОбластьСтрока.Параметры.ДатаЗаявка=ДатаЗаявкаФормат;                      
              ОбластьСтрока.Параметры.НомерИнвойс=ВыборкаПоИнвойсу.НомерИнвойс;
              ОбластьСтрока.Параметры.ДатаИнвойс=ДатаИнвойсФормат;
              ОбластьСтрока.Параметры.СуммаИнвойс=ВыборкаПоИнвойсу.СуммаИнвойс;
              ОбластьСтрока.Параметры.НомерЗаказ=ВыборкаПоИнвойсу.НомерЗаказ;
              ОбластьСтрока.Параметры.ВариантОплаты=ВыборкаПоИнвойсу.ВариантОплаты;
              ОбластьСтрока.Параметры.Процент=ВыборкаПоИнвойсу.Процент;
              ОбластьСтрока.Параметры.СДаты=ВыборкаПоИнвойсу.СДаты;
              ОбластьСтрока.Параметры.ВТечение=ВыборкаПоИнвойсу.ВТечение;
              ДокументДанных.Вывести(ОбластьСтрока);
                              
     КонецЦикла;
        ДокументДанных.Вывести(ОбластьИтог);  
   КонецЦикла;              
   Возврат ДокументДанных;


Соответственно, условие

ДатаИнвойс=ВыборкаПоИнвойсу.ДатаИнвойс;
             ТекЗаявка=ВыборкаПоИнвойсу.Заявка;
                      
                  Если ДатаИнвойс=Null Тогда


мои потуги реализовать данную задачу. Буду признателен за любые советы.
1 Defender aka LINN
 
16.10.13
11:52
"если в результате выполнения 1-го запроса во 2-й выборке не окажется" - это вообще как?
2 jonik_joker
 
16.10.13
11:58
(1) ,в ТЧ документа ЗаявкаНаПоставку есть документы таможни,соответственно если эти документы оплачены,то есть запись в регистре ОборотыДенежныхСредств,если нет - в регистре
ПрохождениеТаможенногоОформления.
3 Defender aka LINN
 
16.10.13
12:00
(2) И? Как это объясняет, что в результате выполнения одного запроса, что-то окажется в совершенно другой выборке?
4 jonik_joker
 
16.10.13
12:17
(3),вот что получается после строки  

Пока ВыборкаПоЗаявке.Следующий() Цикл


http://uploads.ru/JGFaR.png
5 jonik_joker
 
16.10.13
12:19
сорри,первый паз картинки пытаюсь вставить

http://s4.uploads.ru/JGFaR.png
6 jonik_joker
 
16.10.13
12:20
это после строки
Пока ВыборкаПоИнвойсу.Следующий() Цикл
7 jonik_joker
 
16.10.13
12:20
8 jonik_joker
 
16.10.13
12:22
соответственно,когда в 1-м регистре нет записей по данным документам таможни,2-я картинка аналогична 1-й.
9 hhhh
 
16.10.13
12:51
ну вы же нигде не подставляете. У вас

           ТекРезультат=ЗапросТаможня.Выполнить().Выгрузить();
        

а дальше ТекРезультат нигде не используете.
10 jonik_joker
 
16.10.13
15:16
все, спасибо, сам разобрался.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший