///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2024, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОписаниеПеременных

&НаКлиенте
Перем СтруктураЕдиногоДокумента;

#КонецОбласти

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

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

	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда
		МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность");
		МодульУправлениеПечатьюМультиязычность.ЗаполнитьПодменюЯзык(ЭтотОбъект, , ДоступныеЯзыкиПечатныхФорм());
	КонецЕсли;
	
	Элементы.ФлажокПодписьИПечать.Видимость = ЕстьПодписиИПечатиДляОбъектовПечати();
	
	ОбъединитьДокументы = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПечатьДокументовOfficeOpen",
		"ОднимДокументом", Ложь) И Элементы.ФлажокОбъединитьДокументы.Видимость;
	ПодписьИПечать =  ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПечатьДокументовOfficeOpen",
		"ПодписьИПечать", Ложь);
	
	УстановитьЗаголовокФормы();		

	Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
		Элементы.КоманднаяПанельЛеваяЧасть.Видимость = Ложь;
		Элементы.КоманднаяПанельПраваяЧасть.Видимость = Ложь;
		Элементы.ПечатныеФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто;
		Элементы.КнопкаОтправитьВсеДействия.КнопкаПоУмолчанию = Истина;
		Элементы.Справка.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю;
		Элементы.КнопкаИзменитьМакет.Видимость = Ложь;
		Элементы.ФлажокПодписьИПечать.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто;
		Элементы.ФлажокОбъединитьДокументы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто;
		Элементы.ГруппаКоманднаяПанель.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
		Элементы.НастройкаПодписиИПечати.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
		Элементы.ПечатныеФормы.Шапка = Ложь;
		Элементы.БольшеНеПоказывать.Видимость = Ложь;
		БольшеНеПоказывать = Ложь;
		Элементы.ГруппаИнструкция.Видимость = Ложь;
		Элементы.Переместить(Элементы.Показать, Элементы.КоманднаяПанельЕще, Элементы.КнопкаСохранитьВсеДействия);
		Элементы.Показать.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю;
		Элементы.Сохранить.Заголовок = НСтр("ru = 'На устройство...'");
		Элементы.КнопкаСохранитьВсеДействия.Заголовок = НСтр("ru = 'На устройство...'");
		Элементы.ПерейтиКУправлениюМакетами.Видимость = Ложь;
		
	Иначе
		БольшеНеПоказывать = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПечатьДокументовOfficeOpen",
			"ВыводитьСразу", Ложь);
	КонецЕсли;
	
	УправлениеПечатью.ОбработатьКомандыОтправки(ЭтотОбъект);
	
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
	
	ПараметрыВыбора = Новый Структура("ВыбранноеЗначение, ИсточникВыбора", ВыбранноеЗначение, ИсточникВыбора);
	ОповещениеПродолжениеВыбора = Новый ОписаниеОповещения("ОбработкаВыбораПродолжение", ЭтотОбъект, ПараметрыВыбора);
	Оповещение = Новый ОписаниеОповещения("ПриЗавершенииФормированияПечатныхФорм", ЭтотОбъект, ОповещениеПродолжениеВыбора);
	
	Если ТребуетсяПереформирование Тогда
		НачатьПолучениеПечатныхФорм(СтруктураЕдиногоДокумента, Оповещение);
	Иначе
		ВыполнитьОбработкуОповещения(ОповещениеПродолжениеВыбора);
	КонецЕсли;
	
КонецПроцедуры

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

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура Печать(Команда)
	МассивПечатныхФорм = ПечатныеФормыСПометками();
	Если ТребуетсяПереформирование Тогда
		Оповещение = Новый ОписаниеОповещения("ПечатьПродолжение", ЭтотОбъект, МассивПечатныхФорм);
		НачатьПолучениеПечатныхФорм(СтруктураЕдиногоДокумента, Оповещение);
	Иначе
		ПечатьЗавершение(МассивПечатныхФорм);
	КонецЕсли;
КонецПроцедуры	
	
&НаКлиенте
Процедура ПредварительныйПросмотр(Команда)
	ОткрытьОтмеченныеПечатныеФормы();
КонецПроцедуры

&НаКлиенте
Процедура СнятьФлажки(Команда)
	УстановитьПометкиНаСервере(Ложь);
КонецПроцедуры

&НаКлиенте
Процедура УстановитьФлажки(Команда)
	УстановитьПометкиНаСервере(Истина);
КонецПроцедуры

&НаСервере
Процедура УстановитьПометкиНаСервере(Пометка)
	
	ТребуетсяПереформирование = Истина;
	
	ТаблицаЗначений = ПечатныеФормы.Выгрузить();
	
	ТаблицаЗначений.ЗаполнитьЗначения(Пометка, "Пометка");
	
	ПечатныеФормы.Загрузить(ТаблицаЗначений);
	
КонецПроцедуры

