Вход | Регистрация

1С:Предприятие ::

Метки:

Полностью переписал отчёт

Я
   Platon
 
04.02.04 - 07:59
Разочаровался я в своём первом отчёте и переписал всё заново, сделал всё максимально просто и безо-всяких запросов и таблиц значений но когда я его запускаю то после его выполнения 1с както медленно начинает работать
и бегунок в таблице не появляется хотя таблица длинная
Вот код отчёта.
   
Процедура Сформировать()
//Создаю таблицу 

Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Таб.ВывестиСекцию("Дата");
Таб.ВывестиСекцию("Заголовок");
Таб.ВывестиСекцию("Шапка");
//Выбираю операцию с проводками по дебету n кредиту любому

Опер=СоздатьОбъект("Операция");
Опер.ВыбратьОперацииСПроводками(ВыбНачПериода, ВыбКонПериода,"20.01.02,*;20.01.03,*;25.01.01,*;25.01.02,*;23.07.00,*;23.01.03,*;23.03.00,*;23.02.00,*;23.01.03,*;23.01.04,*;26.02.00,*;29.03.02,*;29.02.01,*;29.01.01,*;29.01.03,*;29.01.06,*;29.02.05,*");
//В цикле размножаю секцию "Стр" и заполняю её данными из проводок

Пока Опер.ПолучитьОперацию()=1 Цикл 
 Цех=Опер.Дебет.Субконто(2).Код; 
        Уч=Сред(СокрЛП(Опер.Дебет.Субконто(1).Код),2,1);
 Сум=Опер.Сумма;
 ДСч=Опер.Дебет.Счет;
 КСч=Опер.Кредит.Счет;
 СтРасх=Опер.Дебет.Субконто(1).Код;
Если Опер.ПолучитьПроводкуПоНомеру(2)=0 Тогда
        Продолжить;
 ИначеЕсли Опер.Кредит.Счет=СчетПоКоду("16.09") Тогда
СумОткл=Опер.Сумма;
КонецЕсли;
Таб.ВывестиСекцию("Стр");
//Выхожу из цикла

КонецЦикла;
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
Таб.ТолькоПросмотр(1);      
Таб.ПараметрыСтраницы(1,,,7,3,7,3,0,5,1);
Таб.Показать("Расход материальных ценностей по участкам", "");
КонецПроцедуры 
//**************************

Процедура ПриОткрытии()     
ВыбНачПериода=НачМесяца(РабочаяДата());
ВыбКонПериода=КонМесяца(РабочаяДата()); 
КонецПроцедуры     
   
Вот такая простая таблица но в чём проблема кто знает?
 
  Рекламное место пустует
   345
1 - 04.02.04 - 09:09
Отчет написан неправильно - бух запрос будет быстрее
   345
2 - 04.02.04 - 09:10
Отчет написан неправильно - бух запрос будет быстрее
   Platon
 
3 - 05.02.04 - 06:24
Скорость для меня не актуальна главное, чтобы работало, а потом когда работы будет поменьше я уже буду доводить до ума.
   Platon
 
4 - 05.02.04 - 06:28
Кстати с первой проблемой разобрался надо было строку
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
перенести до цикла и теперь таблица отображается правильно
Теперь другой вопрос :
В форме отчета есть элемент ВыбЦех который равен Справочник.Подразделения Который в свою очередь равен Опер.Дебет.Субконто(n) в проводке, чтобы можно было выбирать Цех и получать отчет по нему не могу понять как это реализовать.
Может ктонибудь поможет?
   Bzzzzz
 
5 - 05.02.04 - 12:03
Опер=СоздатьОбъект("Операция"); 
Опер.ИспользоватьКорСубконто(ВидыСубконто....,ВыбЦех);
Опер.ВыбратьОперацииСПроводками(ВыбНачПериода, ВыбКонПериода,"20.01.02,*;......");
   Platon
 
6 - 05.02.04 - 12:48
Я уже сделал по другому

Если (ПустоеЗначение(ВыбЦех)=1) Тогда
    Предупреждение ("Выберите Цех");
    СтатусВозврата(0);
    Возврат;
// Когда выбран цех начинаем обработку

