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

#Область ПрограммныйИнтерфейс

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

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

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

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

// Вывести табличные документы на принтер.
//
// Параметры:
//  ТабличныеДокументы           - СписокЗначений - печатные формы.
//  ОбъектыПечати                - СписокЗначений - соответствие объектов именам областей табличного документа.
//  ПечататьКомплектами          - Булево
//                               - Неопределено - не используется (вычисляется автоматически).
//  КоличествоКопийКомплектов    - Число - количество экземпляров каждого из комплектов документов.
//
Процедура РаспечататьТабличныеДокументы(ТабличныеДокументы, ОбъектыПечати, Знач ПечататьКомплектами = Неопределено, 
	Знач КоличествоКопийКомплектов = 1) Экспорт
	
	ПечататьКомплектами = ТабличныеДокументы.Количество() > 1;
	ПакетОтображаемыхДокументов = УправлениеПечатьюВызовСервера.ПакетДокументов(ТабличныеДокументы,
		ОбъектыПечати, ПечататьКомплектами, КоличествоКопийКомплектов);
	ПакетОтображаемыхДокументов.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
	
КонецПроцедуры

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

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

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

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

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

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

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

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

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

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

////////////////////////////////////////////////////////////////////////////////
// Работа с макетами офисных документов.

//	Секция содержит интерфейсные функции (API), используемые при создании
//	печатных форм основанных на офисных документах MS Office (шаблоны MS Word) и Open Office (шаблоны OO Writer).
//
////////////////////////////////////////////////////////////////////////////////
//	Типы используемых данных (определяется конкретными реализациями).
//	СсылкаПечатнаяФорма	- ссылка на печатную форму.
//	СсылкаМакет			- ссылка на макет.
//	Область				- ссылка на область в печатной форме или макете (структура)
//						доопределяется в интерфейсном модуле служебной информацией
//						об области.
//	ОписаниеОбласти			- описание области макета (см. ниже).
//	ДанныеЗаполнения		- либо структура, либо массив структур (для случая
//							списков и таблиц.
////////////////////////////////////////////////////////////////////////////////
//	ОписаниеОбласти - структура, описывающая подготовленные пользователем области макета
//	ключ ИмяОбласти - имя области
//	ключ ТипТипОбласти - 	ВерхнийКолонтитул.
//							НижнийКолонтитул
//							Общая
//							СтрокаТаблицы
//							Список
//

#Область ФункцииИнициализацииИЗакрытияСсылок

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

// Устарела. Следует использовать УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента.
//
// Создает COM-соединение с макетом. В дальнейшем это соединение используется при получении из него областей (тегов и
// таблиц).
// Функция не работает в любых других браузерах кроме IE.
// Перед выполнением функции в веб-клиенте необходимо подключить расширение для работы с 1С:Предприятием.
//
// Параметры:
//  ДвоичныеДанныеМакета - ДвоичныеДанные - двоичные данные макета;
//  ТипМакета            - Строка - тип макета печатной формы "DOC" или "ODT";
//  ИмяМакета            - Строка - имя, которое будет использовано при создании временного файла макета.
//
// Возвращаемое значение:
//  Структура - макет.
//
Функция ИнициализироватьМакетОфисногоДокумента(Знач ДвоичныеДанныеМакета, Знач ТипМакета, Знач ИмяМакета = "") Экспорт
	
	Макет = Неопределено;
	ИмяВременногоФайла = "";
	
#Если ВебКлиент Тогда
		Если ПустаяСтрока(ИмяМакета) Тогда
			ИмяВременногоФайла = Строка(Новый УникальныйИдентификатор) + "." + НРег(ТипМакета);
		Иначе
			ИмяВременногоФайла = ИмяМакета + "." + НРег(ТипМакета);
		КонецЕсли;
#КонецЕсли
	
	Если ВРег(ТипМакета) = "DOC" Тогда
		Макет = УправлениеПечатьюMSWordКлиент.ПолучитьМакетMSWord(ДвоичныеДанныеМакета, ИмяВременногоФайла);
		Если Макет <> Неопределено Тогда
			Макет.Вставить("Тип", "DOC");
		КонецЕсли;
	ИначеЕсли ВРег(ТипМакета) = "ODT" Тогда
		Макет = УправлениеПечатьюOOWriterКлиент.ПолучитьМакетOOWriter(ДвоичныеДанныеМакета, ИмяВременногоФайла);
		Если Макет <> Неопределено Тогда
			Макет.Вставить("Тип", "ODT");
			Макет.Вставить("НастройкиСтраницыМакета", Неопределено);
		КонецЕсли;
	КонецЕсли;
	
	Возврат Макет;
	
КонецФункции

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

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

#Область ФункцияОтображенияПечатнойФормыПользователю

// Устарела. Более не требуется.
//
// Показывает сформированный документ пользователю.
//
// Параметры:
//  ПечатнаяФорма - Структура - результат функции ИнициализироватьПечатнуюФорму.
//
Процедура ПоказатьДокумент(Знач ПечатнаяФорма) Экспорт
	
	Если ПечатнаяФорма.Тип = "DOC" Тогда
		УправлениеПечатьюMSWordКлиент.ПоказатьДокументMSWord(ПечатнаяФорма);
	ИначеЕсли ПечатнаяФорма.Тип = "ODT" Тогда
		УправлениеПечатьюOOWriterКлиент.ПоказатьДокументOOWriter(ПечатнаяФорма);
	КонецЕсли;
	
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
// Функции получения областей из макета, вывода в печатную форму областей макета
// и заполнение параметров в них.

// Устарела. Следует использовать УправлениеПечатью.ОбластьМакета.
//
// Получает область из макета печатной формы.
//
// Параметры:
//  СсылкаНаМакет   - Структура - макет печатной формы.
//  ОписаниеОбласти - Структура:
//   * ИмяОбласти - Строка -имя области;
//   * ТипТипОбласти - Строка - тип области: "ВерхнийКолонтитул", "НижнийКолонтитул", "Общая", "СтрокаТаблицы", "Список".
//   
// Возвращаемое значение:
//  Структура - область макета.
//
Функция ОбластьМакета(Знач СсылкаНаМакет, Знач ОписаниеОбласти) Экспорт
	
	Область = Неопределено;
	Если СсылкаНаМакет.Тип = "DOC" Тогда
		
		Если		ОписаниеОбласти.ТипОбласти = "ВерхнийКолонтитул" Тогда
			Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьВерхнегоКолонтитула(СсылкаНаМакет);
		ИначеЕсли	ОписаниеОбласти.ТипОбласти = "НижнийКолонтитул" Тогда
			Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьНижнегоКолонтитула(СсылкаНаМакет);
		ИначеЕсли	ОписаниеОбласти.ТипОбласти = "Общая" Тогда
			Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьМакетаMSWord(СсылкаНаМакет, ОписаниеОбласти.ИмяОбласти, 1, 0);
		ИначеЕсли	ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" Тогда
			Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьМакетаMSWord(СсылкаНаМакет, ОписаниеОбласти.ИмяОбласти);
		ИначеЕсли	ОписаниеОбласти.ТипОбласти = "Список" Тогда
			Область = УправлениеПечатьюMSWordКлиент.ПолучитьОбластьМакетаMSWord(СсылкаНаМакет, ОписаниеОбласти.ИмяОбласти, 1, 0);
		Иначе
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Тип области не указан или указан некорректно: %1.'"), ОписаниеОбласти.ТипОбласти);
		КонецЕсли;
		
		Если Область <> Неопределено Тогда
			Область.Вставить("ОписаниеОбласти", ОписаниеОбласти);
		КонецЕсли;
	ИначеЕсли СсылкаНаМакет.Тип = "ODT" Тогда
		
		Если		ОписаниеОбласти.ТипОбласти = "ВерхнийКолонтитул" Тогда
			Область = УправлениеПечатьюOOWriterКлиент.ПолучитьОбластьВерхнегоКолонтитула(СсылкаНаМакет);
		ИначеЕсли	ОписаниеОбласти.ТипОбласти = "НижнийКолонтитул" Тогда
			Область = УправлениеПечатьюOOWriterКлиент.ПолучитьОбластьНижнегоКолонтитула(СсылкаНаМакет);
		ИначеЕсли	ОписаниеОбласти.ТипОбласти = "Общая"
				ИЛИ ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы"
				ИЛИ ОписаниеОбласти.ТипОбласти = "Список" Тогда
			Область = УправлениеПечатьюOOWriterКлиент.ПолучитьОбластьМакета(СсылкаНаМакет, ОписаниеОбласти.ИмяОбласти);
		Иначе
			ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Тип области не указан или указан некорректно: %1.'"), ОписаниеОбласти.ИмяОбласти);
		КонецЕсли;
		
		Если Область <> Неопределено Тогда
			Область.Вставить("ОписаниеОбласти", ОписаниеОбласти);
		КонецЕсли;
	КонецЕсли;
	
	Возврат Область;
	
КонецФункции

// Устарела. Следует использовать УправлениеПечатью.ПрисоединитьОбласть.
//
// Присоединяет область в печатную форму из макета.
// Применяется при одиночном выводе области.
//
// Параметры:
//  ПечатнаяФорма - см. ИнициализироватьПечатнуюФорму.
//  ОбластьМакета - см. ОбластьМакета.
//  ПереходНаСледующуюСтроку - Булево - Истина, если требуется вставить разрыв после вывода области.
//
Процедура ПрисоединитьОбласть(Знач ПечатнаяФорма, Знач ОбластьМакета, Знач ПереходНаСледующуюСтроку = Истина) Экспорт
	
	Если ОбластьМакета = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	Попытка
		ОписаниеОбласти = ОбластьМакета.ОписаниеОбласти;
		
		Если ПечатнаяФорма.Тип = "DOC" Тогда
			
			ВыведеннаяОбласть = Неопределено;
			
			Если		ОписаниеОбласти.ТипОбласти = "ВерхнийКолонтитул" Тогда
				УправлениеПечатьюMSWordКлиент.ДобавитьВерхнийКолонтитул(ПечатнаяФорма, ОбластьМакета);
			ИначеЕсли	ОписаниеОбласти.ТипОбласти = "НижнийКолонтитул" Тогда
				УправлениеПечатьюMSWordКлиент.ДобавитьНижнийКолонтитул(ПечатнаяФорма, ОбластьМакета);
			ИначеЕсли	ОписаниеОбласти.ТипОбласти = "Общая" Тогда
				ВыведеннаяОбласть = УправлениеПечатьюMSWordКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку);
			ИначеЕсли	ОписаниеОбласти.ТипОбласти = "Список" Тогда
				ВыведеннаяОбласть = УправлениеПечатьюMSWordКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку);
			ИначеЕсли	ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" Тогда
				Если ПечатнаяФорма.ПоследняяВыведеннаяОбласть <> Неопределено
				   И ПечатнаяФорма.ПоследняяВыведеннаяОбласть.ТипОбласти = "СтрокаТаблицы"
				   И НЕ ПечатнаяФорма.ПоследняяВыведеннаяОбласть.ПереходНаСледующуюСтроку Тогда
					ВыведеннаяОбласть = УправлениеПечатьюMSWordКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку, Истина);
				Иначе
					ВыведеннаяОбласть = УправлениеПечатьюMSWordКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку);
				КонецЕсли;
			Иначе
				ВызватьИсключение ТекстТипОбластиУказанНекорректно();
			КонецЕсли;
			
			ОписаниеОбласти.Вставить("Область", ВыведеннаяОбласть);
			ОписаниеОбласти.Вставить("ПереходНаСледующуюСтроку", ПереходНаСледующуюСтроку);
			
			// Содержит тип области, и границы области (если требуется).
			ПечатнаяФорма.ПоследняяВыведеннаяОбласть = ОписаниеОбласти;
			
		ИначеЕсли ПечатнаяФорма.Тип = "ODT" Тогда
			Если		ОписаниеОбласти.ТипОбласти = "ВерхнийКолонтитул" Тогда
				УправлениеПечатьюOOWriterКлиент.ДобавитьВерхнийКолонтитул(ПечатнаяФорма, ОбластьМакета);
			ИначеЕсли	ОписаниеОбласти.ТипОбласти = "НижнийКолонтитул" Тогда
				УправлениеПечатьюOOWriterКлиент.ДобавитьНижнийКолонтитул(ПечатнаяФорма, ОбластьМакета);
			ИначеЕсли	ОписаниеОбласти.ТипОбласти = "Общая"
					ИЛИ ОписаниеОбласти.ТипОбласти = "Список" Тогда
				УправлениеПечатьюOOWriterКлиент.УстановитьОсновнойКурсорНаТелоДокумента(ПечатнаяФорма);
				УправлениеПечатьюOOWriterКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку);
			ИначеЕсли	ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" Тогда
				УправлениеПечатьюOOWriterКлиент.УстановитьОсновнойКурсорНаТелоДокумента(ПечатнаяФорма);
				УправлениеПечатьюOOWriterКлиент.ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку, Истина);
			Иначе
				ВызватьИсключение ТекстТипОбластиУказанНекорректно();
			КонецЕсли;
			// Содержит тип области, и границы области (если требуется).
			ПечатнаяФорма.ПоследняяВыведеннаяОбласть = ОписаниеОбласти;
		КонецЕсли;
	Исключение
		СообщениеОбОшибке = СокрЛП(ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
		СообщениеОбОшибке = ?(Прав(СообщениеОбОшибке, 1) = ".", СообщениеОбОшибке, СообщениеОбОшибке + ".");
		СообщениеОбОшибке = СообщениеОбОшибке + " " + СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Невозможно вывести в печатную форму область ""%1"" из макета.'"),
			ОбластьМакета.ОписаниеОбласти.ИмяОбласти);
		ВызватьИсключение СообщениеОбОшибке;
	КонецПопытки;
	
КонецПроцедуры

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

// Устарела. Следует использовать УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры.
//
// Добавляет область в печатную форму из макета, при этом заменяя параметры в области значениями из данных объекта.
// Применяется при одиночном выводе области.
//
// Параметры:
//  ПечатнаяФорма - см. ИнициализироватьПечатнуюФорму.
//  ОбластьМакета - см. ОбластьМакета.
//  Данные - Структура - данные заполнения.
//  ПереходНаСледующуюСтроку - Булево - Истина, если требуется вставить разрыв после вывода области.
//
Процедура ПрисоединитьОбластьИЗаполнитьПараметры(Знач ПечатнаяФорма, Знач ОбластьМакета,
	Знач Данные, Знач ПереходНаСледующуюСтроку = Истина) Экспорт
	
	Если ОбластьМакета <> Неопределено Тогда
		ПрисоединитьОбласть(ПечатнаяФорма, ОбластьМакета, ПереходНаСледующуюСтроку);
		ЗаполнитьПараметры(ПечатнаяФорма, Данные)
	КонецЕсли;
	
КонецПроцедуры

// Устарела. Следует использовать УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию.
//
// Добавляет область в печатную форму из макета, при этом заменяя
// параметры в области значениями из данных объекта.
// Применяется при одиночном выводе области.
//
// Параметры:
//  ПечатнаяФорма - см. ИнициализироватьПечатнуюФорму.
//  ОбластьМакета - см. ОбластьМакета
//  Данные - Массив - коллекция элементов типа Структура - данные объекта.
//  ПереходНаСледСтроку - Булево - Истина, если требуется вставить разрыв после вывода области.
//
Процедура ПрисоединитьИЗаполнитьКоллекцию(Знач ПечатнаяФорма,
										Знач ОбластьМакета,
										Знач Данные,
										Знач ПереходНаСледСтроку = Истина) Экспорт
	Если ОбластьМакета = Неопределено Тогда
		Возврат;
	КонецЕсли;
	
	ОписаниеОбласти = ОбластьМакета.ОписаниеОбласти;
	
	Если ПечатнаяФорма.Тип = "DOC" Тогда
		Если		ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" Тогда
			УправлениеПечатьюMSWordКлиент.ПрисоединитьИЗаполнитьОбластьТаблицы(ПечатнаяФорма, ОбластьМакета, Данные, ПереходНаСледСтроку);
		ИначеЕсли	ОписаниеОбласти.ТипОбласти = "Список" Тогда
			УправлениеПечатьюMSWordКлиент.ПрисоединитьИЗаполнитьНабор(ПечатнаяФорма, ОбластьМакета, Данные, ПереходНаСледСтроку);
		Иначе
			ВызватьИсключение ТекстТипОбластиУказанНекорректно();
		КонецЕсли;
	ИначеЕсли ПечатнаяФорма.Тип = "ODT" Тогда
		Если		ОписаниеОбласти.ТипОбласти = "СтрокаТаблицы" Тогда
			УправлениеПечатьюOOWriterКлиент.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, ОбластьМакета, Данные, Истина, ПереходНаСледСтроку);
		ИначеЕсли	ОписаниеОбласти.ТипОбласти = "Список" Тогда
			УправлениеПечатьюOOWriterКлиент.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, ОбластьМакета, Данные, Ложь, ПереходНаСледСтроку);
		Иначе
			ВызватьИсключение ТекстТипОбластиУказанНекорректно();
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

