Files
SSL/SSL/src/CommonForms/ПечатьДокументовOfficeOpen/Module.bsl
T
2023-05-04 14:42:00 +03:00

1580 lines
111 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
#Область ОписаниеПеременных
&НаКлиенте
Перем СтруктураЕдиногоДокумента;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если ЭтоАдресВременногоХранилища(Параметры.АдресНастройкиПечатныхФорм) Тогда
НастройкиПечатныхФормВходящие = ПолучитьИзВременногоХранилища(Параметры.АдресНастройкиПечатныхФорм);
Иначе
НастройкиПечатныхФормВходящие = РеквизитФормыВЗначение("НастройкиПечатныхФорм", Тип("ТаблицаЗначений"));
КонецЕсли;
ПараметрыВывода = Параметры.ПараметрыВывода;
Если ПараметрыВывода = Неопределено Тогда
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
КонецЕсли;
Если ЭтоАдресВременногоХранилища(Параметры.АдресСтруктурыЕдиногоДокумента) Тогда
АдресСтруктурыЕдиногоДокумента = Параметры.АдресСтруктурыЕдиногоДокумента;
КонецЕсли;
ТаблицаПечатныхФорм = РеквизитФормыВЗначение("ПечатныеФормы", Тип("ТаблицаЗначений"));
НастройкиСформированныхПечатныхФорм = Новый Соответствие;
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФормВходящие Цикл
ПечатныеФормыДокумента = ОбщегоНазначения.ЗначениеИзСтрокиXML(НастройкаПечатнойФормы.ОфисныеДокументы);
Для Каждого ПечатнаяФорма Из ПечатныеФормыДокумента Цикл
Если ЭтоАдресВременногоХранилища(ПечатнаяФорма.Ключ) Тогда
ЗаданныеИменаПечатныхФорм = ОбщегоНазначения.ЗначениеИзСтрокиXML(НастройкаПечатнойФормы.ИмяФайлаПечатнойФормы);
ПредставлениеПечатнойФормы = УправлениеПечатью.ИмяФайлаПечатнойФормыОбъекта(ПечатнаяФорма.Значение, ЗаданныеИменаПечатныхФорм, НастройкаПечатнойФормы.Название);
ДобавитьПечатнуюФорму(ТаблицаПечатныхФорм, НастройкаПечатнойФормы, ПечатнаяФорма, ПредставлениеПечатнойФормы);
СтруктураНастроек = Новый Структура("ПодписьИПечать, Пометка, ТекущийЯзык");
ЗаполнитьЗначенияСвойств(СтруктураНастроек, НастройкаПечатнойФормы);
НастройкиСформированныхПечатныхФорм.Вставить(ПечатнаяФорма.Ключ, СтруктураНастроек);
НоваяНастройка = НастройкиПечатныхФорм.Добавить();
ЗаполнитьЗначенияСвойств(НоваяНастройка, НастройкаПечатнойФормы,,"ОфисныеДокументы");
ОфисныеДокументы = Новый Соответствие;
ОфисныеДокументы.Вставить(ПечатнаяФорма.Ключ, ПечатнаяФорма.Значение);
НоваяНастройка.ОфисныеДокументы = ОбщегоНазначения.ЗначениеВСтрокуXML(ОфисныеДокументы);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
Элементы.Справка.Видимость = Ложь;
ИначеЕсли НастройкиПечатныхФорм.Количество() = 1 Тогда
Инструкция = ПолучитьТекстИнструкции(ТаблицаПечатныхФорм[0].Представление, ТаблицаПечатныхФорм[0].АдресПечатнойФормы);
Иначе
Инструкция = ПолучитьТекстИнструкции();
КонецЕсли;
ТаблицаПечатныхФорм.ЗаполнитьЗначения(0, "Картинка");
ЗначениеВДанныеФормы(ТаблицаПечатныхФорм, ПечатныеФормы);
НастроитьФорму(НастройкиПечатныхФорм.Количество());
ДополнительнаяИнформация = Новый Структура("Картинка, Текст", Новый Картинка, "");
ТаблицаОбъектовПечати = ПечатныеФормы.Выгрузить(,"ОбъектПечати");
МассивСсылок = ТаблицаОбъектовПечати.ВыгрузитьКолонку("ОбъектПечати");
ОбъектыПечати.ЗагрузитьЗначения(МассивСсылок);
МассивСсылок = ОбъектыПечати.ВыгрузитьЗначения();
// ЭлектронноеВзаимодействие
Если ТипЗнч(МассивСсылок) = Тип("Массив")
И МассивСсылок.Количество() > 0
И ОбщегоНазначения.ЗначениеСсылочногоТипа(МассивСсылок[0]) Тогда
Если ОбщегоНазначения.ПодсистемаСуществует("ЭлектронноеВзаимодействие") Тогда
МодульЭлектронноеВзаимодействие = ОбщегоНазначения.ОбщийМодуль("ЭлектронноеВзаимодействие");
МодульЭлектронноеВзаимодействие.ПриВыводеНавигационнойСсылкиВФормеОбъектаИБ(ДополнительнаяИнформация, МассивСсылок);
КонецЕсли;
КонецЕсли;
// Конец ЭлектронноеВзаимодействие
Элементы.ДополнительнаяИнформация.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(ДополнительнаяИнформация.Текст);
Элементы.КартинкаИнформации.Картинка = ДополнительнаяИнформация.Картинка;
Элементы.ГруппаДополнительнаяИнформация.Видимость = Не ПустаяСтрока(Элементы.ДополнительнаяИнформация.Заголовок);
Элементы.КартинкаИнформации.Видимость = Элементы.КартинкаИнформации.Картинка.Вид <> ВидКартинки.Пустая;
ИнтеграцияПодсистемБСП.ПечатьДокументовПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
УправлениеПечатьюПереопределяемый.ПечатьДокументовПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
Элементы.КоманднаяПанельЛеваяЧасть.Видимость = Ложь;
Элементы.КоманднаяПанельПраваяЧасть.Видимость = Ложь;
Элементы.ПечатныеФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто;
Элементы.КнопкаОтправитьВсеДействия.КнопкаПоУмолчанию = Истина;
Элементы.Справка.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю;
Элементы.КнопкаИзменитьМакет.Видимость = Ложь;
Элементы.ФлажокПодписьИПечать.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто;
Элементы.ФлажокОбъединитьДокументы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто;
Элементы.ГруппаКоманднаяПанель.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
Элементы.НастройкаПодписиИПечати.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
Элементы.ПечатныеФормы.Шапка = Ложь;
Элементы.БольшеНеПоказывать.Видимость = Ложь;
БольшеНеПоказывать = Ложь;
Элементы.ГруппаИнструкция.Видимость = Ложь;
Элементы.Переместить(Элементы.Показать, Элементы.КоманднаяПанельЕще, Элементы.КнопкаСохранитьВсеДействия);
Элементы.Показать.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю;
Элементы.ПечатныеФормыУстановитьФлажки.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю;
Элементы.ПечатныеФормыСнятьФлажки.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю;
Элементы.Переместить(Элементы.ПечатныеФормыУстановитьФлажки, Элементы.КоманднаяПанельЕще);
Элементы.Переместить(Элементы.ПечатныеФормыСнятьФлажки, Элементы.КоманднаяПанельЕще);
Элементы.ПерейтиКУправлениюМакетами.Видимость = Ложь;
Иначе
БольшеНеПоказывать = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПечатьДокументовOfficeOpen",
"ВыводитьСразу", Истина);
КонецЕсли;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда
МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность");
МодульУправлениеПечатьюМультиязычность.ЗаполнитьПодменюЯзык(ЭтотОбъект, , ДоступныеЯзыкиПечатныхФорм());
КонецЕсли;
Элементы.ФлажокПодписьИПечать.Видимость = ЕстьПодписиИПечатиДляОбъектовПечати();
ОбъединитьДокументы = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПечатьДокументовOfficeOpen",
"ОднимДокументом", Ложь) И Элементы.ФлажокОбъединитьДокументы.Видимость;
ПодписьИПечать = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПечатьДокументовOfficeOpen",
"ПодписьИПечать", Ложь);
УстановитьЗаголовокФормы();
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ЭтоАдресВременногоХранилища(АдресСтруктурыЕдиногоДокумента) Тогда
СтруктураЕдиногоДокумента = ПолучитьИзВременногоХранилища(АдресСтруктурыЕдиногоДокумента);
КонецЕсли;
Если СтруктураЕдиногоДокумента = Неопределено Тогда
СтруктураЕдиногоДокумента = Новый Структура();
СтруктураЕдиногоДокумента.Вставить("АдресПечатнойФормы", ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор));
СтруктураЕдиногоДокумента.Вставить("ИмяФайлаПечатнойФормы");
СтруктураЕдиногоДокумента.Вставить("Представление");
СтруктураЕдиногоДокумента.Вставить("СоставЕдиногоДокумента", Новый Соответствие());
Если ОбъединитьДокументы Тогда
Оповещение = Новый ОписаниеОповещения("ПриЗавершенииФормированияПечатныхФорм", ЭтотОбъект);
НачатьПолучениеПечатныхФорм(СтруктураЕдиногоДокумента, Оповещение);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Для Каждого ФайлДляУдаления Из СписокФайловДляУдаления Цикл
НачатьУдалениеФайлов(Новый ОписаниеОповещения, ФайлДляУдаления.Значение);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
ПараметрыВыбора = Новый Структура("ВыбранноеЗначение, ИсточникВыбора", ВыбранноеЗначение, ИсточникВыбора);
ОповещениеПродолжениеВыбора = Новый ОписаниеОповещения("ОбработкаВыбораПродолжение", ЭтотОбъект, ПараметрыВыбора);
Оповещение = Новый ОписаниеОповещения("ПриЗавершенииФормированияПечатныхФорм", ЭтотОбъект, ОповещениеПродолжениеВыбора);
Если ТребуетсяПереформирование Тогда
НачатьПолучениеПечатныхФорм(СтруктураЕдиногоДокумента, Оповещение);
Иначе
ВыполнитьОбработкуОповещения(ОповещениеПродолжениеВыбора);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "Запись_ПользовательскиеМакетыПечати"
И Источник.ВладелецФормы = ЭтотОбъект Тогда
ТребуетсяПереформирование = Истина;
ИначеЕсли (ИмяСобытия = "ОтказОтИзмененияМакета"
Или ИмяСобытия = "ОтменаРедактированияОфисногоДокумента"
И Источник.ВладелецФормы = ЭтотОбъект) Тогда
ЗаблокироватьФорму();
ИначеЕсли ИмяСобытия = "Запись_ОфисныйДокумент" И Источник.ВладелецФормы = ЭтотОбъект Тогда
ТребуетсяПереформирование = Истина;
КонецЕсли;
УправлениеПечатьюКлиентПереопределяемый.ПечатьДокументовОбработкаОповещения(ЭтотОбъект, ИмяСобытия, Параметр, Источник);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура Печать(Команда)
МассивПечатныхФорм = ПечатныеФормыСПометками();
Если ТребуетсяПереформирование Тогда
Оповещение = Новый ОписаниеОповещения("ПечатьПродолжение", ЭтотОбъект, МассивПечатныхФорм);
НачатьПолучениеПечатныхФорм(СтруктураЕдиногоДокумента, Оповещение);
Иначе
ПечатьЗавершение(МассивПечатныхФорм);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПредварительныйПросмотр(Команда)
ОткрытьОтмеченныеПечатныеФормы();
КонецПроцедуры
&НаКлиенте
Процедура СнятьФлажки(Команда)
УстановитьПометкиНаСервере(Ложь);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьФлажки(Команда)
УстановитьПометкиНаСервере(Истина);
КонецПроцедуры
&НаСервере
Процедура УстановитьПометкиНаСервере(Пометка)
ТребуетсяПереформирование = Истина;
ТаблицаЗначений = ПечатныеФормы.Выгрузить();
ТаблицаЗначений.ЗаполнитьЗначения(Пометка, "Пометка");
ПечатныеФормы.Загрузить(ТаблицаЗначений);
КонецПроцедуры
&НаКлиенте
Процедура ПечатныеФормыПометкаПриИзменении(Элемент)
ТребуетсяПереформирование = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьМакетДляРедактирования()
НастройкаПечатнойФормы = НастройкиПечатныхФорм[0];
ЗаблокироватьФорму(Истина);
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ИмяОбъектаМетаданныхМакета", НастройкаПечатнойФормы.ПутьКМакету);
ПараметрыОткрытия.Вставить("Ссылка", СсылкаМакета(НастройкаПечатнойФормы.ПутьКМакету));
ПараметрыОткрытия.Вставить("РежимОткрытияОкна", РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
ПараметрыОткрытия.Вставить("ИмяДокумента", НастройкаПечатнойФормы.Представление);
ПараметрыОткрытия.Вставить("ТипМакета", "MXL");
ПараметрыОткрытия.Вставить("Редактирование", Истина);
ПараметрыОткрытия.Вставить("КодЯзыка", СтрРазделить(ТекущийЯзык, "_", Истина)[0]);
ОткрытьФорму("ОбщаяФорма.РедактированиеДокументаOfficeOpen", ПараметрыОткрытия, ЭтотОбъект, "ПечатьДокументовOfficeOpen");
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьМакет(Команда)
ОткрытьМакетДляРедактирования();
КонецПроцедуры
&НаКлиенте
Процедура ПерейтиКУправлениюМакетами(Команда)
ОткрытьФорму("РегистрСведений.ПользовательскиеМакетыПечати.Форма.МакетыПечатныхФорм");
КонецПроцедуры
&НаКлиенте
Процедура Сохранить(Команда)
Оповещение = Новый ОписаниеОповещения("ПриПодключенииРасширения", ЭтотОбъект);
ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура Отправить(Команда)
ОтправитьПечатныеФормыПоПочте();
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПереключитьЯзык(Команда)
УправлениеПечатьюКлиент.ПереключитьЯзык(ЭтотОбъект, Команда);
УстановитьЗаголовокФормы();
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриПереключенииЯзыка(КодЯзыка, ДополнительныеПараметры) Экспорт
ТребуетсяПереформирование = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ОбъединитьДокументыПриИзменении(Элемент)
ТребуетсяПереформирование = Истина;
ОбъединитьДокументыПриИзмененииНаСервере(ОбъединитьДокументы);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ОбъединитьДокументыПриИзмененииНаСервере(Значение)
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ПечатьДокументовOfficeOpen",
"ОднимДокументом", Значение);
КонецПроцедуры
&НаКлиенте
Процедура ФлажокПодписьИПечатьПриИзменении(Элемент)
ТребуетсяПереформирование = Истина;
ФлажокПодписьИПечатьПриИзмененииНаСервере(ПодписьИПечать);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ФлажокПодписьИПечатьПриИзмененииНаСервере(Значение)
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ПечатьДокументовOfficeOpen",
"ПодписьИПечать", Значение);
КонецПроцедуры
&НаКлиенте
Процедура ПечатныеФормыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
СтрокаВыбора = ПечатныеФормы.НайтиПоИдентификатору(ВыбраннаяСтрока);
МассивПечатныхФорм = Новый Массив;
ДобавитьДанныеПечатнойФормы(МассивПечатныхФорм, СтрокаВыбора.АдресПечатнойФормы,
СтрокаВыбора.ИмяФайлаПечатнойФормы);
ОткрытьПечатныеФормы(МассивПечатныхФорм);
КонецПроцедуры
&НаКлиенте
Процедура ИнструкцияПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
Если ДанныеСобытия.Event.type = "click" И СтрНайти(ДанныеСобытия.Element.href, "ОткрытьЕдинственнуюПечатнуюФорму") Тогда
ОткрытьПечатныеФормы();
СтандартнаяОбработка = ложь;
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
Процедура ЗаблокироватьФорму(Заблокировать = Ложь)
ГруппаОтображенияДокументов = Элементы.ГруппаДокументы;
ГруппаОтображенияДокументов.ТолькоПросмотр = Заблокировать;
КонецПроцедуры
&НаСервере
Процедура УстановитьЗаголовокФормы()
Перем ЗаголовокФормы;
ПараметрыВывода.Свойство("ЗаголовокФормы", ЗаголовокФормы);
Если Не ЗначениеЗаполнено(ЗаголовокФормы) Тогда
Если ОбъектыПечати.Количество() > 1 Тогда
ЗаголовокФормы = НСтр("ru = 'Печать документов'");
ИначеЕсли ОбъектыПечати.Количество() = 1 И ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ОбъектыПечати[0].Значение))
И ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОбъектыПечати[0].Значение, "Ссылка", Истина) <> Неопределено Тогда
ЗаголовокФормы = Строка(ОбъектыПечати[0].Значение);
Иначе
ЗаголовокФормы = НСтр("ru = 'Печать документа'");
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(ТекущийЯзык) Тогда
ТекущийЯзыкПредставление = Элементы["Язык_"+ТекущийЯзык].Заголовок;
ЗаголовокФормы = ЗаголовокФормы + " ("+ТекущийЯзыкПредставление+")";
КонецЕсли;
Заголовок = ЗаголовокФормы;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьОтмеченныеПечатныеФормы(ДополнительныеПараметры = Неопределено) Экспорт
МассивПечатныхФорм = ПечатныеФормыСПометками();
ОткрытьПечатныеФормы(МассивПечатныхФорм);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьПечатныеФормы(МассивПечатныхФорм = Неопределено)
Если Не ТребуетсяПереформирование Тогда
Если МассивПечатныхФорм = Неопределено Тогда
МассивПечатныхФорм = ПолучитьПечатныеФормы(СтруктураЕдиногоДокумента);
КонецЕсли;
ОткрытьПечатныеФормыЗавершение(МассивПечатныхФорм);
Иначе
Оповещение = Новый ОписаниеОповещения("ОткрытьПечатныеФормыПродолжение", ЭтотОбъект, МассивПечатныхФорм);
НачатьПолучениеПечатныхФорм(СтруктураЕдиногоДокумента, Оповещение);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура НастроитьФорму(КоличествоПечатныхФорм)
РежимМногихПечатныхФорм = КоличествоПечатныхФорм > 1;
Если Не РежимМногихПечатныхФорм Тогда
Элементы.Показать.Заголовок = НСтр("ru = 'Показать'");
КонецЕсли;
Элементы.ФлажокОбъединитьДокументы.Видимость = РежимМногихПечатныхФорм;
Элементы.ПечатныеФормы.Видимость = РежимМногихПечатныхФорм Или ОбщегоНазначения.ЭтоМобильныйКлиент();
Элементы.ГруппаУправленияСпискомДокументов.Видимость = Элементы.ПечатныеФормы.Видимость;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьТекстИнструкции(Представление = Неопределено, АдресПечатнойФормы = Неопределено)
ТекстИнструкции = "<!DOCTYPE html PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//EN"">
|<html>
|
|<head></head>
|<style type=""text/css"">
| .Text {
| font-family: Arial;
| orphans: 2;
| widows: 2;
| font-variant-ligatures: normal;
| }
|
|</style>
|
|<body class=""text"">
|
| <div>
| <p><strong>%1</strong></p>
| </div>
| <div>
| <p><span>%2</span></p>
| </p>
| </div>
|</body>
|
|</html>";
Если Представление = Неопределено Тогда
ТекстИнструкции = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстИнструкции, НСтр("ru = 'Документы сформированы и подготовлены к печати'"), НСтр("ru = 'Можно открыть документ для просмотра или отправить его на печать.'"));
Иначе
ТекстИнструкции = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстИнструкции, НСтр("ru = 'Документ сформирован и подготовлен к печати'"), "<a href=""ОткрытьЕдинственнуюПечатнуюФорму"">"+Представление+"</a>");
КонецЕсли;
Возврат ТекстИнструкции;
КонецФункции
&НаКлиенте
Функция ПараметрыОжидания()
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ПараметрыОжидания.ТекстСообщения = НСтр("ru = 'Изменились параметры формирования печатных форм.'");
ПараметрыОжидания.ОповещениеПользователя.Показать = Ложь;
ПараметрыОжидания.ВыводитьОкноОжидания = Истина;
ПараметрыОжидания.Интервал = 1;
Возврат ПараметрыОжидания;
КонецФункции
&НаКлиенте
Процедура ОткрытьПечатныеФормыПродолжение(Результат, МассивПечатныхФорм) Экспорт
Если Результат.Статус = "Ошибка" Тогда
ВызватьИсключение Результат.КраткоеПредставлениеОшибки;
Иначе
СтруктураЕдиногоДокумента = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
МассивПечатныхФорм = ПолучитьПечатныеФормы(СтруктураЕдиногоДокумента, МассивПечатныхФорм);
ОткрытьПечатныеФормыЗавершение(МассивПечатныхФорм);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьПечатныеФормыЗавершение(МассивПечатныхФорм)
Если ОбъединитьДокументы И МассивПечатныхФорм.ВГраница() Тогда
ОткрытьОфисныйДокумент(СтруктураЕдиногоДокумента.АдресПечатнойФормы, СтруктураЕдиногоДокумента.ИмяФайлаПечатнойФормы);
Иначе
Для Каждого ПечатнаяФорма Из МассивПечатныхФорм Цикл
ОткрытьОфисныйДокумент(ПечатнаяФорма.АдресПечатнойФормы, ПечатнаяФорма.ИмяФайлаПечатнойФормы);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьОфисныйДокумент(АдресДокумента, ИмяФайлаДляОткрытия)
ДополнительныеПараметры = Новый Структура("АдресДокумента, ОбработчикЗавершения, ИмяФайлаДляОткрытия");
ДополнительныеПараметры.АдресДокумента = АдресДокумента;
ДополнительныеПараметры.ОбработчикЗавершения = Неопределено;
ДополнительныеПараметры.ИмяФайлаДляОткрытия = ИмяФайлаДляОткрытия;
Оповещение = Новый ОписаниеОповещения("ОткрытьОфисныйДокументПослеПолученияВременногоКаталога", ЭтотОбъект, ДополнительныеПараметры);
ФайловаяСистемаКлиент.СоздатьВременныйКаталог(Оповещение);
КонецПроцедуры
// Продолжение процедуры ОткрытьОфисныйДокумент.
&НаКлиенте
Процедура ОткрытьОфисныйДокументПослеПолученияВременногоКаталога(ИмяКаталога, ДополнительныеПараметры) Экспорт
Оповещение = Новый ОписаниеОповещения("ОткрытьПослеСохранениеУКлиента", ЭтотОбъект, ДополнительныеПараметры.ОбработчикЗавершения);
ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла();
ПараметрыСохранения.Интерактивно = Ложь;
ИмяФайлаДляОткрытия = ИмяКаталога+"\"+ДополнительныеПараметры.ИмяФайлаДляОткрытия;
ФайловаяСистемаКлиент.СохранитьФайл(Оповещение, ДополнительныеПараметры.АдресДокумента, ИмяФайлаДляОткрытия, ПараметрыСохранения);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьПослеСохранениеУКлиента(ПолученныеФайлы, ОбработчикЗавершения) Экспорт
Если ПолученныеФайлы <> Неопределено Тогда
ПутьКФайлу = ПолученныеФайлы[0].ПолноеИмя;
ИмяФайла = ПолученныеФайлы[0].Имя;
ПараметрыЗавершения = Новый Структура;
ПараметрыЗавершения.Вставить("ОбработчикЗавершения", ОбработчикЗавершения);
ПараметрыЗавершения.Вставить("ПутьКФайлу", ПутьКФайлу);
ПараметрыЗавершения.Вставить("ИмяФайла", ИмяФайла);
ФайлНаДиске = Новый Файл(ПутьКФайлу);
ОписаниеПослеУстановкиТолькоЧтения = Новый ОписаниеОповещения("ОткрытьФайлЗавершение", ЭтотОбъект, ПараметрыЗавершения);
ФайлНаДиске.НачатьУстановкуТолькоЧтения(ОписаниеПослеУстановкиТолькоЧтения, Не ДоступноРедактированиеПечатнойФормы());
КонецЕсли;
ВыполнитьОбработкуОповещения(ОбработчикЗавершения);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФайлЗавершение(ПараметрыЗавершения) Экспорт
ОбработчикЗавершения = ПараметрыЗавершения.ОбработчикЗавершения;
ПутьКФайлу = ПараметрыЗавершения.ПутьКФайлу;
ИмяФайла = ПараметрыЗавершения.ИмяФайла;
ПараметрыОткрытияФайла = ФайловаяСистемаКлиент.ПараметрыОткрытияФайла();
ФайловаяСистемаКлиент.ОткрытьФайл(ПутьКФайлу, ОбработчикЗавершения, ИмяФайла, ПараметрыОткрытияФайла);
КонецПроцедуры
&НаСервере
Функция ДоступноРедактированиеПечатнойФормы()
Возврат Пользователи.РолиДоступны("РедактированиеПечатныхФорм");
КонецФункции
&НаСервере
Функция ДлительнаяОперацияПолученияПечатныхФорм(СтруктураЕдиногоДокумента)
ТребуетсяПереформирование = Ложь;
ТаблицаПечатныхФорм = ПечатныеФормы.Выгрузить();
ТаблицаПечатныхФорм.Колонки.Добавить("ФормироватьЗаново", Новый ОписаниеТипов("Булево"));
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.ЗапуститьВФоне = Истина;
ПараметрыВыполнения.ОжидатьЗавершение = 1;
ПараметрыФормирования = Новый Структура("ПереформироватьЕдиныйДокумент", Ложь);
СоставЕдиногоДокумента = СтруктураЕдиногоДокумента.СоставЕдиногоДокумента;
Для Каждого НастройкаПечатнойФормы Из ТаблицаПечатныхФорм Цикл
НастройкаПечатнойФормы.ФормироватьЗаново = НастройкаПечатнойФормы.Пометка
И (ПодписьИПечать <> НастройкаПечатнойФормы.ПодписьИПечать
ИЛИ (ТекущийЯзык <> НастройкаПечатнойФормы.ТекущийЯзык И ТекущийЯзык <> ""));
НастройкаПечатнойФормы.ПодписьИПечать = ПодписьИПечать;
НастройкаПечатнойФормы.ТекущийЯзык = ТекущийЯзык;
КонецЦикла;
Если ПолучитьИзВременногоХранилища(СтруктураЕдиногоДокумента.АдресПечатнойФормы) <> Неопределено Тогда
Для Каждого НастройкаПечатнойФормы Из СоставЕдиногоДокумента Цикл
НастройкаСформированнойПечатнойФормы = ТаблицаПечатныхФорм.Найти(НастройкаПечатнойФормы.Ключ, "АдресПечатнойФормы");
Если НастройкаСформированнойПечатнойФормы = Неопределено Тогда
ПараметрыФормирования.ПереформироватьЕдиныйДокумент = Истина;
Иначе
Для Каждого ПараметрНастройки Из НастройкаПечатнойФормы.Значение Цикл
ПараметрыФормирования.ПереформироватьЕдиныйДокумент = ПараметрыФормирования.ПереформироватьЕдиныйДокумент
ИЛИ ПараметрНастройки.Значение <> НастройкаСформированнойПечатнойФормы[ПараметрНастройки.Ключ];
КонецЦикла;
ПараметрыФормирования.ПереформироватьЕдиныйДокумент = ПараметрыФормирования.ПереформироватьЕдиныйДокумент
ИЛИ Не НастройкаСформированнойПечатнойФормы.Пометка;
КонецЕсли;
КонецЦикла;
МассивНайденныхСтрок = ТаблицаПечатныхФорм.НайтиСтроки(Новый Структура("Пометка", Истина));
Для Каждого НайденнаяСтрока Из МассивНайденныхСтрок Цикл
ПараметрыФормирования.ПереформироватьЕдиныйДокумент = ПараметрыФормирования.ПереформироватьЕдиныйДокумент
ИЛИ СоставЕдиногоДокумента[НайденнаяСтрока.АдресПечатнойФормы] <> Неопределено;
КонецЦикла;
ПараметрыФормирования.ПереформироватьЕдиныйДокумент = ОбъединитьДокументы И ПараметрыФормирования.ПереформироватьЕдиныйДокумент;
Иначе
ПараметрыФормирования.ПереформироватьЕдиныйДокумент = Истина;
КонецЕсли;
ОфисныеДокументы = Новый Соответствие();
Для Каждого СтрокаТаблицыПечатныхФорм Из ТаблицаПечатныхФорм Цикл
ОфисныеДокументы.Вставить(СтрокаТаблицыПечатныхФорм.АдресПечатнойФормы, ПолучитьИзВременногоХранилища(СтрокаТаблицыПечатныхФорм.АдресПечатнойФормы));
КонецЦикла;
ТаблицаПечатныхФорм.ЗаполнитьЗначения(0, "Картинка");
ПечатныеФормы.Загрузить(ТаблицаПечатныхФорм);
Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, "УправлениеПечатьюСлужебный.СформироватьПечатныеФормы", ТаблицаПечатныхФорм, ПараметрыФормирования, ОфисныеДокументы, СтруктураЕдиногоДокумента);
КонецФункции
&НаСервере
Функция ПолучитьПечатныеФормы(СтруктураЕдиногоДокумента, МассивПечатныхФормОграничение = Неопределено)
МассивПечатныхФорм = Новый Массив;
ТаблицаПечатныхФорм = РеквизитФормыВЗначение("ПечатныеФормы", Тип("ТаблицаЗначений"));
Если ОбъединитьДокументы Тогда
ДобавитьДанныеПечатнойФормы(МассивПечатныхФорм, СтруктураЕдиногоДокумента.АдресПечатнойФормы, СтруктураЕдиногоДокумента.ИмяФайлаПечатнойФормы);
Иначе
Если МассивПечатныхФормОграничение = Неопределено Тогда
Для Каждого СтрокаПечатнойФормы Из ТаблицаПечатныхФорм Цикл
Если СтрокаПечатнойФормы.Пометка Тогда
ДобавитьДанныеПечатнойФормы(МассивПечатныхФорм, СтрокаПечатнойФормы.АдресПечатнойФормы,
СтрокаПечатнойФормы.ИмяФайлаПечатнойФормы);
КонецЕсли;
КонецЦикла;
Иначе
Для Каждого СтрокаПечатнойФормы Из МассивПечатныхФормОграничение Цикл
ДобавитьДанныеПечатнойФормы(МассивПечатныхФорм, СтрокаПечатнойФормы.АдресПечатнойФормы,
СтрокаПечатнойФормы.ИмяФайлаПечатнойФормы);
КонецЦикла;
КонецЕсли;
КонецЕсли;
Возврат МассивПечатныхФорм;
КонецФункции
&НаСервере
Функция ПечатныеФормыСПометками()
ТаблицаПечатныхФорм = ПечатныеФормы.Выгрузить();
МассивНайденныхСтрок = ТаблицаПечатныхФорм.НайтиСтроки(Новый Структура("Пометка", Истина));
Если МассивНайденныхСтрок.Количество() <> 0 Тогда
МассивПечатныхФорм = Новый Массив();
Для Каждого СтрокаПечатнойФормы Из МассивНайденныхСтрок Цикл
ДобавитьДанныеПечатнойФормы(МассивПечатныхФорм, СтрокаПечатнойФормы.АдресПечатнойФормы,
СтрокаПечатнойФормы.ИмяФайлаПечатнойФормы);
КонецЦикла;
Возврат МассивПечатныхФорм;
Иначе
Возврат Новый Массив
КонецЕсли;
КонецФункции
&НаСервере
Процедура ДобавитьДанныеПечатнойФормы(МассивПечатныхФорм, Знач АдресПечатнойФормы, Знач ИмяФайлаПечатнойФормы)
ПечатнаяФорма = Новый Структура("АдресПечатнойФормы, Представление, ИмяФайлаПечатнойФормы");
ПечатнаяФорма.АдресПечатнойФормы = АдресПечатнойФормы;
ПечатнаяФорма.Представление = ИмяФайлаПечатнойФормы;
ПечатнаяФорма.ИмяФайлаПечатнойФормы = ИмяФайлаПечатнойФормы;
МассивПечатныхФорм.Добавить(ПечатнаяФорма);
КонецПроцедуры
&НаСервере
Функция СсылкаМакета(ИмяОбъектаМетаданныхМакета)
Возврат Справочники.МакетыПечатныхФорм.СсылкаМакета(ИмяОбъектаМетаданныхМакета);
КонецФункции
&НаСервере
Функция ЕстьПодписиИПечатиДляОбъектовПечати()
Результат = Ложь;
ПодписиИПечатиОбъектов = УправлениеПечатью.ПодписиИПечатиОбъектов(ОбъектыПечати);
Для Каждого ПодписиИПечатиОбъекта Из ПодписиИПечатиОбъектов Цикл
КоллекцияПодписейИПечатей = ПодписиИПечатиОбъекта.Значение;
Для Каждого ПодписьПечать Из КоллекцияПодписейИПечатей Цикл
Картинка = ПодписьПечать.Значение; // Картинка
Если Картинка.Вид <> ВидКартинки.Пустая Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ПриЗавершенииФормированияПечатныхФорм(Результат, ОбработкаПродолжения) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Если Результат.Статус = "Ошибка" Тогда
ВызватьИсключение Результат.КраткоеПредставлениеОшибки;
КонецЕсли;
СтруктураЕдиногоДокумента = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
Если ОбработкаПродолжения <> Неопределено Тогда
ВыполнитьОбработкуОповещения(ОбработкаПродолжения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбораПродолжение(Результат, ПараметрыВыбора) Экспорт
ВыбранноеЗначение = ОбщегоНазначенияКлиент.СкопироватьРекурсивно(ПараметрыВыбора.ВыбранноеЗначение);
ИсточникВыбора = ПараметрыВыбора.ИсточникВыбора;
Если Не ВыбранноеЗначение.Свойство("ОбъектПечати") Тогда
ВладелецФормыВыбора = ИсточникВыбора.ВладелецФормы;
СписокОбъектовПечати = ВладелецФормыВыбора.ОбъектыПечати;
ВыбранноеЗначение.Вставить("ОбъектПечати", СписокОбъектовПечати[0].Значение);
КонецЕсли;
ВариантСохранения = Неопределено;
ВыбранноеЗначение.Свойство("ВариантСохранения", ВариантСохранения);
СписокВложений = Неопределено;
Если ОбъединитьДокументы И ВариантСохранения <> "Присоединить" Тогда
Вложение = ОписаниеФайла(СтруктураЕдиногоДокумента.ИмяФайлаПечатнойФормы);
Вложение.АдресВоВременномХранилище = СтруктураЕдиногоДокумента.АдресПечатнойФормы;
Вложение.ОбъектПечати = ВыбранноеЗначение.ОбъектПечати;
СписокВложений = Новый Массив;
СписокВложений.Добавить(Вложение);
КонецЕсли;
ВыбранноеЗначение.Вставить("СписокВложений", СписокВложений);
ФайлыВоВременномХранилище = ПоместитьОфисныеДокументыВоВременноеХранилище(ВыбранноеЗначение,,Истина);
Если ВыбранноеЗначение.Подписать Тогда
Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.СохранениеПечатнойФормы") Тогда
Если ВыбранноеЗначение.ВариантСохранения = "Присоединить" Тогда
ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, ВыбранноеЗначение);
ЗаписанныеОбъекты = ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище);
ПараметрыВыбора.Вставить("ЗаписанныеОбъекты", ЗаписанныеОбъекты);
ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеОбработкиВыбора", ЭтотОбъект, ПараметрыВыбора);
ПодписатьЗаписанныеОбъекты(ЗаписанныеОбъекты, ОписаниеОповещения);
Возврат;
КонецЕсли;
КонецЕсли;
ПодписатьФайлы(ФайлыВоВременномХранилище, ПараметрыВыбора);
Иначе
ПараметрыВыбора.ВыбранноеЗначение.Вставить("СписокВложений",
ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, ВыбранноеЗначение));
ЗавершениеОбработкиВыбора(Истина, ПараметрыВыбора);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПодписатьЗаписанныеОбъекты(ЗаписанныеОбъекты, ОповещениеЗавершенияПодписания)
ДополнительныеПараметры = Новый Структура("ОбработкаРезультата", ОповещениеЗавершенияПодписания);
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
МодульРаботаСФайламиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСФайламиКлиент");
МодульРаботаСФайламиКлиент.ПодписатьФайл(ЗаписанныеОбъекты, УникальныйИдентификатор, ДополнительныеПараметры);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПодписатьФайлы(ФайлыВоВременномХранилище, ПараметрыВыбора)
ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеОбработкиВыбора", ЭтотОбъект, ПараметрыВыбора);
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
ОписаниеДанных = Новый Структура;
ОписаниеДанных.Вставить("ПоказатьКомментарий", Ложь);
Если ФайлыВоВременномХранилище.Количество() > 1 Тогда
ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файлов'"));
ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файлы'"));
НаборДанных = Новый Массив;
Для Каждого Файл Из ФайлыВоВременномХранилище Цикл
ОписаниеДанныхФайла = Новый Структура;
ОписаниеДанныхФайла.Вставить("Представление", Файл.Представление);
ОписаниеДанныхФайла.Вставить("Данные", Файл.АдресВоВременномХранилище);
ОписаниеДанныхФайла.Вставить("ОбъектПечати", Файл.ОбъектПечати);
НаборДанных.Добавить(ОписаниеДанныхФайла);
КонецЦикла;
ОписаниеДанных.Вставить("НаборДанных", НаборДанных);
ОписаниеДанных.Вставить("ПредставлениеНабора", "Файлы (%1)");
Иначе
Файл = ФайлыВоВременномХранилище[0];
ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файла'"));
ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
ОписаниеДанных.Вставить("Представление", Файл.Представление);
ОписаниеДанных.Вставить("Данные", Файл.АдресВоВременномХранилище);
ОписаниеДанных.Вставить("ОбъектПечати", Файл.ОбъектПечати);
КонецЕсли;
МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент");
МодульЭлектроннаяПодписьКлиент.Подписать(ОписаниеДанных,,ОписаниеОповещения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗавершениеОбработкиВыбора(Результат, ПараметрыВыбора) Экспорт
Если Результат = Ложь
Или (ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("Успех") И Не Результат.Успех) Тогда
Возврат;
КонецЕсли;
ВыбранноеЗначение = ПараметрыВыбора.ВыбранноеЗначение;
ИсточникВыбора = ПараметрыВыбора.ИсточникВыбора;
Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.СохранениеПечатнойФормы") Тогда
Если ВыбранноеЗначение <> Неопределено И ВыбранноеЗначение <> КодВозвратаДиалога.Отмена Тогда
Если ВыбранноеЗначение.ВариантСохранения = "СохранитьВПапку" Тогда
Если ПараметрыВыбора.ВыбранноеЗначение.Подписать Тогда
ФайлыВоВременномХранилище = ПолучитьФайлыПодписей(Результат, ВыбранноеЗначение.ПереводитьИменаФайловВТранслит);
ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, ВыбранноеЗначение);
СохранитьПечатныеФормыВКаталог(ФайлыВоВременномХранилище, ВыбранноеЗначение.ПапкаДляСохранения);
Иначе
СохранитьПечатныеФормыВКаталог(ВыбранноеЗначение.СписокВложений, ВыбранноеЗначение.ПапкаДляСохранения);
КонецЕсли;
Иначе
Если ВыбранноеЗначение.Подписать Тогда
ЗаписанныеОбъекты = ПараметрыВыбора.ЗаписанныеОбъекты;
Иначе
ФайлыВоВременномХранилище = ПоместитьОфисныеДокументыВоВременноеХранилище(ВыбранноеЗначение, Истина);
ЗаписанныеОбъекты = ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище);
КонецЕсли;
Если ЗаписанныеОбъекты.Количество() > 0 Тогда
ОповеститьОбИзменении(ТипЗнч(ЗаписанныеОбъекты[0]));
КонецЕсли;
Для Каждого ЗаписанныйОбъект Из ЗаписанныеОбъекты Цикл
Оповестить("Запись_Файл", Новый Структура, ЗаписанныйОбъект);
КонецЦикла;
ПоказатьОповещениеПользователя(НСтр("ru = 'Сохранение завершено'"), , , БиблиотекаКартинок.Информация32);
КонецЕсли;
КонецЕсли;
ИначеЕсли ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.ВыборФорматаВложений")
Или ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.ПодготовкаНовогоПисьма") Тогда
Если ВыбранноеЗначение <> Неопределено И ВыбранноеЗначение <> КодВозвратаДиалога.Отмена Тогда
Если ВыбранноеЗначение.Подписать Тогда
ФайлыВоВременномХранилище = ПолучитьФайлыПодписей(Результат, ВыбранноеЗначение.ПереводитьИменаФайловВТранслит);
ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, ВыбранноеЗначение);
ПараметрыОтправки = ПараметрыОтправкиПисьма(ВыбранноеЗначение, ФайлыВоВременномХранилище);
ОповещениеОЗакрытииФормы = Неопределено;
Иначе
Если ВыбранноеЗначение.Свойство("СписокВложений") Тогда
Вложения = ВыбранноеЗначение.СписокВложений;
Иначе
Вложения = Неопределено;
КонецЕсли;
ПараметрыОтправки = ПараметрыОтправкиПисьма(ВыбранноеЗначение, Вложения);
ОповещениеОЗакрытииФормы = Неопределено;
КонецЕсли;
МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент");
МодульРаботаСПочтовымиСообщениямиКлиент.СоздатьНовоеПисьмо(ПараметрыОтправки, ОповещениеОЗакрытииФормы);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьФайлыПодписей(СтруктураПодписания, ПереводитьИменаФайловВТранслит)
Если СтруктураПодписания.Свойство("НаборДанных") Тогда
НаборДанных = СтруктураПодписания.НаборДанных;
Иначе
НаборДанных = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(СтруктураПодписания);
КонецЕсли;
МодульЭлектроннаяПодпись = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодпись");
МодульЭлектроннаяПодписьСлужебныйКлиентСервер = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебныйКлиентСервер");
РасширениеДляФайловПодписи = МодульЭлектроннаяПодпись.ПерсональныеНастройки().РасширениеДляФайловПодписи;
КомуВыданСертификат = СтруктураПодписания.ВыбранныйСертификат.Ссылка.КомуВыдан;
Если ПереводитьИменаФайловВТранслит Тогда
КомуВыданСертификат = СтроковыеФункции.СтрокаЛатиницей(КомуВыданСертификат);
КонецЕсли;
Результат = Новый Массив;
Для Каждого ПодписанныйФайл Из НаборДанных Цикл
СтруктураОписанияФайла = Новый Структура("АдресВоВременномХранилище, Представление, ОбъектПечати");
СтруктураОписанияФайла.АдресВоВременномХранилище = ПодписанныйФайл.Данные;
СтруктураОписанияФайла.Представление = ПодписанныйФайл.Представление;
СтруктураОписанияФайла.ОбъектПечати = ПодписанныйФайл.ОбъектПечати;
Результат.Добавить(СтруктураОписанияФайла);
Файл = Новый Файл(ПодписанныйФайл.Представление);
СвойстваПодписи = ПодписанныйФайл.СвойстваПодписи;
ДанныеПодписи = ПоместитьВоВременноеХранилище(СвойстваПодписи.Подпись, УникальныйИдентификатор);
ИмяФайлаПодписи = МодульЭлектроннаяПодписьСлужебныйКлиентСервер.ИмяФайлаПодписи(Файл.ИмяБезРасширения,
Строка(КомуВыданСертификат), РасширениеДляФайловПодписи);
СтруктураОписанияФайла = Новый Структура("АдресВоВременномХранилище, Представление, ОбъектПечати");
СтруктураОписанияФайла.АдресВоВременномХранилище = ДанныеПодписи;
СтруктураОписанияФайла.Представление = ИмяФайлаПодписи;
СтруктураОписанияФайла.ОбъектПечати = ПодписанныйФайл.ОбъектПечати;
Результат.Добавить(СтруктураОписанияФайла);
ДанныеПоСертификату = ПоместитьВоВременноеХранилище(СвойстваПодписи.Сертификат, УникальныйИдентификатор);
Если ТипЗнч(СвойстваПодписи.Сертификат) = Тип("Строка") Тогда
РасширениеСертификата = "txt";
Иначе
РасширениеСертификата = "cer";
КонецЕсли;
ИмяФайлаСертификата = МодульЭлектроннаяПодписьСлужебныйКлиентСервер.ИмяФайлаСертификата(Файл.ИмяБезРасширения,
Строка(КомуВыданСертификат), РасширениеСертификата);
СтруктураОписанияФайла = Новый Структура("АдресВоВременномХранилище, Представление, ОбъектПечати");
СтруктураОписанияФайла.АдресВоВременномХранилище = ДанныеПоСертификату;
СтруктураОписанияФайла.Представление = ИмяФайлаСертификата;
СтруктураОписанияФайла.ОбъектПечати = ПодписанныйФайл.ОбъектПечати;
Результат.Добавить(СтруктураОписанияФайла);
КонецЦикла;
Возврат Результат;
КонецФункции
&НаСервере
Функция ПоместитьФайлыВоВременноеХранилище(МассивФайлов)
СписокВложений = Новый Массив;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
МодульРаботаСФайламиСлужебный = ОбщегоНазначения.ОбщийМодуль("РаботаСФайламиСлужебный");
Для Каждого Файл Из МассивФайлов Цикл
МассивДляФайла = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Файл);
МассивВложенийФайла = МодульРаботаСФайламиСлужебный.ПоместитьФайлыВоВременноеХранилище(МассивДляФайла, УникальныйИдентификаторХранилища);
Для Каждого ВложениеФайла Из МассивВложенийФайла Цикл
ВложениеФайла.Вставить("ОбъектПечати", Файл.ВладелецФайла);
КонецЦикла;
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(СписокВложений, МассивВложенийФайла);
КонецЦикла;
КонецЕсли;
Возврат СписокВложений;
КонецФункции
&НаСервере
Функция ДоступныеЯзыкиПечатныхФорм()
Результат = Новый Массив;
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
Если Не НастройкаПечатнойФормы.ДоступенВыводНаДругихЯзыках Тогда
Продолжить;
КонецЕсли;
Для Каждого КодЯзыка Из СтрРазделить(НастройкаПечатнойФормы.ДоступныеЯзыки, ",", Ложь) Цикл
Если Результат.Найти(КодЯзыка) = Неопределено Тогда
Результат.Добавить(КодЯзыка);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ДополнительнаяИнформацияОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ИнтеграцияПодсистемБСПКлиент.ПечатьДокументовОбработкаНавигационнойСсылки(ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка);
УправлениеПечатьюКлиентПереопределяемый.ПечатьДокументовОбработкаНавигационнойСсылки(ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка);
КонецПроцедуры
// Ветка процедуры, возникающая после установки расширения работы с файлами.
&НаКлиенте
Процедура ПродолжитьПечатьПослеУстановкиРасширенияРаботыСФайлами(РасширениеПодключено, ДополнительныеПараметры) Экспорт
#Если ВебКлиент Тогда
Текст = НСтр("ru = 'Распечатайте документ при помощи приложения, предназначенного для работы с данным файлом.'");
ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьОтмеченныеПечатныеФормы", ЭтотОбъект);
ПоказатьПредупреждение(ОписаниеОповещения, Текст,,НСтр("ru = 'Печать документа из веб-клиента'"));
Возврат;
#КонецЕсли
Если Не РасширениеПодключено Тогда
Возврат;
КонецЕсли;
РасширениеДляРаботыСФайламиПодключено = РасширениеПодключено;
МассивПечатныхФорм = ПолучитьПечатныеФормы(СтруктураЕдиногоДокумента, ДополнительныеПараметры);
#Если ВебКлиент Тогда
Оповещение = Новый ОписаниеОповещения(
"ПечатьПослеПолученияИмениВременногоКаталога", ЭтотОбъект, МассивПечатныхФорм);
НачатьПолучениеКаталогаВременныхФайлов(Оповещение);
#Иначе
ПечатьПослеПолученияИмениВременногоКаталога("", МассивПечатныхФорм);
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПечатьПослеПолученияИмениВременногоКаталога(ИмяКаталогаВременныхФайлов, МассивПечатныхФорм) Экспорт
Для Каждого ПечатнаяФорма Из МассивПечатныхФорм Цикл
#Если ВебКлиент Тогда
ИмяВременногоФайла = ИмяКаталогаВременныхФайлов + Строка(Новый УникальныйИдентификатор);
#Иначе
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("DOCX"); // АПК:441 Функция для получения имени временного файла.
#КонецЕсли
Оповещение = Новый ОписаниеОповещения("ПослеСохраненияФайла", ЭтотОбъект, ИмяВременногоФайла);
ДанныеДокумента = ПолучитьИзВременногоХранилища(ПечатнаяФорма.АдресПечатнойФормы); // ДвоичныеДанные
ДанныеДокумента.НачатьЗапись(Оповещение, ИмяВременногоФайла);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ПослеСохраненияФайла(ИмяВременногоФайла) Экспорт
НапечататьФайлПриложением(ИмяВременногоФайла);
СписокФайловДляУдаления.Добавить(ИмяВременногоФайла);
КонецПроцедуры
#Область ПечатьПриложением
// Процедура предназначена для печати файла соответствующим приложением
//
// Параметры:
// ИмяФайлаДляПечати - Строка.
//
&НаКлиенте
Процедура НапечататьФайлПриложением(ИмяФайлаДляПечати)
#Если МобильныйКлиент Тогда
ПоказатьПредупреждение(, НСтр("ru = 'Печать файлов данного типа возможна только из приложения для Windows или Linux.'"));
Возврат;
#Иначе
Попытка
Если ОбщегоНазначенияКлиент.ЭтоWindowsКлиент() Тогда
ИмяФайлаДляПечати = СтрЗаменить(ИмяФайлаДляПечати, "/", "\");
КонецЕсли;
ФайловаяСистемаКлиент.НапечататьИзПриложенияПоИмениФайла(ИмяФайлаДляПечати);
Исключение
ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не удалось распечатать файл по причине:
|%1'"), ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
#КонецЕсли
КонецПроцедуры
#КонецОбласти
// Параметры:
// ВыбранныеПараметры - см. УправлениеПечатью.НастройкиСохранения
//
&НаСервере
Функция ПараметрыОтправкиПисьма(ВыбранныеПараметры, Вложения)
Если Вложения <> Неопределено Тогда
Если ТипЗнч(Вложения[0]) = Тип("Структура") Тогда
СписокВложений = Вложения;
Иначе
СписокВложений = ПоместитьФайлыВоВременноеХранилище(Вложения);
Для Каждого Вложение Из СписокВложений Цикл
Вложение.Вставить("Печать", Истина);
Вложение.Вставить("Название", Вложение.Представление);
КонецЦикла;
КонецЕсли;
Иначе
СписокВложений = ПоместитьОфисныеДокументыВоВременноеХранилище(ВыбранныеПараметры);
КонецЕсли;
// Контроль уникальности имен.
ШаблонИмениФайла = "%1%2.%3";
ИспользованныеИменаФайлов = Новый Соответствие;
Для Каждого Вложение Из СписокВложений Цикл
ИмяФайла = Вложение.Представление;
НомерИспользования = ?(ИспользованныеИменаФайлов[ИмяФайла] <> Неопределено,
ИспользованныеИменаФайлов[ИмяФайла] + 1, 1);
ИспользованныеИменаФайлов.Вставить(ИмяФайла, НомерИспользования);
Если НомерИспользования > 1 Тогда
Файл = Новый Файл(ИмяФайла);
ИмяФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмениФайла,
Файл.ИмяБезРасширения, " (" + НомерИспользования + ")", Файл.Расширение);
КонецЕсли;
Вложение.Представление = ИмяФайла;
КонецЦикла;
Получатели = ПараметрыВывода.ПараметрыОтправки.Получатель;
Если ВыбранныеПараметры.Свойство("Получатели") Тогда
Получатели = ВыбранныеПараметры.Получатели;
КонецЕсли;
Результат = Новый Структура;
Результат.Вставить("Получатель", Получатели);
Результат.Вставить("Тема", ПараметрыВывода.ПараметрыОтправки.Тема);
Результат.Вставить("Текст", ПараметрыВывода.ПараметрыОтправки.Текст);
Результат.Вставить("Вложения", СписокВложений);
Результат.Вставить("УдалятьФайлыПослеОтправки", Истина);
Если ОбъектыПечати.Количество() = 1 И ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ОбъектыПечати[0].Значение)) Тогда
Результат.Вставить("Предмет", ОбъектыПечати[0].Значение);
КонецЕсли;
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ПриПодключенииРасширения(РасширениеПодключено, ДополнительныеПараметры) Экспорт
РасширениеДляРаботыСФайламиПодключено = РасширениеПодключено;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ОбъектыПечати", ОбъектыПечати);
ПараметрыФормы.Вставить("РасширениеДляРаботыСФайламиПодключено", РасширениеПодключено);
ПараметрыФормы.Вставить("ОграничениеФорматовСохранения", "docx");
ОткрытьФорму("ОбщаяФорма.СохранениеПечатнойФормы", ПараметрыФормы, ЭтотОбъект, "ПечатьДокументовOfficeOpen");
КонецПроцедуры
&НаКлиенте
Процедура ОтправитьПечатныеФормыПоПочте()
ОписаниеОповещения = Новый ОписаниеОповещения("ОтправитьПечатныеФормыПоПочтеНастройкаУчетнойЗаписиПредложена", ЭтотОбъект);
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда
МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент");
МодульРаботаСПочтовымиСообщениямиКлиент.ПроверитьНаличиеУчетнойЗаписиДляОтправкиПочты(ОписаниеОповещения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОтправитьПечатныеФормыПоПочтеНастройкаУчетнойЗаписиПредложена(УчетнаяЗаписьНастроена, ДополнительныеПараметры) Экспорт
Если УчетнаяЗаписьНастроена <> Истина Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура;
ИмяОткрываемойФормы = "ОбщаяФорма.ВыборФорматаВложений";
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия")
И СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ИспользоватьПочтовыйКлиент Тогда
Если ПолучателейБольшеОдного(ПараметрыВывода.ПараметрыОтправки.Получатель) Тогда
ПараметрыФормы.Вставить("Получатели", ПараметрыВывода.ПараметрыОтправки.Получатель);
ИмяОткрываемойФормы = "ОбщаяФорма.ПодготовкаНовогоПисьма";
КонецЕсли;
КонецЕсли;
ПараметрыФормы.Вставить("ОграничениеФорматовСохранения", "docx");
ОткрытьФорму(ИмяОткрываемойФормы, ПараметрыФормы, ЭтотОбъект, "ПечатьДокументовOfficeOpen");
КонецПроцедуры
&НаКлиенте
Процедура БольшеНеПоказыватьПриИзменении(Элемент)
БольшеНеПоказыватьПриИзмененииНаСервере(БольшеНеПоказывать);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура БольшеНеПоказыватьПриИзмененииНаСервере(Значение)
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("ПечатьДокументовOfficeOpen",
"ВыводитьСразу", Значение);
КонецПроцедуры
&НаКлиенте
Функция ПолучателейБольшеОдного(Получатель)
Если ТипЗнч(Получатель) = Тип("Массив") Или ТипЗнч(Получатель) = Тип("СписокЗначений") Тогда
Возврат Получатель.Количество() > 1;
Иначе
Возврат ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(Получатель).Количество() > 1;
КонецЕсли;
КонецФункции
// Параметры:
// ТаблицаПечатныхФорм - ТаблицаЗначений
// НастройкаПечатнойФормы - СтрокаТаблицыЗначений
// ПечатнаяФорма - см. УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм
// ПредставлениеПечатнойФормы - Строка
//
&НаСервере
Процедура ДобавитьПечатнуюФорму(ТаблицаПечатныхФорм, НастройкаПечатнойФормы, ПечатнаяФорма, ПредставлениеПечатнойФормы)
ИмяФайлаПечатнойФормы = ПредставлениеПечатнойФормы + ".DOCX";
НоваяСтрокаПечатнойФормы = ТаблицаПечатныхФорм.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрокаПечатнойФормы, НастройкаПечатнойФормы);
НоваяСтрокаПечатнойФормы.ОбъектПечати = ПечатнаяФорма.Значение;
НоваяСтрокаПечатнойФормы.АдресПечатнойФормы = ПечатнаяФорма.Ключ;
НоваяСтрокаПечатнойФормы.ИмяФайлаПечатнойФормы = ИмяФайлаПечатнойФормы;
НоваяСтрокаПечатнойФормы.Представление = ПредставлениеПечатнойФормы;
НоваяСтрокаПечатнойФормы.Пометка = Истина;
НоваяСтрокаПечатнойФормы.ТекущийЯзык = ОбщегоНазначения.КодОсновногоЯзыка();
КонецПроцедуры
&НаСервере
Функция ПоместитьФайлыВАрхив(ПечатныеФормыДокументов, ПереданныеНастройки)
Перем ЗаписьZipФайла, ИмяАрхива;
Результат = Новый Массив;
НастройкиСохранения = НастройкиСохранения();
ЗаполнитьЗначенияСвойств(НастройкиСохранения, ПереданныеНастройки);
Если Не НастройкиСохранения.УпаковатьВАрхив Тогда
Возврат ПечатныеФормыДокументов;
КонецЕсли;
ВариантСохранения = Неопределено;
ПереданныеНастройки.Свойство("ВариантСохранения", ВариантСохранения);
УстанавливатьОбъектПечати = ВариантСохранения = "Присоединить";
ПереводитьИменаФайловВТранслит = НастройкиСохранения.ПереводитьИменаФайловВТранслит;
ИмяВременногоКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла());
СоздатьКаталог(ИмяВременногоКаталога);
СоответствиеДляАрхивов = Новый Соответствие;
Для Каждого СтруктураФайла Из ПечатныеФормыДокументов Цикл
ДанныеФайла = ПолучитьИзВременногоХранилища(СтруктураФайла.АдресВоВременномХранилище);
ПолноеИмяФайла = ИмяВременногоКаталога + СтруктураФайла.Представление;
ДанныеФайла.Записать(ПолноеИмяФайла);
ОбъектПечати = ?(УстанавливатьОбъектПечати, СтруктураФайла.ОбъектПечати, Неопределено);
Если СоответствиеДляАрхивов[ОбъектПечати] = Неопределено Тогда
ИмяАрхива = ПолучитьИмяВременногоФайла("zip");
ЗаписьZipФайла = Новый ЗаписьZipФайла(ИмяАрхива);
Представление = ?(ОбъектПечати = Неопределено, НСтр("ru = 'Документы'"), ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(Строка(ОбъектПечати)));
Если ПереводитьИменаФайловВТранслит Тогда
Представление = СтроковыеФункции.СтрокаЛатиницей(Представление);
КонецЕсли;
ПараметрыЗаписи = Новый Структура("ЗаписьZipФайла, ИмяАрхива, Представление", ЗаписьZipФайла, ИмяАрхива, Представление+".zip");
СоответствиеДляАрхивов.Вставить(ОбъектПечати, ПараметрыЗаписи);
КонецЕсли;
СоответствиеДляАрхивов[ОбъектПечати].ЗаписьZipФайла.Добавить(ПолноеИмяФайла);
КонецЦикла;
Для Каждого АрхивОбъекта Из СоответствиеДляАрхивов Цикл
ЗаписьZipФайла = АрхивОбъекта.Значение.ЗаписьZipФайла;
ИмяАрхива = АрхивОбъекта.Значение.ИмяАрхива;
ЗаписьZipФайла.Записать();
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяАрхива);
ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторХранилища);
ОписаниеФайла = ОписаниеФайла(АрхивОбъекта.Значение.Представление);
ОписаниеФайла.Вставить("ОбъектПечати", АрхивОбъекта.Ключ);
ОписаниеФайла.Вставить("АдресВоВременномХранилище", ПутьВоВременномХранилище);
Результат.Добавить(ОписаниеФайла);
УдалитьФайлы(ИмяАрхива);
КонецЦикла;
УдалитьФайлы(ИмяВременногоКаталога);
Возврат Результат;
КонецФункции
&НаСервере
Функция ПоместитьОфисныеДокументыВоВременноеХранилище(ПереданныеНастройки, ИспользоватьИндивидуальныеПечатныеФормы = Ложь, ЭтоПодписание = Ложь)
Перем ЗаписьZipФайла, ИмяАрхива;
Если ПереданныеНастройки.Свойство("СписокВложений") И ПереданныеНастройки.СписокВложений <> Неопределено
И Не ИспользоватьИндивидуальныеПечатныеФормы Тогда
НастройкиПечатныхФормВр = ПереданныеНастройки.СписокВложений; // единый документ
Иначе
НастройкиПечатныхФормВр = НастройкиПечатныхФорм;
КонецЕсли;
НастройкиСохранения = НастройкиСохранения();
ЗаполнитьЗначенияСвойств(НастройкиСохранения, ПереданныеНастройки);
Результат = Новый Массив;
// подготовка архива
Если НастройкиСохранения.УпаковатьВАрхив И НЕ ЭтоПодписание Тогда
ИмяАрхива = ПолучитьИмяВременногоФайла("zip");
ЗаписьZipФайла = Новый ЗаписьZipФайла(ИмяАрхива);
КонецЕсли;
ИмяВременногоКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла());
СоздатьКаталог(ИмяВременногоКаталога);
ПереводитьИменаФайловВТранслит = НастройкиСохранения.ПереводитьИменаФайловВТранслит;
ОбъектыДляПрикрепления = Неопределено;
Если ПереданныеНастройки.Свойство("ОбъектыДляПрикрепления") Тогда
ОбъектыДляПрикрепления = ОбщегоНазначения.СкопироватьРекурсивно(ПереданныеНастройки.ОбъектыДляПрикрепления);
КонецЕсли;
// сохранение печатных форм
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФормВр Цикл
Если НастройкаПечатнойФормы.Свойство("ОфисныеДокументы") И НЕ ПустаяСтрока(НастройкаПечатнойФормы.ОфисныеДокументы) Тогда
ФайлыОфисныхДокументов = ОбщегоНазначения.ЗначениеИзСтрокиXML(НастройкаПечатнойФормы.ОфисныеДокументы);
Для Каждого ФайлОфисногоДокумента Из ФайлыОфисныхДокументов Цикл
ИмяФайла = УправлениеПечатью.ИмяФайлаОфисногоДокумента(ФайлОфисногоДокумента.Значение);
ОбъектПечати = ФайлОфисногоДокумента.Значение;
Если ОбъектыДляПрикрепления <> Неопределено И ОбъектыДляПрикрепления[ОбъектПечати] <> Истина Тогда
Продолжить;
КонецЕсли;
Если ПереводитьИменаФайловВТранслит Тогда
ИмяФайла = СтроковыеФункции.СтрокаЛатиницей(ИмяФайла);
КонецЕсли;
Если ЗаписьZipФайла <> Неопределено Тогда
ПолноеИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ИмяВременногоКаталога + ИмяФайла);
ДвоичныеДанные = ПолучитьИзВременногоХранилища(ФайлОфисногоДокумента.Ключ); // ДвоичныеДанные -
ДвоичныеДанные.Записать(ПолноеИмяФайла);
ЗаписьZipФайла.Добавить(ПолноеИмяФайла);
Иначе
ОписаниеФайла = ОписаниеФайла(ИмяФайла);
ОписаниеФайла.Вставить("АдресВоВременномХранилище", ФайлОфисногоДокумента.Ключ);
ОписаниеФайла.Вставить("ОбъектПечати", ОбъектПечати);
Результат.Добавить(ОписаниеФайла);
КонецЕсли;
КонецЦикла;
Продолжить;
ИначеЕсли НастройкаПечатнойФормы.Свойство("АдресВоВременномХранилище") Тогда
Если ОбъектыДляПрикрепления <> Неопределено И ОбъектыДляПрикрепления[НастройкаПечатнойФормы.ОбъектПечати] <> Истина Тогда
Продолжить;
КонецЕсли;
ИмяФайла = НастройкаПечатнойФормы.Представление;
Если ПереводитьИменаФайловВТранслит Тогда
ИмяФайла = СтроковыеФункции.СтрокаЛатиницей(ИмяФайла);
КонецЕсли;
Если ЗаписьZipФайла <> Неопределено Тогда
ПолноеИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ИмяВременногоКаталога + ИмяФайла);
ДвоичныеДанные = ПолучитьИзВременногоХранилища(НастройкаПечатнойФормы.АдресВоВременномХранилище); // ДвоичныеДанные -
ДвоичныеДанные.Записать(ПолноеИмяФайла);
ЗаписьZipФайла.Добавить(ПолноеИмяФайла);
Иначе
ОписаниеФайла = ОписаниеФайла(ИмяФайла);
ОписаниеФайла.Вставить("АдресВоВременномХранилище", НастройкаПечатнойФормы.АдресВоВременномХранилище);
ОписаниеФайла.Вставить("ОбъектПечати", НастройкаПечатнойФормы.ОбъектПечати);
Результат.Добавить(ОписаниеФайла);
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Если архив подготовлен, записываем и помещаем его во временное хранилище.
Если ЗаписьZipФайла <> Неопределено Тогда
ЗаписьZipФайла.Записать();
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяАрхива);
ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторХранилища);
ОписаниеФайла = ОписаниеФайла(ПолучитьИмяФайлаДляАрхива(ПереводитьИменаФайловВТранслит, НастройкиПечатныхФормВр));
ОписаниеФайла.Вставить("АдресВоВременномХранилище", ПутьВоВременномХранилище);
Если ПереданныеНастройки.Свойство("ОбъектПечати") Тогда
ОписаниеФайла.Вставить("ОбъектПечати", ПереданныеНастройки.ОбъектПечати);
Иначе
ОписаниеФайла.Вставить("ОбъектПечати", Неопределено);
КонецЕсли;
Результат.Добавить(ОписаниеФайла);
КонецЕсли;
УдалитьФайлы(ИмяВременногоКаталога);
Если ЗначениеЗаполнено(ИмяАрхива) Тогда
УдалитьФайлы(ИмяАрхива);
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Функция ПолучитьИмяФайлаДляАрхива(ПереводитьИменаФайловВТранслит, НастройкиПечатныхФормВр = Неопределено)
Если НастройкиПечатныхФормВр = Неопределено Тогда
НастройкиПечатныхФормВр = НастройкиПечатныхФорм;
КонецЕсли;
Результат = "";
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФормВр Цикл
Если Не ВыводДоступен() Тогда
Продолжить;
КонецЕсли;
Если ПустаяСтрока(Результат) Тогда
Результат = НастройкаПечатнойФормы.Название;
Иначе
Результат = НСтр("ru = 'Документы'");
Прервать;
КонецЕсли;
КонецЦикла;
Если ПереводитьИменаФайловВТранслит Тогда
Результат = СтроковыеФункции.СтрокаЛатиницей(Результат);
КонецЕсли;
Возврат Результат + ".zip";
КонецФункции
&НаСервереБезКонтекста
Функция НастройкиСохранения()
Возврат УправлениеПечатью.НастройкиСохранения();
КонецФункции
&НаСервере
Функция ВыводДоступен()
Возврат ПравоДоступа("Вывод", Метаданные);
КонецФункции
&НаКлиенте
Процедура СохранитьПечатныеФормыВКаталог(СписокФайловВоВременномХранилище, Знач ИмяКаталога = "")
Если РасширениеДляРаботыСФайламиПодключено И ЗначениеЗаполнено(ИмяКаталога) Тогда
ИмяКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяКаталога);
Иначе
ПриПодготовкеИменФайлов(СписокФайловВоВременномХранилище, "");
Возврат;
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения("ПриПодготовкеИменФайлов", ЭтотОбъект, ИмяКаталога);
ПараметрыПодготовки = УправлениеПечатьюКлиент.ПараметрыПодготовкиИменФайлов(СписокФайловВоВременномХранилище, ИмяКаталога, ОписаниеОповещения);
ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки);
КонецПроцедуры
// Параметры:
// ПараметрыПодготовки - см. УправлениеПечатьюКлиент.ПараметрыПодготовкиИменФайлов
//
&НаКлиенте
Процедура ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки)
УправлениеПечатьюКлиент.ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки);
КонецПроцедуры
&НаКлиенте
Процедура ПриПодготовкеИменФайлов(СписокФайловВоВременномХранилище, ИмяКаталога) Экспорт
СохраняемыеФайлы = Новый Массив;
Для Каждого ФайлДляЗаписи Из СписокФайловВоВременномХранилище Цикл
ИмяФайла = ФайлДляЗаписи.Представление;
СохраняемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла, ФайлДляЗаписи.АдресВоВременномХранилище));
КонецЦикла;
ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайлов();
ПараметрыСохранения.Диалог.Каталог = ИмяКаталога;
ПараметрыСохранения.Интерактивно = Не ЗначениеЗаполнено(ИмяКаталога);
ФайловаяСистемаКлиент.СохранитьФайлы(Неопределено, СохраняемыеФайлы, ПараметрыСохранения);
#Если Не ВебКлиент Тогда
Если ЗначениеЗаполнено(ИмяКаталога) Тогда
ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьПапкуСохранения", ЭтотОбъект, ИмяКаталога);
ПоказатьОповещениеПользователя(НСтр("ru = 'Сохранение успешно завершено'"), ОписаниеОповещения,
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'в папку %1'"), ИмяКаталога), БиблиотекаКартинок.Информация32);
КонецЕсли;
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьПапкуСохранения(ИмяКаталога) Экспорт
ФайловаяСистемаКлиент.ОткрытьПроводник(ИмяКаталога);
КонецПроцедуры
&НаСервере
Функция ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище)
Результат = Новый Массив;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами");
Для Каждого Файл Из ФайлыВоВременномХранилище Цикл
Если МодульРаботаСФайлами.КОбъектуМожноПрисоединятьФайлы(Файл["ОбъектПечати"]) Тогда
ПараметрыФайла = МодульРаботаСФайлами.ПараметрыДобавленияФайла();
ПараметрыФайла.ВладелецФайлов = Файл["ОбъектПечати"];
ПараметрыФайла.ИмяБезРасширения = Файл.Представление;
Результат.Добавить(МодульРаботаСФайлами.ДобавитьФайл(
ПараметрыФайла, Файл.АдресВоВременномХранилище, , НСтр("ru = 'Печатная форма'")));
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ПечатьПродолжение(Результат, МассивПечатныхФорм) Экспорт
Если Результат.Статус = "Ошибка" Тогда
ВызватьИсключение Результат.КраткоеПредставлениеОшибки;
Иначе
СтруктураЕдиногоДокумента = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
МассивПечатныхФорм = ПолучитьПечатныеФормы(СтруктураЕдиногоДокумента, МассивПечатныхФорм);
ПечатьЗавершение(МассивПечатныхФорм);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПечатьЗавершение(МассивПечатныхФорм)
Обработчик = Новый ОписаниеОповещения("ПродолжитьПечатьПослеУстановкиРасширенияРаботыСФайлами", ЭтотОбъект, МассивПечатныхФорм);
ТекстСообщения = НСтр("ru = 'Для продолжения установите расширение для работы с 1С:Предприятием.'");
ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботыСФайлами(Обработчик, ТекстСообщения);
КонецПроцедуры
&НаКлиенте
Процедура НачатьПолучениеПечатныхФорм(СтруктураЕдиногоДокумента, Оповещение)
ДлительнаяОперация = ДлительнаяОперацияПолученияПечатныхФорм(СтруктураЕдиногоДокумента);
ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Оповещение, ПараметрыОжидания());
КонецПроцедуры
&НаСервереБезКонтекста
Функция ОписаниеФайла(НаименованиеФайла = "")
ОписаниеФайла = Новый Структура;
ОписаниеФайла.Вставить("АдресВоВременномХранилище", "");
ОписаниеФайла.Вставить("Название", НаименованиеФайла);
ОписаниеФайла.Вставить("Печать", Истина);
ОписаниеФайла.Вставить("Представление", НаименованиеФайла);
ОписаниеФайла.Вставить("ОбъектПечати", Неопределено);
ОписаниеФайла.Вставить("ЭтоОфисныйДокумент", Истина);
Возврат ОписаниеФайла;
КонецФункции
#КонецОбласти