Имя: Пароль:
1C
1С v8
Вывод в таблицу составных областей.
0 Креатив
 
31.08.20
07:33
Ваяю расписание. В примитивном варианте выглядит так https://b.radikal.ru/b06/2008/cb/68bfd943072e.png
Соответственно мне сначала надо вывести Строка|Номер, затем присоединить справа название|интервалы и ниже времена|ИнтервалХ два раза.
Причём вариации интервалов могут быть любые 1-2, 1-1, 2-1, 2-2. Ширина областей Интервал1 и Интервал2 одинаковая (по ячейкам и их ширине).
Кто уже с этим сталкивался, подскажите, как проще это реализовать?
1 Креатив
 
31.08.20
10:26
Заработало только так. Понятно, что вывод отдельной секции нужно будет оформить в процедуру.
    Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет2");
    ТабДок = Новый ТабличныйДокумент;
    ТабДок2 = Новый ТабличныйДокумент;
    СтрокаТаблицы = Макет.ПолучитьОбласть("Строка|Номер");
    СтрокаТаблицы.Параметры.Номер = 1;
    пНомер = ТабДок.Вывести(СтрокаТаблицы);
    Название = Макет.ПолучитьОбласть("Название|Интервалы");
    Название.Параметры.Имя = "Туда-сюда";
    ТабДок2.Вывести(Название);
    Название = ТабДок2;
    нВерх = пНомер.Верх;
    нНиз = нВерх;
    нЛево = пНомер.Право + 1;
    нПраво = нЛево + Название.ШиринаТаблицы - 1;
    тВставка = Название.Область("R1C1:R" + Название.ВысотаТаблицы + "C" + Название.ШиринаТаблицы);
    //тВставка.Значение = "Туда-сюда";
    ТабДок.ВставитьОбласть(тВставка, ТабДок.Область("R" + нВерх + "C" + нЛево + ":R" + нНиз + "C" + нПраво));
    Ин1 = Макет.ПолучитьОбласть("Времена|Интервал2");
    Ин1.Параметры.Инт2 = "5-10";
    Ин1.Параметры.Инт3 = "10-12";
    ТабДок2.Очистить();
    ТабДок2.Вывести(Ин1);
    Ин1 = ТабДок2;
    тВставка = Ин1.Область("R1C1:R" + Ин1.ВысотаТаблицы + "C" + Ин1.ШиринаТаблицы);
    нВерх = нВерх + 1; //Выводим строкой ниже
    нПраво = нЛево + Ин1.ШиринаТаблицы - 1;
    нНиз = нВерх + Ин1.ВысотаТаблицы - 1;
    ТабДок.ВставитьОбласть(тВставка, ТабДок.Область("R" + нВерх + "C" + нЛево + ":R" + нНиз + "C" + нПраво));
    
    Ин2 = Макет.ПолучитьОбласть("Времена|Интервал1");
    Ин2.Параметры.Инт1 = "6-10";
    ТабДок2.Очистить();
    ТабДок2.Вывести(Ин2);
    Ин2 = ТабДок2;
    тВставка = Ин2.Область("R1C1:R" + Ин2.ВысотаТаблицы + "C" + Ин2.ШиринаТаблицы);
    нВерх = нВерх; //в той же строче
    нЛево = нПраво + 1; // справа от предыдущей
    нПраво = нЛево + Ин2.ШиринаТаблицы - 1;
    //нНиз = нВерх + Ин2.ВысотаТаблицы - 1;
    ТабДок.ВставитьОбласть(тВставка, ТабДок.Область("R" + нВерх + "C" + нЛево + ":R" + нНиз + "C" + нПраво));
2 RomanYS
 
31.08.20
10:30
(1) Заработало и ладно. Правда почему нельзя было просто через присоединить сделать и что такое "1-2, 1-1, 2-1, 2-2" осталось не понятым
3 Ёпрст
 
31.08.20
10:40
(1) использовать RC  формат адреса..нафига ? Когда и так есть Область(номерПервойСтроки,НомерПервойКолонки,НомерПоследнейСтроки,НомерПоследнейКолонки)
4 sitex
 
naïve
31.08.20
10:46
(1) Действительно почему не через "Присоединить"  ?
5 rudnitskij
 
31.08.20
10:56
"Соответственно мне сначала надо вывести Строка|Номер, затем присоединить справа название|интервалы и ниже времена|ИнтервалХ два раза" - "присоединить" и "ниже" в одном предложении удивили. Присоединяете вы всегда в текущей строке. А если
ТабДокумент.Вывести(Область)
то это с новой строки будет
6 rudnitskij
 
31.08.20
10:56
Как вы код выделяете в тексте?
7 Креатив
 
31.08.20
11:22
(3)В примерах СП так.
(4)Бог знает. Описание показалось мутным.
(5)Я указываю область, куда вставлять относительно первой ячейки. А со следующей строкой надо будет посмотреть.
8 rudnitskij
 
31.08.20
11:25
(7) "Я указываю область, куда вставлять относительно первой ячейки" - первый раз такое слышу о формировании табличного документа. "Присоединить" присоединяет указанную область вплотную к выведенной ранее, никакого указанного места там нет
9 Креатив
 
31.08.20
11:25
(1)Могут быть две секции Интервал1, либо две секции Интервал2, либо та и другая, но в разном порядке следования.
10 Креатив
 
31.08.20
11:29
(8)ВставитьОбласть вставляет в любое место таблицы по абсолютному адресу. Так что работает.
Присоединить можно посмотреть, только придётся разбираться с уровнями. К первой ячейке мне нужно будет присоединять сначала длинный заголовок, а под ним короткие секции.
11 RomanYS
 
31.08.20
11:30
(9) Никакой проблемы здесь нет, опреатор "Если" её решает.

(7) Присоединить более "стандартно" для подобных задач, ВставитьОбласть для точечных правок готового ТД, в типовых вообще ни разу не видел.
12 rudnitskij
 
31.08.20
11:32
(10) тогда вы можете отрисовать в какую-то область длинный заголовок с короткими секциями и уже эту всю конструкцию присоединять в сборе
13 rudnitskij
 
31.08.20
11:34
(1) как вы пишете код в таком виде?
14 Креатив
 
31.08.20
11:38
(11)Описание метода очень мутное. Поэтому я и взялся за ВставитьОбласть.
(12)Тоже вариант.
(13)Руками вроде. Для тестирования всё понятно.
15 RomanYS
 
31.08.20
11:43
(14) Что там мутного? По сути тоже самое что и Вывести, только в ту же строку(точнее последнюю горизонтальную область выведенную с помощью Вывести) правее.
16 Креатив
 
31.08.20
12:02
(15)Допустим, присоединил я первую ячейку строка|номер, вывел название|интервалы. А куда присоединится времена|интервал1?
17 RomanYS
 
31.08.20
12:09
(16) Вывод идёт построчно
Или


Вывести(строка|номер)
Цикл
Если
Присоединить(строка|Интервал1)
иначе
Присоединить(строка|Интервал2)
КонецЕсли;
КонецЦикла;

или

Вывести(времена|номер)
Цикл
Если
Присоединить(времена|Интервал1)
иначе
Присоединить(времена|Интервал2)
КонецЕсли;
КонецЦикла;


Обычно выводят заголовки ("Название") потом в цикле строки ("Времена")
18 Креатив
 
31.08.20
12:30
С одним табличным документом получается полная хрень.
19 Креатив
 
31.08.20
12:39
Вот так работает.
    ТабДок = Новый ТабличныйДокумент;
    ТабДок2 = Новый ТабличныйДокумент;
    СтрокаТаблицы = Макет.ПолучитьОбласть("Строка|Номер");
    СтрокаТаблицы.Параметры.Номер = 1;
    пНомер = ТабДок.Присоединить(СтрокаТаблицы);
    
    Название = Макет.ПолучитьОбласть("Название|Интервалы");
    Название.Параметры.Имя = "Туда-сюда";
    ТабДок2.Вывести(Название);
    
    Ин1 = Макет.ПолучитьОбласть("Времена|Интервал2");
    Ин1.Параметры.Инт2 = "5-10";
    Ин1.Параметры.Инт3 = "10-12";
    ТабДок2.Вывести(Ин1);
    
    Ин2 = Макет.ПолучитьОбласть("Времена|Интервал1");
    Ин2.Параметры.Инт1 = "6-10";
    ТабДок2.Присоединить(Ин2);
    ТабДок.Присоединить(ТабДок2);
20 RomanYS
 
31.08.20
12:48
(19) Похоже у меня не получается донести до тебя "построчно".

Строка в данном случае горизонтальная область ("Строка", "Название" или "Времена"). Присоединять нужно соответствующие области (к "Строка|Номер" - "Строка|Интервал1").

Зачем секция "Интервалы" вообще непонятно, интервалы парами у тебя ходят?
Покажи пример результата
21 Креатив
 
31.08.20
13:03
(20)Либо я чего-то не догоняю, либо ты не посмотрел картинку в (0).
Горизонтальная секция "строка" физически располагается на 3-х строчках таблицы. Номер также 3 строки в высоту. Название располагается на одной строке над всеми интервалами. Каждый интервал занимает одну ячейку в ширину и 2 в высоту. И в моём случае Строка|Интервал1 - не является самостоятельным элементом, так как захватывает объединённую область название|интервалы/
В рабочем варианте интервалов будет шесть.
Результат. https://d.radikal.ru/d19/2008/6c/6c1578f1f6c8.png
22 RomanYS
 
31.08.20
13:11
(21) теперь понятнее. Из (0) не очевидно, в первой колонке объединенные ячейки.
Тогда, да - выводить кусками как в (19).

Альтернатива: выводить построчно (сначала "Название" потом "Времена"), а объединение в первой колонке делать постобработкой.
23 Креатив
 
31.08.20
13:24
(22)С программным объединением тоже вариант.
24 RomanYS
 
31.08.20
13:27
(23) Да, ничего сложного. Кстати можно отказаться и от секции "интревал1" и получать её тупо объединением. Возможно получится проще.
25 Креатив
 
31.08.20
16:30
Всем спасибо.