Имя: Пароль:
1C
1C 7.7
v7: Запрос по документам по всем контрагентам и товарам
, ,
0 crisalis
 
12.11.13
11:48
Доброе время суток, подскажите пожалуйста как реализовать запрос по всем товарам и контрагентам которые заполняются на форме обр. в списках значений (ВыбТов,ВыбКонтр), если делаю так
    ТекстЗапроса = "//{{ЗАПРОС(Сформировать)
    |";
    
    ТекстЗапроса = ТекстЗапроса + "    
    |Период с '"+НачПериода+"' по '"+КонПериода+"';
    |";
    Если БНАЛ = 1 Тогда
        ТекстЗапроса = ТекстЗапроса + "
        |ОбрабатыватьДокументы Проведенные;  
        |Обрабатывать НеПомеченныеНаУдаление;
        //|Докум = Документ.РеализацияТМЦЦ.ТекущийДокумент;
        |Контр = Документ.РеализацияТМЦЦ.Контрагент;
        |Товар = Документ.РеализацияТМЦЦ.ТМЦ;
        |КоличествоТов = Документ.РеализацияТМЦЦ.Количество;";
    ИначеЕсли БНАЛ = 2 Тогда  
        ТекстЗапроса = ТекстЗапроса + "    
        |ОбрабатыватьДокументы Все;  
        |Обрабатывать НеПомеченныеНаУдаление;
        |Докум = Документ.РасходнаяНакладная.ТекущийДокумент;
        |Контр = Документ.РасходнаяНакладная.Контрагент;
        |Товар = Документ.РасходнаяНакладная.Товар;
        |КоличествоТов = Документ.РасходнаяНакладная.Количество;";
    Иначе
        ТекстЗапроса = ТекстЗапроса + "    
        |ОбрабатыватьДокументы Все;  
        |Обрабатывать НеПомеченныеНаУдаление;
        //|Докум = Документ.РеализацияТМЦЦ.ТекущийДокумент, Документ.РасходнаяНакладная.ТекущийДокумент;
        |Контр = Документ.РеализацияТМЦЦ.Контрагент, Документ.РасходнаяНакладная.Клиент;
        |Товар = Документ.РеализацияТМЦЦ.ТМЦ, Документ.РасходнаяНакладная.Товар;
        |КоличествоТов = Документ.РеализацияТМЦЦ.Количество, Документ.РасходнаяНакладная.Количество;";
    КонецЕсли;    
    
    ТекстЗапроса = ТекстЗапроса + "
    |Функция Колич = Сумма(КоличествоТов);
    //|Группировка Докум;
    |Группировка Контр;
    |Группировка Товар Без Групп Все;
//    |Группировка Товар По Контрагент;
    |";
    
    Если ВыбКонтр.РазмерСписка() > 0 Тогда
        // используем в запросе внешнюю переменную ВыбКонтр
        ТекстЗапроса = ТекстЗапроса + "Условие (Контр В ВыбКонтр);
        |";
    
    КонецЕсли;
    
    Если ВыбТов.РазмерСписка() > 0 Тогда
        // используем в запросе внешнюю переменную ВыбТов
        ТекстЗапроса = ТекстЗапроса + "Условие (Товар В ВыбТов);";
        //ТекстЗапроса = ТекстЗапроса + "Условие(ВыбТов.Принадлежит(Товар)=1);";
    КонецЕсли;

то получаю только то что отписали и по конкретному контрагенту, а я хочу получить по всем (ВыбКонтр,ВыбТов) с количеством равно 0.

Помогите пожалуйста, заранее благодарен.
1 Ёпрст
 
12.11.13
11:51
соединения со справочником не хватает, чтоб было по всем
(ВыбКонтр,ВыбТов)
2 crisalis
 
12.11.13
11:55
(1)    |Контр = Документ.РеализацияТМЦЦ.Контрагент,Справочник.Контрагенты.ТекущийЭлемент;
        |Товар = Документ.РеализацияТМЦЦ.ТМЦ,Справочник.Товары.ТекущийЭлемент;

вот так ?
3 Ёпрст
 
12.11.13
11:59
Для начала, да, + в группировке по клиентосу ВСЕ воткнуть - тогда должны попасть все клиентосы и товары из фильтра (ВыбКонтр,ВыбТов)
4 1dvd
 
12.11.13
12:05
делай теги в отдельных строках
[ 1C ]
[  / 1C ]
5 crisalis
 
12.11.13
12:07
(3) воткнул, ерунда полная получается (((
(4) спасибо за подсказку С-латинская или русская ?
6 crisalis
 
12.11.13
12:10
[ 1C ]     ТекстЗапроса = "//{{ЗАПРОС(Сформировать)
    |";
    
    ТекстЗапроса = ТекстЗапроса + "    
    |Период с '"+НачПериода+"' по '"+КонПериода+"';
    |";
    Если БНАЛ = 1 Тогда
        ТекстЗапроса = ТекстЗапроса + "
        |ОбрабатыватьДокументы Проведенные;  
        |Обрабатывать НеПомеченныеНаУдаление;
        //|Докум = Документ.РеализацияТМЦЦ.ТекущийДокумент;
        |Контр = Документ.РеализацияТМЦЦ.Контрагент,Справочник.Контрагенты.ТекущийЭлемент;
        |Товар = Документ.РеализацияТМЦЦ.ТМЦ,Справочник.Товары.ТекущийЭлемент;
        |КоличествоТов = Документ.РеализацияТМЦЦ.Количество;";
    ИначеЕсли БНАЛ = 2 Тогда  
        ТекстЗапроса = ТекстЗапроса + "    
        |ОбрабатыватьДокументы Все;  
        |Обрабатывать НеПомеченныеНаУдаление;
        |Докум = Документ.РасходнаяНакладная.ТекущийДокумент;
        |Контр = Документ.РасходнаяНакладная.Контрагент;
        |Товар = Документ.РасходнаяНакладная.Товар;
        |КоличествоТов = Документ.РасходнаяНакладная.Количество;";
    Иначе
        ТекстЗапроса = ТекстЗапроса + "    
        |ОбрабатыватьДокументы Все;  
        |Обрабатывать НеПомеченныеНаУдаление;
        //|Докум = Документ.РеализацияТМЦЦ.ТекущийДокумент, Документ.РасходнаяНакладная.ТекущийДокумент;
        |Контр = Документ.РеализацияТМЦЦ.Контрагент, Документ.РасходнаяНакладная.Клиент;
        |Товар = Документ.РеализацияТМЦЦ.ТМЦ, Документ.РасходнаяНакладная.Товар;
        |КоличествоТов = Документ.РеализацияТМЦЦ.Количество, Документ.РасходнаяНакладная.Количество;";
    КонецЕсли;    
    
    ТекстЗапроса = ТекстЗапроса + "
    |Функция Колич = Сумма(КоличествоТов);
    //|Группировка Докум;
    |Группировка Контр Без Групп Все;
    |Группировка Товар Без Групп Все;
//    |Группировка Товар По Контрагент;
    |";
    
    Если ВыбКонтр.РазмерСписка() > 0 Тогда
        // используем в запросе внешнюю переменную ВыбКонтр
        ТекстЗапроса = ТекстЗапроса + "Условие (Контр В ВыбКонтр);
        |";
    
    КонецЕсли;
    
    Если ВыбТов.РазмерСписка() > 0 Тогда
        // используем в запросе внешнюю переменную ВыбТов
        ТекстЗапроса = ТекстЗапроса + "Условие (Товар В ВыбТов);";
        //ТекстЗапроса = ТекстЗапроса + "Условие(ВыбТов.Принадлежит(Товар)=1);";
    КонецЕсли; [ /1C ]
7 1dvd
 
12.11.13
12:13
(5) латинские, в отдельных строках, без пробелов
http://www.forum.mista.ru/about.php
8 Ёпрст
 
12.11.13
15:02
(5) ерунда в чем именно ?
9 crisalis
 
12.11.13
15:49
(8) в выходной таблице:
получается:
Контр|Товар|Кол
Пусто|Товар1|0
Пусто|Товар1|0
10 Ёпрст
 
12.11.13
15:50
(9) А ты не так хотел разве ?
Не все товары и все клиентосы из фильтра ?
11 crisalis
 
12.11.13
15:51
(9) Дополнение:
Пусто|Товар2|0
Пусто|Товар3|0
Конт1|Пусто|0
Конт1|ТоварН|10
12 crisalis
 
12.11.13
15:55
(10) Нет я хотел получить такую структуру:
Контр|Товар|Кол
Конт1|Товар1|10
Конт1|Товар2|0
Конт1|Товар3|15
Конт1|ТоварН|...
Конт2|Товар1|0
Конт2|Товар2|0
Конт2|Товар3|1
Конт2|ТоварН|...
Конт3|Товар1|0
Конт3|Товар2|0
Конт3|Товар3|0
Конт3|ТоварН|...
13 Ёпрст
 
12.11.13
15:57
(12)Ну переписывай на прямой запрос и cross join тогда, что ле..
14 Ёпрст
 
12.11.13
15:57
:)
15 crisalis
 
12.11.13
16:01
(13) Нет такой фишки (((
16 Стрелок
 
12.11.13
16:06
у товара "все" убери
17 Стрелок
 
12.11.13
16:07
а стоп нет не так

добавь

без итогов и высыпь в ТЗ
18 crisalis
 
12.11.13
16:15
(17) На выходе пустая ТЗ
19 crisalis
 
12.11.13
16:20
Вот как получаю данные:

Функция ПолучитьДанныеПланировщика(НачПериода,КонПериода)
    
    ТекстЗапроса = "//{{ЗАПРОС(Сформировать)
    |";
    
    ТекстЗапроса = ТекстЗапроса + "    
    |Период с '"+НачПериода+"' по '"+КонПериода+"';
    |";
    Если БНАЛ = 1 Тогда
        ТекстЗапроса = ТекстЗапроса + "
        |ОбрабатыватьДокументы Проведенные;  
        |Обрабатывать НеПомеченныеНаУдаление;
        //|Докум = Документ.РеализацияТМЦЦ.ТекущийДокумент;
        |Контр = Документ.РеализацияТМЦЦ.Контрагент,Справочник.Контрагенты.ТекущийЭлемент;
        |Товар = Документ.РеализацияТМЦЦ.ТМЦ,Справочник.Товары.ТекущийЭлемент;
        |КоличествоТов = Документ.РеализацияТМЦЦ.Количество;";
    ИначеЕсли БНАЛ = 2 Тогда  
        ТекстЗапроса = ТекстЗапроса + "    
        |ОбрабатыватьДокументы Все;  
        |Обрабатывать НеПомеченныеНаУдаление;
        |Докум = Документ.РасходнаяНакладная.ТекущийДокумент;
        |Контр = Документ.РасходнаяНакладная.Контрагент;
        |Товар = Документ.РасходнаяНакладная.Товар;
        |КоличествоТов = Документ.РасходнаяНакладная.Количество;";
    Иначе
        ТекстЗапроса = ТекстЗапроса + "    
        |ОбрабатыватьДокументы Все;  
        |Обрабатывать НеПомеченныеНаУдаление;
        //|Докум = Документ.РеализацияТМЦЦ.ТекущийДокумент, Документ.РасходнаяНакладная.ТекущийДокумент;
        |Контр = Документ.РеализацияТМЦЦ.Контрагент, Документ.РасходнаяНакладная.Клиент;
        |Товар = Документ.РеализацияТМЦЦ.ТМЦ, Документ.РасходнаяНакладная.Товар;
        |КоличествоТов = Документ.РеализацияТМЦЦ.Количество, Документ.РасходнаяНакладная.Количество;";
    КонецЕсли;    
    
    ТекстЗапроса = ТекстЗапроса + "
    |Функция Колич = Сумма(КоличествоТов);
    //|Группировка Докум;
    |Группировка Контр Без Групп Все;
    |Группировка Товар Без Групп Все;  
    |Без итогов;
//    |Группировка Товар По Контрагент;
    |";
    
    Если ВыбКонтр.РазмерСписка() > 0 Тогда
        // используем в запросе внешнюю переменную ВыбКонтр
        ТекстЗапроса = ТекстЗапроса + "Условие (Контр В ВыбКонтр);
        |";
    
    КонецЕсли;
    
    Если ВыбТов.РазмерСписка() > 0 Тогда
        // используем в запросе внешнюю переменную ВыбТов
        ТекстЗапроса = ТекстЗапроса + "Условие (Товар В ВыбТов);";
        //ТекстЗапроса = ТекстЗапроса + "Условие(ВыбТов.Принадлежит(Товар)=1);";
    КонецЕсли;
        
    Возврат ТекстЗапроса;    
КонецФункции


//*******************************************
Процедура Сформировать()
    
    ТЗЗапрос = СоздатьОбъект("ТаблицаЗначений");
    ТЗЗапрос.НоваяКолонка("Контр","Справочник.Контрагенты");
    ТЗЗапрос.НоваяКолонка("Товар","Справочник.Товары");
    ТЗЗапрос.НоваяКолонка("КоличПер1","Число",15,2);
    ТЗЗапрос.НоваяКолонка("КоличПер2","Число",15,2);
    
    Если НачДата > КонДата Тогда
        Сообщить("Не правильно выбран период 1 " + НачДата + " " + КонДата + " отчет не сформирован !","!!!");    
        Возврат;
    КонецЕсли;
    
    Если НачДата1 > КонДата1 Тогда
        Сообщить("Не правильно выбран период 2 " + НачДата1 + " " + КонДата1 + " отчет не сформирован !","!!!");    
        Возврат;
    КонецЕсли;
    
    ТекстЗапросаПоВыбТовару = ПолучитьДанныеПоВыбраномуТовару();
    
    Если (ПустоеЗначение(НачДата) = 0) И (ПустоеЗначение(КонДата) = 0) Тогда
        ТекстЗапросаПер1 = ПолучитьДанныеПланировщика(НачДата,КонДата);    
    КонецЕсли;
    
    Если (ПустоеЗначение(НачДата1) = 0) И (ПустоеЗначение(КонДата1) = 0) Тогда
        ТекстЗапросаПер2 = ПолучитьДанныеПланировщика(НачДата1,КонДата1);                                                                              
    КонецЕсли;
    
    //Текст=СоздатьОбъект("Текст");
    //Текст.ДобавитьСтроку(ТекстЗапроса1);
    //Текст.Показать("Текст запроса");
    
    ЗапросПоВыбТовару = СоздатьОбъект("Запрос");
        
    Если ЗапросПоВыбТовару.Выполнить(ТекстЗапросаПоВыбТовару) = 0 Тогда
        Возврат;
    КонецЕсли;
    
    Запрос = СоздатьОбъект("Запрос");
        
    Если Запрос.Выполнить(ТекстЗапросаПер1) = 0 Тогда
        Возврат;
    КонецЕсли;
    
    Пока Запрос.Группировка(1) = 1 Цикл    
        Пока Запрос.Группировка(2) = 1 Цикл    
            ТЗЗапрос.НоваяСтрока();
            ТЗЗапрос.Контр = Запрос.Контр;
            ТЗЗапрос.Товар = Запрос.Товар;
            ТЗЗапрос.КоличПер1 = Запрос.Колич;
        КонецЦикла;        
    КонецЦикла;        
    
    Запрос1 = СоздатьОбъект("Запрос");
    
    Если Запрос1.Выполнить(ТекстЗапросаПер2) = 0 Тогда
        Возврат;
    КонецЕсли;
    
    Пока Запрос1.Группировка(1) = 1 Цикл    
        Пока Запрос1.Группировка(2) = 1 Цикл    
            ТЗЗапрос.НоваяСтрока();
            ТЗЗапрос.Контр = Запрос1.Контр;
            ТЗЗапрос.Товар = Запрос1.Товар;
            ТЗЗапрос.КоличПер2 = Запрос1.Колич;
        КонецЦикла;        
    КонецЦикла;        
    
    ТЗЗапрос.Свернуть("Контр,Товар","КоличПер1,КоличПер2");
    //ТЗЗапрос.Сортировать("Контр");
    ТЗЗапрос.ВыбратьСтроку();

20 crisalis
 
12.11.13
16:23
Как же все сложно без нормальной консоли запросов в 7... (((
Программист всегда исправляет последнюю ошибку.