Имя: Пароль:
1C
1C 7.7
v7: подскажите алгоритм
,
0 aptomilov
 
29.07.11
09:40
Сразу прошу сильно не пинать - зашился сроки пождимают!!
есть табличка вида
объект статья документ сумма документа
все отсортированно ТабОбъект.Сортировать("Объект,Статья,Док");
на до вывести в на печать в виде
объект     - сумма
    статья  - сумма
             документ - сумма

щас делаю так - перебираю всю табл ив условиях

Если ТекОбъект=СледОбъект Тогда
           РасходОбъект=РасходОбъект+ТекРасход;    
           ПриходОбъект=ПриходОбъект+ТекПриход;
           Если ТекСтатья=СледСтатья Тогда      
                РасходСтатья=РасходСтатья+ТекРасход;
                ПриходСтатья=ПриходСтатья+ТекПриход;
                ТабСписание.ВывестиСекцию("Документ");    
           Иначе
               ПриходСтатья=ПриходСтатья+ТекПриход;
               РасходСтатья=РасходСтатья+ТекРасход;
               ТабСписание.ВывестиСекцию("Строка1");
               ПриходСтатья=0;
               РасходСтатья=0;
           КонецЕсли;        
       
       Иначе
           ПриходОбъект=ПриходОбъект+ТекПриход;
           РасходОбъект=РасходОбъект+ТекРасход;    
           ТабСписание.ВывестиСекцию("Строка2");    
           ПриходОбъект=0;
           РасходОбъект=0;
       КонецЕсли;

Но так получается наоборот  сначала документы потом статьи и в конце объекты и в каждой группировке теряется 1 документ.

Выручайте люди голова не соображает
1 Ёпрст
 
29.07.11
09:44
как там говорится то ?

"Вон из профессии!" ©Кто-то
:)
2 Ёпрст
 
29.07.11
09:47
врОбъект="";
врСтатья="";
ТабОбъект.ВыбратьСтроки();
Пока ТабОбъект.ПолучитьСтроку()=1 Цикл
    Объект = ТабОбъект.Объект;
    Если врОбъект<>Объект Тогда
        ТабСписание.ВывестиСекцию("Объект");
        врОбъект= Объект;
    КонецЕсли;
    Статья= ТабОбъект.Статья;
    Если врСтатья<>СтатьяТогда
        ТабСписание.ВывестиСекцию("Статья");
        врСтатья= СтатьяТогда;
    КонецЕсли;
    ТабСписание.ВывестиСекцию("Документ");
КонецЦикла;

наслаждайся
3 aptomilov
 
29.07.11
09:47
15 минут на отчет дали (
4 aptomilov
 
29.07.11
09:49
а как  я суммы то посчитаю
5 aptomilov
 
29.07.11
09:49
я же ещё не прошел группировку то
6 _Atilla
 
29.07.11
09:52
ТабОбъект.Сортировать("Объект,Статья,Док");

ТабОбъект.Выгрузить(ТабОбъект1);
ТабОбъект1.Свернуть("Объект", "Сумма")

ТабОбъект.Выгрузить(ТабОбъект2);
ТабОбъект2.Свернуть("Объект,Статья", "Сумма")

ТабОбъект.НоваяКолонка("НомТаб");
ТабОбъект1.НоваяКолонка("НомТаб");
ТабОбъект2.НоваяКолонка("НомТаб");

ТабОбъект.Заполнить(3,,,"НомТаб");
ТабОбъект1.Заполнить(1,,,"НомТаб");
ТабОбъект2.Заполнить(2,,,"НомТаб");

ТабОбъект1.Выгрузить(ТабОбъект);
ТабОбъект2.Выгрузить(ТабОбъект);

ТабОбъект.Сортировать("Объект,НомТаб,Статья,Док");
7 _Atilla
 
29.07.11
09:52
Понятно?
8 VladZ
 
29.07.11
09:53
(3) Собеседуешься?
9 _Atilla
 
29.07.11
09:55
(6) Вместо "НомТаб" используй "НомГруппы"...
10 aptomilov
 
29.07.11
09:56
понятно  спасибо Атилла
щас пробую как оно будет)
11 aptomilov
 