&НаКлиенте
Процедура ПечатныеФормыПометкаПриИзменении(Элемент)
	ТребуетсяПереформирование = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьМакетДляРедактирования()
	
	НастройкаПечатнойФормы = НастройкиПечатныхФорм[0];
	
	ЗаблокироватьФорму(Истина);
	
	ПараметрыОткрытия = Новый Структура;
	ПараметрыОткрытия.Вставить("ИмяОбъектаМетаданныхМакета", НастройкаПечатнойФормы.ПутьКМакету);
	ПараметрыОткрытия.Вставить("Ссылка", СсылкаМакета(НастройкаПечатнойФормы.ПутьКМакету));
	ПараметрыОткрытия.Вставить("РежимОткрытияОкна", РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
	ПараметрыОткрытия.Вставить("ИмяДокумента", НастройкаПечатнойФормы.Представление);
	ПараметрыОткрытия.Вставить("ТипМакета", "MXL");
	ПараметрыОткрытия.Вставить("Редактирование", Истина);
	ПараметрыОткрытия.Вставить("КодЯзыка", СтрРазделить(ТекущийЯзык, "_", Истина)[0]);
	
	ОткрытьФорму("ОбщаяФорма.РедактированиеДокументаOfficeOpen", ПараметрыОткрытия, ЭтотОбъект, "ПечатьДокументовOfficeOpen");
	
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьМакет(Команда)
	ОткрытьМакетДляРедактирования();
КонецПроцедуры

&НаКлиенте
Процедура ПерейтиКУправлениюМакетами(Команда)
	
	УправлениеПечатьюКлиент.ПерейтиКМакету(НастройкиПечатныхФорм[0].ПутьКМакету);
	
КонецПроцедуры

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

&НаКлиенте
Процедура СохранитьВПрисоединенныеФайлы(Команда)

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ОбъектыПечати", ОбъектыПечати);
	ПараметрыФормы.Вставить("РасширениеДляРаботыСФайламиПодключено", Ложь);
	ПараметрыФормы.Вставить("ОграничениеФорматовСохранения", "docx");
	ПараметрыФормы.Вставить("Назначение", "ПрисоединенныеФайлы");
	ОткрытьФорму("ОбщаяФорма.СохранениеПечатнойФормы", ПараметрыФормы, ЭтотОбъект, "ПечатьДокументовOfficeOpen");

КонецПроцедуры

&НаКлиенте
Процедура Отправить(Команда)
	ОтправитьПечатныеФормыПоПочте();
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПереключитьЯзык(Команда)
	
	УправлениеПечатьюКлиент.ПереключитьЯзык(ЭтотОбъект, Команда);
	УстановитьЗаголовокФормы();
	
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПриПереключенииЯзыка(КодЯзыка, ДополнительныеПараметры) Экспорт
	
	ТребуетсяПереформирование = Истина;
	
КонецПроцедуры

&НаКлиенте
Процедура ОбъединитьДокументыПриИзменении(Элемент)
	ТребуетсяПереформирование = Истина;
	ОбъединитьДокументыПриИзмененииНаСервере(ОбъединитьДокументы);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ОбъединитьДокументыПриИзмененииНаСервере(Значение)
	ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ПечатьДокументовOfficeOpen",
		"ОднимДокументом",	Значение);
КонецПроцедуры
	
&НаКлиенте
Процедура ФлажокПодписьИПечатьПриИзменении(Элемент)
	ТребуетсяПереформирование = Истина;
	ФлажокПодписьИПечатьПриИзмененииНаСервере(ПодписьИПечать);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ФлажокПодписьИПечатьПриИзмененииНаСервере(Значение)
	ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ПечатьДокументовOfficeOpen",
		"ПодписьИПечать", Значение);
КонецПроцедуры

&НаКлиенте
Процедура ПечатныеФормыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	СтрокаВыбора = ПечатныеФормы.НайтиПоИдентификатору(ВыбраннаяСтрока);
	
	МассивПечатныхФорм = Новый Массив;
	ДобавитьДанныеПечатнойФормы(МассивПечатныхФорм, СтрокаВыбора.АдресПечатнойФормы, 
		СтрокаВыбора.ИмяФайлаПечатнойФормы);
	
	ОткрытьПечатныеФормы(МассивПечатныхФорм);
КонецПроцедуры

&НаКлиенте
Процедура ИнструкцияПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
	Если ДанныеСобытия.Event.type = "click" И СтрНайти(ДанныеСобытия.Element.href, "ОткрытьЕдинственнуюПечатнуюФорму") Тогда
		ОткрытьПечатныеФормы();
		СтандартнаяОбработка = ложь;
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаКлиенте
Процедура ЗаблокироватьФорму(Заблокировать = Ложь)
	
	ГруппаОтображенияДокументов = Элементы.ГруппаДокументы;
	ГруппаОтображенияДокументов.ТолькоПросмотр = Заблокировать;
	
КонецПроцедуры

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

&НаКлиенте
Процедура ОткрытьОтмеченныеПечатныеФормы(ДополнительныеПараметры = Неопределено) Экспорт
	МассивПечатныхФорм = ПечатныеФормыСПометками();
	ОткрытьПечатныеФормы(МассивПечатныхФорм);
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьПечатныеФормы(МассивПечатныхФорм = Неопределено)
	Если Не ТребуетсяПереформирование Тогда
		
		Если МассивПечатныхФорм = Неопределено Тогда
			МассивПечатныхФорм = ПолучитьПечатныеФормы(СтруктураЕдиногоДокумента);
		КонецЕсли;
		
		ОткрытьПечатныеФормыЗавершение(МассивПечатныхФорм);
	
	Иначе
		Оповещение = Новый ОписаниеОповещения("ОткрытьПечатныеФормыПродолжение", ЭтотОбъект, МассивПечатныхФорм);
		НачатьПолучениеПечатныхФорм(СтруктураЕдиногоДокумента, Оповещение);
	КонецЕсли;	
КонецПроцедуры

&НаСервере
Процедура НастроитьФорму(КоличествоПечатныхФорм)
	РежимМногихПечатныхФорм = КоличествоПечатныхФорм > 1;
	
	Если Не РежимМногихПечатныхФорм Тогда	
		Элементы.Показать.Заголовок = НСтр("ru = 'Показать'");
	КонецЕсли;
	
	Элементы.ФлажокОбъединитьДокументы.Видимость = РежимМногихПечатныхФорм;
	Элементы.ПечатныеФормы.Видимость = РежимМногихПечатныхФорм Или ОбщегоНазначения.ЭтоМобильныйКлиент();
	Элементы.ГруппаУправленияСпискомДокументов.Видимость = Элементы.ПечатныеФормы.Видимость;
	Элементы.ГруппаУправлениеФлажкамиЕще.Видимость = Элементы.ПечатныеФормы.Видимость;
	Элементы.ГруппаУправлениеСтрокамиЕще.Видимость = Элементы.ПечатныеФормы.Видимость;
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьТекстИнструкции(Представление = Неопределено, АдресПечатнойФормы = Неопределено)

	 ТекстИнструкции = "<!DOCTYPE html PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN"">
	 		|<html>
			|
			|<head></head>
			|<style type=""text/css"">
			|    .Text {
			|        font-family: Arial;
			|        orphans: 2;
			|        widows: 2;
			|        font-variant-ligatures: normal;
			|    }
			|
			|</style>
			|
			|<body class=""text"">
			|
			|    <div>
			|        <p><strong>%1</strong></p>
			|    </div>
			|    <div>
			|        <p><span>%2</span></p>
			|        </p>
			|    </div>
			|</body>
			|
			|</html>";
	
	
	Если Представление = Неопределено Тогда	
		ТекстИнструкции = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстИнструкции, НСтр("ru = 'Документы сформированы и подготовлены к печати'"), НСтр("ru = 'Можно открыть документ для просмотра или отправить его на печать.'"));
	Иначе
		ТекстИнструкции = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстИнструкции, НСтр("ru = 'Документ сформирован и подготовлен к печати'"), "<a href=""ОткрытьЕдинственнуюПечатнуюФорму"">"+Представление+"</a>");
	КонецЕсли;

	Возврат ТекстИнструкции;			
КонецФункции

&НаКлиенте
Функция ПараметрыОжидания()
	
	ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
	ПараметрыОжидания.ТекстСообщения = НСтр("ru = 'Изменились параметры формирования печатных форм.'");
	ПараметрыОжидания.ОповещениеПользователя.Показать = Ложь;
	ПараметрыОжидания.ВыводитьОкноОжидания = Истина;
	ПараметрыОжидания.Интервал = 1;
	Возврат ПараметрыОжидания;

КонецФункции

// Параметры:
//  Результат - см. ДлительныеОперацииКлиент.НовыйРезультатДлительнойОперации
//  МассивПечатныхФорм - Массив
//
&НаКлиенте
Процедура ОткрытьПечатныеФормыПродолжение(Результат, МассивПечатныхФорм) Экспорт
	Если Результат.Статус = "Ошибка" Тогда
		СтандартныеПодсистемыКлиент.ВывестиИнформациюОбОшибке(
			Результат.ИнформацияОбОшибке);
	Иначе
		СтруктураЕдиногоДокумента = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
		МассивПечатныхФорм = ПолучитьПечатныеФормы(СтруктураЕдиногоДокумента, МассивПечатныхФорм);
		ОткрытьПечатныеФормыЗавершение(МассивПечатныхФорм);
	КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьПечатныеФормыЗавершение(МассивПечатныхФорм)

	Если ОбъединитьДокументы И МассивПечатныхФорм.ВГраница() Тогда
		ОткрытьОфисныйДокумент(СтруктураЕдиногоДокумента.АдресПечатнойФормы, СтруктураЕдиногоДокумента.ИмяФайлаПечатнойФормы);
	Иначе
		Для Каждого ПечатнаяФорма Из МассивПечатныхФорм Цикл
			ОткрытьОфисныйДокумент(ПечатнаяФорма.АдресПечатнойФормы, ПечатнаяФорма.ИмяФайлаПечатнойФормы);
		КонецЦикла;
	КонецЕсли;	