// Устарела. Следует использовать УправлениеПечатью.ВставитьРазрывНаНовуюСтроку.
//
// Вставляет разрыв между строками в виде символа перевода строки.
//
// Параметры:
//  ПечатнаяФорма - см. ИнициализироватьПечатнуюФорму.
//
Процедура ВставитьРазрывНаНовуюСтроку(Знач ПечатнаяФорма) Экспорт
	
	Если	  ПечатнаяФорма.Тип = "DOC" Тогда
		УправлениеПечатьюMSWordКлиент.ВставитьРазрывНаНовуюСтроку(ПечатнаяФорма);
	ИначеЕсли ПечатнаяФорма.Тип = "ODT" Тогда
		УправлениеПечатьюOOWriterКлиент.ВставитьРазрывНаНовуюСтроку(ПечатнаяФорма);
	КонецЕсли;
	
КонецПроцедуры

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

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

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

#Область СлужебныйПрограммныйИнтерфейс

// Открывает форму диалога загрузки файла макета для редактирования во внешней программе.
Процедура РедактироватьМакетВоВнешнейПрограмме(ОписаниеОповещения, ПараметрыМакета, Форма) Экспорт
	ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.РедактированиеМакета", ПараметрыМакета, Форма, , , , ОписаниеОповещения);
КонецПроцедуры

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

// Параметры:
//  Форма - ФормаКлиентскогоПриложения
//  Команда - КомандаФормы
//
Процедура ПереключитьЯзык(Форма, Команда) Экспорт
	
	Параметры = Новый Структура;
	Параметры.Вставить("Форма", Форма);
	МассивСловЯзыка = СтрРазделить(Команда.Имя, "_", Ложь);
	МассивСловЯзыка.Удалить(0);
	ВыбранныйЯзык = СтрСоединить(МассивСловЯзыка, "_");
	
	Параметры.Вставить("ВыбранныйЯзык", ВыбранныйЯзык);

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

Функция ИдентификаторОбласти(Область) Экспорт
	
	Возврат УправлениеПечатьюКлиентСервер.ИдентификаторОбласти(Область);
	
КонецФункции

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

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

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

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

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

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

// Конструктор элемента массива для второго параметра процедуры ВыполнитьКомандыПечати.
// 
// Возвращаемое значение:
//  Структура - содержит необходимые поля для выполнения процедуры ВыполнитьКомандыПечати.
//
Функция СоздатьКомандуПечати() Экспорт
	ШаблонКоманды = УправлениеПечатьюВызовСервера.СоздатьКомандуПечати();
	Возврат ШаблонКоманды;
КонецФункции

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

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

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

Функция ТекстТипОбластиУказанНекорректно()
	Возврат НСтр("ru = 'Тип области не указан или указан некорректно.'");
КонецФункции

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

	КонецЕсли;

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

// Параметры:
//  Существует - Булево
//  ПараметрыПодготовки - см. ПараметрыПодготовкиИменФайлов
//
Процедура ПриПроверкеСуществованияФайла(Существует, ПараметрыПодготовки) Экспорт
	
	Если Существует Тогда
		ПараметрыПодготовки.Счетчик = ПараметрыПодготовки.Счетчик + 1;
	Иначе
		ОписаниеФайла = ПараметрыПодготовки.ОписанияФайлов[ПараметрыПодготовки.Индекс];
		ОписаниеФайла.Представление = ПараметрыПодготовки.ИмяФайла;
		ПараметрыПодготовки.Счетчик = 0;
		ПараметрыПодготовки.Индекс = ПараметрыПодготовки.Индекс + 1;
	КонецЕсли;
	
	ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки);
	
КонецПроцедуры

Процедура ПерейтиКМакету(ПутьКМакету) Экспорт
	
	ПараметрыОткрытия = Новый Структура("ПутьКМакету", ПутьКМакету);
	ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.МакетыПечатныхФорм", ПараметрыОткрытия);
	
КонецПроцедуры

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

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

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

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

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