Универсальный механизм печати подписей согласующих лиц в отчетах конфигурации
Данный алгоритм можно использовать в любой конфигурации.
Небольшие изменения конфигурации ЗУП с целью создания инструмента, с помощью которого пользователь без труда сможет управлять отображением подписей согласующих лиц в печатных формах отчетов конфигурации. Плюсом предложенного алгоритма является то, что для реализации вышеописанного инструмента нет необходимости в изменении всего множества шаблонов отчетов конфигурации, для пользователя управление печатью подписей всех отчетов будет происходить из одной "точки входа" — обработки. При этом, подписи можно добавлять, практически, в любое место отчета.
- Описание
- Подробнее
Описание
Для этого воспользуемся стандартным механизмом : «Настройка колонтитулов» (Сервис/Настройка колонтитулов). Придеться добавить доп. функционал , не испортив старого.


Здесь мы добавили возможность выбора конкретного отчета , для которого будут применяться настройки, а так же дополниельные настрйки из созданного нами нового перечисления с макетом: «РазделыОтчётов»

Создадим и заполним новый регистр сведений для хранения имеющих право подписи: «ДопРазделыОтчётов»


Теперь нам осталось внести изменения только в процедуру «УстановитьКолонтитулыПоУмолчанию» общего модуля «УправлениеОтчетами».
В модули отчетов и в макеты никаких изменений вносить не требуется (для стандартного механизма печати колонтитулов вызов вышеуказанной процедуры уже во всех отчетах присутствует).
Организация берется из параметров текущего пользователя.
тзПечатьСтраниц в параметрах — это таблица для расширения данного алгоритма на печать подписей в документах, а так же, если потребуется, печать подписей на каждой странице (в данный момент, печать подписей в документах не реализована).
Код , примерно, такой:
// Установка колонтитулов для отчета
//
// Параметры
// ТабличныйДокумент – ТабличныйДокумент – Отчет, у которого необходимо установить колонтитулы
// НазваниеОтчета – Строка – Название отчета для вывода в колонтитул
// Пользователь – Строка – Имя пользователя для вывода в колонтитул
//
Процедура УстановитьКолонтитулыПоУмолчанию(ТабличныйДокумент, НазваниеОтчета, Пользователь, Дата = Неопределено,тзПечатьСтраниц=Неопределено) Экспорт
Перем КолСтрокВсего,КолСтраниц;
КолСтрокВсего = 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;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если НЕ тзПечатьСтраниц = Неопределено Тогда
НоваяСтрока.ВсегоРазмер = ТабличныйДокумент.ВысотаТаблицы;
КонецЕсли;
//}
Если Настройка.ВерхнийКолонтитул.Свойство(«Выводить») Тогда
ТабличныйДокумент.ВерхнийКолонтитул.Выводить = Настройка.ВерхнийКолонтитул.Выводить;
ТабличныйДокумент.ВерхнийКолонтитул.НачальнаяСтраница = Настройка.ВерхнийКолонтитул.НачальнаяСтраница;
ТабличныйДокумент.ВерхнийКолонтитул.ВертикальноеПоложение = ВертикальноеПоложение.Низ;
ТабличныйДокумент.ВерхнийКолонтитул.ТекстСлева = ЗаполнитьТекстКолонтитула(Настройка.ВерхнийКолонтитул.ТекстСлева, НазваниеОтчета, Пользователь);
ТабличныйДокумент.ВерхнийКолонтитул.ТекстВЦентре = ЗаполнитьТекстКолонтитула(Настройка.ВерхнийКолонтитул.ТекстВЦентре, НазваниеОтчета, Пользователь);
ТабличныйДокумент.ВерхнийКолонтитул.ТекстСправа = ЗаполнитьТекстКолонтитула(Настройка.ВерхнийКолонтитул.ТекстСправа, НазваниеОтчета, Пользователь);
КонецЕсли;
Если Настройка.НижнийКолонтитул.Свойство(«Выводить») Тогда
ТабличныйДокумент.НижнийКолонтитул.Выводить = Настройка.НижнийКолонтитул.Выводить;
ТабличныйДокумент.НижнийКолонтитул.НачальнаяСтраница = Настройка.НижнийКолонтитул.НачальнаяСтраница;
ТабличныйДокумент.НижнийКолонтитул.ВертикальноеПоложение = ВертикальноеПоложение.Верх;
ТабличныйДокумент.НижнийКолонтитул.ТекстСлева = ЗаполнитьТекстКолонтитула(Настройка.НижнийКолонтитул.ТекстСлева, НазваниеОтчета, Пользователь);
ТабличныйДокумент.НижнийКолонтитул.ТекстВЦентре = ЗаполнитьТекстКолонтитула(Настройка.НижнийКолонтитул.ТекстВЦентре, НазваниеОтчета, Пользователь);
ТабличныйДокумент.НижнийКолонтитул.ТекстСправа = ЗаполнитьТекстКолонтитула(Настройка.НижнийКолонтитул.ТекстСправа, НазваниеОтчета, Пользователь);
КонецЕсли;
КонецПроцедуры // УстановитьКолонтитулы()