29.07.11
09:57
не собеседуюсь
12 _Atilla
 
29.07.11
09:57
(10) ТабОбъект.Сортировать("Объект,НомТаб,Статья,Док");

Может ТабОбъект.Сортировать("Объект,Статья,Док,НомТаб");

потестируй...
13 _Atilla
 
29.07.11
09:59
или ТабОбъект.Сортировать("Объект,Статья,НомТаб,Док");
14 Ёпрст
 
29.07.11
10:01
(4) охренеть..

СуммаОбъект=0;
СуммаСтатья=0;
врОбъект="";
врСтатья="";
ТабОбъект.ВыбратьСтроки();
Пока ТабОбъект.ПолучитьСтроку()=1 Цикл
    Объект = ТабОбъект.Объект;
    СуммаДок = ТабОбъект.Сумма;
    СуммаОбъект = СуммаОбъект+СуммаДок;
    СуммаСтатья = СуммаСтатья+СуммаДок;

    Если врОбъект<>Объект Тогда
        ТабСписание.ВывестиСекцию("Объект");
        врОбъект= Объект;
        СуммаОбъект=0;
    КонецЕсли;
    Статья= ТабОбъект.Статья;
    Если врСтатья<>Статья
        ТабСписание.ВывестиСекцию("Статья");
        врСтатья= СтатьяТогда;
        СуммаСтатья =0;
    КонецЕсли;
    ТабСписание.ВывестиСекцию("Документ");
КонецЦикла;

ЗЫ: тут точно, вон из профессии..
:)))
15 aptomilov
 
29.07.11
10:02
я понял, последний вариант
правильный
16 povar
 
29.07.11
10:02
(10) а чем (2) не устроило ?
17 KRV
 
29.07.11
10:05
(3)Фигассеее...  трудно, там, у Вас,.. небось заплату дают еще по понедельникам...
18 Ёпрст
 
29.07.11
10:05
(26) ну.. это же надо осмыслять, а тут некогда - в 15 минут не уложиться :)
19 povar
 
29.07.11
10:07
(18) понятно, время только на копипасту )
20 Aleksey
 
29.07.11
10:11
(0) Индексированная таблица з комплекта 1С++ тебя спасет
21 aptomilov
 
29.07.11
10:12
povar, там суммы получить в группировку не могу, мозгов нет чото ваще
22 aptomilov
 
29.07.11
10:18
таб.Выгрузить почему не добавляет строки  а заменяет собой ту таблицу в которую загружаешь(
23 povar
 
29.07.11
10:20
(22) см. (1)
24 _Atilla
 
29.07.11
10:35
(22) Посмотри параметры "Выгрузить".
25 aptomilov
 
29.07.11
10:45
Atilla, походу с таблицами идея мертвая с сортировкой засада с помощью ней никак не отсортировать так что каждый в свою группу встал.
а по выгрузить там не параметров, подменять или нет собой табл
26 Mikeware
 
29.07.11
10:49
(24) не Выгрузить(), а Заполнить()
(25) это у тебя соотношение радиусов к бесконечности стремится...
27 Сияющий Асинхраль
 
29.07.11
10:52
Параметры выгрузить не помогут, соединять тз можно либо с помощью "заполнить" либо перебором
28 Сияющий Асинхраль
 
29.07.11
11:02
А вообще самое простое добавить в тз еще одну колонку "уровень" и в момент формирования тз добавлять не по одной строчке, а по три, первая - объект, уровень=3, сумма; вторая - объект, статья, уровень=2, сумма; третья - объект, статья, док, уровень=3, сумма. Достаточно эту тз свернуть и отсортировать. Все готово
29 aptomilov
 
29.07.11
11:11
Сияющий Асинхраль эта табл у меня из запроса (группировка документ) +  я потом по ней прошелся и добавил объект , который в запросе ну никак не получить вот теперь сижу и думаю как её выводить
30 Сияющий Асинхраль
 
29.07.11
11:25
Я просто привел самый простой именно для тебя метод. Реально вариантов очень много. Тебя никто не заставляет, скажем, из твоего запроса выгружать в тз, можно ее формировать перебором результата запроса. Другие варианты расскажу как дойду до рабочего места
31 aptomilov
 
29.07.11
11:30
запросом я не могу там нет объекта, проблема в том что у меня как то не было практики формирования группировок из ТЗ(
32 Ёпрст
 
29.07.11
11:44
(29) текст запроса покажи и то, что ты там потом в него добавил.
33 aptomilov
 
29.07.11
11:47
Текст = "//{{ЗАПРОС(ОтгрузкаТоваров)
   |Период с ДатаНач" + ПериодПо + ";
   |
   |ОбрабатыватьДокументы Проведенные;
   |Обрабатывать НеПомеченныеНаУдаление;
   |
   |Статья       = Документ.ПоступлениеДенежныхСредств.СатьяДДС,
   |               Документ.ПоступлениеДенежныхСредствРасчеты.СатьяДДС,
   |               Документ.ПриходныйОрдер.СатьяДДС,
   |               Документ.ПриходныйОрдерРасчеты.СатьяДДС,
   |               Документ.РасходныйОрдер.СатьяДДС,
   |               Документ.РасходныйОрдерРасчеты.СатьяДДС,
   |               Документ.СписаниеДенежныхСредств.СатьяДДС,
   |               Документ.СписаниеДенежныхСредствРасчеты.СатьяДДС;
   
   |ДокОсн   =     Документ.ПоступлениеДенежныхСредств.ДокументОснование,
   |               Документ.ПоступлениеДенежныхСредствРасчеты.ДокументОснование,
   |               Документ.ПриходныйОрдер.ДокументОснование,
   |               Документ.ПриходныйОрдерРасчеты.ДокументОснование,
   |               Документ.РасходныйОрдер.ДокументОснование,
   |               Документ.РасходныйОрдерРасчеты.ДокументОснование,
   |               Документ.СписаниеДенежныхСредств.ДокументОснование,
   |               Документ.СписаниеДенежныхСредствРасчеты.ДокументОснование;  
   
   
   |
   |корсчет      = Документ.ПоступлениеДенежныхСредств.КоррСчет.код,
   |               Документ.СписаниеДенежныхСредств.КоррСчет.код,
   |               Документ.ПриходныйОрдер.КоррСчет.код,
   |               Документ.РасходныйОрдер.КоррСчет.код;
   |ПриходН       = Документ.ПриходныйОрдер.Сумма,
   |               Документ.ПриходныйОрдерРасчеты.Сумма;
   |ПриходБ       = Документ.ПоступлениеДенежныхСредств.Сумма,
   |               Документ.ПоступлениеДенежныхСредствРасчеты.Сумма;
   |РасходН       = Документ.РасходныйОрдер.Сумма,
   |               Документ.РасходныйОрдерРасчеты.Сумма;
   |РасходБ       = Документ.СписаниеДенежныхСредств.Сумма,
   |               Документ.СписаниеДенежныхСредствРасчеты.Сумма;
   |Функция СумПриходН      = Сумма(ПриходН);
   |
   |Функция СумРасходН      = Сумма(РасходН);
   |
   |Функция СумРасходВнН    = Сумма(ПриходН) когда (сокрЛП(корсчет) = сч51);
   |
   |Функция СумПриходВнН    = Сумма(РасходН) когда (сокрЛП(корсчет) = сч51);
   |
   |Функция СумПриходБ      = Сумма(ПриходБ);
   |
   |Функция СумРасходБ      = Сумма(РасходБ);
   |
   |Функция СумРасходВнБ    = Сумма(ПриходБ) когда (сокрЛП(корсчет) = сч51);
   |
   |Функция СумПриходВнБ    = Сумма(РасходБ) когда (сокрЛП(корсчет) = сч51);
   |
   |Группировка  Статья Упорядочить по Статья.код;
   |";  


а добавил я потом в таблицу объект и контрагент из документа основания (докосн)
34 aptomilov
 
29.07.11
11:53
Ёпрст3, твой вариант алгоритма работает)
35 DCKiller
 
29.07.11
12:04
(2) Блин, а ведь это то, что я недавно тоже искал :)
36 aptomilov
 
29.07.11
12:08
работает но не правильно((( , он суммы считает а потом группировку ставит
37 aptomilov
 
29.07.11
12:08
нашел рабочий алгоритм?
38 aptomilov
 
29.07.11
12:10
расстановка позиций верная и суммы правильно считает, только берет не там(, надо брать под группировкой а он над ней берет
39 Сияющий Асинхраль
 
29.07.11
12:11
Вот чудо то. К 34-му посту выяснил, что показанное в посте (14) работает. Ах-ренеть...
Даю еще варианты:

1) ВсегоСтрок = ТЗ.КоличествоСтрок();
ТЗ.НоваяКолонка("Уровень","Число",9,0);
ТЗ.Заполнить(3,,,"Уровень");
Для Счетчик = 1 По ВсегоСтрок Цикл
ТЗ.НоваяСтрока();
ТЗ.ОБъект = ТЗ.ПолучитьЗначение(Счетчик,"ОБъект");
ТЗ.Уровень = 1;

ТЗ.НоваяСтрока();
ТЗ.Объект = ТЗ.ПолучитьЗначение(СЧетчик,"Объект");
ТЗ.Статья = ТЗ.ПолучитьЗначение(СЧетчик,"Статья");
ТЗ.Уровень = 2;
КонецЦикла;

ТЗ.Сортировать("ОБъект,Статья,Док,Уровень");

2)ТЗ1 = СоздатьОбъект("ТаблицаЗначений");
ТЗ.Выгрузить(ТЗ1);
ТЗ1.Свернуть("ОБъект,Статья","Сумма");
ТЗ2 = СоздатьОБъект("ТаблицаЗНачений");
ТЗ1.Выгрузить(ТЗ2);
ТЗ2.Свернуть("ОБъект","СУмма");

ТЗ2.ВыбратьСтроки();
Пока ТЗ2.ПолучитьСтроку() = 1 Цикл
// Здесь Сумма по объекту
ТЗ1.ВыбратьСтроки();
Пока ТЗ1.ПолучитьСтроку() = 1 Цикл
Если ТЗ2.Объект <> ТЗ1.ОБъект Тогда Продолжить КонецЕсли;
// Здесь сумма по статье
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
Если (ТЗ.ОБъект <> ТЗ1.ОБъект) Или (ТЗ.Статья <> ТЗ.Статья) Тогда Продолжить КонецЕсли;
// Здесь суммы по документам
КонецЦикла;
КонецЦикла;
КонецЦикла;

3) Влом описывать, то что уже писал здесь:
http://delorasoft.ru/index.php?option=com_content&task=view&id=10&Itemid=20

Ну и так далее. Вариант 2 один из самых тупых, поубивал бы авторов, но на этом варианте построены практически все отчеты в семерочном подрядчике строительства
40 smaharbA
 
29.07.11
12:12
(27) именно, по ходу не только автор в цейтноте
41 viktor_vv
 
29.07.11
12:13
Все уже украдено до нас :).

В гугле вводишь "Свернуть ТЗ с подитогами по группировкам".
42 DCKiller
 
29.07.11
12:13
(31) Почему в запросе нет объекта?
43 Сияющий Асинхраль
 
