Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Групировка ТЗ          
mavrik Подменю пользователя
сообщение 26.12.11, 10:46
Сообщение #1

Завсегдатай
****
Группа: Пользователи
Сообщений: 120
Из: Украина
Спасибо сказали: 2 раз
Рейтинг: 0

Проблема для меня в том что, Есть некие машины которые За один период заправлялись и маслом и соляркой,в итоге при формирование показывает по солярке все машины правильно,а по маслу выводит,и еще дублирует тех самых что и по солярке. Например всего 15 соляркой,а 4 маслом в итоге по солярке 15, а по маслу 19.
перем Таб,Расшифровка;
Перем МВО;

Процедура Сформировать()  
    Перем Запрос, ТекстЗапроса;
    
    ТЗСПР = СоздатьОбъект("ТаблицаЗначений");
    ТЗСПР.НоваяКолонка("МаркаМашини");
    ТЗСПР.НоваяКолонка("ИмяНАвигатора");
    
    //Создание объекта типа Запрос  
    Заносим в тз машины с навигатором
    Спр = СоздатьОбъект("Справочник.ТранспортніЗасоби");
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент()=1 Цикл
        Если Спр.ЭтоГруппа()=1 Тогда
            Продолжить;
        КонецЕсли;
        Если Спр.ПометкаУдаления()=1 Тогда
            Продолжить;
        КонецЕсли;
        Если СокрЛП(Спр.ПоНавігатору)="" Тогда
            Продолжить;
        КонецЕсли;
        ТЗСПР.НоваяСтрока();
        ТЗСПР.МаркаМашини=СокрЛП(Спр.Склад);
        ТЗСПР.ИмяНавигатора=СокрЛП(Спр.ПоНавігатору);            
    КонецЦикла;

    ТЗ=СоздатьОбъект("ТаблицаЗначений");  
    ТЗ.НоваяКолонка("СкладРод");
    ТЗ.НоваяКолонка("Склад");
    ТЗ.НоваяКолонка("МВО");
    ТЗ.НоваяКолонка("НачОст");
    ТЗ.НоваяКолонка("Приход");
    ТЗ.НоваяКолонка("Расход","Число");
    ТЗ.НоваяКолонка("КонОст");
    ТЗ.НоваяКолонка("Бак");
    ТЗ.НоваяКолонка("Превышение");
    ТЗ.НоваяКолонка("Лимит");
    ТЗ.НоваяКолонка("ПревышенЛимит");
        ТЗ.НоваяКолонка("Автомобіль");
    ТЗ.НоваяКолонка("Паливо");
    ТЗ.НоваяКолонка("Відстань","Число");     
    ТЗ.НоваяКолонка("Навигатор","Число");
    ТЗ.НоваяКолонка("НавигаторЛ","Число");
    ТЗ.НоваяКолонка("РасходТоплива","Число");
    ТЗ.НоваяКолонка("РасходТопливаФ","Число");
    
    ТЗ4=СоздатьОбъект("ТаблицаЗначений");  
    ТЗ4.НоваяКолонка("СкладРод");
    ТЗ4.НоваяКолонка("Склад");
    ТЗ4.НоваяКолонка("МВО");
    ТЗ4.НоваяКолонка("НачОст");
    ТЗ4.НоваяКолонка("Приход");
    ТЗ4.НоваяКолонка("Расход","Число");
    ТЗ4.НоваяКолонка("КонОст");
    ТЗ4.НоваяКолонка("Бак");
    ТЗ4.НоваяКолонка("Превышение");
    ТЗ4.НоваяКолонка("Лимит");
    ТЗ4.НоваяКолонка("ПревышенЛимит");
        ТЗ4.НоваяКолонка("Автомобіль");  
    ТЗ4.НоваяКолонка("Паливо");
    ТЗ4.НоваяКолонка("Відстань","Число");     
    ТЗ4.НоваяКолонка("Навигатор","Число");
    ТЗ4.НоваяКолонка("НавигаторЛ","Число");
    ТЗ4.НоваяКолонка("РасходТоплива","Число");
    ТЗ4.НоваяКолонка("РасходТопливаФ","Число");

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

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

    // Вывод заполненной формы  
    Таб.Опции(0, 0, 6, 0);    
    Таб.ПараметрыСтраницы(1,,,15,10,10,10,,,1,1,);
    Таб.ТолькоПросмотр(1);
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
КонецПроцедуры

Стрелок Подменю пользователя
сообщение 26.12.11, 17:34
Сообщение #2

Говорящий
***
Группа: Пользователи
Сообщений: 96
Спасибо сказали: 8 раз
Рейтинг: 0

Простите уважаемый, у меня несколько вопросов :

1. Как давно вы занимаетесь 1С?
2. Вы не пробовали вначале подумать сами а потом задавать вопросы на форуме?
3. Что нибудь об агрегатных типах данных вы слышали? Что за страсть работать со строками?


Теперь алгоритм. Я не стал разбираться в запросах и таблицах (своих сотрудников за такой код я бы уволил)
1. попробуйте в конце запроса поставить "Без Итогов;" и выгрузить результаты в таблицу значений. Посмотрите её - не то ли что вам надо?
если нет
2. получаете отдельно ТЗ с топливом и отдельно ТЗ с маслом
3. перебором строк любой из двух ТЗ ищем авто во второй (предварительно добавив в неё новую колонку топлива или масла в зависимости от того какая ТЗ выбрана для перебора). Если нашли - устанавливаем значение новой колонки, если не нашли - добавляем строку


Signature
Программист 1С - любимчик бухгалтеров

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 05.06.24, 4:03
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!