Имя: Пароль:
1C
1C 7.7
v7: Научите выводить секции
,
0 e-9
 
31.07.14
13:18
Все тот же табель отработанного времени:(((
По горизонтали он имеет секции:
"Табель", в эту секцию вложены две секции: "Колонтитул" и "Работник".
Выводим "Табель<", "Колонтитул", в цикле выводим секцию "Работник", наконец - "Табель>". Вертикальных секций сначала не было - просто столбцы, в том числе дни месяца, с 1 по 31 . Все было шоколадно.
Но захотелось совершенства - чтобы выводилось ровно столько дней, сколько их в месяце, а не всегда 31. (ШиринаСтолбца(0) не помогла - столбец сжимался, но не до нуля и все равно сиротливо выглядывал).
Решил разбить табель вертикальными секциями (см. наглядно https://yadi.sk/i/5m2CH9fjYbhfQ): "Левая" - до 28-го дня включительно, "29", "30", "31" и "Правая" (все, что после 31-го дня). И выводить сначала "Табель<|Левая", потом
Для Сч=29 По ДатаЧисло(КонМесяца(ДатаДок)) Цикл
Таб.ВывестиСекцию("Табель<|"+Сч);
КонецЦикла;
и наконец "Табель<|Правая".
А потом уже "Колонтитул", всех работников и "Табель>".
Замысел вроде чудесный - но, как всегда, споткнулся о серую реальность:
1. во-первых, клал он (1С) на то, что я в порядке испытания закомментировал вышеприведенный цикл с выводом секций "29", "30", "31" - он их все равно выводит!!! Т.е., никакого смысла во всех мучениях - как ни крути. выведутся все 31 день.
2. во-вторых, нормальной, заданной в конфигураторе, ширины, выводятся только столбцы секции "Левая". Все остальные разъехались (см. https://yadi.sk/i/ez4t83biYbtia) на какую-то одинаковую для всех ширину.
3. в-третьих, перед колонтитулом зачем-то появились 5 пустых строк - см. https://yadi.sk/i/2oZSIyqlYbvNv (справа в зеленом - как надо, как было до разбиения на вертикальные секции).
...Повторюсь: фактически, в нормально работающем, без вертикальных секций, программном коде было одно-единственное изменение:
вместо одной строки
    Таб.ВывестиСекцию("Табель<");
появились строки
    Таб.ВывестиСекцию("Табель<|Левая");
    //ДКМ = ДатаЧисло(КМ);
    //Для Сч=29 По ДКМ Цикл
    //    Таб.ВывестиСекцию("Табель<|"+Сч);
    //КонецЦикла;
    Таб.ВывестиСекцию("Табель<|Правая");
1 e-9
 
31.07.14
13:21
[ппц](...лучше бы миста дала возможность самим выделять программный код тегами, а не делала это автоматически...)[/ппц]
2 e-9
 
31.07.14
13:24
...в частности, шо она зробила с первой ссылкой, ужассс! вот еще раз:
https://yadi.sk/i/5m2CH9fjYbhfQ
3 Teresa
 
31.07.14
13:28
(0) Прочла название темы "Научите вводить санкции"... Перегрелась, видать) Простите за оффтоп)
4 e-9
 
31.07.14
13:29
(3) срочно на кухню! (компотика наварить на всю зиму, вареньица...помогает, по себе ощутил)
5 Zhuravlik
 
31.07.14
13:35
(0) Потренируйся сначала на чем-нить простом. Цель - понять как работают методы "ВывестиСекцию" и  Присоединить(). Я бы все с одной вертикальной секцией попробовал замутить...
т.е.
Таб.Вывести("ДеньТабеля")
Пока сч = 1  По КоличествоДней Цикл

Таб.Присоединить("ДеньТабеля");

КонецЦикла

как-то так.
6 DGorgoN
 
31.07.14
13:35
//ДКМ = ДатаЧисло(КМ);

    //Для Сч=29 По ДКМ Цикл

!!!!!!!!!!!!!!!!!!!!!!!  Таб.ПрисоеденитьСекцию("Табель<|"+Сч);

    //КонецЦикла;
7 DGorgoN
 
31.07.14
13:37
Логика такая.
ВывестиСекцию ПрисоеденитьСекцию ПрисоеденитьСекцию
------------> -----------------> ----------------->

ВывестиСекцию ПрисоеденитьСекцию ПрисоеденитьСекцию
------------> -----------------> ----------------->

ВывестиСекцию ПрисоеденитьСекцию ПрисоеденитьСекцию
------------> -----------------> ----------------->
8 DGorgoN
 
31.07.14
13:38
Т.е. ВывестиСекцию это всегда новая строка, а ПрисоеденитьСекцию присоединяет к этой строке ячейки
9 e-9
 
31.07.14
13:43
DGorgoN, спасибо огромное! все понял - теперь все как надо!
10 e-9
 
31.07.14
13:44
(как всегда, не хватает времени на RTFM - в результате, куча времени уходит на поиск элементарных ошибок, проистекающих от недостатка RTFM:)))
11 e-9
 
31.07.14
13:48
упс....не все ок - самая первая-то проблема и не исчезла:(((
сделал табель за ИЮНЬ (раскомментировал, понятно, цикл) - все равно выводится и 31-е тоже, причем ненормальной ширины....а все остальное - ок!
12 e-9
 
31.07.14
13:50
...в отладчике проверил: ДКМ = ДатаЧисло(КМ) равно 30, как и должно быть для июня
13 DGorgoN
 
31.07.14
14:03
(12) Вся инфа для размышления у тебя есть. думай, отладчиком или сообщить ищи ошибку.
14 e-9
 
31.07.14
14:03
ВСЕ!!! я тормоз
просто надо было не только секцию "Табель<" выводить "по кускам", через ПрисоединитьСекцию, но также и "Колонтитул", и "Работник", и "Табель>"
15 e-9
 
31.07.14
14:04
(13) :))))) (ты опередил на секунду:))
16 дедушка Вах
 
31.07.14
14:22
(0) ну всё, теперь такой сделай:
за _ месяц
Сотр|ВР(сумма)|ВР(сумма)|...|ВсегоНач|ВР(сумма)|ВР(сумма)|...|ВсегоУд|Итого|Выплачено|Остаток
ЗЫ может адынеснегом станешь
17 DmitriyDI
 
31.07.14
14:26
(3) аналогично прочитал)
18 e-9
 
31.07.14
14:42
(16) легко:) программистом стал давно, и семерке меня уже не изуродовать
(17) и это печально....
19 e-9
 
31.07.14
15:12
Да что ж это такое, в конце концов!...
Теперь поплыли левые столбцы - № п/п, ТабНомер, ФИО, даты до 15-го включительно: https://yadi.sk/i/ZYEbbDnWYdhQ5
до сегодняшних модификаций, все было ок (как в этом скриншоте
https://yadi.sk/i/ez4t83biYbtia )
Вот почему, вместо заданной в конфигураторе ширины, у них выводится какая-то непонятная вообще ширина?????
20 e-9
 
31.07.14
15:18
нет, я могу, конечно, перелопатить все 51 столбец, выставляя ширину программно - но ПОЧЕМУ???!!!
21 Ёпрст
 
31.07.14
15:18
скриншот макета покажи
22 Ёпрст
 
31.07.14
15:19
и вот это "<" в имени секций.. вообще никогда не используется.
Механизм вложенных секций, как правило, не используется нигде, он вообще не нужен для вывода.
23 e-9
 
31.07.14
15:19
о!!...Ёпрст!!! наконец-то - я думал, ты местный дух и всегда тут присутствуешь!:) теперь мы всех победим
вот:
https://yadi.sk/i/SSGWS4HYYdjuw
24 Ёпрст
 
31.07.14
15:21
(23) у... какой фееричный пиз..дец!
25 e-9
 
31.07.14
15:21
я там кстати небольшие изменения внес, по сравнению с ранее приведенными скриншотами - вместо Сотрудник теперь, как и требовалось, выводится СотрДолж = Сотрудник.Наименование+РазделительСтрок+Сотрудник.Должность.Получить(НМ);
Однако, столбцы поплыли не из-за этого, и даже до этого
26 Ёпрст
 
31.07.14
15:21
выкидывай все вертикальные секции в табеле, оставь только !одну! для дней, её и присоединяй в цикле.
Будет всегда всё ровно и одной ширины.
27 e-9
 
31.07.14
15:22
(24) так. Раз и навсегда - я программист, а не 1сНЕГ с вывернутыми мозгами!
28 e-9
 
31.07.14
15:23
(26) не понял
мне в феврале, например, только 29-й день нужен (если високосный год)
в июне - только 29-й и 30-й
в июле - все, 29-31
и как я это реализую с ОДНОЙ вертикальной секцией????????????
29 ДенисЧ
 
31.07.14
15:24
(28) Это тайная магия 1с. Пока не освоишь - у тебя ничего не будет получаться.
30 e-9
 
31.07.14
15:25
(28) может, ты в смысле, "Левая" и "Правая" не нужны, только "29", "30", "31"
??
31 Ёпрст
 
31.07.14
15:25
Вот так делай:

3 вертикальных и 3 горизонтальных:

http://pics.rsh.ru/img/123_2aubco8h.png
32 e-9
 
31.07.14
15:30
ребята...(и девчата) простите меня - я тупо забыл приписать "|Левая" в самом конце всех приключений; т.е. в подвале у меня было
    Таб.ВывестиСекцию("Табель>");
вместо
    Таб.ВывестиСекцию("Табель>|Левая");
(упс!)
исправил - теперь все-все-все ОК!!!
33 Ёпрст
 
31.07.14
15:46
а надо будет за 2 или 3 месяца табель, тоже будешь ручонками макет с 60 колонками рисовать ?
:))
34 Ёпрст
 
31.07.14
15:50
тебе надо было всего лишь

Таб.ВывестиСекцию("Шапка");

//вывод заголовков
Таб.ВывестиСекцию("Заголовок|Левая");
Для к = НачДата По КонДата Цикл
    Таб.ПрисоединитьСекцию("Заголовок|Тело");
КонецЦикла;
Таб.ПрисоединитьСекцию("Заголовок|Право");
//вывод всего остального
Таб.ВывестиСекцию("Строка|Левая");

Для к = НачДата По КонДата Цикл
    Таб.ПрисоединитьСекцию("Строка|Тело");
КонецЦикла;
Таб.ПрисоединитьСекцию("Строка|Право");
//вывод подписей:
Таб.ВывестиСекцию("Подвал");
35 Patrio_
O_Muerte
 
31.07.14
16:20
Топикстартер похоже лопнул от наплыва семерошного интеллекта :)
36 e-9
 
31.07.14
17:41
(34) так...я что, могу одну секцию присоединить N раз, N>=0???
а как менять содержимое? вот у меня сейчас, в каждом столбце дня, выражение "Д"+Сч, Сч=1,...,ДатаЧисло(КонМесяца(ДатаДок)). Я его ввел в режиме макета. Как программно его поменять, перед выводом очередного экземпляра секции? И разве, если я сменю выражение, это затронет только выводимый экземпляр секции, а не все, ранее выведенные?
(35) не то слово
37 e-9
 
31.07.14
17:41
+(36) в смысле, у меня в макете Д1,....,Д31
38 DGorgoN
 
31.07.14
17:44
(36) Заноси данные сначала в таблицу значений, а из неё уже делай вывод в таблицу что-бы ничего не менять. Так проще.
39 ДенисЧ
 
31.07.14
17:44
(36) Выражение вычисляется в момент вывода секции. Так что и захочешь что-то поменять в выведенных - не так-тоо и просто_тебе_ будет
40 Ёпрст
 
31.07.14
17:46
(36) удивительное рядом, не так ли ?
:)
41 ДенисЧ
 
31.07.14
17:48
(40) Он так мозги себе вывернет (см (27)) и станет настоящим 1сником :-)
42 Ёпрст
 
31.07.14
17:49
(41) новое слово в медицине - "заворот мозгов" ?
:)
43 e-9
 
31.07.14
17:51
(38) а чего проще? и так проще некуда - данные в таблицу вносятся непосредственно из многострочной части документа (кроме всяких там итогов - они считаются программно, пишутся в переменные, которые указаны как Выражение, в соответствующих ячейках таблицы).

(40-42) да уж.....
44 uno-group
 
31.07.14
19:03
Долго это все всего то надо было
Таб.ВывестиСекцию("Шапка"+(ДатаЧисло(КонМесяцаДатаДок)))
И сделать 4 горизонтальных секции Шапка28,Шапка29,Шапка30,Шапка31). и остальные соответственно и работать будет быстрее
45 uno-group
 
31.07.14
19:06
и все эти Таб.ВывестиСекцию("Табель<|"+Сч) в данном случае от лукавого. сделал 2 секции ТабельШапка. табель дно и о больше меньше забыл
46 uno-group
 
31.07.14
19:09
А лучше вообще 4 таблица бахнуть и 1 строку кода
таб.ИсходнаяТаблица(ДнейВмесяце)
4 копипасте и дел лишних столбцов
47 uno-group
 
31.07.14
19:13
ну и последний вариант с чего ты начинал кроме ШиринаСтолбца(0) для несуществующих дат сделать еще объединение ячеек с последним днем и рамкой обвести
48 Злопчинский
 
31.07.14
19:24
слушай Епрста!
у меня табель отработанного времени ппост как две копейки
http://screencast.com/t/vZNOSJ2J7yGn
49 Ёпрст
 
31.07.14
19:47
На вот, ломай мозг дальше

:))
http://webfile.ru/ed612fa2d2420473bf135c1e8ab59a78
50 Dmitry1c
 
31.07.14
20:11
Я один прочитал название темы - "Научитесь вводить санкции"?
51 e-9
 
01.08.14
15:52
(44-47) короче, нет предела безум...возможностям СЕМЕРКИ!
(48) а мне (т.е. организации) надо навороченный, как пицотевро
(49) бережно сохранил в специальной папке Ёпрст! Для тщательного изучения долгими зимними днями...
(50+3+17) лечитесь, пока не поздно (относится также ко всем, кто побоялся признаться)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший