Перейти к основному содержимому

Управление разметкой табличного документа

В «1С:Шине» реализована поддержка управления размером ячеек и размещением текста в них.

Форматирование строк

У каждой строки табличного документа есть формат, и по умолчанию он общий для всех строк. Чтобы создать область ячеек с новым форматом строк, воспользуйтесь методом СоздатьНовыйФорматСтрок() типа ОбластьСтрок.

Например, создадим область с новым форматом для строк 2, 3 и 4:

знч Документ = новый ТабличныйДокумент()

// Для колонки 1 установим ширину 10
Документ.ПолучитьОбласть(1, 1, 1, 1).УстановитьШиринуКолонки(10)

// Выделим отдельную область из строк 2, 3 и 4 и создадим для нее новый формат строк
знч ОтдельнаяОбласть = Документ.ПолучитьСтроки(2, 4)
ОтдельнаяОбласть.СоздатьНовыйФорматСтрок()

// Для колонки 1 отдельной области установим ширину 50
Документ.ПолучитьОбласть(2, 1, 2, 1).УстановитьШиринуКолонки(50)

Если изменить ширину колонок в этой области, то в строках, которые не входят в эту область, ширина колонок не изменится:

знч ШиринаКолонки = Документ.ПолучитьОбласть(1, 1, 1, 1).ПолучитьШиринуКолонки()
// ШиринаКолонки: 10

Описание формата строк табличного документа содержится в объекте типа ФорматСтрокТабличногоДокумента. Объект этого типа возвращает метод ОбластьТабличногоДокумента.ПолучитьФорматСтрок(). Затем его можно использовать, чтобы установить формат строк другой области табличного документа с помощью метода ОбластьТабличногоДокумента.УстановитьФорматСтрок():

метод СкопироватьФорматСтрок(ТабличныйДокумент: ТабличныйДокумент, НомерСтрокиОбразца: Число, НомерСтрокиНазначения: Число)
// Получаем формат строк области-образца
знч ОбластьОбразец = ТабличныйДокумент.ПолучитьСтроки(НомерСтрокиОбразца, НомерСтрокиОбразца)
знч ФорматСтрок = ОбластьОбразец.ПолучитьФорматСтрок()

// Получаем область назначения и устанавливаем для нее формат строк области-образца
знч ОбластьНазначения = ТабличныйДокумент.ПолучитьСтроки(НомерСтрокиНазначения, НомерСтрокиНазначения)
ОбластьНазначения.УстановитьФорматСтрок(ФорматСтрок)
;

Форматирование текста

Для форматирования текста в ячейках табличного документа используйте методы типа ОбластьТабличногоДокумента. Например:

  • УстановитьПереносТекста()

    Область.УстановитьПереносТекста(ПереносТекстаТабличногоДокумента.Переносить)
  • УстановитьВыравниваниеПоГоризонтали()

    Область.УстановитьВыравниваниеПоГоризонтали(ВыравниваниеПоГоризонталиТабличногоДокумента.Центр)
  • УстановитьВыравниваниеПоВертикали()

    Область.УстановитьВыравниваниеПоВертикали(ВыравниваниеПоВертикалиТабличногоДокумента.Верх)
  • УстановитьЦветТекста()

    Область.УстановитьЦветТекста(новый АбсолютныйЦвет(0, 0, 0))
  • УстановитьШрифтТекста()

    Область.УстановитьШрифт(новый ШрифтОбластиТабличногоДокумента(новый АбсолютныйШрифт("Arial", 10, Истина)))

Работа с областями табличного документа

«1С:Шина» предоставляет следующие методы для работы с областями табличного документа:

  • ПолучитьИменованныеОбласти() типа ТабличныйДокумент — возвращает все именованные области табличного документа;
  • ПолучитьИменаПараметровИШаблонов() типа ОбластьТабличногоДокумента — возвращает имена параметров и шаблонов, используемых в ячейках области табличного документа.

Рассмотрим следующие примеры.

Проверка наличия области подписи в табличном документе

метод ВМакетеЕстьОбластьПодписи(Макет: ТабличныйДокумент): Булево
// Получаем все именованные области макета
знч Области = Макет.ПолучитьИменованныеОбласти()

// Ищем область с именем "ОбластьПодписи"
для Область из Области
если Область.Имя == "ОбластьПодписи"
возврат Истина
;
;

// Возвращаем Ложь, если область подписи не найдена
возврат Ложь
;

Получение имен параметров области по заданному условию

метод ПолучитьИменаПараметровЭЦП(Область: ОбластьТабличногоДокумента): Массив<Строка>
// Получаем имена параметров и шаблонов заданной области
знч ИменаПараметров = Область.ПолучитьИменаПараметровИШаблонов()

знч Результат = новый Массив<Строка>()

// Ищем параметр, имя которого начинается с "ЭЦП_"
для ИмяПараметра из ИменаПараметров
если ИмяПараметра.НачинаетсяС("ЭЦП_")
Результат.Добавить(ИмяПараметра)
;
;

возврат Результат
;

Пример добавления штампа в табличный документ

В этом примере мы добавим штамп с информацией об электронной цифровой подписи к произвольному пользовательскому документу, используя возможности форматирования строк табличного документа.

Штамп будет иметь размер 8 строк и 5 колонок, включая колонку перед штампом:

Заявление со штампом

Параметры исходного заявления и штампа зададим с помощью структур:

структура Заявление
пер ЧислоСтрок: Число = 5
пер ЧислоКолонок: Число = 5
;

структура СтруктураШтампа
пер ЧислоСтрок: Число = 8
пер ЧислоКолонок: Число = 5

пер ШиринаКолонок: ЧитаемыйМассив<Число> = [1.25, 1.13, 10.88, 24.75, 1.88]
// Задаем высоту только для тех строк, для которых не подходит значение по умолчанию
пер ВысотаСтрок: ЧитаемоеСоответствие<Число, Число> = {1: 5, 3: 6, 8: 5}

// Левая верхняя ячейка штампа
обз пер ПерваяСтрока: Число
обз пер ПерваяКолонка: Число

// Номера строк штампа, в которых располагаются соответствующие записи
пер Содержимое: ЧитаемоеСоответствие<Строка, Число> = {
"Заголовок": 1,
"Владелец": 3,
"ИНН": 4,
"Сертификат": 5,
"Период": 6}

// Номера колонок, в которых располагается Название и Значение записи
пер КолонкаНазвание: Число = 2
пер КолонкаЗначение: Число = 3
;

В методе ШтампНаЗаявление() установим ширину колонок и высоту строк штампа и выведем штамп:

метод ШтампНаЗаявление(Шаблон: Байты, ПутьКФайлу: Строка)
// Создадим структуру заявления со значениями по умолчанию
пер Заявление = новый Заявление()

// Считываем пользовательское заявление и выводим его в итоговый документ
знч Макет = ТабличныйДокумент.Прочитать(Шаблон)
знч ОбластьЗаявления = Макет.ПолучитьОбласть(1, 1, Заявление.ЧислоСтрок, Заявление.ЧислоКолонок)

знч Результат = новый ТабличныйДокумент()
Результат.Запись.ВывестиВертикально(ОбластьЗаявления)

// Создадим штамп
пер Штамп = новый СтруктураШтампа(ПерваяСтрока = Заявление.ЧислоСтрок + 1, ПерваяКолонка = 1)

// Создаем новый формат строк для области штампа
пер ОбластьЭЦП = Результат.ПолучитьСтроки(Штамп.ПерваяСтрока, Штамп.ПерваяСтрока + Штамп.ЧислоСтрок - 1)
ОбластьЭЦП.СоздатьНовыйФорматСтрок()

// Устанавливаем ширину колонок в штампе
для Колонка = 1 по Штамп.ЧислоКолонок
Результат.ПолучитьОбласть(Штамп.ПерваяСтрока, Колонка, Штамп.ПерваяСтрока, Колонка).УстановитьШиринуКолонки(Штамп.ШиринаКолонок[Колонка - 1])
;

// Устанавливаем высоту строк в штампе
для Строка из Штамп.ВысотаСтрок.Ключи()

Результат.ПолучитьСтроки(Штамп.ПерваяСтрока + Строка - 1, Штамп.ПерваяСтрока + Строка - 1).УстановитьВысотуСтроки(Штамп.ВысотаСтрок[Строка])
;

// Выводим штамп
ВывестиШтамп(Результат, Штамп)

// Записываем получившийся табличный документ в файл
Результат.Записать(ПутьКФайлу)
;

Метод для вывода штампа может выглядеть следующим образом:

метод ВывестиШтамп(Документ: ТабличныйДокумент, Штамп: СтруктураШтампа)
// Получаем область штампа и обводим ее
пер ГраницаРамки = новый ГраницаЯчейкиТабличногоДокумента(ВидГраницыЯчейкиТабличногоДокумента.Двойная, 1)

пер ОбластьШтампа = Документ.ПолучитьОбласть(
Штамп.ПерваяСтрока,
Штамп.ПерваяКолонка + 1,
Штамп.ПерваяСтрока + Штамп.ЧислоСтрок - 1,
Штамп.ПерваяКолонка + Штамп.ЧислоКолонок - 1
)
ОбластьШтампа.УстановитьЦветРамки(ПолучитьЦвет())
ОбластьШтампа.Обвести(ГраницаРамки, ГраницаРамки, ГраницаРамки, ГраницаРамки)

// Заполняем штамп
пер Заголовок = Документ.ПолучитьОбласть(
Штамп.ПерваяСтрока + Штамп.Содержимое["Заголовок"],
Штамп.ПерваяКолонка + Штамп.КолонкаНазвание,
Штамп.ПерваяСтрока + Штамп.Содержимое["Заголовок"],
Штамп.ПерваяКолонка + Штамп.КолонкаЗначение)
Заголовок.ОбъединитьЯчейки()
Заголовок.УстановитьТекст("Документ подписан" + Символы.НОВАЯ_СТРОКА + "электронной подписью")
Заголовок.УстановитьШрифт(
новый ШрифтОбластиТабличногоДокумента(новый АбсолютныйШрифт("Arial", 10, Истина))
)
Заголовок.УстановитьЦветТекста(ПолучитьЦвет())
Заголовок.УстановитьВыравниваниеПоГоризонтали(ВыравниваниеПоГоризонталиТабличногоДокумента.Центр)

ЗаписатьФорматированноеЗначение(Документ.ПолучитьОбласть("R%{Штамп.ПерваяСтрока + Штамп.Содержимое["Владелец"]}C%{Штамп.ПерваяКолонка + Штамп.КолонкаНазвание}"), "Владелец:")
ЗаписатьФорматированноеЗначение(Документ.ПолучитьОбласть("R%{Штамп.ПерваяСтрока + Штамп.Содержимое["Владелец"]}C%{Штамп.ПерваяКолонка + Штамп.КолонкаЗначение}"), "Иванов Иван Иванович")

ЗаписатьФорматированноеЗначение(Документ.ПолучитьОбласть("R%{Штамп.ПерваяСтрока + Штамп.Содержимое["ИНН"]}C%{Штамп.ПерваяКолонка + Штамп.КолонкаНазвание}"), "ИНН:")
ЗаписатьФорматированноеЗначение(Документ.ПолучитьОбласть("R%{Штамп.ПерваяСтрока + Штамп.Содержимое["ИНН"]}C%{Штамп.ПерваяКолонка + Штамп.КолонкаЗначение}"), "717880655582")

ЗаписатьФорматированноеЗначение(Документ.ПолучитьОбласть("R%{Штамп.ПерваяСтрока + Штамп.Содержимое["Сертификат"]}C%{Штамп.ПерваяКолонка + Штамп.КолонкаНазвание}"), "Сертификат:")
ЗаписатьФорматированноеЗначение(Документ.ПолучитьОбласть("R%{Штамп.ПерваяСтрока + Штамп.Содержимое["Сертификат"]}C%{Штамп.ПерваяКолонка + Штамп.КолонкаЗначение}"), "120998200991982888282")

ЗаписатьФорматированноеЗначение(Документ.ПолучитьОбласть("R%{Штамп.ПерваяСтрока + Штамп.Содержимое["Период"]}C%{Штамп.ПерваяКолонка + Штамп.КолонкаНазвание}"), "Период:")
ЗаписатьФорматированноеЗначение(Документ.ПолучитьОбласть("R%{Штамп.ПерваяСтрока + Штамп.Содержимое["Период"]}C%{Штамп.ПерваяКолонка + Штамп.КолонкаЗначение}"), "23.03.2023 - 22.03.2024")
;

метод ЗаписатьФорматированноеЗначение(Область: ОбластьТабличногоДокумента, Заголовок: Строка)
Область.УстановитьТекст(Заголовок)
Область.УстановитьЦветТекста(ПолучитьЦвет())
;

метод ПолучитьЦвет(): АбсолютныйЦвет
возврат новый АбсолютныйЦвет(83, 106, 194)
;

В результате получаем исходный документ пользователя со штампом:

Заявление со штампом