1С 8.3 Объединение табличных документов (с разной шириной)
Данные > Примеры кода 1С > 1С 8.3 Табличный документ / Макет
Перейти в основной раздел:

При присоединении одного табличного документа к другому, если строки
имеют различную ширину, возможны смещения (сдвиги) печатных форм по
незапланированному сценарию. Данный метод позволяет исправить формат строк с
помощью СоздатьФорматСтрок(). При объединении нескольких печатных форм в одну -
создается новый формат строк.
Объединение печатной формы в 1С 8.3 (от eсhо77):
// Процедура ПрисоединитьТабличныйДокумент осуществляет вывод Присоединяемого документа под указанным
// С возможностью создания нового формата строк для всей области присоединяемого документа
// Удобно использовать, чтобы колонки различной ширины не разъезжались
//
// Параметры:
// ПриемникТаблДок - ТабличныйДокумент - документ, куда будут добавлены области присоединяемого документа
// ПередатчикТаблДок - ТабличныйДокумент/ОбластьЯчеекТабличногоДокумента - документ, который присоединяем
// СоздатьФорматСтрок - Булево - флаг, указывающий на то, что необходимо создать свой формат строк
//
Процедура ПрисоединитьТабличныйДокумент(ПриемникТаблДок, Знач ПередатчикТаблДок, Знач СоздатьФорматСтрок = Ложь) Экспорт
ВременныйТаблДок = Новый ТабличныйДокумент;
ОбластьЯчеек = ВременныйТаблДок.Вывести(ПередатчикТаблДок);
Если СоздатьФорматСтрок Тогда
ОбластьЯчеек.СоздатьФорматСтрок();
КонецЕсли;
ПриемникТаблДок.Вывести(ВременныйТаблДок);
КонецПроцедуры
// С возможностью создания нового формата строк для всей области присоединяемого документа
// Удобно использовать, чтобы колонки различной ширины не разъезжались
//
// Параметры:
// ПриемникТаблДок - ТабличныйДокумент - документ, куда будут добавлены области присоединяемого документа
// ПередатчикТаблДок - ТабличныйДокумент/ОбластьЯчеекТабличногоДокумента - документ, который присоединяем
// СоздатьФорматСтрок - Булево - флаг, указывающий на то, что необходимо создать свой формат строк
//
Процедура ПрисоединитьТабличныйДокумент(ПриемникТаблДок, Знач ПередатчикТаблДок, Знач СоздатьФорматСтрок = Ложь) Экспорт
ВременныйТаблДок = Новый ТабличныйДокумент;
ОбластьЯчеек = ВременныйТаблДок.Вывести(ПередатчикТаблДок);
Если СоздатьФорматСтрок Тогда
ОбластьЯчеек.СоздатьФорматСтрок();
КонецЕсли;
ПриемникТаблДок.Вывести(ВременныйТаблДок);
КонецПроцедуры
Пример соединение печатной формы документа в 1С 8.3:
// Добавляет один сформированный табличный документ к другому
//
// Параметры:
// - табличный документ, в который добавляется Табличный документ
// - табличный документ, вставляемый в приемник
Процедура ДобавитьТабличныйДокумент(ПриемникТаблДок, ПередатчикТаблДок)
Если ПередатчикТаблДок = Неопределено Тогда
Возврат;
КонецЕсли;
НачалоНовогоТД = ПриемникТаблДок.ВысотаТаблицы + 1;
//Разобъем вствляемый ТД на куски форматов строк
ФорматыСтрокТЗ = Новый ТаблицаЗначений;
ФорматыСтрокТЗ.Колонки.Добавить("ПерваяСтрока");
ФорматыСтрокТЗ.Колонки.Добавить("ПоследняяСтрока");
ФорматыСтрокТЗ.Колонки.Добавить("МассивЗначенийШирины");
//Чтобы узнать ширину колонки для каждой ячейки необходимо разъединить все объединенные ячейки
//А, т.к. вставляемый ТД нам не нужно изменять, создадим копию вставляемого ТД
ВременныйТаблДок = ПередатчикТаблДок.ПолучитьОбласть();
ВременныйТаблДок.Область().Разъединить();
//Готовим таблицу, где будет храниться информация обо всех "группах" форматирования строк
ПредыдущаяШиринаСтрокой = "";
Для НомерСтроки = 1 По ВременныйТаблДок.ВысотаТаблицы Цикл
МассивЗначенийШирины = Новый Массив;
Для НомерКолонки = 1 По ВременныйТаблДок.ШиринаТаблицы Цикл
МассивЗначенийШирины.Добавить(ВременныйТаблДок.Область(НомерСтроки, НомерКолонки).ШиринаКолонки);
КонецЦикла;
ШиринаСтрокой = ПолучитьШиринуСтрокой(МассивЗначенийШирины, ";");
Если ШиринаСтрокой<>ПредыдущаяШиринаСтрокой Тогда
Если ФорматыСтрокТЗ.Количество()>0 Тогда
ФорматыСтрокТЗ[ФорматыСтрокТЗ.Количество() - 1].ПоследняяСтрока = НомерСтроки - 1;
КонецЕсли;
ФорматыСтрокСтрока = ФорматыСтрокТЗ.Добавить();
ФорматыСтрокСтрока.ПерваяСтрока = НомерСтроки;
ФорматыСтрокСтрока.МассивЗначенийШирины = МассивЗначенийШирины;
КонецЕсли;
ПредыдущаяШиринаСтрокой = ШиринаСтрокой;
КонецЦикла;
ФорматыСтрокТЗ[ФорматыСтрокТЗ.Количество() - 1].ПоследняяСтрока = НомерСтроки - 1;
//Теперь вставляем в Приемник вставляемую ТД кусками. Сразу же устанавливаем ширину колонок
Для Каждого СтрокаФорматыТЗ Из ФорматыСтрокТЗ Цикл
ПерваяСтрокаОбласти = НачалоНовогоТД + СтрокаФорматыТЗ.ПерваяСтрока - 1;
ПоследняяСтрокаОбласти = НачалоНовогоТД + СтрокаФорматыТЗ.ПоследняяСтрока - 1;
КусокВставляемогоТабДок =
ПередатчикТаблДок.ПолучитьОбласть(СтрокаФорматыТЗ.ПерваяСтрока,,СтрокаФорматыТЗ.ПоследняяСтрока);
ОбластьИсточник = КусокВставляемогоТабДок.Область();
ОбластьПриемник = ПриемникТаблДок.Область(ПерваяСтрокаОбласти, , ПоследняяСтрокаОбласти, );
ПриемникТаблДок.ВставитьОбласть(ОбластьИсточник, ОбластьПриемник);
ОбластьПриемник.СоздатьФорматСтрок();
Для Счетчик = 1 По КусокВставляемогоТабДок.ШиринаТаблицы Цикл
ПриемникТаблДок.Область(ПерваяСтрокаОбласти, Счетчик, ПоследняяСтрокаОбласти, Счетчик).ШиринаКолонки =
СтрокаФорматыТЗ.МассивЗначенийШирины[Счетчик - 1];
КонецЦикла;
КонецЦикла;
ПриемникТаблДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецПроцедуры // ДобавитьТабличныйДокумент
Функция ПолучитьШиринуСтрокой(перМассив, разделитель = ";")
Рез = "";
Для Каждого Стр Из перМассив Цикл
Рез = Рез + стр + разделитель;
КонецЦикла;
Возврат Рез;
КонецФункции
//
// Параметры:
// - табличный документ, в который добавляется Табличный документ
// - табличный документ, вставляемый в приемник
Процедура ДобавитьТабличныйДокумент(ПриемникТаблДок, ПередатчикТаблДок)
Если ПередатчикТаблДок = Неопределено Тогда
Возврат;
КонецЕсли;
НачалоНовогоТД = ПриемникТаблДок.ВысотаТаблицы + 1;
//Разобъем вствляемый ТД на куски форматов строк
ФорматыСтрокТЗ = Новый ТаблицаЗначений;
ФорматыСтрокТЗ.Колонки.Добавить("ПерваяСтрока");
ФорматыСтрокТЗ.Колонки.Добавить("ПоследняяСтрока");
ФорматыСтрокТЗ.Колонки.Добавить("МассивЗначенийШирины");
//Чтобы узнать ширину колонки для каждой ячейки необходимо разъединить все объединенные ячейки
//А, т.к. вставляемый ТД нам не нужно изменять, создадим копию вставляемого ТД
ВременныйТаблДок = ПередатчикТаблДок.ПолучитьОбласть();
ВременныйТаблДок.Область().Разъединить();
//Готовим таблицу, где будет храниться информация обо всех "группах" форматирования строк
ПредыдущаяШиринаСтрокой = "";
Для НомерСтроки = 1 По ВременныйТаблДок.ВысотаТаблицы Цикл
МассивЗначенийШирины = Новый Массив;
Для НомерКолонки = 1 По ВременныйТаблДок.ШиринаТаблицы Цикл
МассивЗначенийШирины.Добавить(ВременныйТаблДок.Область(НомерСтроки, НомерКолонки).ШиринаКолонки);
КонецЦикла;
ШиринаСтрокой = ПолучитьШиринуСтрокой(МассивЗначенийШирины, ";");
Если ШиринаСтрокой<>ПредыдущаяШиринаСтрокой Тогда
Если ФорматыСтрокТЗ.Количество()>0 Тогда
ФорматыСтрокТЗ[ФорматыСтрокТЗ.Количество() - 1].ПоследняяСтрока = НомерСтроки - 1;
КонецЕсли;
ФорматыСтрокСтрока = ФорматыСтрокТЗ.Добавить();
ФорматыСтрокСтрока.ПерваяСтрока = НомерСтроки;
ФорматыСтрокСтрока.МассивЗначенийШирины = МассивЗначенийШирины;
КонецЕсли;
ПредыдущаяШиринаСтрокой = ШиринаСтрокой;
КонецЦикла;
ФорматыСтрокТЗ[ФорматыСтрокТЗ.Количество() - 1].ПоследняяСтрока = НомерСтроки - 1;
//Теперь вставляем в Приемник вставляемую ТД кусками. Сразу же устанавливаем ширину колонок
Для Каждого СтрокаФорматыТЗ Из ФорматыСтрокТЗ Цикл
ПерваяСтрокаОбласти = НачалоНовогоТД + СтрокаФорматыТЗ.ПерваяСтрока - 1;
ПоследняяСтрокаОбласти = НачалоНовогоТД + СтрокаФорматыТЗ.ПоследняяСтрока - 1;
КусокВставляемогоТабДок =
ПередатчикТаблДок.ПолучитьОбласть(СтрокаФорматыТЗ.ПерваяСтрока,,СтрокаФорматыТЗ.ПоследняяСтрока);
ОбластьИсточник = КусокВставляемогоТабДок.Область();
ОбластьПриемник = ПриемникТаблДок.Область(ПерваяСтрокаОбласти, , ПоследняяСтрокаОбласти, );
ПриемникТаблДок.ВставитьОбласть(ОбластьИсточник, ОбластьПриемник);
ОбластьПриемник.СоздатьФорматСтрок();
Для Счетчик = 1 По КусокВставляемогоТабДок.ШиринаТаблицы Цикл
ПриемникТаблДок.Область(ПерваяСтрокаОбласти, Счетчик, ПоследняяСтрокаОбласти, Счетчик).ШиринаКолонки =
СтрокаФорматыТЗ.МассивЗначенийШирины[Счетчик - 1];
КонецЦикла;
КонецЦикла;
ПриемникТаблДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецПроцедуры // ДобавитьТабличныйДокумент
Функция ПолучитьШиринуСтрокой(перМассив, разделитель = ";")
Рез = "";
Для Каждого Стр Из перМассив Цикл
Рез = Рез + стр + разделитель;
КонецЦикла;
Возврат Рез;
КонецФункции
Пример соединение печатной формы с помощью расширения 1С 8.3 (от Pустeм):
&После("Печать")
Процедура ДопПечать_Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "РасходныйОрдер") Тогда
ТабДок1 = ПечатьРасходногоОрдераНаТовары(МассивОбъектов, ОбъектыПечати);
ТабДок2 = Обработки.ДопПечать_ПечатьРО.СформироватьРасходныйОрдер(МассивОбъектов, ОбъектыПечати, ПараметрыПечати);
ДобавитьТабличныйДокумент(ТабДок1, ТабДок2);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"РасходныйОрдер",
НСтр("ru = 'Расходный ордер на товары'"),
ТабДок1);
КонецЕсли;
КонецПроцедуры
Процедура ДопПечать_Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "РасходныйОрдер") Тогда
ТабДок1 = ПечатьРасходногоОрдераНаТовары(МассивОбъектов, ОбъектыПечати);
ТабДок2 = Обработки.ДопПечать_ПечатьРО.СформироватьРасходныйОрдер(МассивОбъектов, ОбъектыПечати, ПараметрыПечати);
ДобавитьТабличныйДокумент(ТабДок1, ТабДок2);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"РасходныйОрдер",
НСтр("ru = 'Расходный ордер на товары'"),
ТабДок1);
КонецЕсли;
КонецПроцедуры
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник