Создание договоров средствами 1С

07.11.14

Задачи пользователя - Адаптация типовых решений

Создание договоров средствами 1С

Доброго времени суток! Руководством была поставлена задача реализации создания договоров средствами 1с (в данном случае на предприятии использовалась конфигурация 1С УПП 1.3). Предпосылками к этому послужило то, что договора хранились в общей сетевой папке в формате odt. Недостатков такого способа ведения договоров было достаточно много. Первый недостаток был разграничения доступа. Средствами АД  это преодолеть не получалось. Для этого нужно было  под каждый отдел свои папки с доступом, но такой подход не устраивал руководство и юристов, которые хотели видеть весь список в одной папке. Вторым недостатком была надежность такого способа. Любой пользователь мог по невнимательности и/или свойственной части пользователей безалаберности  удалить договора, внести в них изменения, переименовать их (не будем забывать, что это могут сделать и специально из-за обиды на руководство, например). Архивирование, конечно, периодически делалось, но не так часто как хотелось бы (объем этой папки достигал несколько десятков гб). Третьим недостатком было то, что организация имела большой оборот и множество меняющихся контрагентов, что приводило к частым проверкам со стороны отдела по борьбе с экономическими преступлениям. С проверяющими была договоренность по предоставлению первоначальной информации в электронном виде из-за слишком большого количество документов (в некоторых случаях несколько тысяч страниц). Основная часть документов формировалась специальной обработкой из 1с (платежки, накладные, счета-фактуры и реестры этих документов). Но договора и реестр по ним для каждой организации приходилось делать вручную, что требовало отвлечения на это времени сотрудников, да и формат договоров odt не устраивал проверяющих, и их приходилось пересохранять в pdf.

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

  1. Сами тексты шаблонов договоров должны меняться/создаваться определенными пользователями (в моем случае юристами);
  2. Программа должна поддерживать три типа договоров;
  3. Пользователь должен иметь возможность менять только свои договора;
  4. Пользователь должен видеть только разрешенные ему договора.

По типам договоров. У организации были несколько часто используемых договоров (дилерский договор, договор купли-продажи, договор складского хранения, договор ОМТС). Все эти договора в итоге можно было разделить на три вида.

 

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

Сами типы договоров были реализованы справочником ТипДоговора

 

Где ПодписьНаПоследнейСтранице это булево отвечающее за вывод колонтитула на последнюю страницу. Табличные части:

  • пунктыДоговора это сам текст договора;
  • подписиНаСтраницах это нижний колонтитул;
  • подписи это подписи/реквизиты в конце договора;
  • параметры это изменяемые параметры договора;
  • нумерация это таблица для нумерации договоров;

Из реквизитов текстовые это пункт(10), текст(не ограничено), символформатирования(20), реквизит(100). Положение это перечисление содержащее значение лево, центр, право, поШирине. Заголовок это булево.

Сама форма выглядит так

 

Юристы в этот справочник добавляют нужные договора. В самом справочнике никакого кода нет. При создании договора пункты нужно забивать как текст. Т.е. если пункт 001 будет стоять выше пункта 1. У меня юристы сразу начинают нумерацию с нулей. Символ форматирования это та строка, которая будет выводиться вместо этого номера. Если она не заполнена, то выводиться сам номер. Если пункт без номера, то там ставиться пробел. Реквизиты в тексте договора начинаются с символа &.

На все реквизиты есть права только у юристов. У остальных пользователей есть право на просмотр и изменение таблицы нумерация.

Сам документ договор.

 

Пользователь выбирает тип договора и заполняет реквизиты (Та часть, которая есть в данных контрагента, вытягивается автоматически при заполнении).  После этого он получает готовую форму договора при нажатии на кнопку печать. Далее договор можно распечатывать или сохранять, но при сохранении нужно выбирать формат pdf. В ворде и экселе форматирование теряется. Вполне возможно, что на платформе 8.3 это уже исправили. Если вдруг контрагента не устраивает что-то в тексте договора, то в табличной части нужно добавить строку и заполнить нужный пункт договора. После этого текст и настройки данного пункта, появятся в соответствующих колонках, и их можно будет отредактировать. Для того, чтобы определить правильный номер пункта служит кнопка шаблон.

 

Реквизиты можно посмотреть при нажатии на кнопку реквизиты

 

 

Перем ТекстДоговора;
Перем ПодписиНаСтраницах;
Перем Подписи;
Перем ВысотаПодписи;
Перем ПодписьНаПоследнейСтранице;
Перем СтрокиНаЭтойСтранице;
Перем СтрокиНаСледующейСтранице;
Перем ТабДок;
Перем Макет;
Перем ВысотаСтроки;
Перем ШиринаСтроки;
Перем ШиринаПоловиныСтроки;
Перем ВысотаСтраницы;
Перем ТекущийТекстДоговора;
Перем ТаблицаПараметров;

Процедура УстановитьПараметры()
	ВысотаСтроки=5;
	ШиринаСтроки=84;
	ШиринаПоловиныСтроки=42;
	ВысотаСтраницы=295;
КонецПроцедуры//УстановитьПараметры

Процедура ТипДоговораПриИзменении(Элемент)
	ЗаполнитьТекстДоговора();
КонецПроцедуры//ТипДоговораПриИзменении

Процедура ЗаполнитьТекстДоговора()
	Если ЗначениеЗаполнено(ТипДоговора) Тогда
		ТекстДоговора=ТипДоговора.ПунктыДоговора.Выгрузить();
		ПодписиНаСтраницах=ТипДоговора.ПунктыДоговора.Выгрузить();
		Подписи=ТипДоговора.Подписи.Выгрузить();
		ПодписьНаПоследнейСтранице=ТипДоговора.ПодписьНаПоследнейСтранице;
	КонецЕсли;
КонецПроцедуры//ЗаполнитьТекстДоговора

Процедура ВычислитьВысотуПодписиИСтраницы()
	Если ТипДоговора.ПодписиНаСтраницах.Количество()>0 Тогда
		Высота=0;
		Для Каждого СтрокаТЧ из ТипДоговора.ПодписиНаСтраницах Цикл
			ТекстЛевый=СтрокаТЧ.ТекстЛевый;
			ТекстПравый=СтрокаТЧ.ТекстПравый;
			Для Каждого СтрокаПараметров из ТаблицаПараметров Цикл
				ТекстЛевый=СтрЗаменить(ТекстЛевый,СтрокаПараметров.Реквизит,СтрокаПараметров.Значение);
				ТекстПравый=СтрЗаменить(ТекстПравый,СтрокаПараметров.Реквизит,СтрокаПараметров.Значение);
			КонецЦикла;
			ВысотаЛевая=ВысотаСтроки*Окр(СтрДлина(СтрокаТЧ.ТекстЛевый)/ШиринаПоловиныСтроки,0,1);
			ВысотаПравая=ВысотаСтроки*Окр(СтрДлина(СтрокаТЧ.ТекстПравый)/ШиринаПоловиныСтроки,0,1);
            Высота=Высота+Макс(ВысотаЛевая,ВысотаПравая,ВысотаСтроки);
		КонецЦикла;
		ВысотаСтраницы=ВысотаСтраницы-Высота;
		ВысотаПодписи=Высота;
	Иначе
		ВысотаПодписи=0;
	КонецЕсли;
КонецПроцедуры//ВычислитьВысотуПодписиИСтраницы

Процедура ОсновныеДействияФормыПечать(Кнопка)
	ЗаполнитьПараметры();
	УстановитьПараметры();
	ВычислитьВысотуПодписиИСтраницы();
	ТекущаяВысотаСтраницы=0;
    ТабДок=Новый ТабличныйДокумент;
	Макет=ЭтотОбъект.ПолучитьМакет("Договор");
	ТекущийТекстДоговора=Новый ТаблицаЗначений;
	ТекущийТекстДоговора=ТекстДоговора.Скопировать();
	Для каждого СтрокаДоговора из ИзмененныеПунктыДоговора Цикл
		ПараметрыПоиска=новый Структура;
		ПараметрыПоиска.Вставить("Пункт",СтрокаДоговора.Пункт);
		РезультатПоиска=ТекущийТекстДоговора.НайтиСтроки(ПараметрыПоиска);
		Если РезультатПоиска.Количество()>0 Тогда
			РезультатПоиска[0].Текст=СтрокаДоговора.Текст;
			РезультатПоиска[0].СимволФорматирования=СтрокаДоговора.СимволФорматирования;
			РезультатПоиска[0].Заголовок=СтрокаДоговора.Заголовок;
			РезультатПоиска[0].Положение=СтрокаДоговора.Положение;
      	Иначе
			НоваяСтрока=ТекущийТекстДоговора.Добавить();
			НоваяСтрока.Текст= СтрокаДоговора.Текст;
			НоваяСтрока.Пункт= СтрокаДоговора.Пункт;
			НоваяСтрока.СимволФорматирования=СтрокаДоговора.СимволФорматирования;
			НоваяСтрока.Заголовок=СтрокаДоговора.Заголовок;
			НоваяСтрока.Положение=СтрокаДоговора.Положение;
		КонецЕсли;
	КонецЦикла;
	ТекущийТекстДоговора.Сортировать("Пункт Возр");
	Для каждого СтрокаДоговора из ТекущийТекстДоговора Цикл
		Если Найти(СтрокаДоговора.Текст,"&")<>0 Тогда
			Для Каждого СтрокаПараметров из ТаблицаПараметров Цикл
				СтрокаДоговора.Текст=СтрЗаменить(СтрокаДоговора.Текст,"&"+СтрокаПараметров.Реквизит,СтрокаПараметров.Значение);	
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	ВременныйТекстДоговора=Новый ТаблицаЗначений;
	ВременныйТекстДоговора=ТекущийТекстДоговора.Скопировать();
	ТекущийТекстДоговора.Очистить();
  	Для каждого ПунктДоговора из ВременныйТекстДоговора Цикл
		ТекстСтроки="";
		Если СтрДлина(ПунктДоговора.СимволФорматирования)>0 Тогда
			ТекстСтроки=ПунктДоговора.СимволФорматирования+ПунктДоговора.Текст;
		Иначе
			ТекстСтроки=ПунктДоговора.Пункт+" "+ПунктДоговора.Текст;
		КонецЕсли;
		РазложеннаяСтрока=ТаблицаСтрок(ТекстСтроки,ПунктДоговора.Положение);
		Для каждого СтрокаТаблицы из РазложеннаяСтрока Цикл
			НоваяСтрока=ТекущийТекстДоговора.Добавить();
			Если СтрокаТаблицы.Положение=Перечисления.ПоложениеНаСтраницеБМА.ПоШирине Тогда
				НоваяСтрока.Текст=ВыровнятьПоШирине(СтрокаТаблицы.Текст);
			Иначе
				НоваяСтрока.Текст=СтрокаТаблицы.Текст;	
			КонецЕсли;
			НоваяСтрока.Заголовок=ПунктДоговора.Заголовок;
			НоваяСтрока.Положение=СтрокаТаблицы.Положение;
		КонецЦикла;
	КонецЦикла;
	ВременныйТекстДоговора.Очистить();
	ПоследняяСтраница=ложь;
	ТекущаяВысотаСтраницы=0;
	Для каждого ПунктДоговора из ТекущийТекстДоговора Цикл
		Если ТекущаяВысотаСтраницы0 Тогда
				ВывестиПодписи();
			КонецЕсли;
			ТабДок.ВывестиГоризонтальныйРазделительСтраниц();

		КонецЕсли;
	КонецЦикла;
	ВывестиРеквизиты();
	Если ПодписьНаПоследнейСтранице Тогда
		ВывестиПодписи();	
	КонецЕсли;
    ТабДок.ПолеСлева=15;
	ТабДок.ОтображатьЗаголовки=Ложь;
	ТабДОк.ОтображатьСетку=Ложь;
	ТабДок.Показать(ТипДоговора.Наименование);
КонецПроцедуры//ОсновныеДействияФормыПечать

Процедура ВывестиРеквизиты()
	Если ТипДоговора.Подписи.Количество()>0 Тогда
		Область=Макет.ПолучитьОбласть("ЛинияСнизу");
		ТабДок.Вывести(Область);
		ЗаполнитьРеквизиты();	
		Область=Макет.ПолучитьОбласть("ЛинияСверху");
		ТабДок.Вывести(Область);
	КонецЕсли;
КонецПроцедуры//ВывестиРеквизиты

Процедура ЗаполнитьРеквизиты()
	Для Каждого Строка из ТипДоговора.Подписи Цикл
		Если Строка.Заголовок Тогда
			Область=Макет.ПолучитьОбласть("ПодписиЗаголовок");	
		Иначе
			Область=Макет.ПолучитьОбласть("Подписи");	
		КонецЕсли;
		ТекстЛевый=Строка.ТекстЛевый;
        ТекстПравый=Строка.ТекстПравый;
		Для каждого СтрокаПараметров из ТаблицаПараметров Цикл
			ТекстЛевый=СтрЗаменить(ТекстЛевый,"&"+СтрокаПараметров.Реквизит,СтрокаПараметров.Значение);	
			ТекстПравый=СтрЗаменить(ТекстПравый,"&"+СтрокаПараметров.Реквизит,СтрокаПараметров.Значение);	
		КонецЦикла;
		Область.Параметры.ТекстЛевый=ТекстЛевый;
		Область.Параметры.ТекстПравый=ТекстПравый;
		ПоложениеНаСтранице(Область,Строка.Положение);
		ТабДок.Вывести(Область);
	КонецЦикла;
КонецПроцедуры//ЗаполнитьРеквизиты

Процедура ВывестиПодписи()
	Если ВысотаПодписи>0 Тогда
		ЗаполнитьПодписи();	
	КонецЕсли;
КонецПроцедуры//ВывестиПодписи

Процедура ЗаполнитьПодписи()
	Для Каждого Строка из ТипДоговора.ПодписиНаСтраницах Цикл
		Если Строка.Заголовок Тогда
			Область=Макет.ПолучитьОбласть("ПодписиНаСтраницахЗаголовок");	
		Иначе
			Область=Макет.ПолучитьОбласть("ПодписиНаСтраницах");	
		КонецЕсли;
		ТекстЛевый=Строка.ТекстЛевый;
        ТекстПравый=Строка.ТекстПравый;
		Для каждого СтрокаПараметров из ТаблицаПараметров Цикл
			ТекстЛевый=СтрЗаменить(ТекстЛевый,"&"+СтрокаПараметров.Реквизит,СтрокаПараметров.Значение);	
			ТекстПравый=СтрЗаменить(ТекстПравый,"&"+СтрокаПараметров.Реквизит,СтрокаПараметров.Значение);	
		КонецЦикла;
		Область.Параметры.ТекстЛевый=ТекстЛевый;
		Область.Параметры.ТекстПравый=ТекстПравый;
		ПоложениеНаСтранице(Область,Строка.Положение);
		ТабДок.Вывести(Область);
	КонецЦикла;
КонецПроцедуры//ЗаполнитьПодписи

Процедура СформироватьСтроки(Остаток,ТекстСтроки,СтрокиНаЭтойСтранице,СтрокиНаСледующейСтранице)
	СтрокаПоиска=Сред(ТекстСтроки,1,Остаток*ШиринаСтроки);
	Позиция=СтрДлина(СтрокаПоиска);
	Пока (Сред(СтрокаПоиска,Позиция,1)<>" ") И (Позиция>0) Цикл
		Позиция=Позиция-1;
	КонецЦикла;
	СтрокиНаЭтойСтранице=Сред(ТекстСтроки,1,Позиция-1);
	СтрокиНаСледующейСтранице=Сред(ТекстСтроки,Позиция+1,СтрДлина(ТекстСтроки));
КонецПроцедуры//СформироватьСтроки

Процедура ПоложениеНаСтранице(Область,Положение)
	Если Положение=Перечисления.ПоложениеНаСтраницеБМА.Лево Тогда
		Область.Область().ГоризонтальноеПоложение=ГоризонтальноеПоложение.Лево;	
	ИначеЕсли Положение=Перечисления.ПоложениеНаСтраницеБМА.Право Тогда
		Область.Область().ГоризонтальноеПоложение=ГоризонтальноеПоложение.Право;
	ИначеЕсли Положение=Перечисления.ПоложениеНаСтраницеБМА.Центр Тогда
		Область.Область().ГоризонтальноеПоложение=ГоризонтальноеПоложение.Центр;
	Иначе
		Область.Область().ГоризонтальноеПоложение=ГоризонтальноеПоложение.ПоШирине;
	КонецЕсли;
КонецПроцедуры//ПоложениеНаСтранице

Процедура ПриОткрытии()
	Если ЗначениеЗаполнено(Автор) Тогда
		ФормаДокумента=ЭтотОбъект.ПолучитьФорму("ФормаДокумента");
		ФормаДокумента.ТолькоПросмотр=НЕ ПроверкаПравДоступа();
	Иначе	
		Автор=ПараметрыСеанса.ТекущийПользователь;
	КонецЕсли;
	УстановитьПараметры();
	ЗаполнитьТекстДоговора();
КонецПроцедуры//ПриОткрытии

Процедура ИзмененныеПунктыДоговораПунктПриИзменении(Элемент)
	ТекущаяСтрока=ЭлементыФормы.ИзмененныеПунктыДоговора.ТекущаяСтрока;
	Если ЗначениеЗаполнено(ТекущаяСтрока.Пункт) Тогда
		ПараметрыПоиска=Новый Структура;
		ПараметрыПоиска.Вставить("Пункт", ТекущаяСтрока.Пункт);
		Результат=ТекстДоговора.НайтиСтроки(ПараметрыПоиска);
		Для каждого СтрокаРезультата из Результат Цикл
			ТекущаяСтрока.Текст=СтрокаРезультата.Текст;
			ТекущаяСтрока.СимволФорматирования=СтрокаРезультата.СимволФорматирования;
			ТекущаяСтрока.Заголовок=СтрокаРезультата.Заголовок;
			ТекущаяСтрока.Положение=СтрокаРезультата.Положение;
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

Процедура ОсновныеДействияФормыШаблон(Кнопка)
	ТабДок=Новый ТабличныйДокумент;
	Макет=ЭтотОбъект.ПолучитьМакет("Договор");
	ТекущийТекстДоговора=Новый ТаблицаЗначений;
	ТекущийТекстДоговора=ТекстДоговора.Скопировать();
	Для каждого СтрокаТЧ из ТекущийТекстДоговора Цикл
		Область=Макет.ПолучитьОбласть("Текст");
		Область.Параметры.Текст=СтрокаТЧ.Пункт+СтрокаТЧ.Текст;
		ТабДок.Вывести(Область);
	КонецЦикла;	
	ТабДок.ОтображатьГруппировки=Ложь;
	ТабДок.ОтображатьЗаголовки=Ложь;
	ТабДок.ОтображатьСетку=Ложь;
	ТабДок.Показать("Шаблон "+СокрЛП(ТипДоговора.Наименование));
КонецПроцедуры

Процедура КоманднаяПанель2Заполнить(Кнопка)
	Для каждого СтрокаТЧ из ТипДоговора.Параметры Цикл
		ПараметрыПоиска=Новый Структура;
		ПараметрыПоиска.Вставить("Реквизит",СтрокаТЧ.Реквизит);
		РезультатПоиска=Параметры.НайтиСтроки(ПараметрыПоиска);
		Если РезультатПоиска.Количество()=0 Тогда
			НоваяСтрока=Параметры.Добавить();
			НоваяСтрока.Реквизит=СтрокаТЧ.Реквизит;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры//Заполнить

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	ТабЗнач=Новый ТаблицаЗначений;
	ТабЗнач=Параметры.Выгрузить();
	Параметры.Очистить();
	Для каждого СтрокаТЧ из ТабЗнач Цикл
		Если ЗначениеЗаполнено(СтрокаТЧ.Значение) Тогда
			НоваяСтрока=Параметры.Добавить();
			НоваяСтрока.Значение=СтрокаТЧ.Значение;
			НоваяСтрока.Реквизит=СтрокаТЧ.Реквизит;
		КонецЕсли;
	КонецЦикла;
	//Попытка присвоить номер
	Если Не ЗначениеЗаполнено(НомерПечатный) Тогда
		Объект=ТипДоговора.ПолучитьОбъект();
		ПараметрыПоиска=Новый Структура;
		ПараметрыПоиска.Вставить("Организация",Организация);
		РезультатПоиска=Объект.Нумерация.НайтиСтроки(ПараметрыПоиска);
		Если РезультатПоиска.Количество()>0 Тогда
			НомерПечатный=Строка(РезультатПоиска[0].ПоследнийНомер+1);
			РезультатПоиска[0].ПоследнийНомер=РезультатПоиска[0].ПоследнийНомер+1;
	    Иначе
			НоваяСтрока=Объект.Нумерация.Добавить();
			НоваяСтрока.Организация=Организация;
			НоваяСтрока.ПоследнийНомер=1;
			НомерПечатный="1";
		КонецЕсли;
		Объект.Записать();
	КонецЕсли;
КонецПроцедуры//ПередЗаписью

Процедура ЗаполнитьПараметры()
	ТаблицаПараметров=Новый ТаблицаЗначений;
	ТаблицаПараметров.Колонки.Добавить("Реквизит");
	ТаблицаПараметров.Колонки.Добавить("Значение");
	ТаблицаПараметров.Колонки.Добавить("Длина");
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ОрганизацияНаименованиеСокращенное";
	НоваяСтрока.Значение=СокрЛП(Организация.НаименованиеСокращенное);
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ОрганизацияНаименованиеПолное";
	НоваяСтрока.Значение=СокрЛП(Организация.НаименованиеПолное);
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="НомерДоговора";
	НоваяСтрока.Значение=СокрЛП(НомерПечатный);
    НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ДатаДоговораДень";
	НоваяСтрока.Значение=Строка(День(ЭтотОбъект.Дата));
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ДатаДоговораЦифрами";
	НоваяСтрока.Значение=Формат(ЭтотОбъект.Дата,"ДЛФ=D");
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ДатаДоговораМесяцПрописью";
	ФорматнаяСтрока=Формат(ЭтотОбъект.Дата,"ДЛФ=DD");
	ФорматнаяСтрока=Сред(ФорматнаяСтрока,Найти(ФорматнаяСтрока," ")+1,СтрДлина(ФорматнаяСтрока));
	ФорматнаяСтрока=Сред(ФорматнаяСтрока,1, Найти(ФорматнаяСтрока," "));
	НоваяСтрока.Значение=СокрЛП(ФорматнаяСтрока);
    НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ДатаДоговораГод";
	НоваяСтрока.Значение=Формат(ЭтотОбъект.Дата,"ДФ=yyyy");
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ДатаКонецГода";
	НоваяСтрока.Значение=Формат(КонецГода(ЭтотОбъект.Дата),"ДЛФ=D");
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ДатаОкончания";
	НоваяСтрока.Значение=Формат(ЭтотОбъект.Дата,"ДФ=dd.MM.yyyy");
    Запрос=Новый Запрос;
	Запрос.Текст="ВЫБРАТЬ
	             |	ОтветственныеЛицаОрганизацийСрезПоследних.ФизическоеЛицо КАК ФизическоеЛицо,
	             |	ОтветственныеЛицаОрганизацийСрезПоследних.Должность КАК Должность,
	             |	ОтветственныеЛицаОрганизацийСрезПоследних.ОтветственноеЛицо КАК ОтветственноеЛицо,
	             |	ОтветственныеЛицаОрганизацийСрезПоследних.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница
	             |ИЗ
	             |	РегистрСведений.ОтветственныеЛицаОрганизаций.СрезПоследних(&Период, СтруктурнаяЕдиница = &Организация) КАК ОтветственныеЛицаОрганизацийСрезПоследних";
	Запрос.УстановитьПараметр("Период", ЭтотОбъект.Дата);
	Запрос.УстановитьПараметр("Организация",Организация);
	Результат=Запрос.Выполнить().Выгрузить();
	ПараметрыПоиска=Новый Структура;
	ПараметрыПоиска.Вставить("ОтветственноеЛицо",Перечисления.ОтветственныеЛицаОрганизаций.Руководитель);
	РезультатПоиска=Результат.НайтиСтроки(ПараметрыПоиска);
	РуководительДолжность=РезультатПоиска[0].Должность;
	РуководительФизЛицо=РезультатПоиска[0].ФизическоеЛицо;
	ПараметрыПоиска.Количество();
	ПараметрыПоиска.Вставить("ОтветственноеЛицо",Перечисления.ОтветственныеЛицаОрганизаций.ГлавныйБухгалтер);
	РезультатПоиска=Результат.НайтиСтроки(ПараметрыПоиска);
	ГлавныйБухгалтерДолжность=РезультатПоиска[0].Должность;
	ГлавныйБухгалтерФизЛицо=РезультатПоиска[0].ФизическоеЛицо;
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ДолжностьРуководителя";
	НоваяСтрока.Значение=СокрЛП(РуководительДолжность.Наименование);
    НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ФИОРуководителя";
	НоваяСтрока.Значение=СокрЛП(РуководительФизЛицо.Наименование);
	ФИО="";
	УниверсальныеМеханизмы.Просклонять(глЗначениеПеременной("глКомпонентаСклоненияФИО"),РуководительФизЛицо.Наименование, 2, РуководительФизЛицо.Пол, ФИО);
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ФИОРуководителяРодительныйПадеж";
	НоваяСтрока.Значение=СокрЛП(ФИО);
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ДолжностьРуководителяРодительныйПадеж";
	НоваяСтрока.Значение=ПросклонятьДолжности(СокрЛП(РуководительДолжность.Наименование));
	УниверсальныеМеханизмы.Просклонять(глЗначениеПеременной("глКомпонентаСклоненияФИО"),ГлавныйБухгалтерФизЛицо.Наименование, 2, ГлавныйБухгалтерФизЛицо.Пол, ФИО);
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ФИОГлавногоБухгалтераРодительныйПадеж";
	НоваяСтрока.Значение=СокрЛП(ФИО);
    НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ДолжностьГлавногоБухгалтераРодительныйПадеж";
	НоваяСтрока.Значение=ПросклонятьДолжности(СокрЛП(ГлавныйБухгалтерДолжность.Наименование));
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ФИОГлавногоБухгалтера";
	НоваяСтрока.Значение=СокрЛП(ГлавныйБухгалтерФизЛицо.Наименование);
    НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ДолжностьГлавногоБухгалтера";
	НоваяСтрока.Значение=СокрЛП(ГлавныйБухгалтерДолжность.Наименование);
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ФамилияИнициалыГлавногоБухгалтера";
	НоваяСтрока.Значение=ОбщегоНазначения.ФамилияИнициалыФизЛица(ГлавныйБухгалтерФизЛицо);
    НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ФамилияИнициалыРуководителя";
	НоваяСтрока.Значение=ОбщегоНазначения.ФамилияИнициалыФизЛица(РуководительФизЛицо);
	СведенияОбОрганизации = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Организация, ЭтотОбъект.Дата);
    НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ЮридическийАдрес";
	НоваяСтрока.Значение=СокрЛП(СведенияОбОрганизации.ЮридическийАдрес);
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ИННКПП";
	НоваяСтрока.Значение=СокрЛП(СведенияОбОрганизации.ИНН+"/"+СведенияОбОрганизации.КПП);
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="РасчетныйСчет";
	НоваяСтрока.Значение=СокрЛП(СведенияОбОрганизации.НомерСчета);
    НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="КоррСчет";
	НоваяСтрока.Значение=СокрЛП(СведенияОбОрганизации.КоррСчет);
    НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="БИК";
	НоваяСтрока.Значение=СокрЛП(СведенияОбОрганизации.БИК);
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="Банк";
	НоваяСтрока.Значение=СокрЛП(СведенияОбОрганизации.Банк);
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="БанкГород";
	Банк=Справочники.Банки.НайтиПоКоду(СокрЛП(СведенияОбОрганизации.БИК));
	НоваяСтрока.Значение=СокрЛП(Банк.Город);
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="Телефоны";
	НоваяСтрока.Значение=СокрЛП(СведенияОбОрганизации.Телефоны);
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="КодПоОКПО";
	НоваяСтрока.Значение=СокрЛП(СведенияОбОрганизации.КодПоОКПО);
    НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="ОГРН";
	НоваяСтрока.Значение=СокрЛП(Организация.ОГРН);
    //реквизиты контрагента
    СведенияОбКонтрагенте = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Контрагент, ЭтотОбъект.Дата);
    НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="КонтрагентНаименованиеПолное";
	НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.ПолноеНаименование);
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="КонтрагентНаименованиеСокращенное";
	НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.ПолноеНаименование);
	НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="КонтрагентКодПоОКПО";
	НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.КодПоОКПО);
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="КонтрагентИННКПП";
	НоваяСтрока.Значение=СокрЛП(Строка(СведенияОбКонтрагенте.ИНН)+"/"+Строка(СведенияОбКонтрагенте.КПП));
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="КонтрагентТелефоны";
	НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.Телефоны);
    НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="КонтрагентЮридическийАдрес";
	НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.ЮридическийАдрес);
    НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="КонтрагентБанк";
	НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.Банк);
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="КонтрагентБИК";
	НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.БИК);
    НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="КонтрагентБанкГород";
	Банк=Справочники.Банки.НайтиПоКоду(СокрЛП(СведенияОбКонтрагенте.БИК));
	НоваяСтрока.Значение=СокрЛП(Банк.Город);
    НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="КонтрагентКоррСчет";
	НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.КоррСчет);
	НоваяСтрока=ТаблицаПараметров.Добавить();
	НоваяСтрока.Реквизит="КонтрагентКодРасчетныйСчет";
	НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.НомерСчета);
	ПараметрыПоиска=Новый Структура;
	Для каждого Строка из ТипДоговора.Параметры Цикл
		НоваяСтрока=ТаблицаПараметров.Добавить();
		НоваяСтрока.Реквизит=Строка.Реквизит;
		ПараметрыПоиска.Очистить();
		ПараметрыПоиска.Вставить("Реквизит",Строка.Реквизит);
		РезультатПоиска=Параметры.НайтиСтроки(ПараметрыПоиска);
		Если РезультатПоиска.Количество()>0 Тогда
			НоваяСтрока.Значение=РезультатПоиска[0].Значение;
		КонецЕсли;
	КонецЦикла;
	Для каждого Строка из Параметры Цикл
		ПараметрыПоиска.Очистить();
		ПараметрыПоиска.Вставить("Реквизит",Строка.Реквизит);
		РезультатПоиска=ТаблицаПараметров.НайтиСтроки(ПараметрыПоиска);
		Если РезультатПоиска.Количество()>0 Тогда
			РезультатПоиска[0].Значение=Строка.Значение;
		КонецЕсли;
	КонецЦикла;
	Для каждого Строка из ТаблицаПараметров Цикл
		Строка.Длина=СтрДлина(Строка.Реквизит);	
	КонецЦикла;
	ТаблицаПараметров.Сортировать("Длина Убыв");
КонецПроцедуры//ЗаполнитьПараметры

Функция ПросклонятьДолжности(ТекущаяДолжность)
	должность=НРег(ТекущаяДолжность);
	должность=СтрЗаменить(Должность,"директор","директора");
	должность=СтрЗаменить(Должность,"генеральный","генерального");
	должность=СтрЗаменить(Должность,"бухгалтер","бухгалтера");
	должность=СтрЗаменить(Должность,"главный","главного");
	Возврат Должность;
КонецФункции//ПросклонятьДолжности

Процедура ОсновныеДействияФормыРеквизиты(Кнопка)
	ЗаполнитьПараметры();
	Таблица=новый ТабличныйДокумент;
	МакетТаблицы=ЭтотОбъект.ПолучитьМакет("Договор");
	Для каждого Строка из ТаблицаПараметров Цикл
		Область=МакетТаблицы.ПолучитьОбласть("Реквизиты");
		Область.Параметры.ТекстЛевый=Строка.Реквизит;
		Область.Параметры.ТекстПравый=Строка.Значение;
		Таблица.Вывести(Область);
	КонецЦикла;
	Таблица.ОтображатьЗаголовки=Ложь;
	Таблица.ОтображатьСетку=Ложь;
	Таблица.Показать("Реквизиты");
КонецПроцедуры//ОсновныеДействияФормыРеквизиты

Функция ТаблицаСтрок(Текст,Положение)
	ТЗ=новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("Текст");
	ТЗ.Колонки.Добавить("Положение");
	МассивПодстрок=РазложитьСтроку(Текст);
	ТекущаяСтрока="";
	Для каждого СтрокаМассива из МассивПодстрок Цикл
		Если СтрДлина(ТекущаяСтрока+" "+СтрокаМассива)"" Тогда
		НоваяСтрока=ТЗ.Добавить();
		НоваяСтрока.Текст=ТекущаяСтрока;
		НоваяСтрока.Положение=Положение;
	КонецЕсли;
	Если ТЗ.Количество()>1 и Положение=Перечисления.ПоложениеНаСтраницеБМА.ПоШирине Тогда
		ТЗ[ТЗ.Количество()-1].Положение=Перечисления.ПоложениеНаСтраницеБМА.Лево;		
	КонецЕсли;
	Возврат ТЗ;
КонецФункции//ТаблицаСтрок

Функция РазложитьСтроку(Текст) Экспорт
	Для х=1 по СтрДлина(Текст) Цикл
		ТекущийСимвол=Сред(Текст,х,1);
		Если ТекущийСимвол=" " Тогда
			Если х+10 Тогда
		ЧислоПробелов=Цел(ОстатокСтроки/ТекущееКолвоПробелов);
	Иначе
		ЧислоПробелов=0;
	КонецЕсли;
	НовыйТекст="";
	Если ТекущееКолвоПробелов>0 и ОстатокСтроки>0 Тогда
		ТаблицаПробелов=Новый ТаблицаЗначений;
		ТаблицаПробелов.Колонки.Добавить("Положение");
		ТаблицаПробелов.Колонки.Добавить("Довесок");
		хНач=1;
		ТекущийСимвол=Сред(Текст,хНач,1);
		Пока ТекущийСимвол=" " и хНач0 и ТаблицаПробелов.Количество()>0 Цикл
			СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0, ТаблицаПробелов.Количество()-1);
			ТаблицаПробелов[СлучайноеЧисло].Довесок=ТаблицаПробелов[СлучайноеЧисло].Довесок+" ";
			ОстатокСтроки=ОстатокСтроки-1;		
		КонецЦикла;
		Если хНач>1 Тогда
			НовыйТекст=Сред(Текст,1,хНач-1);
		КонецЕсли;
		Для  х=хНач по ДлинаСтроки Цикл
			ТекущийСимвол=Сред(Текст,х,1);
			Если ТекущийСимвол=" " Тогда
				ПараметрыПоиска=Новый Структура;
				ПараметрыПоиска.Вставить("Положение",х);
				НайденнаяСтрока=ТаблицаПробелов.НайтиСтроки(ПараметрыПоиска);
				НовыйТекст=НовыйТекст+НайденнаяСтрока[0].Довесок;
			Иначе
				НовыйТекст=НовыйТекст+ТекущийСимвол;				
			КонецЕсли;
		КонецЦикла;

	Иначе
		НовыйТекст=Текст;	
	КонецЕсли;
	Возврат НовыйТекст;
КонецФункции//ВыровнятьПоШирине

Проверка прав пользователей происходит при открытии формы с помощью функции ПроверкаПравДоступа(). В данном случае пользователю, если он не автор дается право на просмотр.  Данный код был приведен из первой начальной версии реализации договоров. В последствии были добавлены разные хотелки пользователей и усложнена проверка прав. К сожалению выгрузить файлом конфигурации не получается, т.к. там используются контрагенты и организации. Если пытаться загрузить в чистую базу только пункты, касаемые договоров, то по пеерсекающимся ссылкам он затягивает практически всю конфигурации. А выложить конфигурацию упп я не имею права (1с может обидеться Smile). Поэтому привожу сам код формы.

Скриншот макета договора

  espero, в комментарии обратил внимание, что в коде есть ошибки. Выяснилось, что при копировании через стандратный редактор иностарта почему-то съедает часть кода. Два раза пробовал перевставить. Как минимум, обрезает текст в Процедуре ОсновныеДействияФормыПечать, поэтому ниже код в виде обычного текста

Перем ТекстДоговора;
Перем ПодписиНаСтраницах;
Перем Подписи;
Перем ВысотаПодписи;
Перем ПодписьНаПоследнейСтранице;
Перем СтрокиНаЭтойСтранице;
Перем СтрокиНаСледующейСтранице;
Перем ТабДок;
Перем Макет;
Перем ВысотаСтроки;
Перем ШиринаСтроки;
Перем ШиринаПоловиныСтроки;
Перем ВысотаСтраницы;
Перем ТекущийТекстДоговора;
Перем ТаблицаПараметров;

Процедура УстановитьПараметры()
    ВысотаСтроки=5;
    ШиринаСтроки=84;
    ШиринаПоловиныСтроки=42;
    ВысотаСтраницы=295;
КонецПроцедуры//УстановитьПараметры

Процедура ТипДоговораПриИзменении(Элемент)
    ЗаполнитьТекстДоговора();
КонецПроцедуры//ТипДоговораПриИзменении

Процедура ЗаполнитьТекстДоговора()
    Если ЗначениеЗаполнено(ТипДоговора) Тогда
        ТекстДоговора=ТипДоговора.ПунктыДоговора.Выгрузить();
        ПодписиНаСтраницах=ТипДоговора.ПунктыДоговора.Выгрузить();
        Подписи=ТипДоговора.Подписи.Выгрузить();
        ПодписьНаПоследнейСтранице=ТипДоговора.ПодписьНаПоследнейСтранице;
    КонецЕсли;
КонецПроцедуры//ЗаполнитьТекстДоговора

Процедура ВычислитьВысотуПодписиИСтраницы()
    Если ТипДоговора.ПодписиНаСтраницах.Количество()>0 Тогда
        Высота=0;
        Для Каждого СтрокаТЧ из ТипДоговора.ПодписиНаСтраницах Цикл
            ТекстЛевый=СтрокаТЧ.ТекстЛевый;
            ТекстПравый=СтрокаТЧ.ТекстПравый;
            Для Каждого СтрокаПараметров из ТаблицаПараметров Цикл
                ТекстЛевый=СтрЗаменить(ТекстЛевый,СтрокаПараметров.Реквизит,СтрокаПараметров.Значение);
                ТекстПравый=СтрЗаменить(ТекстПравый,СтрокаПараметров.Реквизит,СтрокаПараметров.Значение);
            КонецЦикла;
            ВысотаЛевая=ВысотаСтроки*Окр(СтрДлина(СтрокаТЧ.ТекстЛевый)/ШиринаПоловиныСтроки,0,1);
            ВысотаПравая=ВысотаСтроки*Окр(СтрДлина(СтрокаТЧ.ТекстПравый)/ШиринаПоловиныСтроки,0,1);
            Высота=Высота+Макс(ВысотаЛевая,ВысотаПравая,ВысотаСтроки);
        КонецЦикла;
        ВысотаСтраницы=ВысотаСтраницы-Высота;
        ВысотаПодписи=Высота;
    Иначе
        ВысотаПодписи=0;
    КонецЕсли;
КонецПроцедуры//ВычислитьВысотуПодписиИСтраницы

Процедура ОсновныеДействияФормыПечать(Кнопка)
    ЗаполнитьПараметры();
    УстановитьПараметры();
    ВычислитьВысотуПодписиИСтраницы();
    ТекущаяВысотаСтраницы=0;
    ТабДок=Новый ТабличныйДокумент;
    Макет=ЭтотОбъект.ПолучитьМакет("Договор");
    ТекущийТекстДоговора=Новый ТаблицаЗначений;
    ТекущийТекстДоговора=ТекстДоговора.Скопировать();
    Для каждого СтрокаДоговора из ИзмененныеПунктыДоговора Цикл
        ПараметрыПоиска=новый Структура;
        ПараметрыПоиска.Вставить("Пункт",СтрокаДоговора.Пункт);
        РезультатПоиска=ТекущийТекстДоговора.НайтиСтроки(ПараметрыПоиска);
        Если РезультатПоиска.Количество()>0 Тогда
            РезультатПоиска[0].Текст=СтрокаДоговора.Текст;
            РезультатПоиска[0].СимволФорматирования=СтрокаДоговора.СимволФорматирования;
            РезультатПоиска[0].Заголовок=СтрокаДоговора.Заголовок;
            РезультатПоиска[0].Положение=СтрокаДоговора.Положение;
          Иначе
            НоваяСтрока=ТекущийТекстДоговора.Добавить();
            НоваяСтрока.Текст= СтрокаДоговора.Текст;
            НоваяСтрока.Пункт= СтрокаДоговора.Пункт;
            НоваяСтрока.СимволФорматирования=СтрокаДоговора.СимволФорматирования;
            НоваяСтрока.Заголовок=СтрокаДоговора.Заголовок;
            НоваяСтрока.Положение=СтрокаДоговора.Положение;
        КонецЕсли;
    КонецЦикла;
    ТекущийТекстДоговора.Сортировать("Пункт Возр");
    Для каждого СтрокаДоговора из ТекущийТекстДоговора Цикл
        Если Найти(СтрокаДоговора.Текст,"&")<>0 Тогда
            Для Каждого СтрокаПараметров из ТаблицаПараметров Цикл
                СтрокаДоговора.Текст=СтрЗаменить(СтрокаДоговора.Текст,"&"+СтрокаПараметров.Реквизит,СтрокаПараметров.Значение);    
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    ВременныйТекстДоговора=Новый ТаблицаЗначений;
    ВременныйТекстДоговора=ТекущийТекстДоговора.Скопировать();
    ТекущийТекстДоговора.Очистить();
      Для каждого ПунктДоговора из ВременныйТекстДоговора Цикл
        ТекстСтроки="";
        Если СтрДлина(ПунктДоговора.СимволФорматирования)>0 Тогда
            ТекстСтроки=ПунктДоговора.СимволФорматирования+ПунктДоговора.Текст;
        Иначе
            ТекстСтроки=ПунктДоговора.Пункт+" "+ПунктДоговора.Текст;
        КонецЕсли;
        РазложеннаяСтрока=ТаблицаСтрок(ТекстСтроки,ПунктДоговора.Положение);
        Для каждого СтрокаТаблицы из РазложеннаяСтрока Цикл
            НоваяСтрока=ТекущийТекстДоговора.Добавить();
            Если СтрокаТаблицы.Положение=Перечисления.ПоложениеНаСтраницеБМА.ПоШирине Тогда
                НоваяСтрока.Текст=ВыровнятьПоШирине(СтрокаТаблицы.Текст);
            Иначе
                НоваяСтрока.Текст=СтрокаТаблицы.Текст;    
            КонецЕсли;
            НоваяСтрока.Заголовок=ПунктДоговора.Заголовок;
            НоваяСтрока.Положение=СтрокаТаблицы.Положение;
        КонецЦикла;
    КонецЦикла;
    ВременныйТекстДоговора.Очистить();
    ПоследняяСтраница=ложь;
    ТекущаяВысотаСтраницы=0;
    Для каждого ПунктДоговора из ТекущийТекстДоговора Цикл
        Если ТекущаяВысотаСтраницы            Если ПунктДоговора.Заголовок Тогда
                Область=Макет.ПолучитьОбласть("ТекстЗаголовка");    
            Иначе
                Область=Макет.ПолучитьОбласть("Текст");
            КонецЕсли;
            Область.Параметры.Текст=ПунктДоговора.Текст;
            ПоложениеНаСтранице(Область,ПунктДоговора.Положение);
            ТабДок.Вывести(Область);
            ТекущаяВысотаСтраницы=ТекущаяВысотаСтраницы+ВысотаСтроки;
        Иначе
            ТекущаяВысотаСтраницы=0;
            Остаток=ТекущийТекстДоговора.Количество()-1-ТекущийТекстДоговора.Индекс(ПунктДоговора);
            Если Остаток>0 Тогда
                ВывестиПодписи();
            КонецЕсли;
            ТабДок.ВывестиГоризонтальныйРазделительСтраниц();

        КонецЕсли;
    КонецЦикла;
    ВывестиРеквизиты();
    Если ПодписьНаПоследнейСтранице Тогда
        ВывестиПодписи();    
    КонецЕсли;
    ТабДок.ПолеСлева=15;
    ТабДок.ОтображатьЗаголовки=Ложь;
    ТабДОк.ОтображатьСетку=Ложь;
    ТабДок.Показать(ТипДоговора.Наименование);
КонецПроцедуры//ОсновныеДействияФормыПечать

Процедура ВывестиРеквизиты()
    Если ТипДоговора.Подписи.Количество()>0 Тогда
        Область=Макет.ПолучитьОбласть("ЛинияСнизу");
        ТабДок.Вывести(Область);
        ЗаполнитьРеквизиты();    
        Область=Макет.ПолучитьОбласть("ЛинияСверху");
        ТабДок.Вывести(Область);
    КонецЕсли;
КонецПроцедуры//ВывестиРеквизиты

Процедура ЗаполнитьРеквизиты()
    Для Каждого Строка из ТипДоговора.Подписи Цикл
        Если Строка.Заголовок Тогда
            Область=Макет.ПолучитьОбласть("ПодписиЗаголовок");    
        Иначе
            Область=Макет.ПолучитьОбласть("Подписи");    
        КонецЕсли;
        ТекстЛевый=Строка.ТекстЛевый;
        ТекстПравый=Строка.ТекстПравый;
        Для каждого СтрокаПараметров из ТаблицаПараметров Цикл
            ТекстЛевый=СтрЗаменить(ТекстЛевый,"&"+СтрокаПараметров.Реквизит,СтрокаПараметров.Значение);    
            ТекстПравый=СтрЗаменить(ТекстПравый,"&"+СтрокаПараметров.Реквизит,СтрокаПараметров.Значение);    
        КонецЦикла;
        Область.Параметры.ТекстЛевый=ТекстЛевый;
        Область.Параметры.ТекстПравый=ТекстПравый;
        ПоложениеНаСтранице(Область,Строка.Положение);
        ТабДок.Вывести(Область);
    КонецЦикла;
КонецПроцедуры//ЗаполнитьРеквизиты

Процедура ВывестиПодписи()
    Если ВысотаПодписи>0 Тогда
        ЗаполнитьПодписи();    
    КонецЕсли;
КонецПроцедуры//ВывестиПодписи

Процедура ЗаполнитьПодписи()
    Для Каждого Строка из ТипДоговора.ПодписиНаСтраницах Цикл
        Если Строка.Заголовок Тогда
            Область=Макет.ПолучитьОбласть("ПодписиНаСтраницахЗаголовок");    
        Иначе
            Область=Макет.ПолучитьОбласть("ПодписиНаСтраницах");    
        КонецЕсли;
        ТекстЛевый=Строка.ТекстЛевый;
        ТекстПравый=Строка.ТекстПравый;
        Для каждого СтрокаПараметров из ТаблицаПараметров Цикл
            ТекстЛевый=СтрЗаменить(ТекстЛевый,"&"+СтрокаПараметров.Реквизит,СтрокаПараметров.Значение);    
            ТекстПравый=СтрЗаменить(ТекстПравый,"&"+СтрокаПараметров.Реквизит,СтрокаПараметров.Значение);    
        КонецЦикла;
        Область.Параметры.ТекстЛевый=ТекстЛевый;
        Область.Параметры.ТекстПравый=ТекстПравый;
        ПоложениеНаСтранице(Область,Строка.Положение);
        ТабДок.Вывести(Область);
    КонецЦикла;
КонецПроцедуры//ЗаполнитьПодписи

Процедура СформироватьСтроки(Остаток,ТекстСтроки,СтрокиНаЭтойСтранице,СтрокиНаСледующейСтранице)
    СтрокаПоиска=Сред(ТекстСтроки,1,Остаток*ШиринаСтроки);
    Позиция=СтрДлина(СтрокаПоиска);
    Пока (Сред(СтрокаПоиска,Позиция,1)<>" ") И (Позиция>0) Цикл
        Позиция=Позиция-1;
    КонецЦикла;
    СтрокиНаЭтойСтранице=Сред(ТекстСтроки,1,Позиция-1);
    СтрокиНаСледующейСтранице=Сред(ТекстСтроки,Позиция+1,СтрДлина(ТекстСтроки));
КонецПроцедуры//СформироватьСтроки

Процедура ПоложениеНаСтранице(Область,Положение)
    Если Положение=Перечисления.ПоложениеНаСтраницеБМА.Лево Тогда
        Область.Область().ГоризонтальноеПоложение=ГоризонтальноеПоложение.Лево;    
    ИначеЕсли Положение=Перечисления.ПоложениеНаСтраницеБМА.Право Тогда
        Область.Область().ГоризонтальноеПоложение=ГоризонтальноеПоложение.Право;
    ИначеЕсли Положение=Перечисления.ПоложениеНаСтраницеБМА.Центр Тогда
        Область.Область().ГоризонтальноеПоложение=ГоризонтальноеПоложение.Центр;
    Иначе
        Область.Область().ГоризонтальноеПоложение=ГоризонтальноеПоложение.ПоШирине;
    КонецЕсли;
КонецПроцедуры//ПоложениеНаСтранице

Процедура ПриОткрытии()
    Если ЗначениеЗаполнено(Автор) Тогда
        ФормаДокумента=ЭтотОбъект.ПолучитьФорму("ФормаДокумента");
        ФормаДокумента.ТолькоПросмотр=НЕ ПроверкаПравДоступа();
    Иначе    
        Автор=ПараметрыСеанса.ТекущийПользователь;
    КонецЕсли;
    УстановитьПараметры();
    ЗаполнитьТекстДоговора();
КонецПроцедуры//ПриОткрытии

Процедура ИзмененныеПунктыДоговораПунктПриИзменении(Элемент)
    ТекущаяСтрока=ЭлементыФормы.ИзмененныеПунктыДоговора.ТекущаяСтрока;
    Если ЗначениеЗаполнено(ТекущаяСтрока.Пункт) Тогда
        ПараметрыПоиска=Новый Структура;
        ПараметрыПоиска.Вставить("Пункт", ТекущаяСтрока.Пункт);
        Результат=ТекстДоговора.НайтиСтроки(ПараметрыПоиска);
        Для каждого СтрокаРезультата из Результат Цикл
            ТекущаяСтрока.Текст=СтрокаРезультата.Текст;
            ТекущаяСтрока.СимволФорматирования=СтрокаРезультата.СимволФорматирования;
            ТекущаяСтрока.Заголовок=СтрокаРезультата.Заголовок;
            ТекущаяСтрока.Положение=СтрокаРезультата.Положение;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

Процедура ОсновныеДействияФормыШаблон(Кнопка)
    ТабДок=Новый ТабличныйДокумент;
    Макет=ЭтотОбъект.ПолучитьМакет("Договор");
    ТекущийТекстДоговора=Новый ТаблицаЗначений;
    ТекущийТекстДоговора=ТекстДоговора.Скопировать();
    Для каждого СтрокаТЧ из ТекущийТекстДоговора Цикл
        Область=Макет.ПолучитьОбласть("Текст");
        Область.Параметры.Текст=СтрокаТЧ.Пункт+СтрокаТЧ.Текст;
        ТабДок.Вывести(Область);
    КонецЦикла;    
    ТабДок.ОтображатьГруппировки=Ложь;
    ТабДок.ОтображатьЗаголовки=Ложь;
    ТабДок.ОтображатьСетку=Ложь;
    ТабДок.Показать("Шаблон "+СокрЛП(ТипДоговора.Наименование));
КонецПроцедуры

Процедура КоманднаяПанель2Заполнить(Кнопка)
    Для каждого СтрокаТЧ из ТипДоговора.Параметры Цикл
        ПараметрыПоиска=Новый Структура;
        ПараметрыПоиска.Вставить("Реквизит",СтрокаТЧ.Реквизит);
        РезультатПоиска=Параметры.НайтиСтроки(ПараметрыПоиска);
        Если РезультатПоиска.Количество()=0 Тогда
            НоваяСтрока=Параметры.Добавить();
            НоваяСтрока.Реквизит=СтрокаТЧ.Реквизит;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры//Заполнить

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    ТабЗнач=Новый ТаблицаЗначений;
    ТабЗнач=Параметры.Выгрузить();
    Параметры.Очистить();
    Для каждого СтрокаТЧ из ТабЗнач Цикл
        Если ЗначениеЗаполнено(СтрокаТЧ.Значение) Тогда
            НоваяСтрока=Параметры.Добавить();
            НоваяСтрока.Значение=СтрокаТЧ.Значение;
            НоваяСтрока.Реквизит=СтрокаТЧ.Реквизит;
        КонецЕсли;
    КонецЦикла;
    //Попытка присвоить номер
    Если Не ЗначениеЗаполнено(НомерПечатный) Тогда
        Объект=ТипДоговора.ПолучитьОбъект();
        ПараметрыПоиска=Новый Структура;
        ПараметрыПоиска.Вставить("Организация",Организация);
        РезультатПоиска=Объект.Нумерация.НайтиСтроки(ПараметрыПоиска);
        Если РезультатПоиска.Количество()>0 Тогда
            НомерПечатный=Строка(РезультатПоиска[0].ПоследнийНомер+1);
            РезультатПоиска[0].ПоследнийНомер=РезультатПоиска[0].ПоследнийНомер+1;
        Иначе
            НоваяСтрока=Объект.Нумерация.Добавить();
            НоваяСтрока.Организация=Организация;
            НоваяСтрока.ПоследнийНомер=1;
            НомерПечатный="1";
        КонецЕсли;
        Объект.Записать();
    КонецЕсли;
КонецПроцедуры//ПередЗаписью

Процедура ЗаполнитьПараметры()
    ТаблицаПараметров=Новый ТаблицаЗначений;
    ТаблицаПараметров.Колонки.Добавить("Реквизит");
    ТаблицаПараметров.Колонки.Добавить("Значение");
    ТаблицаПараметров.Колонки.Добавить("Длина");
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ОрганизацияНаименованиеСокращенное";
    НоваяСтрока.Значение=СокрЛП(Организация.НаименованиеСокращенное);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ОрганизацияНаименованиеПолное";
    НоваяСтрока.Значение=СокрЛП(Организация.НаименованиеПолное);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="НомерДоговора";
    НоваяСтрока.Значение=СокрЛП(НомерПечатный);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ДатаДоговораДень";
    НоваяСтрока.Значение=Строка(День(ЭтотОбъект.Дата));
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ДатаДоговораЦифрами";
    НоваяСтрока.Значение=Формат(ЭтотОбъект.Дата,"ДЛФ=D");
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ДатаДоговораМесяцПрописью";
    ФорматнаяСтрока=Формат(ЭтотОбъект.Дата,"ДЛФ=DD");
    ФорматнаяСтрока=Сред(ФорматнаяСтрока,Найти(ФорматнаяСтрока," ")+1,СтрДлина(ФорматнаяСтрока));
    ФорматнаяСтрока=Сред(ФорматнаяСтрока,1, Найти(ФорматнаяСтрока," "));
    НоваяСтрока.Значение=СокрЛП(ФорматнаяСтрока);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ДатаДоговораГод";
    НоваяСтрока.Значение=Формат(ЭтотОбъект.Дата,"ДФ=yyyy");
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ДатаКонецГода";
    НоваяСтрока.Значение=Формат(КонецГода(ЭтотОбъект.Дата),"ДЛФ=D");
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ДатаОкончания";
    НоваяСтрока.Значение=Формат(ЭтотОбъект.Дата,"ДФ=dd.MM.yyyy");
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
                 |    ОтветственныеЛицаОрганизацийСрезПоследних.ФизическоеЛицо КАК ФизическоеЛицо,
                 |    ОтветственныеЛицаОрганизацийСрезПоследних.Должность КАК Должность,
                 |    ОтветственныеЛицаОрганизацийСрезПоследних.ОтветственноеЛицо КАК ОтветственноеЛицо,
                 |    ОтветственныеЛицаОрганизацийСрезПоследних.СтруктурнаяЕдиница КАК СтруктурнаяЕдиница
                 |ИЗ
                 |    РегистрСведений.ОтветственныеЛицаОрганизаций.СрезПоследних(&Период, СтруктурнаяЕдиница = &Организация) КАК ОтветственныеЛицаОрганизацийСрезПоследних";
    Запрос.УстановитьПараметр("Период", ЭтотОбъект.Дата);
    Запрос.УстановитьПараметр("Организация",Организация);
    Результат=Запрос.Выполнить().Выгрузить();
    ПараметрыПоиска=Новый Структура;
    ПараметрыПоиска.Вставить("ОтветственноеЛицо",Перечисления.ОтветственныеЛицаОрганизаций.Руководитель);
    РезультатПоиска=Результат.НайтиСтроки(ПараметрыПоиска);
    РуководительДолжность=РезультатПоиска[0].Должность;
    РуководительФизЛицо=РезультатПоиска[0].ФизическоеЛицо;
    ПараметрыПоиска.Количество();
    ПараметрыПоиска.Вставить("ОтветственноеЛицо",Перечисления.ОтветственныеЛицаОрганизаций.ГлавныйБухгалтер);
    РезультатПоиска=Результат.НайтиСтроки(ПараметрыПоиска);
    ГлавныйБухгалтерДолжность=РезультатПоиска[0].Должность;
    ГлавныйБухгалтерФизЛицо=РезультатПоиска[0].ФизическоеЛицо;
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ДолжностьРуководителя";
    НоваяСтрока.Значение=СокрЛП(РуководительДолжность.Наименование);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ФИОРуководителя";
    НоваяСтрока.Значение=СокрЛП(РуководительФизЛицо.Наименование);
    ФИО="";
    УниверсальныеМеханизмы.Просклонять(глЗначениеПеременной("глКомпонентаСклоненияФИО"),РуководительФизЛицо.Наименование, 2, РуководительФизЛицо.Пол, ФИО);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ФИОРуководителяРодительныйПадеж";
    НоваяСтрока.Значение=СокрЛП(ФИО);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ДолжностьРуководителяРодительныйПадеж";
    НоваяСтрока.Значение=ПросклонятьДолжности(СокрЛП(РуководительДолжность.Наименование));
    УниверсальныеМеханизмы.Просклонять(глЗначениеПеременной("глКомпонентаСклоненияФИО"),ГлавныйБухгалтерФизЛицо.Наименование, 2, ГлавныйБухгалтерФизЛицо.Пол, ФИО);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ФИОГлавногоБухгалтераРодительныйПадеж";
    НоваяСтрока.Значение=СокрЛП(ФИО);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ДолжностьГлавногоБухгалтераРодительныйПадеж";
    НоваяСтрока.Значение=ПросклонятьДолжности(СокрЛП(ГлавныйБухгалтерДолжность.Наименование));
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ФИОГлавногоБухгалтера";
    НоваяСтрока.Значение=СокрЛП(ГлавныйБухгалтерФизЛицо.Наименование);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ДолжностьГлавногоБухгалтера";
    НоваяСтрока.Значение=СокрЛП(ГлавныйБухгалтерДолжность.Наименование);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ФамилияИнициалыГлавногоБухгалтера";
    НоваяСтрока.Значение=ОбщегоНазначения.ФамилияИнициалыФизЛица(ГлавныйБухгалтерФизЛицо);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ФамилияИнициалыРуководителя";
    НоваяСтрока.Значение=ОбщегоНазначения.ФамилияИнициалыФизЛица(РуководительФизЛицо);
    СведенияОбОрганизации = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Организация, ЭтотОбъект.Дата);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ЮридическийАдрес";
    НоваяСтрока.Значение=СокрЛП(СведенияОбОрганизации.ЮридическийАдрес);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ИННКПП";
    НоваяСтрока.Значение=СокрЛП(СведенияОбОрганизации.ИНН+"/"+СведенияОбОрганизации.КПП);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="РасчетныйСчет";
    НоваяСтрока.Значение=СокрЛП(СведенияОбОрганизации.НомерСчета);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="КоррСчет";
    НоваяСтрока.Значение=СокрЛП(СведенияОбОрганизации.КоррСчет);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="БИК";
    НоваяСтрока.Значение=СокрЛП(СведенияОбОрганизации.БИК);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="Банк";
    НоваяСтрока.Значение=СокрЛП(СведенияОбОрганизации.Банк);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="БанкГород";
    Банк=Справочники.Банки.НайтиПоКоду(СокрЛП(СведенияОбОрганизации.БИК));
    НоваяСтрока.Значение=СокрЛП(Банк.Город);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="Телефоны";
    НоваяСтрока.Значение=СокрЛП(СведенияОбОрганизации.Телефоны);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="КодПоОКПО";
    НоваяСтрока.Значение=СокрЛП(СведенияОбОрганизации.КодПоОКПО);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="ОГРН";
    НоваяСтрока.Значение=СокрЛП(Организация.ОГРН);
    //реквизиты контрагента
    СведенияОбКонтрагенте = УправлениеКонтактнойИнформацией.СведенияОЮрФизЛице(Контрагент, ЭтотОбъект.Дата);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="КонтрагентНаименованиеПолное";
    НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.ПолноеНаименование);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="КонтрагентНаименованиеСокращенное";
    НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.ПолноеНаименование);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="КонтрагентКодПоОКПО";
    НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.КодПоОКПО);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="КонтрагентИННКПП";
    НоваяСтрока.Значение=СокрЛП(Строка(СведенияОбКонтрагенте.ИНН)+"/"+Строка(СведенияОбКонтрагенте.КПП));
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="КонтрагентТелефоны";
    НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.Телефоны);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="КонтрагентЮридическийАдрес";
    НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.ЮридическийАдрес);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="КонтрагентБанк";
    НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.Банк);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="КонтрагентБИК";
    НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.БИК);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="КонтрагентБанкГород";
    Банк=Справочники.Банки.НайтиПоКоду(СокрЛП(СведенияОбКонтрагенте.БИК));
    НоваяСтрока.Значение=СокрЛП(Банк.Город);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="КонтрагентКоррСчет";
    НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.КоррСчет);
    НоваяСтрока=ТаблицаПараметров.Добавить();
    НоваяСтрока.Реквизит="КонтрагентКодРасчетныйСчет";
    НоваяСтрока.Значение=СокрЛП(СведенияОбКонтрагенте.НомерСчета);
    ПараметрыПоиска=Новый Структура;
    Для каждого Строка из ТипДоговора.Параметры Цикл
        НоваяСтрока=ТаблицаПараметров.Добавить();
        НоваяСтрока.Реквизит=Строка.Реквизит;
        ПараметрыПоиска.Очистить();
        ПараметрыПоиска.Вставить("Реквизит",Строка.Реквизит);
        РезультатПоиска=Параметры.НайтиСтроки(ПараметрыПоиска);
        Если РезультатПоиска.Количество()>0 Тогда
            НоваяСтрока.Значение=РезультатПоиска[0].Значение;
        КонецЕсли;
    КонецЦикла;
    Для каждого Строка из Параметры Цикл
        ПараметрыПоиска.Очистить();
        ПараметрыПоиска.Вставить("Реквизит",Строка.Реквизит);
        РезультатПоиска=ТаблицаПараметров.НайтиСтроки(ПараметрыПоиска);
        Если РезультатПоиска.Количество()>0 Тогда
            РезультатПоиска[0].Значение=Строка.Значение;
        КонецЕсли;
    КонецЦикла;
    Для каждого Строка из ТаблицаПараметров Цикл
        Строка.Длина=СтрДлина(Строка.Реквизит);    
    КонецЦикла;
    ТаблицаПараметров.Сортировать("Длина Убыв");
КонецПроцедуры//ЗаполнитьПараметры

Функция ПросклонятьДолжности(ТекущаяДолжность)
    должность=НРег(ТекущаяДолжность);
    должность=СтрЗаменить(Должность,"директор","директора");
    должность=СтрЗаменить(Должность,"генеральный","генерального");
    должность=СтрЗаменить(Должность,"бухгалтер","бухгалтера");
    должность=СтрЗаменить(Должность,"главный","главного");
    Возврат Должность;
КонецФункции//ПросклонятьДолжности

Процедура ОсновныеДействияФормыРеквизиты(Кнопка)
    ЗаполнитьПараметры();
    Таблица=новый ТабличныйДокумент;
    МакетТаблицы=ЭтотОбъект.ПолучитьМакет("Договор");
    Для каждого Строка из ТаблицаПараметров Цикл
        Область=МакетТаблицы.ПолучитьОбласть("Реквизиты");
        Область.Параметры.ТекстЛевый=Строка.Реквизит;
        Область.Параметры.ТекстПравый=Строка.Значение;
        Таблица.Вывести(Область);
    КонецЦикла;
    Таблица.ОтображатьЗаголовки=Ложь;
    Таблица.ОтображатьСетку=Ложь;
    Таблица.Показать("Реквизиты");
КонецПроцедуры//ОсновныеДействияФормыРеквизиты

Функция ТаблицаСтрок(Текст,Положение)
    ТЗ=новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("Текст");
    ТЗ.Колонки.Добавить("Положение");
    МассивПодстрок=РазложитьСтроку(Текст);
    ТекущаяСтрока="";
    Для каждого СтрокаМассива из МассивПодстрок Цикл
        Если СтрДлина(ТекущаяСтрока+" "+СтрокаМассива)            ТекущаяСтрока=ТекущаяСтрока+" "+СтрокаМассива;    
        Иначе
            НоваяСтрока=ТЗ.Добавить();
            НоваяСтрока.Текст=ТекущаяСтрока;
            НоваяСтрока.Положение=Положение;
            ТекущаяСтрока=СтрокаМассива;
        КонецЕсли;
    КонецЦикла;
    Если ТекущаяСтрока<>"" Тогда
        НоваяСтрока=ТЗ.Добавить();
        НоваяСтрока.Текст=ТекущаяСтрока;
        НоваяСтрока.Положение=Положение;
    КонецЕсли;
    Если ТЗ.Количество()>1 и Положение=Перечисления.ПоложениеНаСтраницеБМА.ПоШирине Тогда
        ТЗ[ТЗ.Количество()-1].Положение=Перечисления.ПоложениеНаСтраницеБМА.Лево;        
    КонецЕсли;
    Возврат ТЗ;
КонецФункции//ТаблицаСтрок

Функция РазложитьСтроку(Текст) Экспорт
    Для х=1 по СтрДлина(Текст) Цикл
        ТекущийСимвол=Сред(Текст,х,1);
        Если ТекущийСимвол=" " Тогда
            Если х+1                Текст=ЗаменитьПробелы(Текст,х+1);    
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Результат=ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(Текст, " ");
    Для Индекс=0 по Результат.ВГраница() Цикл
        Результат[Индекс]=СтрЗаменить(Результат[Индекс],"#"," ");
    КонецЦикла;
    Возврат Результат;
КонецФункции//РазложитьСтроку

Функция ЗаменитьПробелы(Текст, Позиция)
    Пока Позиция        Текст=Сред(Текст,1,Позиция-1)+"#"+Сред(Текст,Позиция+1,СтрДлина(Текст));
        Позиция=Позиция+1;
    КонецЦикла;
    Возврат Текст;
КонецФункции//ЗаменитьПробелы

Функция ВыровнятьПоШирине(Текст)
    ДлинаСтроки=СтрДлина(Текст);
    ТекущееКолвоПробелов=СтрЧислоВхождений(Текст," ");
    ОстатокСтроки=ШиринаСтроки-ДлинаСтроки;
    Если ТекущееКолвоПробелов>0 Тогда
        ЧислоПробелов=Цел(ОстатокСтроки/ТекущееКолвоПробелов);
    Иначе
        ЧислоПробелов=0;
    КонецЕсли;
    НовыйТекст="";
    Если ТекущееКолвоПробелов>0 и ОстатокСтроки>0 Тогда
        ТаблицаПробелов=Новый ТаблицаЗначений;
        ТаблицаПробелов.Колонки.Добавить("Положение");
        ТаблицаПробелов.Колонки.Добавить("Довесок");
        хНач=1;
        ТекущийСимвол=Сред(Текст,хНач,1);
        Пока ТекущийСимвол=" " и хНач            хНач=хНач+1;
            ТекущийСимвол=Сред(Текст,хНач,1);
        КонецЦикла;
        Для х=хНач по ДлинаСтроки Цикл
            ТекущийСимвол=Сред(Текст,х,1);
            Если ТекущийСимвол=" " Тогда
                НоваяСтрока=ТаблицаПробелов.Добавить();
                НоваяСтрока.Положение=х;
                НоваяСтрока.Довесок=" ";
            КонецЕсли;
        КонецЦикла;
        Гсч = Новый ГенераторСлучайныхЧисел();
        Пока ОстатокСтроки>0 и ТаблицаПробелов.Количество()>0 Цикл
            СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0, ТаблицаПробелов.Количество()-1);
            ТаблицаПробелов[СлучайноеЧисло].Довесок=ТаблицаПробелов[СлучайноеЧисло].Довесок+" ";
            ОстатокСтроки=ОстатокСтроки-1;        
        КонецЦикла;
        Если хНач>1 Тогда
            НовыйТекст=Сред(Текст,1,хНач-1);
        КонецЕсли;
        Для  х=хНач по ДлинаСтроки Цикл
            ТекущийСимвол=Сред(Текст,х,1);
            Если ТекущийСимвол=" " Тогда
                ПараметрыПоиска=Новый Структура;
                ПараметрыПоиска.Вставить("Положение",х);
                НайденнаяСтрока=ТаблицаПробелов.НайтиСтроки(ПараметрыПоиска);
                НовыйТекст=НовыйТекст+НайденнаяСтрока[0].Довесок;
            Иначе
                НовыйТекст=НовыйТекст+ТекущийСимвол;                
            КонецЕсли;
        КонецЦикла;

    Иначе
        НовыйТекст=Текст;    
    КонецЕсли;
    Возврат НовыйТекст;
КонецФункции//ВыровнятьПоШирине

См. также

Табличная часть в доп. реквизитах и формирование таблиц в шаблоне docx для 1С:ДО 3.0

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    4653    9    5    

18

Расширение для 1С:УНФ. Автоматическое снятие резервов в Заказах покупателей

Логистика, склад и ТМЦ Адаптация типовых решений Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    3066    4    0    

20

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    1691    dimanich70    8    

14

Доработка отчета "Связанные документы" (структура подчиненности) для вывода объектов из любого расширения

Адаптация типовых решений Платформа 1С v8.3 1С:Управление торговлей 11 Россия Абонемент ($m)

Доработка типового отчета "Связанные документы" позволяет просто и быстро расширять состав объектов для построения структуры подчиненности документов, используя объекты основной конфигурации и любых расширений.

1 стартмани

27.10.2023    2109    19    avmartynov    14    

44

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2246    25    progmaster    8    

3
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. RespectSoft 51 12.11.14 19:20 Сейчас в теме
Есть решение описанной задачи в программе Респект: Учет договоров. Правда потребуется изменить типовую конфигурацию, хотя можно и автономно использовать.
2. wunderland 201 13.11.14 10:46 Сейчас в теме
Есть что-то общее с заполнением документов по шаблонам в "1С: Документооборот"
3. oleglad 13.11.14 17:02 Сейчас в теме
Что-то подобное создавал для УТ11, данные брались из справочников, шаблоны сохранялись в ХранилищеЗначений, заполнение дополнительных реквизитов проходило через обработку, вызывалась из справочника Соглашений с клиентом.
Прикрепленные файлы:
4. espero 25 15.11.14 19:42 Сейчас в теме
Идея хороша, но взять и вставить этот код в модуль формы - чревато, т.к. местами в коде вырезаны блоки. То есть после вставки кода в форму и перед сохранием конфигурации начинают вываливать ошибки, такие как: местами отсутствуют "КонецЕсли", "КонецЦикла" - и это мелочи.
А местами и вообще отсутствуют объекты, такие как: "ИзмененныеПунктыДоговора", "ДлинаСтроки", "ВыровнятьПоШирине" и т.д.
Молчу про отсутствующие в моей конфе глобальные процедуры и функции, тестировал на БП 3.0
Но все равно автору спасибо за идею, но $m - увы не дам.
5. Bienko 212 15.11.14 20:56 Сейчас в теме
(4) espero, при вставке через подсветку кода почему-то съедает часть кода, поэтому у тебя и синтаксические ошибки. Побороть не смог. Два раза перевставлял, а воз и ныне там, поэтому разместил код ниже еще и в обычном тексте. Может модератор поправит, - я ему про проблему написал.
6. espero 25 16.11.14 13:58 Сейчас в теме
Максиму, автору публикации, большое спасибо за индивидуальную помощь и советы по внедрению данной доработки в моей конфигурации!
7. b-dm 171 21.11.14 16:24 Сейчас в теме
Отличное руководство по созданию печатной формы договора!
8. gigagr 03.12.14 16:41 Сейчас в теме
Хороший вариант решения, лучше чем у нас реализованный на уровне заполнения документов по шаблонам...
9. Mig_Alm 09.01.15 10:28 Сейчас в теме
Хорошее решение. Подробно все расписано. Осталось только хранить где-нибудь подписанные и отсканированные договора. Я думал хранить их в отдельной базе, на SQL например. Осталось воплотить в жизнь. Может кто уже внедрял хранение договоров в отдельной базе с доступом из основной?
10. user1194102 21.02.20 12:06 Сейчас в теме
Мне кажется проще использовать вставки текста из 1С в шаблон договора вордовского файла, с помощью закладок.
Оставьте свое сообщение