29.07.11
12:16
(+39) В варианте 1) забыл дописать строчки:
ТЗ.Сумма= ТЗ.ПолучитьЗначение(Счетчик,"Сумма");
Для обеих формируемых строчек...
44 Сияющий Асинхраль
 
29.07.11
12:21
И кстати, если конфа на плане счетов, то пользовать такой запрос как (33) дурной тон :-) , это все надо было вытаскивать из бухгалтерского запроса по операциям...
45 DCKiller
 
29.07.11
12:23
(44) Не надо лучше такие страшные термины тут упоминать... :) а то автору еще плохо станет
46 aptomilov
 
29.07.11
12:29
Сияющий Асинхраль,если честно я не понял  зачем мы впихиваем в основную таблицу уровни если мы их потом не используем
47 Сияющий Асинхраль
 
29.07.11
12:33
(46) Чтобы при распечатке ты мог отличить какой же ты уровень печатаешь - уровень объекта, уровень статьи или уровень документа...
48 Сияющий Асинхраль
 
29.07.11
12:34
+(47) Например выведя каждую из этих строчек отдельным цветом, чтобы красиво было...
49 aptomilov
 
29.07.11
12:35
непонятно как в первом варианте получать сумму по группировке(
50 Сияющий Асинхраль
 
29.07.11
12:38
+(47) Ну и попутно для правильной сортировки..
Перед сортировать должна быть еще одна строчка:
ТЗ.Свернуть("ОБъект,Статья,ДОк,Уровень","Сумма");
После этого на первом уровне будут уже готовые суммы по объектам, на втором по статьям, а третий по документам, но они не изменятся...
51 Сияющий Асинхраль
 
29.07.11
12:41
Итого полный первый вариант имеет вид:

ВсегоСтрок = ТЗ.КоличествоСтрок();
ТЗ.НоваяКолонка("Уровень","Число",9,0);
ТЗ.Заполнить(3,,,"Уровень");
Для Счетчик = 1 По ВсегоСтрок Цикл
ТЗ.НоваяСтрока();
ТЗ.ОБъект = ТЗ.ПолучитьЗначение(Счетчик,"ОБъект");
ТЗ.Сумма= ТЗ.ПолучитьЗначение(Счетчик,"Сумма");
ТЗ.Уровень = 1;

ТЗ.НоваяСтрока();
ТЗ.Объект = ТЗ.ПолучитьЗначение(СЧетчик,"Объект");
ТЗ.Статья = ТЗ.ПолучитьЗначение(СЧетчик,"Статья");
ТЗ.Сумма= ТЗ.ПолучитьЗначение(Счетчик,"Сумма");
ТЗ.Уровень = 2;
КонецЦикла;

ТЗ.Свернуть("ОБъект,Статья,ДОк,Уровень","Сумма");
ТЗ.Сортировать("ОБъект,Статья,Док,Уровень");
52 aptomilov
 
29.07.11
12:56
второй вариант повторяет постоянно одни и те же документы(( будем пробовать первый
53 Сияющий Асинхраль
 
29.07.11
13:01
(52) Какие документы? Ты хоть немножко своих мозгов прикладывай к тому, что написано, а не только чужие юзай. Тебе уже вариантов до хрена написали ни над одним не задумался а как же это работает... Тебе сразу циферки готовые выдать надо?!
54 Сияющий Асинхраль
 
29.07.11
13:03
Во втором варианте опечатка была, которую мог бы и сам заметить:
Если (ТЗ.ОБъект <> ТЗ1.ОБъект) Или (ТЗ.Статья <> ТЗ1.Статья) Тогда Продолжить КонецЕсли;
// Здесь суммы по документам

КонецЦикла;
55 aptomilov
 
29.07.11
13:04
Спасибо большое всем - будем разбираться.
Тебе  Сияющий Асинхраль  в особенности!!