КонецПроцедуры

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

// Продолжение процедуры ОткрытьОфисныйДокумент.
&НаКлиенте
Процедура ОткрытьОфисныйДокументПослеПолученияВременногоКаталога(ИмяКаталога, ДополнительныеПараметры) Экспорт
	
	Оповещение = Новый ОписаниеОповещения("ОткрытьПослеСохранениеУКлиента", ЭтотОбъект, ДополнительныеПараметры.ОбработчикЗавершения);
	ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла();
	ПараметрыСохранения.Интерактивно = Ложь;
	
	ИмяФайлаДляОткрытия = ИмяКаталога + ПолучитьРазделительПути() + ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ДополнительныеПараметры.ИмяФайлаДляОткрытия);
	ФайловаяСистемаКлиент.СохранитьФайл(Оповещение, ДополнительныеПараметры.АдресДокумента, ИмяФайлаДляОткрытия, ПараметрыСохранения);
	
КонецПроцедуры

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

&НаКлиенте
Процедура ОткрытьФайлЗавершение(ПараметрыЗавершения) Экспорт	
	ОбработчикЗавершения = ПараметрыЗавершения.ОбработчикЗавершения;
	ПутьКФайлу = ПараметрыЗавершения.ПутьКФайлу;
	ИмяФайла = ПараметрыЗавершения.ИмяФайла;
		
	ПараметрыОткрытияФайла = ФайловаяСистемаКлиент.ПараметрыОткрытияФайла();
	ФайловаяСистемаКлиент.ОткрытьФайл(ПутьКФайлу, ОбработчикЗавершения, ИмяФайла, ПараметрыОткрытияФайла);
КонецПроцедуры

&НаСервере
Функция ДоступноРедактированиеПечатнойФормы()
	Возврат Пользователи.РолиДоступны("РедактированиеПечатныхФорм");
КонецФункции

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

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

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

&НаСервере
Функция ПечатныеФормыСПометками()
		
	ТаблицаПечатныхФорм = ПечатныеФормы.Выгрузить();
	
	МассивНайденныхСтрок = ТаблицаПечатныхФорм.НайтиСтроки(Новый Структура("Пометка", Истина));
	Если МассивНайденныхСтрок.Количество()  <> 0 Тогда
		МассивПечатныхФорм = Новый Массив();
		Для Каждого СтрокаПечатнойФормы Из МассивНайденныхСтрок Цикл
			ДобавитьДанныеПечатнойФормы(МассивПечатныхФорм, СтрокаПечатнойФормы.АдресПечатнойФормы, 
				СтрокаПечатнойФормы.ИмяФайлаПечатнойФормы);
		КонецЦикла;
		Возврат МассивПечатныхФорм;
	Иначе
		Возврат Новый Массив
	КонецЕсли;
КонецФункции

&НаСервере
Процедура ДобавитьДанныеПечатнойФормы(МассивПечатныхФорм, Знач АдресПечатнойФормы, Знач ИмяФайлаПечатнойФормы)
	ПечатнаяФорма = Новый Структура("АдресПечатнойФормы, Представление, ИмяФайлаПечатнойФормы");
	ПечатнаяФорма.АдресПечатнойФормы 	= АдресПечатнойФормы;
	ПечатнаяФорма.Представление 		= ИмяФайлаПечатнойФормы;
	ПечатнаяФорма.ИмяФайлаПечатнойФормы = ИмяФайлаПечатнойФормы;
	МассивПечатныхФорм.Добавить(ПечатнаяФорма);
КонецПроцедуры

&НаСервере
Функция СсылкаМакета(ИмяОбъектаМетаданныхМакета)
	
	Возврат Справочники.МакетыПечатныхФорм.СсылкаМакета(ИмяОбъектаМетаданныхМакета);
	
КонецФункции

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

// Параметры:
//  Результат - см. ДлительныеОперацииКлиент.НовыйРезультатДлительнойОперации
//  ОбработкаПродолжения - ОписаниеОповещения, Неопределено
//
&НаКлиенте
Процедура ПриЗавершенииФормированияПечатныхФорм(Результат, ОбработкаПродолжения) Экспорт

	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Если Результат.Статус = "Ошибка" Тогда
		СтандартныеПодсистемыКлиент.ВывестиИнформациюОбОшибке(
			Результат.ИнформацияОбОшибке);
		Возврат;
	КонецЕсли;
	СтруктураЕдиногоДокумента = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);

	Если ОбработкаПродолжения <> Неопределено Тогда
		ВыполнитьОбработкуОповещения(ОбработкаПродолжения);		
	КонецЕсли;

КонецПроцедуры

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

КонецПроцедуры

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

&НаКлиенте
Процедура ПодписатьФайлы(ФайлыВоВременномХранилище, ПараметрыВыбора)

	Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
		Возврат;
	КонецЕсли;
	
	Соответствие = Новый Соответствие;
	
	ОписаниеДанных = Новый Структура;
	ОписаниеДанных.Вставить("ПоказатьКомментарий", Ложь);
	Если ФайлыВоВременномХранилище.Количество() > 1 Тогда
		ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файлов'"));
		ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файлы'"));

		НаборДанных = Новый Массив;
		Для Каждого Файл Из ФайлыВоВременномХранилище Цикл
			ОписаниеДанныхФайла = Новый Структура;
			ОписаниеДанныхФайла.Вставить("Представление", Файл.Представление);
			ОписаниеДанныхФайла.Вставить("Данные", Файл.АдресВоВременномХранилище);
			
			Соответствие.Вставить(Файл.АдресВоВременномХранилище, Файл.ОбъектПечати);
			
			НаборДанных.Добавить(ОписаниеДанныхФайла);
		КонецЦикла;

		ОписаниеДанных.Вставить("НаборДанных", НаборДанных);
		ОписаниеДанных.Вставить("ПредставлениеНабора", "Файлы (%1)");
	Иначе
		Файл = ФайлыВоВременномХранилище[0];
		ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файла'"));
		ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
		ОписаниеДанных.Вставить("Представление", Файл.Представление);
		ОписаниеДанных.Вставить("Данные", Файл.АдресВоВременномХранилище);
		
		Соответствие.Вставить(Файл.АдресВоВременномХранилище, Файл.ОбъектПечати);
	КонецЕсли;

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

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

&НаСервере
Функция ПолучитьФайлыПодписейИПоместитьВАрхив(РезультатПодписания, ПереданныеНастройки, СоответствиеФайловОбъектамПечати)
		
	МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный");
	
	ПараметрыПолученияФайлов = МодульЭлектроннаяПодписьСлужебный.ПараметрыПолученияФайлов();
	ПараметрыПолученияФайлов.ПереводитьИменаФайловВТранслит = ПереданныеНастройки.ПереводитьИменаФайловВТранслит;
	Файлы = МодульЭлектроннаяПодписьСлужебный.ПолучитьФайлыИзРезультатаПодписания(
		РезультатПодписания, ПараметрыПолученияФайлов, УникальныйИдентификатор);
	
	ФайлыВоВременномХранилище = Новый Массив;
	Для Каждого Файл Из Файлы Цикл
		СтруктураОписанияФайла = Новый Структура("АдресВоВременномХранилище, Представление, ОбъектПечати");
		СтруктураОписанияФайла.АдресВоВременномХранилище = Файл.Данные;
		СтруктураОписанияФайла.Представление = Файл.ИмяФайла;
		СтруктураОписанияФайла.ОбъектПечати = СоответствиеФайловОбъектамПечати.Получить(Файл.Данные);
		ФайлыВоВременномХранилище.Добавить(СтруктураОписанияФайла);
	КонецЦикла;
	
	ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, ПереданныеНастройки);
	
	Возврат ФайлыВоВременномХранилище;
	
КонецФункции

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

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

&НаКлиенте
Процедура ДополнительнаяИнформацияОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	
	ИнтеграцияПодсистемБСПКлиент.ПечатьДокументовОбработкаНавигационнойСсылки(ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка);
	УправлениеПечатьюКлиентПереопределяемый.ПечатьДокументовОбработкаНавигационнойСсылки(ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура ПродолжитьПечатьПослеУстановкиРасширения1СПредприятия(РасширениеПодключено, ДополнительныеПараметры) Экспорт
	
#Если ВебКлиент Тогда
	Текст = НСтр("ru = 'Распечатайте документ при помощи приложения, предназначенного для работы с данным файлом.'");
	ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьОтмеченныеПечатныеФормы", ЭтотОбъект);
	ПоказатьПредупреждение(ОписаниеОповещения, Текст,,НСтр("ru = 'Печать документа из веб-клиента'"));
	Возврат;
#КонецЕсли
	
	Если Не РасширениеПодключено Тогда
		Возврат;
	КонецЕсли;
	
	РасширениеДляРаботыСФайламиПодключено = РасширениеПодключено;
	
	МассивПечатныхФорм = ПолучитьПечатныеФормы(СтруктураЕдиногоДокумента, ДополнительныеПараметры);
	
	
#Если ВебКлиент Тогда
	Оповещение = Новый ОписаниеОповещения(
		"ПечатьПослеПолученияИмениВременногоКаталога", ЭтотОбъект, МассивПечатныхФорм);
	НачатьПолучениеКаталогаВременныхФайлов(Оповещение);
#Иначе
	ПечатьПослеПолученияИмениВременногоКаталога("", МассивПечатныхФорм);
#КонецЕсли

КонецПроцедуры

&НаКлиенте
Процедура ПечатьПослеПолученияИмениВременногоКаталога(ИмяКаталогаВременныхФайлов, МассивПечатныхФорм) Экспорт
	
	Для Каждого ПечатнаяФорма Из МассивПечатныхФорм Цикл
#Если ВебКлиент Тогда
		ИмяВременногоФайла = ИмяКаталогаВременныхФайлов + Строка(Новый УникальныйИдентификатор);
#Иначе
		ИмяВременногоФайла = ПолучитьИмяВременногоФайла("DOCX"); // АПК:441 Функция для получения имени временного файла.
#КонецЕсли
		Оповещение = Новый ОписаниеОповещения("ПослеСохраненияФайла", ЭтотОбъект, ИмяВременногоФайла);
		ДанныеДокумента = ПолучитьИзВременногоХранилища(ПечатнаяФорма.АдресПечатнойФормы); // ДвоичныеДанные
		ДанныеДокумента.НачатьЗапись(Оповещение, ИмяВременногоФайла);
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ПослеСохраненияФайла(ИмяВременногоФайла) Экспорт
	НапечататьФайлПриложением(ИмяВременногоФайла);
	СписокФайловДляУдаления.Добавить(ИмяВременногоФайла);
КонецПроцедуры



#Область ПечатьПриложением
// Процедура предназначена для печати файла соответствующим приложением
//
// Параметры:
//  ИмяФайлаДляПечати - Строка.
//
&НаКлиенте
Процедура НапечататьФайлПриложением(ИмяФайлаДляПечати)
	
#Если МобильныйКлиент Тогда
	ПоказатьПредупреждение(, НСтр("ru = 'Печать файлов данного типа возможна только из приложения для Windows или Linux.'"));
	Возврат;
#Иначе
		
	Попытка
		
		Если ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда
			ИмяФайлаДляПечати = СтрЗаменить(ИмяФайлаДляПечати, "/", "\");
		КонецЕсли;
		
		ФайловаяСистемаКлиент.НапечататьИзПриложенияПоИмениФайла(ИмяФайлаДляПечати);
		
	Исключение
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не удалось распечатать файл по причине:
				|%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке())); 
		
	КонецПопытки;
#КонецЕсли

КонецПроцедуры

#КонецОбласти

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

&НаКлиенте
Процедура СохранитьНаКомпьютерПриПодключенииРасширения(РасширениеПодключено, ДополнительныеПараметры) Экспорт
	
	РасширениеДляРаботыСФайламиПодключено = РасширениеПодключено;
	
	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ОбъектыПечати", ОбъектыПечати);
	ПараметрыФормы.Вставить("РасширениеДляРаботыСФайламиПодключено", РасширениеПодключено);
	ПараметрыФормы.Вставить("ОграничениеФорматовСохранения", "docx");
	ПараметрыФормы.Вставить("Назначение", "Компьютер");
	ОткрытьФорму("ОбщаяФорма.СохранениеПечатнойФормы", ПараметрыФормы, ЭтотОбъект, "ПечатьДокументовOfficeOpen");

КонецПроцедуры

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

&НаКлиенте
Процедура ОтправитьПечатныеФормыПоПочтеНастройкаУчетнойЗаписиПредложена(УчетнаяЗаписьНастроена, ДополнительныеПараметры) Экспорт
	
	Если УчетнаяЗаписьНастроена <> Истина Тогда
		Возврат;
	КонецЕсли;

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

&НаКлиенте
Процедура БольшеНеПоказыватьПриИзменении(Элемент)
	БольшеНеПоказыватьПриИзмененииНаСервере(БольшеНеПоказывать);
КонецПроцедуры

&НаСервереБезКонтекста
Процедура БольшеНеПоказыватьПриИзмененииНаСервере(Значение)
	ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ПечатьДокументовOfficeOpen",
		"ВыводитьСразу",	Значение);
КонецПроцедуры

&НаКлиенте
Функция ПолучателейБольшеОдного(Получатель)
	Если ТипЗнч(Получатель) = Тип("Массив") Или ТипЗнч(Получатель) = Тип("СписокЗначений") Тогда
		Возврат Получатель.Количество() > 1;
	Иначе
		Возврат ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(Получатель).Количество() > 1;
	КонецЕсли;
КонецФункции

// Параметры:
//  ТаблицаПечатныхФорм - ТаблицаЗначений
//  НастройкаПечатнойФормы - СтрокаТаблицыЗначений
//  ПечатнаяФорма - см. УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм
//  ПредставлениеПечатнойФормы - Строка
//
&НаСервере
Процедура ДобавитьПечатнуюФорму(ТаблицаПечатныхФорм, НастройкаПечатнойФормы, ПечатнаяФорма, ПредставлениеПечатнойФормы)
	
	ИмяФайлаПечатнойФормы = ПредставлениеПечатнойФормы + ".DOCX";
	
	НоваяСтрокаПечатнойФормы = ТаблицаПечатныхФорм.Добавить();
	ЗаполнитьЗначенияСвойств(НоваяСтрокаПечатнойФормы, НастройкаПечатнойФормы);
	НоваяСтрокаПечатнойФормы.ОбъектПечати = ПечатнаяФорма.Значение;
	НоваяСтрокаПечатнойФормы.АдресПечатнойФормы = ПечатнаяФорма.Ключ;
	НоваяСтрокаПечатнойФормы.ИмяФайлаПечатнойФормы = ИмяФайлаПечатнойФормы;
	НоваяСтрокаПечатнойФормы.Представление = ПредставлениеПечатнойФормы;
	НоваяСтрокаПечатнойФормы.Пометка = Истина;
	НоваяСтрокаПечатнойФормы.ТекущийЯзык = ОбщегоНазначения.КодОсновногоЯзыка();
	
КонецПроцедуры


&НаСервере
Функция ПоместитьФайлыВАрхив(ПечатныеФормыДокументов, ПереданныеНастройки)
	Перем ЗаписьZipФайла, ИмяАрхива;
	
	Результат = Новый Массив;
	
	НастройкиСохранения = НастройкиСохранения();
	ЗаполнитьЗначенияСвойств(НастройкиСохранения, ПереданныеНастройки);
	
	Если Не НастройкиСохранения.УпаковатьВАрхив Тогда
		Возврат ПечатныеФормыДокументов;
	КонецЕсли;
	ВариантСохранения = Неопределено; 
	ПереданныеНастройки.Свойство("ВариантСохранения", ВариантСохранения);
	УстанавливатьОбъектПечати = ВариантСохранения = "Присоединить";	
	
	ПереводитьИменаФайловВТранслит = НастройкиСохранения.ПереводитьИменаФайловВТранслит;
	
	ИмяВременногоКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла());
	СоздатьКаталог(ИмяВременногоКаталога);
	
	СоответствиеДляАрхивов = Новый Соответствие;
		
	Для Каждого СтруктураФайла Из ПечатныеФормыДокументов Цикл
			
		ДанныеФайла = ПолучитьИзВременногоХранилища(СтруктураФайла.АдресВоВременномХранилище);
		ПолноеИмяФайла = ИмяВременногоКаталога + СтруктураФайла.Представление;
		ДанныеФайла.Записать(ПолноеИмяФайла);
		
		ОбъектПечати = ?(УстанавливатьОбъектПечати И ЗначениеЗаполнено(СтруктураФайла.ОбъектПечати), СтруктураФайла.ОбъектПечати, Неопределено);
		
		Если СоответствиеДляАрхивов[ОбъектПечати] = Неопределено Тогда
			ИмяАрхива = ПолучитьИмяВременногоФайла("zip");
			ЗаписьZipФайла = Новый ЗаписьZipФайла(ИмяАрхива);
			
			Представление = ?(ОбъектПечати = Неопределено, НСтр("ru = 'Документы'"), ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(Строка(ОбъектПечати)));
			Если ПереводитьИменаФайловВТранслит Тогда
				Представление = СтроковыеФункции.СтрокаЛатиницей(Представление);
			КонецЕсли;
			ПараметрыЗаписи = Новый Структура("ЗаписьZipФайла, ИмяАрхива, Представление", ЗаписьZipФайла, ИмяАрхива, Представление+".zip");
			СоответствиеДляАрхивов.Вставить(ОбъектПечати, ПараметрыЗаписи);
		КонецЕсли;
		
		СоответствиеДляАрхивов[ОбъектПечати].ЗаписьZipФайла.Добавить(ПолноеИмяФайла);

	КонецЦикла;
		
	Для Каждого АрхивОбъекта Из СоответствиеДляАрхивов Цикл
		ЗаписьZipФайла = АрхивОбъекта.Значение.ЗаписьZipФайла;
		ИмяАрхива = АрхивОбъекта.Значение.ИмяАрхива;
		ЗаписьZipФайла.Записать();
		ДвоичныеДанные = Новый ДвоичныеДанные(ИмяАрхива);
		ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторХранилища);
		ОписаниеФайла = ОписаниеФайла(АрхивОбъекта.Значение.Представление);
		ОписаниеФайла.Вставить("ОбъектПечати", АрхивОбъекта.Ключ);
		ОписаниеФайла.Вставить("АдресВоВременномХранилище", ПутьВоВременномХранилище);
		Результат.Добавить(ОписаниеФайла);
		УдалитьФайлы(ИмяАрхива);
	КонецЦикла;
		
	УдалитьФайлы(ИмяВременногоКаталога);
	
	Возврат Результат;
	
КонецФункции

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

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

&НаСервереБезКонтекста
Функция НастройкиСохранения()

	Возврат УправлениеПечатью.НастройкиСохранения();

КонецФункции

&НаСервере
Функция ВыводДоступен()
	Возврат ПравоДоступа("Вывод", Метаданные);
КонецФункции

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

// Параметры:
//  ПараметрыПодготовки - см. УправлениеПечатьюКлиент.ПараметрыПодготовкиИменФайлов
//
&НаКлиенте
Процедура ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки)
	
	УправлениеПечатьюКлиент.ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки);
		
КонецПроцедуры

&НаКлиенте
Процедура ПриПодготовкеИменФайлов(СписокФайловВоВременномХранилище, ИмяКаталога) Экспорт
	
	СохраняемыеФайлы = Новый Массив;
	
	Для Каждого ФайлДляЗаписи Из СписокФайловВоВременномХранилище Цикл
		ИмяФайла = ФайлДляЗаписи.Представление;
		СохраняемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла, ФайлДляЗаписи.АдресВоВременномХранилище));
	КонецЦикла;
	
	ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайлов();
	ПараметрыСохранения.Диалог.Каталог = ИмяКаталога;
	ПараметрыСохранения.Интерактивно = Не ЗначениеЗаполнено(ИмяКаталога);
	ФайловаяСистемаКлиент.СохранитьФайлы(Неопределено, СохраняемыеФайлы, ПараметрыСохранения);

#Если Не ВебКлиент Тогда
	Если ЗначениеЗаполнено(ИмяКаталога) Тогда
		ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьПапкуСохранения", ЭтотОбъект, ИмяКаталога); 
		ПоказатьОповещениеПользователя(НСтр("ru = 'Печатная форма сохранена'"), ОписаниеОповещения,
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'в каталог %1'"), ИмяКаталога), 
			БиблиотекаКартинок.ДиалогИнформация);
	КонецЕсли;
#КонецЕсли
	
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьПапкуСохранения(ИмяКаталога) Экспорт
	ФайловаяСистемаКлиент.ОткрытьПроводник(ИмяКаталога);
КонецПроцедуры

&НаСервере
Функция ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище)
	Результат = Новый Массив;
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
		МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами");
		Для Каждого Файл Из ФайлыВоВременномХранилище Цикл
			Если МодульРаботаСФайлами.КОбъектуМожноПрисоединятьФайлы(Файл["ОбъектПечати"]) Тогда
				ПараметрыФайла = МодульРаботаСФайлами.ПараметрыДобавленияФайла();
				ПараметрыФайла.ВладелецФайлов = Файл["ОбъектПечати"];
				ПараметрыФайла.ИмяБезРасширения = Файл.Представление;
				Результат.Добавить(МодульРаботаСФайлами.ДобавитьФайл(
					ПараметрыФайла, Файл.АдресВоВременномХранилище, , НСтр("ru = 'Печатная форма'")));
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	Возврат Результат;
КонецФункции

// Параметры:
//  Результат - см. ДлительныеОперацииКлиент.НовыйРезультатДлительнойОперации
//  МассивПечатныхФорм - Массив
//
&НаКлиенте
Процедура ПечатьПродолжение(Результат, МассивПечатныхФорм) Экспорт
	Если Результат.Статус = "Ошибка" Тогда
		СтандартныеПодсистемыКлиент.ВывестиИнформациюОбОшибке(
			Результат.ИнформацияОбОшибке);
	Иначе
		СтруктураЕдиногоДокумента = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
		МассивПечатныхФорм = ПолучитьПечатныеФормы(СтруктураЕдиногоДокумента, МассивПечатныхФорм);
		ПечатьЗавершение(МассивПечатныхФорм);
	КонецЕсли;
	
КонецПроцедуры	
	
&НаКлиенте
Процедура ПечатьЗавершение(МассивПечатныхФорм)	
	Обработчик = Новый ОписаниеОповещения("ПродолжитьПечатьПослеУстановкиРасширения1СПредприятия", ЭтотОбъект, МассивПечатныхФорм);
	ТекстСообщения = НСтр("ru = 'Для продолжения установите расширение для работы с 1С:Предприятием.'");
	ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботы1СПредприятия(Обработчик, ТекстСообщения);
КонецПроцедуры

&НаКлиенте
Процедура НачатьПолучениеПечатныхФорм(СтруктураЕдиногоДокумента, Оповещение)
	ДлительнаяОперация = ДлительнаяОперацияПолученияПечатныхФорм(СтруктураЕдиногоДокумента);
	ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Оповещение, ПараметрыОжидания());
КонецПроцедуры

&НаСервереБезКонтекста
Функция ОписаниеФайла(НаименованиеФайла = "")
	ОписаниеФайла = Новый Структура;
	ОписаниеФайла.Вставить("АдресВоВременномХранилище", "");
	ОписаниеФайла.Вставить("Название", НаименованиеФайла);
	ОписаниеФайла.Вставить("Печать", Истина);
	ОписаниеФайла.Вставить("Представление", НаименованиеФайла);
	ОписаниеФайла.Вставить("ОбъектПечати", Неопределено);
	ОписаниеФайла.Вставить("ЭтоОфисныйДокумент", Истина);
	Возврат ОписаниеФайла; 
КонецФункции

#КонецОбласти










