Имя: Пароль:
1C
1С v8
Табличный документ с изменяемым количеством строк в присоединяемой области
0 vdeemer
 
08.09.15
10:50
Доброго времени суток!
Чего-то руки покривели и глазки подослепли(( Был многострочный табличный документ с присоединяемыми колонками, формировал его как обычно (присоединяя колонки и выводя строки). Сейчас задача усложнилась - количество строк в выводимой и присоединяемой областях стало изменяемым, т.е. саму выводимую область приходится формировать (тоже выводя и присоединяя). Вместо области

ТабДок = Новый ТабличныйДокумент;
ОбластьСС = Макет.ПолучитьОбласть("Строка|Столбец");
// Заполнение параметров области...
ТабДок.Вывести(ОбластьСС);
ТабДок.Присоединить(ОбластьСС);
)

формирую отдельный ТабличныйДокумент и оперирую им. Увы и ах - не выходит каменный цветок! В частности, не удается присоединить корректно (без сдвигов и разрывов) сформированные области. Число строк в областях одной строки становится известным на этапе ее формирования (т.е. по всем мега-колонкам в одной мега-строке число строк одинаково).
Спасибо.
1 Aprobator
 
08.09.15
11:00
В области где меньше строк пустые строки тоже выводи. Создай под этого отдельно макет пустой строки и всё.
2 vdeemer
 
08.09.15
11:13
(1) Пробовал, не выходит. Последней строкой в выводимой области будет строка из присоединенной ранее области, вот после нее и выводится доприсоединяемая область. Имеем сдвиг((
3 Aprobator
 
08.09.15
11:25
(2) Покажи кусок кода, как выводишь. Интересует как выводишь пустую часть строки и как получаешь её макет.
4 vdeemer
 
08.09.15
11:36
(3)

ВремТабДокумент = Новый ТабличныйДокумент;
ОбластьПроекта.Параметры.Заполнить(CтрокаПроекта.Проект);
ОбластьПроекта.Параметры.Проект = CтрокаПроекта.Проект;
ОбластьПроекта.Параметры.Позиция = CтрокаПроекта.Позиция;
ВремТабДокумент.Вывести(ОбластьПроекта);

// Сначала надо определить, сколько максимум задач в категории - именно столько будет строк в каждом проекте
МаксимумСтрокПроекта = 0;
Для каждого CтрокаКатегории из ТаблицыДанных.ТЗ_Категории Цикл
ЗаписиПоПроекту = ТаблицыДанных.РезультатЗапроса.НайтиСтроки(Новый Структура("Проект, Категория", CтрокаПроекта.Проект, CтрокаКатегории.Категория));
МаксимумСтрокПроекта = Макс(МаксимумСтрокПроекта, ЗаписиПоПроекту.Количество());
КонецЦикла; // Для каждого CтрокаКатегории из ТаблицыДанных.ТЗ_Категории
        
// В каждом проекте минимум 2 строки описания
ДобитьСтрок = Макс(2, МаксимумСтрокПроекта) - 2;
Для Сч = 1 По ДобитьСтрок Цикл
ВремТабДокумент.Вывести(ОбластьПустойСтрокиПроекта);
КонецЦикла;

// ТабДокумент - исходный документ для печати
ТабДокумент.Вывести(ВремТабДокумент);
    
Если ТаблицыДанных.ТЗ_Категории.Количество() = 0 Тогда
Возврат;
КонецЕсли;
    
Для каждого CтрокаКатегории из ТаблицыДанных.ТЗ_Категории Цикл
// Каждая категория в отдельный таб.документ, чтобы потом присоединить к имеющемуся
ВремТабДокумент = Новый ТабличныйДокумент;
ЗаписиПоПроекту = ТаблицыДанных.РезультатЗапроса.НайтиСтроки(Новый Структура("Проект, Категория", CтрокаПроекта.Проект, CтрокаКатегории.Категория));
СтруктураОбластиПечати = Новый Структура("Описание, ДатаПлан, ДатаФакт, Отставание", "", "", "", "");
        
ВсегоЗаписейПоКатегории = 0;
Для Каждого ЗаписьП из ЗаписиПоПроекту Цикл
// На каждую проектную задачу выводится отдельная строка, чтобы можно было форматировать область каждой задачи
// Чего не хватит до МаксимумСтрокПроекта, добьем пустой строкой ОбластьПустойСтроки
ВсегоЗаписейПоКатегории = ВсегоЗаписейПоКатегории + 1;
ЗаполнитьЗначенияСвойств(Область.Параметры,СтруктураОбластиПечати);
ВремТабДокумент.Вывести(Область);
КонецЦикла; // Для Каждого ЗаписьП из ЗаписиПоПроекту
ДобитьСтрок = Макс(ВсегоЗаписейПоКатегории, МаксимумСтрокПроекта);
Для Сч = 1 По ДобитьСтрок Цикл
ВремТабДокумент.Вывести(ОбластьПустойСтрокиПроекта);
КонецЦикла;
ТабДокумент.Присоединить(ВремТабДокумент);
КонецЦикла; // Для каждого CтрокаКатегории из ТЗ_Категории
5 vdeemer
 
08.09.15
11:37
(4) с форматированием косячок вышел
6 vdeemer
 
08.09.15
11:39
Самого главного не показал))
Это процедура

Процедура ВыводПроекта(ТаблицыДанных, CтрокаПроекта, ТабДокумент, ОбластьПроекта, Область, СтруктураПараметровНастройки, ОбластьПустойСтрокиПроекта, ОбластьПустойСтроки)

а вызываю ее так:

Макет = ПолучитьМакет("МакетОтчета");
ОбластьПроекта = Макет.ПолучитьОбласть("Строка|СтолбцыНаименования");
    ОбластьПустойСтроки = Макет.ПолучитьОбласть("СтрокаДиапазона|СтолбцыКатегории");
    ОбластьПустойСтрокиПроекта = Макет.ПолучитьОбласть("Пустаястрока|СтолбцыНаименования");
7 Aprobator
 
08.09.15
12:41
(6) добивание пустыми строками целиком по областям не получится, только непосредственно по строкам.
8 vdeemer
 
08.09.15
12:54
(7) Эт как?
9 Aprobator
 
08.09.15
13:02
(8) Насколько я понял, мы имеем дело с двумя таблицами данных.
У них разное количество строк и мы должны их вывести в одну таблицу. Соответственно, что мы должны обходить одновременно обе таблицы. Я правильно понял ситуацию то?
10 vdeemer
 
08.09.15
13:25
(9) Можно и так)) Если ближе к предметной области: есть список проектов, у которых есть проектные задачи (один ко многим). Каждая проектная задача имеет реквизит "категория". Отчет: таблица, в шапке которой перечислены категории, в первом столбце проекты, на пересечении строки проекта и столбца категории несколько проектных задач.
11 Aprobator
 
08.09.15
13:41
(10) так тебе колонки с пустыми категориями довесить надо?
12 vdeemer
 
08.09.15
13:41
(11) ага
13 vdeemer
 
08.09.15
13:41
снизу прицепить
14 Aprobator
 
08.09.15
13:43
колонки снизу? Это как?
15 vdeemer
 
08.09.15
14:05
не, строки)
Т.к. количество проектных задач какой-то категории может быть разным, то делаю так: 1) вычисляю максимальное количество задач в категории, 2) добиваю каждую область колонки отчета пустой строкой из макета до максимального количества строк.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший