Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Вывод в таблицу составных областей.

Вывод в таблицу составных областей.
Я
   Креатив
 
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" + нПраво));
   RomanYS
 
2 - 31.08.20 - 10:30
(1) Заработало и ладно. Правда почему нельзя было просто через присоединить сделать и что такое "1-2, 1-1, 2-1, 2-2" осталось не понятым
   Ёпрст
 
3 - 31.08.20 - 10:40
(1) использовать RC  формат адреса..нафига ? Когда и так есть Область(номерПервойСтроки,НомерПервойКолонки,НомерПоследнейСтроки,НомерПоследнейКолонки)
   sitex
 
4 - 31.08.20 - 10:46
(1) Действительно почему не через "Присоединить"  ?
   rudnitskij
 
5 - 31.08.20 - 10:56
"Соответственно мне сначала надо вывести Строка|Номер, затем присоединить справа название|интервалы и ниже времена|ИнтервалХ два раза" - "присоединить" и "ниже" в одном предложении удивили. Присоединяете вы всегда в текущей строке. А если
ТабДокумент.Вывести(Область)
то это с новой строки будет
   rudnitskij
 
6 - 31.08.20 - 10:56
Как вы код выделяете в тексте?
   Креатив
 
7 - 31.08.20 - 11:22
(3)В примерах СП так.
(4)Бог знает. Описание показалось мутным.
(5)Я указываю область, куда вставлять относительно первой ячейки. А со следующей строкой надо будет посмотреть.
   rudnitskij
 
8 - 31.08.20 - 11:25
(7) "Я указываю область, куда вставлять относительно первой ячейки" - первый раз такое слышу о формировании табличного документа. "Присоединить" присоединяет указанную область вплотную к выведенной ранее, никакого указанного места там нет
   Креатив
 
9 - 31.08.20 - 11:25
(1)Могут быть две секции Интервал1, либо две секции Интервал2, либо та и другая, но в разном порядке следования.
   Креатив
 
10 - 31.08.20 - 11:29
(8)ВставитьОбласть вставляет в любое место таблицы по абсолютному адресу. Так что работает.
Присоединить можно посмотреть, только придётся разбираться с уровнями. К первой ячейке мне нужно будет присоединять сначала длинный заголовок, а под ним короткие секции.
   RomanYS
 
11 - 31.08.20 - 11:30
(9) Никакой проблемы здесь нет, опреатор "Если" её решает.

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.