Имя: Пароль:
1C
1C 7.7
v7: Не выводится нужным способом таблица
0 andryus
 
06.09.11
08:49
Вот какая задача: есть документ, в нем список сотрудников, принадлежащих разным группам. Нужно чтобы формировалась платежная ведомость на каждую группу с включением в эту ведомость тех сотрудников, которые принадлежат данной группе. Отдельная группа, отдельная ведомость.
Сделал код:
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Сотрудник","Справочник.СотрудникиУчреждения");
ТЗ.НоваяКолонка("ГруппаСотрудника","Справочник");
ТЗ.НоваяКолонка("СуммаВыплаты","Число","15","2");

Далее обошел табличную часть документа, заполнил эту ТЗ, далее:
код

ТЗ.Свернуть("Сотрудник,ГруппаСотрудника","СуммаВыплаты");
ТЗ.Сортировать("ГруппаСотрудника+,Сотрудник+");

ТекущаяГруппа = "";
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
 Если ТЗ.ГруппаСотрудника<>ТекущаяГруппа Тогда
    Подразделение = ТЗ.ГруппаСотрудника;
    Таб=СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица");
    Таб.ВывестиСекцию("Шапка");
    Ном=0;
    Итого=0;
 КонецЕсли;
           
 Ном=Ном+1;
 Таб.ВывестиСекцию("Строка");
 Итого=Итого+ТЗ.СуммаВыплаты;
           
 Если ТЗ.ГруппаСотрудника<>ТекущаяГруппа Тогда
   ТекущаяГруппа=ТЗ.ГруппаСотрудника;
   Таб.ВывестиСекцию("Подвал");
   Таб.ТолькоПросмотр(1);
   Таб.ПараметрыСтраницы(1,,,,,,,,,,,);
   Таб.Опции(0,0,0,0);
   Таб.Показать("Платежная ведомость");
 КонецЕсли;
КонецЦикла;

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

Помогите найти выход
1 Chum
 
06.09.11
08:55
Если ТЗ.ГруппаСотрудника<>ТекущаяГруппа Тогда
    Подразделение = ТЗ.ГруппаСотрудника;

 Если ТЗ.ГруппаСотрудника<>ТекущаяГруппа Тогда
   ТекущаяГруппа=ТЗ.ГруппаСотрудника;


Найдите 10 отличий
2 Chum
 
06.09.11
08:58
Подвал должен быть после таблицы? Тогда где проверка на последнюю строку?
А еще, для ИндексированнойТаблицы есть великолепный метод Группировать
3 andryus
 
06.09.11
09:29
(1) Значение Подразделение как видите не участвует в условиях, соответственно не имеет значения, даже если я из кода уберу Подразделение = ТЗ.ГруппаСотрудника; это не даст абсолютно никакого значения.

(2) Да. Выводятся шапка, строки, подвал. Такая структура должна быть на каждую группу. Что за метод Группировать? Чего то я не нашел такой команды
4 Oleg_Kag
 
06.09.11
09:42
(0) Всё правильно программа делает :)
Допустим, что это условие истина, идем по шагам
Если ТЗ.ГруппаСотрудника<>ТекущаяГруппа Тогда <-выполнилась, вывелась шапка
далее идет вывод строки и заход во второй Если, но ведь условие ИСТИНА. по этому и получается:

Бухгалтерия
Петрова
Итого какая-то сумма
Петрова
Сидорова
5 andryus
 
06.09.11
09:45
(4) Да я не сомневаюсь что программа права, я говорю выход не могу найти
6 Ёпрст
 
06.09.11
09:48
(0) если документ записан то весь вывод сделать чОрным запросом, который сам развернёт всю иерархию по группам справочника.
7 andryus
 
06.09.11
09:50
(6) Не выход. Не исключаю, что документ вообще будет проводится и делать проводки. Основная задача чисто информативная (я знаю что это можно сделать отчетом, но мне нужен документ)
8 Oleg_Kag
 
06.09.11
09:53
Даю "кривую" вводную (есть ошибка), но чуть будет понятна :)
...
Пока ТЗ.ПолучитьСтроку()=1 Цикл
Если ТЗ.ГруппаСотрудника<>ТекущаяГруппа Тогда
    Если ТЗ.ГруппаСотрудников<>Подразделение Тогда
       Таб.ВывестиСекцию("Подвал");
       Таб.ТолькоПросмотр(1);
       Таб.ПараметрыСтраницы(1,,,,,,,,,,,);
       Таб.Опции(0,0,0,0);
       Таб.Показать("Платежная ведомость");
       Подразделение = ТЗ.ГруппаСотрудника;
    КонецЕсли;
    Таб=СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица");
    Таб.ВывестиСекцию("Шапка");
    Ном=0;
    Итого=0;
 КонецЕсли;
...
вот как-то так ... осталось вначале инициализировать Подразделение что бы не было первого входа во второй "Если" :)
9 Oleg_Kag
 
06.09.11
09:55
офтоп  -  я манАл эти нетбуки фиг по клавишам попадешь :)

чуть=суть
10 Ёпрст
 
06.09.11
09:59
(7) читаем вниматочно - документ должен быть ЗАПИСАН.
о проведении речи не было.
11 Oleg_Kag
 
06.09.11
10:00
Можно поступить по другому:
1) Вне цикла выводим "первую" шапку
2) в цикле при выполнении условия "Если ТЗ.ГруппаСотрудника<>ТекущаяГруппа" выводим "подвал-вывод документа-шапка"
3) по окончанию цикла выводим "подвал-вывод документа"
но (!) если ведомость пустая, то выведется 1 пусто табличный документ вида "шапка+подвал"
12 Ёпрст
 
06.09.11
10:01
+10
хотя, можно и не записанный документ запросом обработать - тупо выгрузить табличную часть в список, его скормить в качестве фильтра к запросу по справочнику.
13 Oleg_Kag
 
06.09.11
10:01
ппц пойду работать
1) читать как "ДО цикла"
14 Oleg_Kag
 
06.09.11
10:05
ТЗ.Свернуть("Сотрудник,ГруппаСотрудника","СуммаВыплаты");
ТЗ.Сортировать("ГруппаСотрудника+,Сотрудник+");
Таб=СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Таб.ВывестиСекцию("Шапка");
ТекущаяГруппа = "";
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
 Если ТЗ.ГруппаСотрудника<>ТекущаяГруппа Тогда
    ТекущаяГруппа = ТЗ.ГруппаСотрудника;
    Таб.ВывестиСекцию("Подвал");
    Таб.ТолькоПросмотр(1);
    Таб.ПараметрыСтраницы(1,,,,,,,,,,,);
    Таб.Опции(0,0,0,0);
    Таб.Показать("Платежная ведомость");
    Таб=СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Таблица");
    Таб.ВывестиСекцию("Шапка");
    Ном=0;
    Итого=0;
 КонецЕсли;
 Ном=Ном+1;
 Таб.ВывестиСекцию("Строка");
 Итого=Итого+ТЗ.СуммаВыплаты;
КонецЦикла;
Таб.ВывестиСекцию("Подвал");
Таб.ТолькоПросмотр(1);
Таб.ПараметрыСтраницы(1,,,,,,,,,,,);
Таб.Опции(0,0,0,0);
Таб.Показать("Платежная ведомость");
15 PuhUfa
 
06.09.11
10:10
ТекущаяГруппа = "";
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
 Если (ТЗ.ГруппаСотрудника<>ТекущаяГруппа) и (ТекущаяГруппа = "") Тогда
 //сменилась группа и первая группа. создает новую таб
    Таб=СоздатьОбъект("Таблица");
    Таб.ВывестиСекцию("Шапка");
 иначеесли (ТЗ.ГруппаСотрудника<>ТекущаяГруппа) и (ТекущаяГруппа <> "") тогда
 //сменилась группа и она не первая. выводим предыдцщцю таб и создаем новую  
    Таб.ВывестиСекцию("Подвал");
    Таб.Показать("Платежная ведомость");
    Таб=СоздатьОбъект("Таблица");
    Таб.ВывестиСекцию("Шапка");
 конецесли;
 Таб.ВывестиСекцию("Строка");
 ТекущаяГруппа = ТЗ.ГруппаСотрудника;
конеццикла;
//последний подвал
Таб.ВывестиСекцию("Подвал");
Таб.Показать("Платежная ведомость");
16 andryus
 
06.09.11
10:35
(14) Все хорошо, но в ТЗ только 2 группы, от выдает по ним таблицы, НО еще выкидывает пустую таблицу
17 Vladal
 
06.09.11
10:59
Условие Если (ТЗ.ГруппаСотрудника<>ТекущаяГруппа) и (ТекущаяГруппа = "") Тогда избыточное

Вторая часть условия не выполнится никогда:
иначеесли (ТЗ.ГруппаСотрудника<>ТекущаяГруппа) и (ТекущаяГруппа <> "") тогда
18 PuhUfa
 
06.09.11
11:25
(17) это еще почему?
Программист всегда исправляет последнюю ошибку.