Имя: Пароль:
1C
1С v8
Помогите пожалуйста с группировкой
0 betty
 
28.04.14
17:28
Приветствую

Помогите пожалуйста с группировкой по Документу

Есть запросы, один вытягивает данные из Реализации Бухгалтерии, другой вытягивает данные из Реализации Торговли.
Сравниваем и выводим различия

В итоге получается что нет свертки по документу, т.е

Документ 00010  01.01.2014 | Валенки синие| склад1 | 50
Документ 00010  01.01.2014 | Валенки красные| склад1 | 40
Документ 00010  01.01.2014 | Валенки зеленые| склад1 | 60
Документ 00011  01.01.2014 | Валенки зеленые| склад2 | 90
----------------------------------------------------------------------

Процедура ПоискДляРеализации(ДатаНач,ДатаКон,НаименованиеДок) Экспорт
    
    НомерПП = 0;
    Запрос=БД_COM.NewObject("Запрос");
    
    ТекстЗапроса = ВернутьТекстЗапроса(НаименованиеДок);
    Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
    Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
    Запрос.УстановитьПараметр("Организации", ВернутьСписокОрганизации(БД_COM));
    Запрос.УстановитьПараметр("ПоВсем", ?(Организации.Количество()=0,ИСТИНА,ЛОЖЬ));
    Запрос.Текст=ТекстЗапроса;
    
    ТЗ_УТ=Запрос.Выполнить().Выбрать();
    Макет = ВнешнийОтчет.ПолучитьМакет("Макет");
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
        
    ПустойТовар = Справочники.Номенклатура.ПустаяСсылка();
    
    ЗапросБП = новый Запрос;
    ЗапросБП.Текст = ТекстЗапроса;
    
    ЗапросБП.УстановитьПараметр("ДатаНач", ДатаНач);
    ЗапросБП.УстановитьПараметр("ДатаКон",ДатаКон);
    ЗапросБП.УстановитьПараметр("Организации", Организации);
    ЗапросБП.УстановитьПараметр("ПоВсем", ?(Организации.Количество()=0,ИСТИНА,ЛОЖЬ));
    ТЗ_БП = ЗапросБП.Выполнить().Выгрузить();
    ТЗ_БП.Колонки.Добавить("Префикс");
    ТЗ_БП.Колонки.Добавить("СК"); // сравнительный коэфициент
    ТЗ_БП.ЗаполнитьЗначения(2,"Префикс");
    ТЗ_БП.ЗаполнитьЗначения(1,"СК");
    
    ОбщаяТЗ = ТЗ_БП.Скопировать();
    
    Пока ТЗ_УТ.Следующий() Цикл
        
        НоваяСтрокаТЗ = ОбщаяТЗ.Добавить();
        
        
        НоваяСтрокаТЗ.Дата                   = ТЗ_УТ.Дата;
        НоваяСтрокаТЗ.Склад                   = ТЗ_УТ.Склад;
        
        НоваяСтрокаТЗ.Наименование         = ТЗ_УТ.Наименование;//.Description;
        НоваяСтрокаТЗ.Количество           = ТЗ_УТ.Количество;
        НоваяСтрокаТЗ.Артикул              = ТЗ_УТ.Артикул;
        НоваяСтрокаТЗ.Код                  = ТЗ_УТ.Код;
        НоваяСтрокаТЗ.Номер                = ТЗ_УТ.Номер;
        НоваяСтрокаТЗ.Сумма                = Окр(ТЗ_УТ.Сумма,2);
        НоваяСтрокаТЗ.Префикс              = 3;
        НоваяСтрокаТЗ.СК                   = 1;

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

                МассивСтрок = ОбщаяТЗ2.НайтиСтроки(СтруктураПоиска);
                ОбластьСтрока.Параметры.НаименованиеБП = "";
                ОбластьСтрока.Параметры.КоличествоБП = "";
                ОбластьСтрока.Параметры.КоличествоУТ = "";
                ОбластьСтрока.Параметры.НаименованиеУТ = "";
                ОбластьСтрока.Параметры.СуммаБП = "";
                ОбластьСтрока.Параметры.СуммаУТ = "";
                                
            Иначе
            
            СтруктураПоиска.Вставить("Номер",строка.Номер);
            
            СтруктураПоиска.Вставить("Код",строка.Код);
            
            СтруктураПоиска.Вставить("Дата", Строка.Дата);
            СтруктураПоиска.Вставить("Склад", Строка.Склад);
            
            /////////////////////////////////////////////////
            МассивСтрок = ОбщаяТЗ.НайтиСтроки(СтруктураПоиска);
            ОбластьСтрока.Параметры.НаименованиеБП = "";
            ОбластьСтрока.Параметры.КоличествоБП = "";
            ОбластьСтрока.Параметры.КоличествоУТ = "";
            ОбластьСтрока.Параметры.НаименованиеУТ = "";
            ОбластьСтрока.Параметры.СуммаБП = "";
            ОбластьСтрока.Параметры.СуммаУТ = "";
            Для каждого Строка из МассивСтрок Цикл
                
                Если Строка.Префикс = 2 Тогда
                    ОбластьСтрока.Параметры.НаименованиеБП = Строка.Наименование;
                    ОбластьСтрока.Параметры.КоличествоБП = Строка.Количество;
                    ОбластьСтрока.Параметры.СуммаБП = Строка.Сумма;
                ИначеЕсли Строка.Префикс = 3 Тогда
                    ОбластьСтрока.Параметры.КоличествоУТ = Строка.Количество;
                    ОбластьСтрока.Параметры.НаименованиеУТ = Строка.Наименование;
                    ОбластьСтрока.Параметры.СуммаУТ = Строка.Сумма;
                КонецЕсли;            
            КонецЦикла;
            
            Если НЕ Строка.Префикс = 5 Тогда
                НомерПП = НомерПП+1;
                ОбластьСтрока.Параметры.НомерПП = НомерПП;
                ТабДок.Вывести(ОбластьСтрока);
                
            КонецЕсли;
            
            КонецЕсли
        КонецЦикла;
        
    КонецЕсли;
    