// По разным дебетам Субконто цеха можетбыть под разным номером
    ИначеЕсли (Опер.Дебет.Субконто(2)=ВыбЦех) 
    или   (Опер.Дебет.Субконто(1)=ВыбЦех)
    или    (Опер.Дебет.Субконто(3)=ВыбЦех) Тогда 
Цикл ...
КонецЕсли
Но вот другой вопрос как всётаки Правильно свернуть по заданной группе знаю что
ТЗ.Свернуть("НомерУчастка","Сумма,СуммаОтклонений");
но что писать в самой таблице?
   Bzzzzz
 
7 - 05.02.04 - 13:18
Эээ... в какой таблице?
А нафиг ты пишешь:
Таб.ВывестиСекцию("Дата"); 
Таб.ВывестиСекцию("Заголовок"); 
Таб.ВывестиСекцию("Шапка");
разве нельзя всё в одну секцию зафигачить?
   Bzzzzz
 
8 - 05.02.04 - 13:46
И еще - лучше смени:
Если Опер.ПолучитьПроводкуПоНомеру(2)=0 Тогда
на:
Если Опер.ПолучитьПроводкуПоНомеру(2)<>1 Тогда
а то че-то у меня 0 не возвращает
   Platon
 
9 - 05.02.04 - 14:10
В обычной таблице которую собственно и увидит в последствии пользователь он должен видеть подробно по каждой операции и какбы промежуточный итог по номеру участка а не только по всему цеху вот для этого я думаю и существует Свернуть(,) но как это правильно реализовать
   Bzzzzz
 
10 - 05.02.04 - 14:53
"Свернуть" применяется к ТЗ, а у тебя ТЗ нигде и не используется.
Спроси у 345 как реализовать енто с помощью Бух.запроса.
Мне интересно тоже.
Там можно накапливать значения по группам.
 
  Рекламное место пустует
   Platon
 
11 - 06.02.04 - 07:25
Да нет у меня как раз Таблица Значений и используется ну свернул я колонки а как показать то в таблице?
   Bzzzzz
 
12 - 06.02.04 - 08:40
(11) ОК. Видел на IT Land Forum.
На мой взгляд:
ТЗ.Свернуть("Цех,Участок","Сумма,СуммаОтклонений");
Посел этого у тебя в ТЗ будут 4 эти колонки и по-моему они будут уже отсортированы сначала по Цех, потом по Участок.
В цикле начинаешь выводить секцию "Стр", накапливая при этом в переменной итог по текущему Цеху. Как только меняется Цех, выводишь секцию-итог по цеху.
   Platon
 
13 - 06.02.04 - 09:00
Дело в том если я сверну колонки то по этим данным детализация потеряется а это нехорошо вот если сдублировать эти колонки
Потом можно создать ещё одну Таблицу значений Выгрузить туда интересующие колонки и затем их свернуть
Почемуто когда я сворачиваю то при формировании отчета получаю ошибки типа "не  найден цех" хотя без свернуть всё нормально
   345
14 - 06.02.04 - 13:56
=======================================================
могу заметить, что судя по примеру, скорее всего это
либо самописная конфа, писанная, пардон, идиотом,
либо сильно переделанная типовая российская,
которую переделывал безграмотный программист по
требованию не знающего 1С буха... Ибо субсчетов наплодили ...
как на дворняге блох..................
=======================================================

судя по всему, выбираются проводки по счетам с аналитикой
Участок - первое субконто
Цех - второе субконто 

Будем считать, что все счета дебета имеют эту аналитику

тогда имеем следующий код
Цех, Участок, НачДата, КонДата - реквизиты диалога

ВыводитьДокументы - флажок на форме, если стоит птиса -
выводим движения по документам

//=======================================================

Би = CreateObject("BookkeepingTotals");

// последовательность выбора Субконто выбирается 

// такой, чтобы было удобно группировать итоги

if Цех.Selected() = 1 
    then Би.UseSubconto(SubcontoKinds.Подразделения, Цех, 2); 
    else Би.UseSubconto(SubcontoKinds.Подразделения,    , 1);    
endIf; 

if Участок.Selected() = 1 
    then    Би.UseSubconto(SubcontoKinds.Участки, Участок, 2); 
    else    Би.UseSubconto(SubcontoKinds.Участки,  , 1);    
endIf; 
//-------------------------------------------------------                                             

// собираем список счетов дебета
СписокСчетов = CreateObject("ValueList");
СписокСчетов.AddValue(AccountByCode("20.01.01")); 
СписокСчетов.AddValue(AccountByCode("20.01.02"));
...........................
СписокСчетов.AddValue(AccountByCode("23.01.01"));
СписокСчетов.AddValue(AccountByCode("23.01.02"));
...........................
СписокСчетов.AddValue(AccountByCode("26.ххххх"));
...........................

// список счетов кредита - не важен... По условию - любой счет


Би.DoQuery(НачДата , КонДата ,СписокСчетов,   ,  , 3,"Проводка", "С");  

//-------------------------------------------------------

// в обработке итогов глубоко плюем на цикл по счетам 
// просто расписываем полученные затраты 


// если надо затраты расписать по счетам затрат,

// тогда надо прокрутить цикл анализа с учетом цикла 
// по счетам

                
//=======================================================

if Би.SelectSubconto(1) =1 then      //  выбрать Подразделения

    while Би.GetSubconto(1) = 1 do   //  получить Подразделения

       //==============================================

       // итоги по Подразделения 

        пЦех  =  Би.Subconto(1);  //  итоги по Подразделения

        пЦехДо=  Би.ДО ("С");     //  это дебет выбранного счета      

        
       // печатаем итоги 

        Табл.PutSection("ИтогиПоЦеху");
       //==============================================                                                                               

        if Би.SelectSubconto(2) =1 then   // выбрать участок

            while Би.GetSubconto(2) = 1 do// получить участок

               //==============================================

               // итоги по участок

                пУчасток  =  Би.Subconto(2);//  итоги по Участок

                пУчастокДо  =  Би.ДО ("С"); // затраты по Участок          

                Табл.PutSection("ИтогиПоУчастку");
            endDo;// перебор по Участок

            if ВыводитьДокументы =1 then
                Би.SelectPeriods();
                while Би.GetPeriod() = 1 do 
                   // раскручиваем затраты с детализацией до дока 

                    if Би.Credit.Счет.SubcontoCount() =1 then 
                        Затрата1 = Би.Credit.Subconto(1);
                        Затрата2 = "";
                        Затрата3 = "";
                    elsIf Би.Credit.Счет.SubcontoCount() =2 then 
                        Затрата1 = Би.Credit.Subconto(1);
                        Затрата2 = Би.Credit.Subconto(2);
                        Затрата3 = ""; 
                    elsIf Би.Credit.Счет.SubcontoCount() =3 then 
                        Затрата1 = Би.Credit.Subconto(1);
                        Затрата2 = Би.Credit.Subconto(2);
                        Затрата3 = Би.Credit.Subconto(3);
                    else
                       // для корр счета без субконто

                        Затрата1 = "";
                        Затрата2 = "";
                        Затрата3 = "";
                    endIf; 
                    ЗатратаСумма = Би.ДО("С"); // сумма затраты 

                    ДокДвижения  = Би.Operation.Document;
                    ДатаДвижения = ДокДвижения.ДатаДок;
                    
                   // печатаем очередную секцию разворота затрат по участку

                   // переменные Затрата1, Затрата2, Затрата3 

                   // ЗатратаСумма ДокДвижения ДатаДвижения 

                    Табл.PutSection("ЗатратаПоУчастку");
                endDo;
            endIf; 
        endIf;
    endDo;    // перебор по Подразделения 

EndIf;
//===================================================

Сорри за английский синтаксис - мои шаблоны русскому не обучены
   Platon
 
15 - 06.02.04 - 15:14
Насчёт безграмотности программистов я согласен всё через ж.. сделано, конфа Бух 429 сильно изменённая
Насчёт конторы то тут огромное предприятие отчего темболее стыдно поэтому не буду упоминать название
всуе Сам я ещё только начинающий поэтому много глупых
вопросов и судя по всему задолбал этой темой всех за эту неделю но думаю для этого и существуют такие форумы
Очень благодарен всем кто пытается мне помочь
   345
16 - 06.02.04 - 19:47
Пардон соврамши.... Много пива ...

По моему надо
Би.Credit.

везде заменить на Би.Операция.Credit.


Список тем форума
 
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует