1С 8.3 Объединение табличных документов (с разной шириной) - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

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С 8.3 (от Pустeм):
&После("Печать")
Процедура ДопПечать_Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)

   Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "РасходныйОрдер") Тогда

       ТабДок1 = ПечатьРасходногоОрдераНаТовары(МассивОбъектов, ОбъектыПечати);
       ТабДок2 = Обработки.ДопПечать_ПечатьРО.СформироватьРасходныйОрдер(МассивОбъектов, ОбъектыПечати, ПараметрыПечати);

       ДобавитьТабличныйДокумент(ТабДок1, ТабДок2);

       УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
       КоллекцияПечатныхФорм,
      "РасходныйОрдер",
       НСтр("ru = 'Расходный ордер на товары'"),
       ТабДок1);

   КонецЕсли;

КонецПроцедуры
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 09.01.2022
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому