Skip to content

Instantly share code, notes, and snippets.

@b4tman
Created January 19, 2022 06:53
Show Gist options
  • Save b4tman/d7b1ddb9af7ca18218afc87f04b1e846 to your computer and use it in GitHub Desktop.
Save b4tman/d7b1ddb9af7ca18218afc87f04b1e846 to your computer and use it in GitHub Desktop.
Объединение табличных документов с разным количеством колонок
// srcs:
// https://forum.mista.ru/topic.php?id=837711
// https://fastcode.im/Templates/7861
// Добавляет один сформированный табличный документ к другому
//
// Параметры:
// <ТабличныйДокументПриемник> - табличный документ, в который добавляется Табличный документ
// <ВставляемыйТабличныйДокумент> - табличный документ, вставляемый в приемник
Процедура ДобавитьТабличныйДокумент(ТабличныйДокументПриемник, ВставляемыйТабличныйДокумент)
Если ВставляемыйТабличныйДокумент = Неопределено Тогда
Возврат;
КонецЕсли;
НачалоНовогоТД = ТабличныйДокументПриемник.ВысотаТаблицы + 1;
//Разобъем вствляемый ТД на куски форматов строк
ТаблицаФорматовСтрок = Новый ТаблицаЗначений;
ТаблицаФорматовСтрок.Колонки.Добавить("ПерваяСтрока");
ТаблицаФорматовСтрок.Колонки.Добавить("ПоследняяСтрока");
ТаблицаФорматовСтрок.Колонки.Добавить("МассивЗначенийШирины");
//Чтобы узнать ширину колонки для каждой ячейки необходимо разъединить все объединенные ячейки
//А, т.к. вставляемый ТД нам не нужно изменять, создадим копию вставляемого ТД
ВременныйТабличныйДокумент = ВставляемыйТабличныйДокумент.ПолучитьОбласть();
ВременныйТабличныйДокумент.Область().Разъединить();
//Готовим таблицу, где будет храниться информация обо всех "группах" форматирования строк
ПредыдущиеШириныСтрокой = "";
Для НомерСтроки = 1 по ВременныйТабличныйДокумент.ВысотаТаблицы Цикл
МассивЗначенийШирины = Новый Массив;
Для НомерКолонки = 1 по ВременныйТабличныйДокумент.ШиринаТаблицы Цикл
МассивЗначенийШирины.Добавить(ВременныйТабличныйДокумент.Область(НомерСтроки, НомерКолонки).ШиринаКолонки);
КонецЦикла;
ТекущиеШириныСтрокой = ПолучитьЗначениеШириныСтрокой(МассивЗначенийШирины, ";");
Если ТекущиеШириныСтрокой<>ПредыдущиеШириныСтрокой Тогда
Если ТаблицаФорматовСтрок.Количество()>0 Тогда
ТаблицаФорматовСтрок[ТаблицаФорматовСтрок.Количество() - 1].ПоследняяСтрока = НомерСтроки - 1;
КонецЕсли;
СтрокаФорматовСтрок = ТаблицаФорматовСтрок.Добавить();
СтрокаФорматовСтрок.ПерваяСтрока = НомерСтроки;
СтрокаФорматовСтрок.МассивЗначенийШирины = МассивЗначенийШирины;
КонецЕсли;
ПредыдущиеШириныСтрокой = ТекущиеШириныСтрокой;
КонецЦикла;
ТаблицаФорматовСтрок[ТаблицаФорматовСтрок.Количество() - 1].ПоследняяСтрока = НомерСтроки - 1;
//Теперь вставляем в Приемник вставляемую ТД кусками. Сразу же устанавливаем ширину колонок
Для Каждого СтрокаТаблицыФорматовСтрок Из ТаблицаФорматовСтрок Цикл
ПерваяСтрокаОбласти = НачалоНовогоТД + СтрокаТаблицыФорматовСтрок.ПерваяСтрока - 1;
ПоследняяСтрокаОбласти = НачалоНовогоТД + СтрокаТаблицыФорматовСтрок.ПоследняяСтрока - 1;
КусокВставляемогоТабличногоДокумента = ВставляемыйТабличныйДокумент.ПолучитьОбласть(СтрокаТаблицыФорматовСтрок.ПерваяСтрока,,СтрокаТаблицыФорматовСтрок.ПоследняяСтрока);
ОбластьИсточник = КусокВставляемогоТабличногоДокумента.Область();
ОбластьПриемник = ТабличныйДокументПриемник.Область(ПерваяСтрокаОбласти, , ПоследняяСтрокаОбласти, );
ТабличныйДокументПриемник.ВставитьОбласть(ОбластьИсточник, ОбластьПриемник);
ОбластьПриемник.СоздатьФорматСтрок();
Для Счетчик = 1 По КусокВставляемогоТабличногоДокумента.ШиринаТаблицы Цикл
ТабличныйДокументПриемник.Область(ПерваяСтрокаОбласти, Счетчик, ПоследняяСтрокаОбласти, Счетчик).ШиринаКолонки = СтрокаТаблицыФорматовСтрок.МассивЗначенийШирины[Счетчик - 1];
КонецЦикла;
КонецЦикла;
ТабличныйДокументПриемник.ВывестиГоризонтальныйРазделительСтраниц();
КонецПроцедуры// ДобавитьТабличныйДокумент
Функция ПолучитьЗначениеШириныСтрокой(пМассив, разделитель = ";")
рез = "";
для Каждого стр из пМассив Цикл
рез = рез + стр + разделитель;
КонецЦикла;
Возврат рез;
КонецФункции
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment