Печать документов / Модуль

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

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

&НаКлиенте
Перем ИмяВременногоКаталогаКлиент; 

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

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

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

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

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

	УправлениеПечатью.ПечатьДокументовПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

	Соответствие = Новый Соответствие;

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

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

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

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

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

	МодульЭлектроннаяПодписьКлиент.Подписать(ОписаниеДанных,, ОписаниеОповещения, ПараметрыПодписи);
	
КонецПроцедуры

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

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

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

&НаКлиенте
Процедура ЗавершениеПодписанияФайлов(Результат, Контекст) Экспорт	
	Если Результат = Ложь Тогда
		Возврат;
	КонецЕсли;
	ЗаписанныеОбъекты = Контекст.ЗаписанныеОбъекты;

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

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

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

#Область ОбработчикиСобытийЭлементовШапкиФормы

&НаКлиенте
Процедура КопийПриИзменении(Элемент)
	Если НастройкиПечатныхФорм.Количество() = 1 Тогда
		НастройкиПечатныхФорм[0].Количество = Копий;
		НачатьСохранениеНастроек();
	КонецЕсли;
КонецПроцедуры

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

&НаКлиенте
Процедура ТекущаяПечатнаяФормаПриАктивизации(Элемент)
	ПодключитьОбработчикОжидания("РассчитатьПоказателиДинамически", 0.2, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ФлажокПодписьИПечатьПриИзменении(Элемент)
	ДобавитьУдалитьПодписьПечать();
	УстановитьТекущуюСтраницу();
КонецПроцедуры

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

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

#Область ОбработчикиСобытийЭлементовТаблицыФормыНастройкиПечатныхФорм

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

&НаКлиенте
Процедура НастройкиПечатныхФормПриАктивизацииСтроки(Элемент)
	ОтключитьОбработчикОжидания("УстановитьТекущуюСтраницу");
	ПодключитьОбработчикОжидания("УстановитьТекущуюСтраницу", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура НастройкиПечатныхФормКоличествоРегулирование(Элемент, Направление, СтандартнаяОбработка)
	НастройкаПечатнойФормы = НастройкаТекущейПечатнойФормы();
	НастройкаПечатнойФормы.Печатать = НастройкаПечатнойФормы.Количество + Направление > 0;
КонецПроцедуры

&НаКлиенте
Процедура НастройкиПечатныхФормПечататьПриИзменении(Элемент)
	НастройкаПечатнойФормы = НастройкаТекущейПечатнойФормы();
	Если НастройкаПечатнойФормы.Печатать И НастройкаПечатнойФормы.Количество = 0 Тогда
		НастройкаПечатнойФормы.Количество = 1;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура НастройкиПечатныхФормПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
	Отказ = Истина;
КонецПроцедуры

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура КнопкаПоказатьСкрытьНастройкуКомплекта(Команда)
	УстановитьВидимостьНастройкиКоличестваКопий();
КонецПроцедуры

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

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

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

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

&НаКлиенте
Процедура ПереключитьРедактирование(Команда)
	ПереключитьРедактированиеТекущейПечатнойФормы();
КонецПроцедуры

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

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

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

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

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

&НаКлиенте
Процедура РассчитатьВсеПоказатели(Команда)
	ОбщегоНазначенияСлужебныйКлиент.УстановитьВидимостьПанелиПоказателей(
		Элементы, Не Элементы.РассчитатьВсеПоказатели.Пометка);
КонецПроцедуры

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

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

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

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

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

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

&НаСервере
Процедура ИсключитьОфисныеДокументыИзКомплектов(КоллекцияПечатныхФорм)
	
	ОфисныеДокументы = Новый Массив;
	
	Для Счетчик = 1 По КоллекцияПечатныхФорм.Количество() Цикл
		Индекс = КоллекцияПечатныхФорм.Количество() - Счетчик;
		ПечатнаяФорма = КоллекцияПечатныхФорм[Индекс];
		Если ПечатнаяФорма.ОфисныеДокументы <> Неопределено Тогда
			ОфисныеДокументы.Добавить(Индекс);
		КонецЕсли;
	КонецЦикла;
	
	Если КоллекцияПечатныхФорм.Количество() > ОфисныеДокументы.Количество() Тогда
		Для Каждого Индекс Из ОфисныеДокументы Цикл
			КоллекцияПечатныхФорм.Удалить(Индекс);
		КонецЦикла;
	КонецЕсли;
	
КонецПроцедуры

&НаСервере
Процедура УстановитьУсловноеОформление()

	УсловноеОформление.Элементы.Очистить();

	//

	Элемент = УсловноеОформление.Элементы.Добавить();

	ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
	ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.НастройкиПечатныхФорм.Имя);

	ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НастройкиПечатныхФорм.Печатать");
	ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ОтборЭлемента.ПравоеЗначение = Ложь;

	Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);

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

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

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

&НаКлиенте
Процедура ОткрытьФормуПечатиOfficeOpen(ПараметрыОткрытия) Экспорт
	ОткрытьФорму("ОбщаяФорма.ПечатьДокументовOfficeOpen", ПараметрыОткрытия);
КонецПроцедуры


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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Процедура УстановитьТекущийТабличныйДокумент(ИмяРеквизита)
	ТекущаяПечатнаяФорма = ЭтотОбъект[ИмяРеквизита];
КонецПроцедуры

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

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

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

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

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

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

&НаСервере
Функция ПоместитьТабличныеДокументыВоВременноеХранилище(ПереданныеНастройки)
	
	НастройкиСохранения = НастройкиСохранения();
	ЗаполнитьЗначенияСвойств(НастройкиСохранения, ПереданныеНастройки);
	
	Результат = Новый Массив;
	
	ИмяВременногоКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла());
	СоздатьКаталог(ИмяВременногоКаталога);
	
	ВыбранныеФорматыСохранения = НастройкиСохранения.ФорматыСохранения;
	ПереводитьИменаФайловВТранслит = НастройкиСохранения.ПереводитьИменаФайловВТранслит;
	ТаблицаФорматов = УправлениеПечатью.НастройкиФорматовСохраненияТабличногоДокумента();
	
	ОбъектыДляПрикрепления = Неопределено;
	Если ПереданныеНастройки.Свойство("ОбъектыДляПрикрепления") Тогда
		ОбъектыДляПрикрепления = ОбщегоНазначения.СкопироватьРекурсивно(ПереданныеНастройки.ОбъектыДляПрикрепления);
	КонецЕсли;
	
	// сохранение печатных форм
	ОбработанныеПечатныеФормы = Новый Массив;
	Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
		
		Если НЕ ПустаяСтрока(НастройкаПечатнойФормы.ОфисныеДокументы) Тогда
			
			ФайлыОфисныхДокументов = ОбщегоНазначения.ЗначениеИзСтрокиXML(НастройкаПечатнойФормы.ОфисныеДокументы);
			
			Для Каждого ФайлОфисногоДокумента Из ФайлыОфисныхДокументов Цикл
				ИмяФайла = УправлениеПечатью.ИмяФайлаОфисногоДокумента(ФайлОфисногоДокумента.Значение);
				ОписаниеФайла = Новый Структура;
				ОписаниеФайла.Вставить("Представление", ИмяФайла);
				ОписаниеФайла.Вставить("ОбъектПечати", ?(ТипЗнч(ФайлОфисногоДокумента.Значение) = Тип("Строка"), Неопределено, ФайлОфисногоДокумента.Значение));
				Если ОбъектыДляПрикрепления <> Неопределено И ОбъектыДляПрикрепления[ОписаниеФайла.ОбъектПечати] <> Истина Тогда
					Продолжить;
				КонецЕсли;
				ОписаниеФайла.Вставить("АдресВоВременномХранилище", ФайлОфисногоДокумента.Ключ);
				ОписаниеФайла.Вставить("ЭтоОфисныйДокумент", Истина);
				Результат.Добавить(ОписаниеФайла);
			КонецЦикла;
			
			Продолжить;
			
		КонецЕсли;
		
		Если Не НастройкаПечатнойФормы.Печатать Тогда
			Продолжить;
		КонецЕсли;
		
		ПечатнаяФорма = ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита];
		Если ОбработанныеПечатныеФормы.Найти(ПечатнаяФорма) = Неопределено Тогда
			ОбработанныеПечатныеФормы.Добавить(ПечатнаяФорма);
		Иначе
			Продолжить;
		КонецЕсли;
		
		Если ВычислитьИспользованиеВывода(ПечатнаяФорма) = ИспользованиеВывода.Запретить Тогда
			Продолжить;
		КонецЕсли;
		
		Если ПечатнаяФорма.Защита Тогда
			Продолжить;
		КонецЕсли;
		
		Если ПечатнаяФорма.ВысотаТаблицы = 0 Тогда
			Продолжить;
		КонецЕсли;
		
		ПечатныеФормыПоОбъектам = УправлениеПечатью.ПечатныеФормыПоОбъектам(ПечатнаяФорма, ОбъектыПечати);
		Для Каждого СоответствиеОбъектаПечатнойФорме Из ПечатныеФормыПоОбъектам Цикл
			ОбъектПечати = СоответствиеОбъектаПечатнойФорме.Ключ;
			ПечатнаяФорма = СоответствиеОбъектаПечатнойФорме.Значение;
			
			Если ОбъектыДляПрикрепления <> Неопределено И ОбъектыДляПрикрепления[ОбъектПечати] <> Истина Тогда
				Продолжить;
			КонецЕсли;
			
			Для Каждого ВыбранныйФормат Из ВыбранныеФорматыСохранения Цикл
				ТипФайла = ТипФайлаТабличногоДокумента[ВыбранныйФормат];
				НастройкиФормата = ТаблицаФорматов.НайтиСтроки(Новый Структура("ТипФайлаТабличногоДокумента", ТипФайла))[0];
				ЗаданныеИменаПечатныхФорм = ОбщегоНазначения.ЗначениеИзСтрокиXML(НастройкаПечатнойФормы.ИмяФайлаПечатнойФормы);
				
				ИмяФайла = УправлениеПечатью.ИмяФайлаПечатнойФормыОбъекта(ОбъектПечати, ЗаданныеИменаПечатныхФорм, НастройкаПечатнойФормы.Название);
				ИмяФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайла);
				
				Если ПереводитьИменаФайловВТранслит Тогда
					ИмяФайла = СтроковыеФункции.СтрокаЛатиницей(ИмяФайла);
				КонецЕсли;
				
				РасширениеФайла = НастройкиФормата.Расширение;
				РазмерРасширенияВБайтах = РазмерСтрокиВБайтах(РасширениеФайла);
				
				Если ОбщегоНазначения.ЭтоLinuxСервер() Тогда
					ИмяФайла = СократитьРазмерСтрокиВБайтах(ИмяФайла, 255 - РазмерРасширенияВБайтах - 1);
				КонецЕсли;
				
				ИмяФайлаСРасширением = ИмяФайла + "." + РасширениеФайла;
				ПолноеИмяФайла = ИмяВременногоКаталога + ИмяФайлаСРасширением;
				
				МаксимальнаяДлина = 218; // https://docs.microsoft.com/en-us/office/troubleshoot/office-suite-issues/error-open-document
				Если ТипФайла = ТипФайлаТабличногоДокумента.XLS И СтрДлина(ПолноеИмяФайла) > МаксимальнаяДлина Тогда
					МаксимальнаяДлина = МаксимальнаяДлина - 5; // Резерв для формирования уникального имени.
					Если СтрДлина(ИмяВременногоКаталога) < МаксимальнаяДлина Тогда
						ИмяФайла = Лев(ИмяФайла, МаксимальнаяДлина - СтрДлина(ИмяВременногоКаталога) - СтрДлина(РасширениеФайла) - 1);
						ИмяФайлаСРасширением = ИмяФайла + "." + РасширениеФайла;
						ПолноеИмяФайла = ИмяВременногоКаталога + ИмяФайлаСРасширением;
					КонецЕсли;
				КонецЕсли;
				
				ПолноеИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ПолноеИмяФайла);
				ПечатнаяФорма.Записать(ПолноеИмяФайла, ТипФайла);
				
				Если ТипФайла = ТипФайлаТабличногоДокумента.HTML Тогда
					УправлениеПечатью.ВставитьКартинкиВHTML(ПолноеИмяФайла);
				КонецЕсли;
				
				ДвоичныеДанные = Новый ДвоичныеДанные(ПолноеИмяФайла);
				ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторХранилища);
				ОписаниеФайла = Новый Структура;
				ОписаниеФайла.Вставить("Представление", ИмяФайлаСРасширением);
				ОписаниеФайла.Вставить("АдресВоВременномХранилище", ПутьВоВременномХранилище);
				ОписаниеФайла.Вставить("ОбъектПечати", ОбъектПечати);
				Если ТипФайла = ТипФайлаТабличногоДокумента.ANSITXT Тогда
					ОписаниеФайла.Вставить("Кодировка", "windows-1251");
				КонецЕсли;
				Результат.Добавить(ОписаниеФайла);
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;
	
	УдалитьФайлы(ИмяВременногоКаталога);
	
	Возврат Результат;
	
КонецФункции

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

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

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

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


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

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

&НаКлиенте
Процедура ОткрытьЕдиныйДокументЗавершение(Результат, СтруктураЕдиногоДокумента) Экспорт
	ОповеститьОГотовностиПечатныхФорм(СтруктураЕдиногоДокумента);
КонецПроцедуры

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

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

&НаКлиенте
Процедура ОткрытьОфисныеДокументыПослеПолученияРазрешения(РазрешенияПолучены, Контекст) Экспорт	

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

&НаСервере
Функция ЕстьДанныеДляПечати()
	Результат = Ложь;
	Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
		Результат = Результат Или ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита].ВысотаТаблицы > 0;
	КонецЦикла;
	Возврат Результат;
КонецФункции

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

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

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

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

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

&НаКлиенте
Процедура ПереключитьРедактированиеТекущейПечатнойФормы()
	НастройкаПечатнойФормы = НастройкаТекущейПечатнойФормы();
	Если НастройкаПечатнойФормы <> Неопределено Тогда
		ПолеТабличногоДокумента = Элементы[НастройкаПечатнойФормы.ИмяРеквизита]; // РасширениеПоляФормыДляПоляТабличногоДокумента - 
		ПолеТабличногоДокумента.Редактирование = Не ПолеТабличногоДокумента.Редактирование;
		Элементы.ТекущаяПечатнаяФорма.Редактирование = ПолеТабличногоДокумента.Редактирование;
		ПереключитьПометкуКнопкиРедактирование();
	КонецЕсли;
КонецПроцедуры

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

&НаКлиенте
Процедура УстановитьДоступностьИзмененияМакета()
	ПечатнаяФормаДоступна = Элементы.Страницы.ТекущаяСтраница <> Элементы.СтраницаПечатнаяФормаНедоступна;
	НастройкаПечатнойФормы = НастройкаТекущейПечатнойФормы();
	Элементы.КнопкаИзменитьМакет.Доступность = Не ПустаяСтрока(НастройкаПечатнойФормы.ПутьКМакету);
КонецПроцедуры

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

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

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

&НаКлиенте
Функция НастройкаТекущейПечатнойФормы()
	Возврат УправлениеПечатьюКлиент.НастройкаТекущейПечатнойФормы(ЭтотОбъект);
КонецФункции

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

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

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

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

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

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

&НаКлиенте
Процедура НачатьСохранениеНастроек()
	ОтключитьОбработчикОжидания("СохранитьНастройки");
	Если ПустаяСтрока(КлючНастроек) Тогда
		Возврат;
	КонецЕсли;
	ПодключитьОбработчикОжидания("СохранитьНастройки", 2, Истина);
КонецПроцедуры

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

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

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

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

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

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

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

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

&НаКлиенте
Процедура ДобавитьУдалитьПодписьПечать()
	
	Если ПодписьИПечать Тогда
		ДобавитьПодписьИПечать();
	Иначе
		УбратьПодписьИПечать();
	КонецЕсли;

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

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

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

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

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

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

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

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

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

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

&НаКлиенте
Функция ПерейтиПоСсылке(АдресСсылки)
	Если ПустаяСтрока(АдресСсылки) Тогда
		Возврат Ложь;
	КонецЕсли;
	АдресСсылкиВРег = ВРег(АдресСсылки);
	Если СтрНачинаетсяС(АдресСсылкиВРег, ВРег("http://"))
		Или СтрНачинаетсяС(АдресСсылкиВРег, ВРег("https://"))
		Или СтрНачинаетсяС(АдресСсылкиВРег, ВРег("e1cib/"))
		Или СтрНачинаетсяС(АдресСсылкиВРег, ВРег("e1c://")) Тогда
		ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(АдресСсылки);
		Возврат Истина;
	КонецЕсли;
	Возврат Ложь;
КонецФункции

&НаСервереБезКонтекста
Процедура ОтключитьПользовательскийМакет(ПутьКМакету)
	
	УправлениеПечатью.ОтключитьПользовательскийМакет(ПутьКМакету);
	
КонецПроцедуры

&НаСервереБезКонтекста
Функция ИспользуетсяПользовательскийМакет(ПутьКМакету)
	
	Возврат УправлениеПечатью.ИспользуетсяПользовательскийМакет(ПутьКМакету);
	
КонецФункции

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

&НаСервереБезКонтекста
Функция СократитьРазмерСтрокиВБайтах(Строка, ТребуемыйРазмерВБайтах)
	
	Результат = "";
	ТекущийРазмерСтрокиРезультата = 0;
	
	Для НомерСимвола = 1 По СтрДлина(Строка) Цикл
		Символ = Сред(Строка, НомерСимвола, 1);
		РазмерСимвола = РазмерСтрокиВБайтах(Символ);
		
		Если ТекущийРазмерСтрокиРезультата + РазмерСимвола > ТребуемыйРазмерВБайтах Тогда
			Возврат Результат;
		КонецЕсли;
		
		Результат = Результат + Символ;
		ТекущийРазмерСтрокиРезультата = ТекущийРазмерСтрокиРезультата + РазмерСимвола;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

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


Связанные материалы