Имя: Пароль:
1C
1С v8
Процедура объединения двух табличных документов
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);
КонецФункции


С группировками не сталкивался в этой конфе :(
Можно, наверно, допилить
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.