Для этого воспользуемся стандартным механизмом : "Настройка колонтитулов" (Сервис/Настройка колонтитулов). Придеться добавить доп. функционал , не испортив старого.
Здесь мы добавили возможность выбора конкретного отчета , для которого будут применяться настройки, а так же дополниельные настрйки из созданного нами нового перечисления с макетом: "РазделыОтчётов"
Создадим и заполним новый регистр сведений для хранения имеющих право подписи: "ДопРазделыОтчётов"
Теперь нам осталось внести изменения только в процедуру "УстановитьКолонтитулыПоУмолчанию" общего модуля "УправлениеОтчетами".
В модули отчетов и в макеты никаких изменений вносить не требуется (для стандартного механизма печати колонтитулов вызов вышеуказанной процедуры уже во всех отчетах присутствует).
Организация берется из параметров текущего пользователя.
тзПечатьСтраниц в параметрах - это таблица для расширения данного алгоритма на печать подписей в документах, а так же, если потребуется, печать подписей на каждой странице (в данный момент, печать подписей в документах не реализована).
Код , примерно, такой:
// Установка колонтитулов для отчета
//
// Параметры
// ТабличныйДокумент – ТабличныйДокумент – Отчет, у которого необходимо установить колонтитулы
// НазваниеОтчета – Строка – Название отчета для вывода в колонтитул
// Пользователь – Строка – Имя пользователя для вывода в колонтитул
//
Процедура УстановитьКолонтитулыПоУмолчанию(ТабличныйДокумент, НазваниеОтчета, Пользователь, Дата = Неопределено,тзПечатьСтраниц=Неопределено) Экспорт
Перем КолСтрокВсего,КолСтраниц;
КолСтрокВсего = 0;
КолСтраниц = 0;
Настройка = ПолучитьНастройкиКолонтитулов();
Если НЕ тзПечатьСтраниц = Неопределено Тогда
Если тзПечатьСтраниц.Количество() > 0 Тогда
тзПечатьСтраниц.Сортировать("Отчёт Возр,НомерСтраницы Возр");
СтруктураПоиска = Новый Структура("Отчёт", НазваниеОтчета);
МассивНайденныхСтрок = тзПечатьСтраниц.НайтиСтроки(СтруктураПоиска);
Если МассивНайденныхСтрок.Количество()> 0 Тогда
КолСтрокВсего = МассивНайденныхСтрок[МассивНайденныхСтрок.ВГраница()].ВсегоРазмер;
КолСтраниц = МассивНайденныхСтрок[МассивНайденныхСтрок.ВГраница()].НомерСтраницы;
КонецЕсли;
Если ТабличныйДокумент.ВысотаТаблицы <= КолСтрокВсего Тогда
//начали с начала
тзПечатьСтраниц.Очистить();
КонецЕсли;
КонецЕсли;
Если тзПечатьСтраниц.Количество() = 0 Тогда
НоваяСтрока = тзПечатьСтраниц.Добавить();
НоваяСтрока.НомерСтраницы = 0;
НоваяСтрока.Отчёт = НазваниеОтчета;
НоваяСтрока.ВсегоРазмер = 0;
КолСтрокВсего = 0;
КолСтраниц = 0;
КонецЕсли;
НоваяСтрока = тзПечатьСтраниц.Добавить();
НоваяСтрока.НомерСтраницы = КолСтраниц+1;
НоваяСтрока.Отчёт = НазваниеОтчета;
НоваяСтрока.ВсегоРазмер = 0;
КонецЕсли;
//ищим имя объекта по синониму
Синоним = СокрЛП(НазваниеОтчета);
Имя = "";
номСимв = Найти(Синоним,"[");
Если номСимв > 0 Тогда
Синоним = СокрЛП(Лев(Синоним,номСимв-1));
КонецЕсли;
Если НЕ ПустаяСтрока(Синоним) Тогда
Для Каждого ДокументМет из Метаданные.Документы Цикл
Если СокрЛП(ДокументМет.Синоним) = Синоним Тогда
Имя = "Документ"+СокрЛП(ДокументМет.Имя);
Прервать;//->Для Каждого ДокументМет из Метаданные.Документы Цикл
КонецЕсли;
Если Найти(СокрЛП(ДокументМет.Синоним),Синоним) > 0 Тогда
Имя = "Документ"+СокрЛП(ДокументМет.Имя);
Прервать;//->Для Каждого ДокументМет из Метаданные.Документы Цикл
КонецЕсли;
КонецЦикла;
Если ПустаяСтрока(Имя) Тогда
Для Каждого ОтчетМет из Метаданные.Отчеты Цикл
Если СокрЛП(ОтчетМет.Синоним) = Синоним Тогда
Имя = "Отчет"+СокрЛП(ОтчетМет.Имя);
Прервать;//Для Каждого ОтчетМет из Метаданные.Отчеты Цикл
КонецЕсли;
Если Найти(СокрЛП(ОтчетМет.Синоним),Синоним) > 0 Тогда
Имя = "Отчет"+СокрЛП(ОтчетМет.Имя);
Прервать;//Для Каждого ОтчетМет из Метаданные.Отчеты Цикл
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если НЕ ПустаяСтрока(Имя) Тогда
Если Настройка.Свойство("ПодписиМакетов") Тогда
ПодписиМакетов = Настройка["ПодписиМакетов"];
Если ПодписиМакетов.Свойство(Имя) Тогда
Если (ПодписиМакетов[Имя].ВерхнийКолонтитул.Выводить) или (ПодписиМакетов[Имя].НижнийКолонтитул.Выводить) Тогда
Настройка = ПодписиМакетов[Имя];
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ШиринаСимвола = 1;
ШиринаДокумента = ТабличныйДокумент.ШиринаТаблицы;
ВысотаДокумента = ТабличныйДокумент.ВысотаТаблицы;
тзСрезПоследних = РегистрыСведений.ДопРазделыОтчётов.СрезПоследних(?((Дата = Неопределено) или (Дата = Дата(1, 1, 1)),РабочаяДата,Дата),);
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| НастройкиПользователей.Значение как Организация
|ИЗ
| РегистрСведений.НастройкиПользователей КАК НастройкиПользователей
| ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.НастройкиПользователей КАК НастройкиПользователей1
| ПО НастройкиПользователей.Настройка = НастройкиПользователей1.Ссылка
|ГДЕ
| НастройкиПользователей.Пользователь = &Пользователь
| И НастройкиПользователей.Настройка = &Организация";
Запрос.УстановитьПараметр("Пользователь", ПараметрыСеанса.ТекущийПользователь);
Запрос.УстановитьПараметр("Организация",ПланыВидовХарактеристик.НастройкиПользователей.ОсновнаяОрганизация);
тзРезультат = Новый ТаблицаЗначений;
тзРезультат = Запрос.Выполнить().Выгрузить();
Организация = Справочники.Организации.ПустаяСсылка();
Если тзРезультат.Количество()>0 Тогда
Если НЕ тзРезультат[0]["Организация"] = Неопределено тогда
Если НЕ тзРезультат[0]["Организация"].Пустая() тогда
Организация = тзРезультат[0]["Организация"].Ссылка;
КонецЕсли;
КонецЕсли;
КонецЕсли;
//***МЕТКА1
ОтступСлева = 0;
ОтступСправа = 0;
ОтступСверху = 0;
ВысотаПодписи = 0;
ВысотаПодписиВсего = 0;
ВысотаПодписиТек = 0;
ШиринаПодписиВсего = 40;
//вверх - лево
ПерваяОрганизация = Справочники.Организации.ПустаяСсылка();
Если Настройка.ВерхнийКолонтитул.Свойство("ТекстСлева") //Если Настройка.ВерхнийКолонтитул.Свойство("ТекстСлева") Тогда
Для Сч = 0 По Перечисления.РазделыОтчётов.Количество()-1 //Для Сч = 0 По Перечисления.РазделыОтчётов.Количество()-1 Цикл
ВыбЭлемент = Перечисления.РазделыОтчётов.Получить(Сч).Метаданные().ЗначенияПеречисления[Сч].Имя;
Если (Найти(Настройка.ВерхнийКолонтитул.ТекстСлева,"[&"+СокрЛП(ВыбЭлемент)+"]")>0) и (Настройка.ВерхнийКолонтитул.Выводить) Тогда
Синоним = Перечисления.РазделыОтчётов.Получить(Сч).Метаданные().ЗначенияПеречисления[Сч].Синоним;
Отбор = Новый Структура;
Отбор.Вставить("РазделОтчёта",Перечисления.РазделыОтчётов.Получить(Сч));
Если НЕ Организация.Пустая() Тогда
Отбор.Вставить("Организация",Организация);
КонецЕсли;
МассивСтрок = тзСрезПоследних.НайтиСтроки(Отбор);
ОтступСверху = КолСтрокВсего;
ПерваяОрганизация = Справочники.Организации.ПустаяСсылка();
ИтоговыйДокумент = Новый ТекстовыйДокумент;
ИтоговыйДокумент.Очистить();
Макет = Перечисления.РазделыОтчётов.ПолучитьМакет("МакетТекст");
обМакет = Макет.ПолучитьОбласть("Заголовок");
обМакет.Параметры.Заголовок = СокрЛП(Синоним);
ИтоговыйДокумент.Вывести(обМакет);
обМакет = Макет.ПолучитьОбласть("Раздел");
ОтступСлева = 0;
//ОтступСправа = Макс(ШиринаДокумента - РазмерОбласти,0);
ОтступСправа = Макс(ШиринаДокумента - 1,0);
//вывожу элементы
Для Каждого строкаТЗ ИЗ МассивСтрок Цикл
Если ПерваяОрганизация.Пустая() Тогда
ПерваяОрганизация = строкаТЗ.Организация;
КонецЕсли;
Если ПерваяОрганизация <> строкаТЗ.Организация Тогда
Продолжить;
КонецЕсли;
ФИО = "";
Если НЕ строкаТЗ.ФизЛицо.Пустая() Тогда
ФИО = СокрЛП(строкаТЗ.ФизЛицо.Наименование);
КонецЕсли;
Инициалы ="";
МассивФИО = ОбщегоНазначения.ПолучитьМассивФИО(ФИО);
Если (НЕ ПустаяСтрока(МассивФИО[1])) И (НЕ ПустаяСтрока(МассивФИО[2])) Тогда
Инициалы =" "+Лев(МассивФИО[1],1) + "." + Лев(МассивФИО[2],1)+".";
КонецЕсли;
ФИО = СокрЛП(МассивФИО[0] + Инициалы);
обМакет.Параметры.Должность = СокрЛП(строкаТЗ.Должность);
обМакет.Параметры.ФИО = ФИО;
ИтоговыйДокумент.Вывести(обМакет);
КонецЦикла;
обТД = ТабличныйДокумент.Область(ОтступСверху+1,1,ОтступСверху+2,ШиринаДокумента);
ТабДок = Новый ТабличныйДокумент;
обТДИсточник = ТабДок.Область(ОтступСверху+1,1,ОтступСверху+2,ШиринаДокумента);
ТабличныйДокумент.ВставитьОбласть(обТДИсточник,обТД,ТипСмещенияТабличногоДокумента.ПоВертикали,Ложь);
обТД = ТабличныйДокумент.Область(ОтступСверху+1,1,ОтступСверху+1,1);
обТД.Текст = ИтоговыйДокумент.ПолучитьТекст();
обТД.Шрифт = Новый Шрифт(обТДИсточник.Шрифт,"Courier",8,Ложь,Ложь,Ложь,Ложь);
обТД.ВертикальноеПоложение = ВертикальноеПоложение.Верх;
обТД1 = ТабличныйДокумент.Область(,,,);
обТД1.ВысотаСтроки = 0;
Настройка.ВерхнийКолонтитул.ТекстСлева = СтрЗаменить(Настройка.ВерхнийКолонтитул.ТекстСлева,"[&"+СокрЛП(ВыбЭлемент)+"]","");
ВысотаПодписиВсего = ВысотаПодписиВсего + 1;
КонецЕсли;
КонецЦикла;//Для Сч = 0 По Перечисления.РазделыОтчётов.Количество()-1 Цикл
КонецЕсли;//Если Настройка.ВерхнийКолонтитул.Свойство("ТекстСлева") Тогда
//***МЕТКА2
//вверх - центр
ВысотаПодписи = ?(ВысотаПодписиВсего>0,2*ВысотаПодписиВсего-2,0);
Если Настройка.ВерхнийКолонтитул.Свойство("ТекстВЦентре") Тогда
Для Сч = 0 По Перечисления.РазделыОтчётов.Количество()-1 Цикл
ВыбЭлемент = Перечисления.РазделыОтчётов.Получить(Сч).Метаданные().ЗначенияПеречисления[Сч].Имя;
Если (Найти(Настройка.ВерхнийКолонтитул.ТекстВЦентре,"[&"+СокрЛП(ВыбЭлемент)+"]")>0) и (Настройка.ВерхнийКолонтитул.Выводить) Тогда
Синоним = Перечисления.РазделыОтчётов.Получить(Сч).Метаданные().ЗначенияПеречисления[Сч].Синоним;
Отбор = Новый Структура;
Отбор.Вставить("РазделОтчёта",Перечисления.РазделыОтчётов.Получить(Сч));
Если НЕ Организация.Пустая() Тогда
Отбор.Вставить("Организация",Организация);
КонецЕсли;
МассивСтрок = тзСрезПоследних.НайтиСтроки(Отбор);
ОтступСверху = КолСтрокВсего;
ОтступСлева = 0;
ОтступСправа = 0;
//найдем ширину документа в средних символах:
ШиринаДокументаВСимволах = 0;
Для СчЯчейка = 1 По ШиринаДокумента Цикл
обТД = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху+1,СчЯчейка,ВысотаПодписи + ОтступСверху+1,СчЯчейка);
ШиринаДокументаВСимволах= ШиринаДокументаВСимволах + окр(обТД.ШиринаКолонки,0,1);
КонецЦикла;
ЛеваяГраница = 1;
ПраваяГраница = ШиринаДокумента;
ШагВперёд = Истина;
ТекШирина = ШиринаДокументаВСимволах;
Пока (ПраваяГраница > ЛеваяГраница) и (ТекШирина > ШиринаПодписиВсего*ШиринаСимвола) Цикл
//слева шагаем
Если ШагВперёд Тогда
обШаг = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху + 1,ЛеваяГраница,ВысотаПодписи + ОтступСверху+1,ЛеваяГраница);
ШагШирина = окр(обШаг.ШиринаКолонки,0,1);
ЛеваяГраница = ЛеваяГраница+1;
ТекШирина = ТекШирина - ШагШирина;
КонецЕсли;
//справа шагаем
Если НЕ ШагВперёд Тогда
обШаг = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху + 1,ПраваяГраница,ВысотаПодписи + ОтступСверху+1,ПраваяГраница);
ШагШирина = окр(обШаг.ШиринаКолонки,0,1);
ПраваяГраница = ПраваяГраница - 1;
ТекШирина = ТекШирина - ШагШирина;
КонецЕсли;
ШагВперёд = НЕ ШагВперёд;
КонецЦикла;
ОтступСлева = ЛеваяГраница - 1;
ОтступСправа = ШиринаДокумента - ПраваяГраница;
ПерваяОрганизация = Справочники.Организации.ПустаяСсылка();
ИтоговыйДокумент = Новый ТекстовыйДокумент;
ИтоговыйДокумент.Очистить();
Макет = Перечисления.РазделыОтчётов.ПолучитьМакет("МакетТекст");
обМакет = Макет.ПолучитьОбласть("Заголовок");
обМакет.Параметры.Заголовок = СокрЛП(Синоним);
ИтоговыйДокумент.Вывести(обМакет);
обМакет = Макет.ПолучитьОбласть("Раздел");
Для Каждого строкаТЗ ИЗ МассивСтрок Цикл
Если ПерваяОрганизация.Пустая() Тогда
ПерваяОрганизация = строкаТЗ.Организация;
КонецЕсли;
Если ПерваяОрганизация <> строкаТЗ.Организация Тогда
Продолжить;
КонецЕсли;
ФИО = "";
Если НЕ строкаТЗ.ФизЛицо.Пустая() Тогда
ФИО = СокрЛП(строкаТЗ.ФизЛицо.Наименование);
КонецЕсли;
Инициалы ="";
МассивФИО = ОбщегоНазначения.ПолучитьМассивФИО(ФИО);
Если (НЕ ПустаяСтрока(МассивФИО[1])) И (НЕ ПустаяСтрока(МассивФИО[2])) Тогда
Инициалы =" "+Лев(МассивФИО[1],1) + "." + Лев(МассивФИО[2],1)+".";
КонецЕсли;
ФИО = СокрЛП(МассивФИО[0] + Инициалы);
обМакет.Параметры.Должность = СокрЛП(строкаТЗ.Должность);
обМакет.Параметры.ФИО = ФИО;
ИтоговыйДокумент.Вывести(обМакет);
КонецЦикла;
ТабДок = Новый ТабличныйДокумент;
Если (ВысотаПодписиТек < ВысотаПодписиВсего) и (ВысотаПодписиВсего <> 0) Тогда
обТД = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху + 1,ОтступСлева + 1,ВысотаПодписи + ОтступСверху + 2,ШиринаДокумента);
обТДИсточник = ТабДок.Область(ОтступСверху+1,ОтступСлева + 1,ОтступСверху+2,ШиринаДокумента);
ТабличныйДокумент.ВставитьОбласть(обТДИсточник,обТД,ТипСмещенияТабличногоДокумента.БезСмещения,Ложь);
Иначе
обТД = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху + 1,1,ВысотаПодписи + ОтступСверху + 2,ШиринаДокумента);
обТДИсточник = ТабДок.Область(ОтступСверху+1,1,ОтступСверху+2,ШиринаДокумента);
ТабличныйДокумент.ВставитьОбласть(обТДИсточник,обТД,ТипСмещенияТабличногоДокумента.ПоВертикали,Ложь);
КонецЕсли;
обТД = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху+1,ОтступСлева + 1,ВысотаПодписи + ОтступСверху+1,ОтступСлева + 1);
обТД.Текст = ИтоговыйДокумент.ПолучитьТекст();
обТД.Шрифт = Новый Шрифт(обТДИсточник.Шрифт,"Courier",8,Ложь,Ложь,Ложь,Ложь);
обТД.ВертикальноеПоложение = ВертикальноеПоложение.Верх;
обТД1 = ТабличныйДокумент.Область(,,,);
обТД1.ВысотаСтроки = 0;
Настройка.ВерхнийКолонтитул.ТекстВЦентре = СтрЗаменить(Настройка.ВерхнийКолонтитул.ТекстСлева,"[&"+СокрЛП(ВыбЭлемент)+"]","");
ВысотаПодписиТек = ВысотаПодписиТек + 1;
Если ВысотаПодписиТек >= ВысотаПодписиВсего Тогда
ВысотаПодписи = 0;
Иначе
ВысотаПодписи = 2*(ВысотаПодписиВсего-ВысотаПодписиТек)-2;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ВысотаПодписиВсего = Макс(ВысотаПодписиТек,ВысотаПодписиВсего);
ВысотаПодписиТек = 0;
ВысотаПодписи = ?(ВысотаПодписиВсего>0,2*ВысотаПодписиВсего-2,0);
//***МЕТКА3
//вверх - право
Если Настройка.ВерхнийКолонтитул.Свойство("ТекстСправа") Тогда
Для Сч = 0 По Перечисления.РазделыОтчётов.Количество()-1 Цикл
ВыбЭлемент = Перечисления.РазделыОтчётов.Получить(Сч).Метаданные().ЗначенияПеречисления[Сч].Имя;
Если (Найти(Настройка.ВерхнийКолонтитул.ТекстСправа,"[&"+СокрЛП(ВыбЭлемент)+"]")>0) и (Настройка.ВерхнийКолонтитул.Выводить) Тогда
Синоним = Перечисления.РазделыОтчётов.Получить(Сч).Метаданные().ЗначенияПеречисления[Сч].Синоним;
Отбор = Новый Структура;
Отбор.Вставить("РазделОтчёта",Перечисления.РазделыОтчётов.Получить(Сч));
Если НЕ Организация.Пустая() Тогда
Отбор.Вставить("Организация",Организация);
КонецЕсли;
МассивСтрок = тзСрезПоследних.НайтиСтроки(Отбор);
ОтступСлева = 0;
ОтступСправа = 0;
ОтступСверху = КолСтрокВсего;
ШиринаВсего = 0;
НомЯчейки = ШиринаДокумента + 1;
Для СчЯчейки = - ШиринаДокумента По -1 Цикл
НомЯчейки = - СчЯчейки;
обПодпись = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху+1,НомЯчейки,ВысотаПодписи + ОтступСверху+1,НомЯчейки);
ШиринаВсего = ШиринаВсего+окр(обПодпись.ШиринаКолонки,0,1);
Если ШиринаВсего >= ШиринаПодписиВсего*ШиринаСимвола Тогда
Прервать;
КонецЕсли;
КонецЦикла;
ПерваяОрганизация = Справочники.Организации.ПустаяСсылка();
ОтступСлева = НомЯчейки - 1;
ИтоговыйДокумент = Новый ТекстовыйДокумент;
ИтоговыйДокумент.Очистить();
Макет = Перечисления.РазделыОтчётов.ПолучитьМакет("МакетТекст");
обМакет = Макет.ПолучитьОбласть("Заголовок");
обМакет.Параметры.Заголовок = СокрЛП(Синоним);
ИтоговыйДокумент.Вывести(обМакет);
обМакет = Макет.ПолучитьОбласть("Раздел");
Для Каждого строкаТЗ ИЗ МассивСтрок Цикл
Если ПерваяОрганизация.Пустая() Тогда
ПерваяОрганизация = строкаТЗ.Организация;
КонецЕсли;
Если ПерваяОрганизация <> строкаТЗ.Организация Тогда
Продолжить;
КонецЕсли;
ФИО = "";
Если НЕ строкаТЗ.ФизЛицо.Пустая() Тогда
ФИО = СокрЛП(строкаТЗ.ФизЛицо.Наименование);
КонецЕсли;
Инициалы ="";
МассивФИО = ОбщегоНазначения.ПолучитьМассивФИО(ФИО);
Если (НЕ ПустаяСтрока(МассивФИО[1])) И (НЕ ПустаяСтрока(МассивФИО[2])) Тогда
Инициалы =" "+Лев(МассивФИО[1],1) + "." + Лев(МассивФИО[2],1)+".";
КонецЕсли;
ФИО = СокрЛП(МассивФИО[0] + Инициалы);
обМакет.Параметры.Должность = СокрЛП(строкаТЗ.Должность);
обМакет.Параметры.ФИО = ФИО;
ИтоговыйДокумент.Вывести(обМакет);
КонецЦикла;
ТабДок = Новый ТабличныйДокумент;
Если (ВысотаПодписиТек < ВысотаПодписиВсего) и (ВысотаПодписиВсего <> 0) Тогда
обТД = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху + 1,ОтступСлева + 1,ВысотаПодписи + ОтступСверху + 2,ШиринаДокумента);
обТДИсточник = ТабДок.Область(ОтступСверху+1,ОтступСлева + 1,ОтступСверху+2,ШиринаДокумента);
ТабличныйДокумент.ВставитьОбласть(обТДИсточник,обТД,ТипСмещенияТабличногоДокумента.БезСмещения,Ложь);
Иначе
обТД = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху + 1,1,ВысотаПодписи + ОтступСверху + 2,ШиринаДокумента);
обТДИсточник = ТабДок.Область(ОтступСверху+1,1,ОтступСверху+2,ШиринаДокумента);
ТабличныйДокумент.ВставитьОбласть(обТДИсточник,обТД,ТипСмещенияТабличногоДокумента.ПоВертикали,Ложь);
КонецЕсли;
обТД = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху+1,ОтступСлева + 1,ВысотаПодписи + ОтступСверху+1,ОтступСлева + 1);
обТД.Текст = ИтоговыйДокумент.ПолучитьТекст();
обТД.Шрифт = Новый Шрифт(обТДИсточник.Шрифт,"Courier",8,Ложь,Ложь,Ложь,Ложь);
обТД.ВертикальноеПоложение = ВертикальноеПоложение.Верх;
обТД1 = ТабличныйДокумент.Область(,,,);
обТД1.ВысотаСтроки = 0;
ВысотаПодписиТек = ВысотаПодписиТек + 1;
Если ВысотаПодписиТек >= ВысотаПодписиВсего Тогда
ВысотаПодписи = 0;
Иначе
ВысотаПодписи = 2*(ВысотаПодписиВсего-ВысотаПодписиТек)-2;
КонецЕсли;
Настройка.ВерхнийКолонтитул.ТекстСправа = СтрЗаменить(Настройка.ВерхнийКолонтитул.ТекстСправа,"[&"+СокрЛП(ВыбЭлемент)+"]","");
КонецЕсли;
КонецЦикла;
КонецЕсли;
ВысотаПодписиВсего = 0;
ВысотаПодписиТек = 0;
ВысотаПодписи = 0;
ВысотаДокумента = ТабличныйДокумент.ВысотаТаблицы;
//МЕТКА4
//низ-лево
Если Настройка.НижнийКолонтитул.Свойство("ТекстСлева") Тогда
Для Сч = 0 По Перечисления.РазделыОтчётов.Количество()-1 Цикл
ВыбЭлемент = Перечисления.РазделыОтчётов.Получить(Сч).Метаданные().ЗначенияПеречисления[Сч].Имя;
Если (Найти(Настройка.НижнийКолонтитул.ТекстСлева,"[&"+СокрЛП(ВыбЭлемент)+"]")>0) и (Настройка.НижнийКолонтитул.Выводить) Тогда
ОтступСлева = 0;
ОтступСправа = Макс(ШиринаДокумента - 1,0);
ОтступСверху = ТабличныйДокумент.ВысотаТаблицы;
Синоним = Перечисления.РазделыОтчётов.Получить(Сч).Метаданные().ЗначенияПеречисления[Сч].Синоним;
Отбор = Новый Структура;
Отбор.Вставить("РазделОтчёта",Перечисления.РазделыОтчётов.Получить(Сч));
Если НЕ Организация.Пустая() Тогда
Отбор.Вставить("Организация",Организация);
КонецЕсли;
МассивСтрок = тзСрезПоследних.НайтиСтроки(Отбор);
ПерваяОрганизация = Справочники.Организации.ПустаяСсылка();
ИтоговыйДокумент = Новый ТекстовыйДокумент;
ИтоговыйДокумент.Очистить();
Макет = Перечисления.РазделыОтчётов.ПолучитьМакет("МакетТекст");
обМакет = Макет.ПолучитьОбласть("Заголовок");
обМакет.Параметры.Заголовок = СокрЛП(Синоним);
ИтоговыйДокумент.Вывести(обМакет);
обМакет = Макет.ПолучитьОбласть("Раздел");
Настройка.НижнийКолонтитул.ТекстСлева = СтрЗаменить(Настройка.НижнийКолонтитул.ТекстСлева,"[&"+СокрЛП(ВыбЭлемент)+"]","");
Для Каждого строкаТЗ ИЗ МассивСтрок Цикл
Если ПерваяОрганизация.Пустая() Тогда
ПерваяОрганизация = строкаТЗ.Организация;
КонецЕсли;
Если ПерваяОрганизация <> строкаТЗ.Организация Тогда
Продолжить;
КонецЕсли;
ФИО = "";
Если НЕ строкаТЗ.ФизЛицо.Пустая() Тогда
ФИО = СокрЛП(строкаТЗ.ФизЛицо.Наименование);
КонецЕсли;
Инициалы ="";
МассивФИО = ОбщегоНазначения.ПолучитьМассивФИО(ФИО);
Если (НЕ ПустаяСтрока(МассивФИО[1])) И (НЕ ПустаяСтрока(МассивФИО[2])) Тогда
Инициалы =" "+Лев(МассивФИО[1],1) + "." + Лев(МассивФИО[2],1)+".";
КонецЕсли;
ФИО = СокрЛП(МассивФИО[0] + Инициалы);
обМакет.Параметры.Должность = СокрЛП(строкаТЗ.Должность);
обМакет.Параметры.ФИО = ФИО;
ИтоговыйДокумент.Вывести(обМакет);
КонецЦикла;
обТД = ТабличныйДокумент.Область(ОтступСверху+1,1,ОтступСверху+2,ШиринаДокумента);
ТабДок = Новый ТабличныйДокумент;
обТДИсточник = ТабДок.Область(ОтступСверху+1,1,ОтступСверху+2,ШиринаДокумента);
ТабличныйДокумент.ВставитьОбласть(обТДИсточник,обТД,ТипСмещенияТабличногоДокумента.ПоВертикали,Ложь);
обТД = ТабличныйДокумент.Область(ОтступСверху+2,1,ОтступСверху+2,1);
обТД.Текст = ИтоговыйДокумент.ПолучитьТекст();
обТД.Шрифт = Новый Шрифт(обТДИсточник.Шрифт,"Courier",8,Ложь,Ложь,Ложь,Ложь);
обТД.ВертикальноеПоложение = ВертикальноеПоложение.Верх;
обТД1 = ТабличныйДокумент.Область(,,,);
обТД1.ВысотаСтроки = 0;
ВысотаПодписиВсего = ВысотаПодписиВсего + 1;
КонецЕсли;
КонецЦикла;
КонецЕсли;
//МЕТКА5
//низ - центр
ВысотаПодписиВсего = Макс(ВысотаПодписиТек,ВысотаПодписиВсего);
ВысотаПодписиТек = 0;
ВысотаПодписи = 0;
Если Настройка.НижнийКолонтитул.Свойство("ТекстВЦентре") Тогда
Для Сч = 0 По Перечисления.РазделыОтчётов.Количество()-1 Цикл
ВыбЭлемент = Перечисления.РазделыОтчётов.Получить(Сч).Метаданные().ЗначенияПеречисления[Сч].Имя;
Если (Найти(Настройка.НижнийКолонтитул.ТекстВЦентре,"[&"+СокрЛП(ВыбЭлемент)+"]")>0) и (Настройка.НижнийКолонтитул.Выводить) Тогда
ОтступСлева = 0;
ОтступСправа = 0;
ОтступСверху = ВысотаДокумента;
Синоним = Перечисления.РазделыОтчётов.Получить(Сч).Метаданные().ЗначенияПеречисления[Сч].Синоним;
Отбор = Новый Структура;
Отбор.Вставить("РазделОтчёта",Перечисления.РазделыОтчётов.Получить(Сч));
Если НЕ Организация.Пустая() Тогда
Отбор.Вставить("Организация",Организация);
КонецЕсли;
МассивСтрок = тзСрезПоследних.НайтиСтроки(Отбор);
ШиринаДокументаВСимволах = 0;
Для СчЯчейка = 1 По ШиринаДокумента Цикл
обТД = ТабличныйДокумент.Область(ОтступСверху+1,СчЯчейка,ОтступСверху+1,СчЯчейка);
ШиринаДокументаВСимволах=ШиринаДокументаВСимволах + окр(обТД.ШиринаКолонки,0,1);
КонецЦикла;
ЛеваяГраница = 1;
ПраваяГраница = ШиринаДокумента;
ШагВперёд = Истина;
ТекШирина = ШиринаДокументаВСимволах;
Пока (ПраваяГраница > ЛеваяГраница) и (ТекШирина > ШиринаПодписиВсего*ШиринаСимвола) Цикл
//слева шагаем
Если ШагВперёд Тогда
обШаг = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху + 1,ЛеваяГраница,ВысотаПодписи + ОтступСверху+1,ЛеваяГраница);
ШагШирина = окр(обШаг.ШиринаКолонки,0,1);
ЛеваяГраница = ЛеваяГраница+1;
ТекШирина = ТекШирина - ШагШирина;
КонецЕсли;
//справа шагаем
Если НЕ ШагВперёд Тогда
обШаг = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху + 1,ПраваяГраница,ВысотаПодписи + ОтступСверху+1,ПраваяГраница);
ШагШирина = окр(обШаг.ШиринаКолонки,0,1);
ПраваяГраница = ПраваяГраница - 1;
ТекШирина = ТекШирина - ШагШирина;
КонецЕсли;
ШагВперёд = НЕ ШагВперёд;
КонецЦикла;
ОтступСлева = ЛеваяГраница - 1;
ОтступСправа = ШиринаДокумента - ПраваяГраница;
ПерваяОрганизация = Справочники.Организации.ПустаяСсылка();
ИтоговыйДокумент = Новый ТекстовыйДокумент;
ИтоговыйДокумент.Очистить();
Макет = Перечисления.РазделыОтчётов.ПолучитьМакет("МакетТекст");
обМакет = Макет.ПолучитьОбласть("Заголовок");
обМакет.Параметры.Заголовок = СокрЛП(Синоним);
ИтоговыйДокумент.Вывести(обМакет);
обМакет = Макет.ПолучитьОбласть("Раздел");
Настройка.НижнийКолонтитул.ТекстВЦентре = СтрЗаменить(Настройка.НижнийКолонтитул.ТекстВЦентре,"[&"+СокрЛП(ВыбЭлемент)+"]","");
//вывожу элементы
Для Каждого строкаТЗ ИЗ МассивСтрок Цикл
Если ПерваяОрганизация.Пустая() Тогда
ПерваяОрганизация = строкаТЗ.Организация;
КонецЕсли;
Если ПерваяОрганизация <> строкаТЗ.Организация Тогда
Продолжить;
КонецЕсли;
ФИО = "";
Если НЕ строкаТЗ.ФизЛицо.Пустая() Тогда
ФИО = СокрЛП(строкаТЗ.ФизЛицо.Наименование);
КонецЕсли;
Инициалы ="";
МассивФИО = ОбщегоНазначения.ПолучитьМассивФИО(ФИО);
Если (НЕ ПустаяСтрока(МассивФИО[1])) И (НЕ ПустаяСтрока(МассивФИО[2])) Тогда
Инициалы =" "+Лев(МассивФИО[1],1) + "." + Лев(МассивФИО[2],1)+".";
КонецЕсли;
ФИО = СокрЛП(МассивФИО[0] + Инициалы);
обМакет.Параметры.Должность = СокрЛП(строкаТЗ.Должность);
обМакет.Параметры.ФИО = ФИО;
ИтоговыйДокумент.Вывести(обМакет);
КонецЦикла;
ТабДок = Новый ТабличныйДокумент;
Если (ВысотаПодписиТек < ВысотаПодписиВсего) и (ВысотаПодписиВсего <> 0) Тогда
обТД = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху + 1,ОтступСлева + 1,ВысотаПодписи + ОтступСверху + 2,ШиринаДокумента);
обТДИсточник = ТабДок.Область(ОтступСверху+1,ОтступСлева + 1,ОтступСверху+2,ШиринаДокумента);
ТабличныйДокумент.ВставитьОбласть(обТДИсточник,обТД,ТипСмещенияТабличногоДокумента.БезСмещения,Ложь);
Иначе
обТД = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху + 1,1,ВысотаПодписи + ОтступСверху + 2,ШиринаДокумента);
обТДИсточник = ТабДок.Область(ОтступСверху+1,1,ОтступСверху+2,ШиринаДокумента);
ТабличныйДокумент.ВставитьОбласть(обТДИсточник,обТД,ТипСмещенияТабличногоДокумента.ПоВертикали,Ложь);
КонецЕсли;
обТД = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху+2,ОтступСлева + 1,ВысотаПодписи + ОтступСверху+2,ОтступСлева + 1);
обТД.Текст = ИтоговыйДокумент.ПолучитьТекст();
обТД.Шрифт = Новый Шрифт(обТДИсточник.Шрифт,"Courier",8,Ложь,Ложь,Ложь,Ложь);
обТД.ВертикальноеПоложение = ВертикальноеПоложение.Верх;
обТД1 = ТабличныйДокумент.Область(,,,);
обТД1.ВысотаСтроки = 0;
ВысотаПодписиТек = ВысотаПодписиТек + 1;
ВысотаПодписи = ВысотаПодписи + 2;
КонецЕсли;
КонецЦикла;
КонецЕсли;
ВысотаПодписиВсего = Макс(ВысотаПодписиТек,ВысотаПодписиВсего);
ВысотаПодписиТек = 0;
ВысотаПодписи = 0;
//МЕТКА6
//низ - право
Если Настройка.НижнийКолонтитул.Свойство("ТекстСправа") Тогда
Для Сч = 0 По Перечисления.РазделыОтчётов.Количество()-1 Цикл
ВыбЭлемент = Перечисления.РазделыОтчётов.Получить(Сч).Метаданные().ЗначенияПеречисления[Сч].Имя;
Если (Найти(Настройка.НижнийКолонтитул.ТекстСправа,"[&"+СокрЛП(ВыбЭлемент)+"]")>0) и (Настройка.НижнийКолонтитул.Выводить) Тогда
ОтступСлева = 0;
ОтступСправа = 0;
ОтступСверху = ВысотаДокумента;
Синоним = Перечисления.РазделыОтчётов.Получить(Сч).Метаданные().ЗначенияПеречисления[Сч].Синоним;
Отбор = Новый Структура;
Отбор.Вставить("РазделОтчёта",Перечисления.РазделыОтчётов.Получить(Сч));
Если НЕ Организация.Пустая() Тогда
Отбор.Вставить("Организация",Организация);
КонецЕсли;
МассивСтрок = тзСрезПоследних.НайтиСтроки(Отбор);
ШиринаВсего = 0;
НомЯчейки = ШиринаДокумента + 1;
Для СчЯчейки = - ШиринаДокумента По -1 Цикл
НомЯчейки = - СчЯчейки;
обПодпись = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху+1,НомЯчейки,ВысотаПодписи + ОтступСверху+1,НомЯчейки);
ШиринаВсего = ШиринаВсего+окр(обПодпись.ШиринаКолонки,0,1);
Если ШиринаВсего >= ШиринаПодписиВсего*ШиринаСимвола Тогда
Прервать;
КонецЕсли;
КонецЦикла;
ПерваяОрганизация = Справочники.Организации.ПустаяСсылка();
ОтступСлева = НомЯчейки - 1;
ИтоговыйДокумент = Новый ТекстовыйДокумент;
ИтоговыйДокумент.Очистить();
Макет = Перечисления.РазделыОтчётов.ПолучитьМакет("МакетТекст");
обМакет = Макет.ПолучитьОбласть("Заголовок");
обМакет.Параметры.Заголовок = СокрЛП(Синоним);
ИтоговыйДокумент.Вывести(обМакет);
обМакет = Макет.ПолучитьОбласть("Раздел");
Настройка.НижнийКолонтитул.ТекстСправа = СтрЗаменить(Настройка.НижнийКолонтитул.ТекстСправа,"[&"+СокрЛП(ВыбЭлемент)+"]","");
Для Каждого строкаТЗ ИЗ МассивСтрок Цикл
Если ПерваяОрганизация.Пустая() Тогда
ПерваяОрганизация = строкаТЗ.Организация;
КонецЕсли;
Если ПерваяОрганизация <> строкаТЗ.Организация Тогда
Продолжить;
КонецЕсли;
ФИО = "";
Если НЕ строкаТЗ.ФизЛицо.Пустая() Тогда
ФИО = СокрЛП(строкаТЗ.ФизЛицо.Наименование);
КонецЕсли;
Инициалы ="";
МассивФИО = ОбщегоНазначения.ПолучитьМассивФИО(ФИО);
Если (НЕ ПустаяСтрока(МассивФИО[1])) И (НЕ ПустаяСтрока(МассивФИО[2])) Тогда
Инициалы =" "+Лев(МассивФИО[1],1) + "." + Лев(МассивФИО[2],1)+".";
КонецЕсли;
ФИО = СокрЛП(МассивФИО[0] + Инициалы);
обМакет.Параметры.Должность = СокрЛП(строкаТЗ.Должность);
обМакет.Параметры.ФИО = ФИО;
ИтоговыйДокумент.Вывести(обМакет);
КонецЦикла;
ТабДок = Новый ТабличныйДокумент;
Если (ВысотаПодписиТек < ВысотаПодписиВсего) и (ВысотаПодписиВсего <> 0) Тогда
обТД = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху + 1,ОтступСлева + 1,ВысотаПодписи + ОтступСверху + 2,ШиринаДокумента);
обТДИсточник = ТабДок.Область(ОтступСверху+1,ОтступСлева + 1,ОтступСверху+2,ШиринаДокумента);
ТабличныйДокумент.ВставитьОбласть(обТДИсточник,обТД,ТипСмещенияТабличногоДокумента.БезСмещения,Ложь);
Иначе
обТД = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху + 1,1,ВысотаПодписи + ОтступСверху + 2,ШиринаДокумента);
обТДИсточник = ТабДок.Область(ОтступСверху+1,1,ОтступСверху+2,ШиринаДокумента);
ТабличныйДокумент.ВставитьОбласть(обТДИсточник,обТД,ТипСмещенияТабличногоДокумента.ПоВертикали,Ложь);
КонецЕсли;
обТД = ТабличныйДокумент.Область(ВысотаПодписи + ОтступСверху+2,ОтступСлева + 1,ВысотаПодписи + ОтступСверху+2,ОтступСлева + 1);
обТД.Текст = ИтоговыйДокумент.ПолучитьТекст();
обТД.Шрифт = Новый Шрифт(обТДИсточник.Шрифт,"Courier",8,Ложь,Ложь,Ложь,Ложь);
обТД.ВертикальноеПоложение = ВертикальноеПоложение.Верх;
обТД1 = ТабличныйДокумент.Область(,,,);
обТД1.ВысотаСтроки = 0;
ВысотаПодписиТек = ВысотаПодписиТек + 1;
ВысотаПодписи = ВысотаПодписи + 2;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если НЕ тзПечатьСтраниц = Неопределено Тогда
НоваяСтрока.ВсегоРазмер = ТабличныйДокумент.ВысотаТаблицы;
КонецЕсли;
//}
Если Настройка.ВерхнийКолонтитул.Свойство("Выводить") Тогда
ТабличныйДокумент.ВерхнийКолонтитул.Выводить = Настройка.ВерхнийКолонтитул.Выводить;
ТабличныйДокумент.ВерхнийКолонтитул.НачальнаяСтраница = Настройка.ВерхнийКолонтитул.НачальнаяСтраница;
ТабличныйДокумент.ВерхнийКолонтитул.ВертикальноеПоложение = ВертикальноеПоложение.Низ;
ТабличныйДокумент.ВерхнийКолонтитул.ТекстСлева = ЗаполнитьТекстКолонтитула(Настройка.ВерхнийКолонтитул.ТекстСлева, НазваниеОтчета, Пользователь);
ТабличныйДокумент.ВерхнийКолонтитул.ТекстВЦентре = ЗаполнитьТекстКолонтитула(Настройка.ВерхнийКолонтитул.ТекстВЦентре, НазваниеОтчета, Пользователь);
ТабличныйДокумент.ВерхнийКолонтитул.ТекстСправа = ЗаполнитьТекстКолонтитула(Настройка.ВерхнийКолонтитул.ТекстСправа, НазваниеОтчета, Пользователь);
КонецЕсли;
Если Настройка.НижнийКолонтитул.Свойство("Выводить") Тогда
ТабличныйДокумент.НижнийКолонтитул.Выводить = Настройка.НижнийКолонтитул.Выводить;
ТабличныйДокумент.НижнийКолонтитул.НачальнаяСтраница = Настройка.НижнийКолонтитул.НачальнаяСтраница;
ТабличныйДокумент.НижнийКолонтитул.ВертикальноеПоложение = ВертикальноеПоложение.Верх;
ТабличныйДокумент.НижнийКолонтитул.ТекстСлева = ЗаполнитьТекстКолонтитула(Настройка.НижнийКолонтитул.ТекстСлева, НазваниеОтчета, Пользователь);
ТабличныйДокумент.НижнийКолонтитул.ТекстВЦентре = ЗаполнитьТекстКолонтитула(Настройка.НижнийКолонтитул.ТекстВЦентре, НазваниеОтчета, Пользователь);
ТабличныйДокумент.НижнийКолонтитул.ТекстСправа = ЗаполнитьТекстКолонтитула(Настройка.НижнийКолонтитул.ТекстСправа, НазваниеОтчета, Пользователь);
КонецЕсли;
КонецПроцедуры // УстановитьКолонтитулы()