КонецПроцедуры
1 Ёпрст
 
гуру
28.04.14
17:40
(0) це очевидно - не совпадение типов в строках ТЗ.. при сворачивании, они тупо остаются теми, которые есть, в первом случае - скорее всего, ссылки, во втором - строки *наименование)..
2 Ёпрст
 
гуру
28.04.14
17:40
И это, всё в одном запросе получить, не предлагать ?
Всё проще, чем выгружать в 2 тз. объединять их и сворачивать.
3 betty
 
28.04.14
17:42
(2) у нас склады по разному в базах называются.
и плюс запрос общий, так как не одну Реализацию рассматриваем, а еще Поступление, Перемещение и ТребованиеНакладную
4 betty
 
28.04.14
17:43
а если напрямую к документу обращаться - то очень долгое выполнение
5 Ёпрст
 
гуру
28.04.14
17:48
(3) :)

И че с того ? Да зовите их как угодно, хоть склад васи и пети.
Они же у вас по какому-то реквизиту засинхрированны ? По ид, коду ..еще как ?

Вот по этому реквизиту и лепите соответствие в тексте запроса.
6 Ёпрст
 
гуру
28.04.14
17:48
И будет, один запрос, без всяких выгрузок в тз и прочего.
7 Ёпрст
 
гуру
28.04.14
17:52
ну и.. если хочешь оставить "всё как есть", то будьте добры - приводите всё к одному типу, в вашем случае - к строке.
Заместо документа - имейте представление, аналогично со складом и номенклатурой - их наименование..
Тогда, если наименования в обоих базах одинаковые, есть шанец правильно "свернуть" ТЗ на выходе.
8 betty
 
28.04.14
17:56
(7) спасибо:)буду пробовать
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан