0
1dvd
15.11.13
✎
07:43
|
Задался сабжем и обнаружил, что "ТД1.Вывести(ТД2);" не всегда работает так, как надо. А точнее - всегда, когда в документах есть различные форматы строк(группы строк, в которых ширина одной или нескольких колонок отличается от других групп строк), работает не правильно.
Потратил около 6 часов на такую процедуру. Жду критики
// Процедура добавляет один сформированный табличный документ к другому
//
// Параметры:
// <ТабличныйДокументПриемник> - табличный документ, в который добавляется Табличный документ
// <ВставляемыйТабличныйДокумент> - табличный документ, вставляемый в приемник
Процедура ДобавитьТабличныйДокумент(ТабличныйДокументПриемник, ВставляемыйТабличныйДокумент)
Если ВставляемыйТабличныйДокумент = Неопределено Тогда
Возврат;
КонецЕсли;
НачалоНовогоТД = ТабличныйДокументПриемник.ВысотаТаблицы + 1;
//Разобъем вствляемый ТД на куски форматов строк
ТаблицаФорматовСтрок = Новый ТаблицаЗначений;
ТаблицаФорматовСтрок.Колонки.Добавить("ПерваяСтрока");
ТаблицаФорматовСтрок.Колонки.Добавить("ПоследняяСтрока");
ТаблицаФорматовСтрок.Колонки.Добавить("МассивЗначенийШирины");
//Чтобы узнать ширину колонки для каждой ячейки необходимо разъединить все объединенные ячейки
//А, т.к. вставляемый ТД нам не нужно изменять, создадим копию вставляемого ТД
ВременныйТабличныйДокумент = ВставляемыйТабличныйДокумент.ПолучитьОбласть();
ВременныйТабличныйДокумент.Область().Разъединить();
//Готовим таблицу, где будет храниться информация обо всех "группах" форматирования строк
ПредыдущиеШириныСтрокой = "";
Для НомерСтроки = 1 по ВременныйТабличныйДокумент.ВысотаТаблицы Цикл
МассивЗначенийШирины = Новый Массив;
Для НомерКолонки = 1 по ВременныйТабличныйДокумент.ШиринаТаблицы Цикл
МассивЗначенийШирины.Добавить(ВременныйТабличныйДокумент.Область(НомерСтроки, НомерКолонки).ШиринаКолонки);
КонецЦикла;
ТекущиеШириныСтрокой = ОбщегоНазначенияГКМ.Join(МассивЗначенийШирины, ";");
Если ТекущиеШириныСтрокой<>ПредыдущиеШириныСтрокой Тогда
Если ТаблицаФорматовСтрок.Количество()>0 Тогда
ТаблицаФорматовСтрок[ТаблицаФорматовСтрок.Количество() - 1].ПоследняяСтрока = НомерСтроки - 1;
КонецЕсли;
СтрокаФорматовСтрок = ТаблицаФорматовСтрок.Добавить();
СтрокаФорматовСтрок.ПерваяСтрока = НомерСтроки;
СтрокаФорматовСтрок.МассивЗначенийШирины = МассивЗначенийШирины;
КонецЕсли;
ПредыдущиеШириныСтрокой = ТекущиеШириныСтрокой;
КонецЦикла;
ТаблицаФорматовСтрок[ТаблицаФорматовСтрок.Количество() - 1].ПоследняяСтрока = НомерСтроки - 1;
//Теперь вставляем в Приемник вставляемую ТД кусками. Сразу же устанавливаем ширину колонок
Для Каждого СтрокаТаблицыФорматовСтрок Из ТаблицаФорматовСтрок Цикл
ПерваяСтрокаОбласти = НачалоНовогоТД + СтрокаТаблицыФорматовСтрок.ПерваяСтрока - 1;
ПоследняяСтрокаОбласти = НачалоНовогоТД + СтрокаТаблицыФорматовСтрок.ПоследняяСтрока - 1;
КусокВставляемогоТабличногоДокумента = ВставляемыйТабличныйДокумент.ПолучитьОбласть(СтрокаТаблицыФорматовСтрок.ПерваяСтрока,,СтрокаТаблицыФорматовСтрок.ПоследняяСтрока);
ОбластьИсточник = КусокВставляемогоТабличногоДокумента.Область();
ОбластьПриемник = ТабличныйДокументПриемник.Область(ПерваяСтрокаОбласти, , ПоследняяСтрокаОбласти, );
ТабличныйДокументПриемник.ВставитьОбласть(ОбластьИсточник, ОбластьПриемник);
ОбластьПриемник.СоздатьФорматСтрок();
Для Счетчик = 1 По КусокВставляемогоТабличногоДокумента.ШиринаТаблицы Цикл
ТабличныйДокументПриемник.Область(ПерваяСтрокаОбласти, Счетчик, ПоследняяСтрокаОбласти, Счетчик).ШиринаКолонки = СтрокаТаблицыФорматовСтрок.МассивЗначенийШирины[Счетчик - 1];
КонецЦикла;
КонецЦикла;
ТабличныйДокументПриемник.ВывестиГоризонтальныйРазделительСтраниц();
КонецПроцедуры // ДобавитьТабличныйДокумент
|
|
1
Гончар-А
13.12.13
✎
15:37
|
Очень помогло.
т.к
функции ОбщегоНазначенияГКМ.Join(МассивЗначенийШирины, ";")в моей конфигурации нет
заменил на
Функция ТекущиеШириныСтрокой(пМассив, разделитель = ";")
рез = "";
для Каждого стр из пМассив Цикл
рез = рез + стр + разделитель;
КонецЦикла;
Возврат рез;
КонецФункции
Жаль что группировки не сохраняются в выводимом документе (табличном поле)
|
|
2
1Сергей
13.12.13
✎
15:42
|
1Сергей = 1dvd
пардон, не обратил внимания.
Функция Join(Коллекция, Разделитель, Колонка = 0) Экспорт
Рез = "";
ТипКоллекции = ТипЗнч(Коллекция);
Если ТипКоллекции = Тип("Массив") Тогда
Для Каждого Элемент Из Коллекция Цикл
Рез = Рез + Разделитель + Элемент;
КонецЦикла;
ИначеЕсли ТипКоллекции = Тип("СписокЗначений") Тогда
Для Каждого Элемент Из Коллекция Цикл
Рез = Рез + Разделитель + Элемент.Представление;
КонецЦикла;
ИначеЕсли ТипКоллекции = Тип("ВыборкаИзРезультатаЗапроса") Тогда
Пока Коллекция.Следующий() Цикл
Рез = Рез + Разделитель + Коллекция[Колонка];
КонецЦикла;
Иначе
Для Каждого Элемент Из Коллекция Цикл
Рез = Рез + Разделитель + Элемент[Колонка];
КонецЦикла;
КонецЕсли;
Возврат Сред(Рез, СтрДлина(Разделитель) + 1);
КонецФункции
С группировками не сталкивался в этой конфе :(
Можно, наверно, допилить
|
|