#Область ОписаниеПеременных
&НаКлиенте
Перем ИмяВременногоКаталогаКлиент;
#КонецОбласти
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Перем КоллекцияПечатныхФорм;
УстановитьУсловноеОформление();
Если Не ПравоДоступа("Изменение", Метаданные.РегистрыСведений.ПользовательскиеМакетыПечати) Тогда
Элементы.КнопкаПерейтиКУправлениюМакетами.Видимость = Ложь;
КонецЕсли;
Если Не ЗначениеЗаполнено(Параметры.ИсточникДанных) Тогда
ОбщегоНазначенияКлиентСервер.Проверить(ТипЗнч(Параметры.ПараметрКоманды) = Тип("Массив") Или ОбщегоНазначения.ЗначениеСсылочногоТипа(Параметры.ПараметрКоманды),
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр(
"ru = 'Недопустимое значение параметра %1 при вызове метода %2.
|Ожидалось: %3, %4.
|Передано: %5'"),
"ПараметрКоманды",
"УправлениеПечатьюКлиент.ВыполнитьКомандуПечати",
"Массив",
"ЛюбаяСсылка",
ТипЗнч(Параметры.ПараметрКоманды)));
КонецЕсли;
ПараметрыПечати = Параметры.ПараметрыПечати;
Если Параметры.ПараметрыПечати = Неопределено Тогда
ПараметрыПечати = Новый Структура;
КонецЕсли;
Если Не ПараметрыПечати.Свойство("ДополнительныеПараметры") Тогда
Параметры.ПараметрыПечати = Новый Структура("ДополнительныеПараметры", ПараметрыПечати);
Для Каждого ПараметрПечати Из ПараметрыПечати Цикл
Параметры.ПараметрыПечати.Вставить(ПараметрПечати.Ключ, ПараметрПечати.Значение);
КонецЦикла;
КонецЕсли;
ПараметрыВывода = Параметры.ПараметрыВывода;
Если ПараметрыВывода = Неопределено Тогда
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
КонецЕсли;
Если Параметры.КоллекцияПечатныхФорм = Неопределено Тогда
КоллекцияПечатныхФорм = СформироватьПечатныеФормы(Параметры.ИменаМакетов, Отказ);
Если Отказ Тогда
Возврат;
КонецЕсли;
Иначе
КоллекцияПечатныхФорм = Параметры.КоллекцияПечатныхФорм;
ОбъектыПечати = Параметры.ОбъектыПечати;
КонецЕсли;
ИсключитьОфисныеДокументыИзКомплектов(КоллекцияПечатныхФорм);
Если Параметры.Сообщения <> Неопределено Тогда
Для Каждого Сообщение Из Параметры.Сообщения Цикл
ОбщегоНазначения.СообщитьПользователю(Сообщение.Текст);
КонецЦикла;
КонецЕсли;
СоздатьРеквизитыИЭлементыФормыДляПечатныхФорм(КоллекцияПечатныхФорм);
СохранитьНастройкиКомплектаПоУмолчанию();
ЗагрузитьНастройкиКоличестваКопий();
ЕстьРазрешенныйВывод = ЕстьРазрешенныйВывод();
НастроитьВидимостьЭлементовФормы();
УстановитьПризнакДоступностиВыводаВПредставленияхПечатныхФорм(ЕстьРазрешенныйВывод);
Если Не ОбщегоНазначения.ЭтоМобильныйКлиент() И ЭтоПечатьКомплекта() Тогда
Элементы.Копий.Заголовок = НСтр("ru = 'Копий комплекта'");
КонецЕсли;
ДополнительнаяИнформация = Новый Структура("Картинка, Текст", Новый Картинка, "");
МассивСсылок = Параметры.ПараметрКоманды;
Если ОбщегоНазначения.ЗначениеСсылочногоТипа(МассивСсылок) Тогда
МассивСсылок = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(МассивСсылок);
КонецЕсли;
Элементы.ДополнительнаяИнформация.Заголовок = СтроковыеФункции.ФорматированнаяСтрока(ДополнительнаяИнформация.Текст);
Элементы.КартинкаИнформации.Картинка = ДополнительнаяИнформация.Картинка;
Элементы.ГруппаДополнительнаяИнформация.Видимость = Не ПустаяСтрока(Элементы.ДополнительнаяИнформация.Заголовок);
Элементы.КартинкаИнформации.Видимость = Элементы.КартинкаИнформации.Картинка.Вид <> ВидКартинки.Пустая;
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
Элементы.КоманднаяПанельЛеваяЧасть.Видимость = Ложь;
Элементы.КоманднаяПанельПраваяЧасть.Видимость = Ложь;
Элементы.НастройкиПечатныхФорм.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто;
Элементы.КнопкаОтправитьВсеДействия.КнопкаПоУмолчанию = Истина;
Элементы.Справка.ПоложениеВКоманднойПанели = ПоложениеКнопкиВКоманднойПанели.ВДополнительномПодменю;
Элементы.КнопкаИзменитьМакет.Видимость = Ложь;
Элементы.ФлажокПодписьИПечать.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Авто;
Элементы.НастройкаКоличестваКопий.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
Элементы.Переместить(Элементы.КомандыПоказателей, Элементы.КомандыПоказателей.Родитель, Элементы.Показатель);
Элементы.ГруппаКоманднаяПанель.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
Элементы.КнопкаСохранить.Заголовок = НСтр("ru = 'На устройство...'");
Элементы.КнопкаСохранитьВсеДействия.Заголовок = НСтр("ru = 'На устройство...'");
КонецЕсли;
СохранениеВПрисоединенныеФайлы = Ложь;
Если ОбъектыПечати.Количество() > 0 И ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами");
СохранениеВПрисоединенныеФайлы = МодульРаботаСФайлами.КОбъектуМожноПрисоединятьФайлы(ОбъектыПечати[0].Значение);
КонецЕсли;
Если УправлениеПечатью.НастройкиПечати().СкрыватьПодписиИПечатиДляРедактирования Тогда
АдресХранилищаРисунков = ПоместитьВоВременноеХранилище(ПодписиИПечатиТабличныхДокументов(), УникальныйИдентификатор);
КонецЕсли;
УбратьПодписьИПечать();
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда
МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность");
МодульУправлениеПечатьюМультиязычность.ЗаполнитьПодменюЯзык(ЭтотОбъект, , ДоступныеЯзыкиПечатныхФорм());
КонецЕсли;
УстановитьЗаголовокФормы();
УправлениеПечатью.ПечатьДокументовПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
КонецПроцедуры
&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)
ИнтеграцияПодсистемБСП.ПечатьДокументовПриЗагрузкеДанныхИзНастроекНаСервере(ЭтотОбъект, Настройки);
УправлениеПечатьюПереопределяемый.ПечатьДокументовПриЗагрузкеДанныхИзНастроекНаСервере(ЭтотОбъект, Настройки);
КонецПроцедуры
&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
ИнтеграцияПодсистемБСП.ПечатьДокументовПриСохраненииДанныхВНастройкахНаСервере(ЭтотОбъект, Настройки);
УправлениеПечатьюПереопределяемый.ПечатьДокументовПриСохраненииДанныхВНастройкахНаСервере(ЭтотОбъект, Настройки);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ИмяВременногоКаталогаКлиент = "";
Если ВладелецФормы = Неопределено Тогда
УникальныйИдентификаторХранилища = Новый УникальныйИдентификатор;
Иначе
УникальныйИдентификаторХранилища = ВладелецФормы.УникальныйИдентификатор;
КонецЕсли;
Если ЗначениеЗаполнено(НастройкиФорматаСохранения) Тогда
Отказ = Истина;
СохранитьПечатнуюФормуВФайл();
Возврат;
КонецЕсли;
ПодключитьОбработчикОжидания("ПослеОткрытия", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
Если ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.СохранениеПечатнойФормы") Тогда
Если ВыбранноеЗначение <> Неопределено И ВыбранноеЗначение <> КодВозвратаДиалога.Отмена Тогда
Если ВыбранноеЗначение.ВариантСохранения = "СохранитьВПапку" Тогда
Если ВыбранноеЗначение.Подписать Тогда
ПодписатьФайлыДляОтправкиСохранения(ВыбранноеЗначение, "СохранитьВПапку");
Иначе
ФайлыВоВременномХранилище = ПоместитьТабличныеДокументыВоВременноеХранилище(ВыбранноеЗначение);
ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, ВыбранноеЗначение);
СохранитьПечатныеФормыВКаталог(ФайлыВоВременномХранилище, ВыбранноеЗначение.ПапкаДляСохранения);
КонецЕсли;
Иначе
ФайлыВоВременномХранилище = ПоместитьТабличныеДокументыВоВременноеХранилище(ВыбранноеЗначение);
ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, ВыбранноеЗначение);
Если ВыбранноеЗначение.Подписать Тогда
ЗаписанныеОбъекты = ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище);
Контекст = Новый Структура("ЗаписанныеОбъекты, ВыбранноеЗначение", ЗаписанныеОбъекты, ВыбранноеЗначение);
ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеПодписанияФайлов", ЭтотОбъект, Контекст);
ПодписатьЗаписанныеОбъекты(ЗаписанныеОбъекты, ОписаниеОповещения);
Иначе
ЗаписанныеОбъекты = ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище);
Если ЗаписанныеОбъекты.Количество() > 0 Тогда
ОповеститьОбИзменении(ТипЗнч(ЗаписанныеОбъекты[0]));
КонецЕсли;
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
МодульРаботаСФайламиСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСФайламиСлужебныйКлиент");
МодульРаботаСФайламиСлужебныйКлиент.ОповеститьОбИзмененииФайлов(ЗаписанныеОбъекты);
КонецЕсли;
ПоказатьОповещениеПользователя(, , НСтр("ru = 'Печатная форма сохранена'"), БиблиотекаКартинок.ДиалогИнформация);
КонецЕсли;
КонецЕсли;
КонецЕсли;
ИначеЕсли ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.ВыборФорматаВложений")
Или ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.ПодготовкаНовогоПисьма") Тогда
Если ВыбранноеЗначение <> Неопределено И ВыбранноеЗначение <> КодВозвратаДиалога.Отмена Тогда
Если ВыбранноеЗначение.Подписать Тогда
ПодписатьФайлыДляОтправкиСохранения(ВыбранноеЗначение, "ОтправкаПисьма");
Иначе
ПараметрыОтправки = ПараметрыОтправкиПисьма(ВыбранноеЗначение);
ОтключитьВыборПолучателей = ВРег(ИсточникВыбора.ИмяФормы) = ВРег("ОбщаяФорма.ПодготовкаНовогоПисьма");
ПараметрыОтправки.Вставить("ОтключитьВыборПолучателей", ОтключитьВыборПолучателей);
МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент");
МодульРаботаСПочтовымиСообщениямиКлиент.СоздатьНовоеПисьмо(ПараметрыОтправки);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПодписатьЗаписанныеОбъекты(ЗаписанныеОбъекты, ОповещениеЗавершенияПодписания)
ДополнительныеПараметры = Новый Структура("ОбработкаРезультата", ОповещениеЗавершенияПодписания);
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
МодульРаботаСФайламиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСФайламиКлиент");
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент");
ПараметрыПодписи = МодульЭлектроннаяПодписьКлиент.НовыйТипПодписи();
ПараметрыПодписи.ВыборДоверенности = Истина;
Иначе
ПараметрыПодписи = Неопределено;
КонецЕсли;
МодульРаботаСФайламиКлиент.ПодписатьФайл(ЗаписанныеОбъекты, УникальныйИдентификатор, ДополнительныеПараметры,
ПараметрыПодписи);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПодписатьФайлыДляОтправкиСохранения(ВыбранноеЗначение, Действие)
ФайлыВоВременномХранилище = ПоместитьТабличныеДокументыВоВременноеХранилище(ВыбранноеЗначение);
Контекст = Новый Структура;
Контекст.Вставить("Действие", Действие);
Контекст.Вставить("ВыбранноеЗначение", ВыбранноеЗначение);
ПодписатьФайлы(ФайлыВоВременномХранилище, Контекст);
КонецПроцедуры
&НаКлиенте
Процедура ПодписатьФайлы(ФайлыВоВременномХранилище, Контекст)
Если Не ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.ЭлектроннаяПодпись") Тогда
Возврат;
КонецЕсли;
ОписаниеДанных = Новый Структура;
ОписаниеДанных.Вставить("ПоказатьКомментарий", Ложь);
Соответствие = Новый Соответствие;
Если ФайлыВоВременномХранилище.Количество() > 1 Тогда
ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файлов'"));
ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файлы'"));
НаборДанных = Новый Массив;
Для Каждого Файл Из ФайлыВоВременномХранилище Цикл
ОписаниеДанныхФайла = Новый Структура;
ОписаниеДанныхФайла.Вставить("Представление", Файл.Представление);
ОписаниеДанныхФайла.Вставить("Данные", Файл.АдресВоВременномХранилище);
НаборДанных.Добавить(ОписаниеДанныхФайла);
Соответствие.Вставить(Файл.АдресВоВременномХранилище, Файл.ОбъектПечати);
КонецЦикла;
ОписаниеДанных.Вставить("НаборДанных", НаборДанных);
ОписаниеДанных.Вставить("ПредставлениеНабора", "Файлы (%1)");
Иначе
Файл = ФайлыВоВременномХранилище[0];
ОписаниеДанных.Вставить("Операция", НСтр("ru = 'Подписание файла'"));
ОписаниеДанных.Вставить("ЗаголовокДанных", НСтр("ru = 'Файл'"));
ОписаниеДанных.Вставить("Представление", Файл.Представление);
ОписаниеДанных.Вставить("Данные", Файл.АдресВоВременномХранилище);
Соответствие.Вставить(Файл.АдресВоВременномХранилище, Файл.ОбъектПечати);
КонецЕсли;
МодульЭлектроннаяПодписьКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("ЭлектроннаяПодписьКлиент");
ПараметрыПодписи = МодульЭлектроннаяПодписьКлиент.НовыйТипПодписи();
ПараметрыПодписи.ВыборДоверенности = Истина;
Контекст.Вставить("СоответствиеФайловОбъектамПечати", Соответствие);
Если Контекст.Действие = "СохранитьВПапку" Тогда
ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеПодписанияСохранитьВПапку", ЭтотОбъект, Контекст);
ИначеЕсли Контекст.Действие = "ОтправкаПисьма" Тогда
ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеПодписанияОтправитьПоПочте", ЭтотОбъект, Контекст);
КонецЕсли;
МодульЭлектроннаяПодписьКлиент.Подписать(ОписаниеДанных,, ОписаниеОповещения, ПараметрыПодписи);
КонецПроцедуры
&НаСервере
Функция ПолучитьФайлыПодписейИПоместитьВАрхив(РезультатПодписания, ПереданныеНастройки, СоответствиеФайловОбъектамПечати)
МодульЭлектроннаяПодписьСлужебный = ОбщегоНазначения.ОбщийМодуль("ЭлектроннаяПодписьСлужебный");
ПараметрыПолученияФайлов = МодульЭлектроннаяПодписьСлужебный.ПараметрыПолученияФайлов();
ПараметрыПолученияФайлов.ПереводитьИменаФайловВТранслит = ПереданныеНастройки.ПереводитьИменаФайловВТранслит;
Файлы = МодульЭлектроннаяПодписьСлужебный.ПолучитьФайлыИзРезультатаПодписания(
РезультатПодписания, ПараметрыПолученияФайлов, УникальныйИдентификатор);
ФайлыВоВременномХранилище = Новый Массив;
Для Каждого Файл Из Файлы Цикл
СтруктураОписанияФайла = Новый Структура("АдресВоВременномХранилище, Представление, ОбъектПечати");
СтруктураОписанияФайла.АдресВоВременномХранилище = Файл.Данные;
СтруктураОписанияФайла.Представление = Файл.ИмяФайла;
СтруктураОписанияФайла.ОбъектПечати = СоответствиеФайловОбъектамПечати.Получить(Файл.Данные);
ФайлыВоВременномХранилище.Добавить(СтруктураОписанияФайла);
КонецЦикла;
ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, ПереданныеНастройки);
Возврат ФайлыВоВременномХранилище;
КонецФункции
&НаКлиенте
Процедура ЗавершениеПодписанияСохранитьВПапку(Результат, Контекст) Экспорт
Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("Успех") И Не Результат.Успех Тогда
Возврат;
КонецЕсли;
ФайлыВоВременномХранилище = ПолучитьФайлыПодписейИПоместитьВАрхив(
Результат, Контекст.ВыбранноеЗначение, Контекст.СоответствиеФайловОбъектамПечати);
СохранитьПечатныеФормыВКаталог(ФайлыВоВременномХранилище, Контекст.ВыбранноеЗначение.ПапкаДляСохранения);
ПоказатьОповещениеПользователя(, , НСтр("ru = 'Подписание и сохранение завершено'"), БиблиотекаКартинок.ДиалогИнформация);
КонецПроцедуры
&НаКлиенте
Процедура ЗавершениеПодписанияОтправитьПоПочте(Результат, Контекст) Экспорт
Если ТипЗнч(Результат) = Тип("Структура") И Результат.Свойство("Успех") И Не Результат.Успех Тогда
Возврат;
КонецЕсли;
ФайлыВоВременномХранилище = ПолучитьФайлыПодписейИПоместитьВАрхив(
Результат, Контекст.ВыбранноеЗначение, Контекст.СоответствиеФайловОбъектамПечати);
ПараметрыОтправки = ПараметрыОтправкиПисьма(Контекст.ВыбранноеЗначение, ФайлыВоВременномХранилище);
МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент");
МодульРаботаСПочтовымиСообщениямиКлиент.СоздатьНовоеПисьмо(ПараметрыОтправки);
КонецПроцедуры
&НаКлиенте
Процедура ЗавершениеПодписанияФайлов(Результат, Контекст) Экспорт
Если Результат = Ложь Тогда
Возврат;
КонецЕсли;
ЗаписанныеОбъекты = Контекст.ЗаписанныеОбъекты;
Если ЗаписанныеОбъекты.Количество() > 0 Тогда
ОповеститьОбИзменении(ТипЗнч(ЗаписанныеОбъекты[0]));
КонецЕсли;
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
МодульРаботаСФайламиСлужебныйКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСФайламиСлужебныйКлиент");
МодульРаботаСФайламиСлужебныйКлиент.ОповеститьОбИзмененииФайлов(ЗаписанныеОбъекты);
КонецЕсли;
ПоказатьОповещениеПользователя(, , НСтр("ru = 'Сохранение и подписание завершено'"), БиблиотекаКартинок.ДиалогИнформация);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
НастройкаПечатнойФормы = НастройкаТекущейПечатнойФормы();
Если (ИмяСобытия = "Запись_ПользовательскиеМакетыПечати"
И Источник.ВладелецФормы = ЭтотОбъект
И Параметр.ИмяОбъектаМетаданныхМакета = НастройкаПечатнойФормы.ПутьКМакету)
Или (ИмяСобытия = "Запись_ТабличныйДокумент"
И Источник.ВладелецФормы = ЭтотОбъект
И ЗначениеЗаполнено(Параметр.ИмяОбъектаМетаданныхМакета)
И СтрЗаканчиваетсяНа(НастройкаПечатнойФормы.ПутьКМакету, Параметр.ИмяОбъектаМетаданныхМакета)) Тогда
ПодключитьОбработчикОжидания("ОбновитьТекущуюПечатнуюФорму", 0.1, Истина);
ИначеЕсли (ИмяСобытия = "ОтказОтИзмененияМакета" Или ИмяСобытия = "ОтменаРедактированияТабличногоДокумента"
И Источник.ВладелецФормы = ЭтотОбъект
И ЗначениеЗаполнено(Параметр.ИмяОбъектаМетаданныхМакета)
И СтрЗаканчиваетсяНа(НастройкаПечатнойФормы.ПутьКМакету, Параметр.ИмяОбъектаМетаданныхМакета)) Тогда
ОтобразитьСостояниеТекущейПечатнойФормы();
КонецЕсли;
УправлениеПечатьюКлиентПереопределяемый.ПечатьДокументовОбработкаОповещения(ЭтотОбъект, ИмяСобытия, Параметр, Источник);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура КопийПриИзменении(Элемент)
Если НастройкиПечатныхФорм.Количество() = 1 Тогда
НастройкиПечатныхФорм[0].Количество = Копий;
НачатьСохранениеНастроек();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ДополнительнаяИнформацияОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
МассивСсылок = Параметры.ПараметрКоманды;
Если ТипЗнч(МассивСсылок) <> Тип("Массив") Тогда
МассивСсылок = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(МассивСсылок);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ТекущаяПечатнаяФормаПриАктивизации(Элемент)
ПодключитьОбработчикОжидания("РассчитатьПоказателиДинамически", 0.2, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ФлажокПодписьИПечатьПриИзменении(Элемент)
ДобавитьУдалитьПодписьПечать();
УстановитьТекущуюСтраницу();
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ОбработкаНавигационнойСсылки(Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка)
ИнтеграцияПодсистемБСПКлиент.ПечатьДокументовОбработкаНавигационнойСсылки(ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка);
УправлениеПечатьюКлиентПереопределяемый.ПечатьДокументовОбработкаНавигационнойСсылки(ЭтотОбъект, Элемент, НавигационнаяСсылкаФорматированнойСтроки, СтандартнаяОбработка);
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыНастройкиПечатныхФорм
&НаКлиенте
Процедура НастройкиПечатныхФормПриИзменении(Элемент)
МожноПечатать = Ложь;
МожноСохранять = Ложь;
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
ПечатнаяФорма = ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита];
ПолеТабличногоДокумента = Элементы[НастройкаПечатнойФормы.ИмяРеквизита];
МожноПечатать = МожноПечатать Или НастройкаПечатнойФормы.Печатать И ПечатнаяФорма.ВысотаТаблицы > 0
И ПолеТабличногоДокумента.Вывод = ИспользованиеВывода.Разрешить;
МожноСохранять = МожноСохранять Или НастройкаПечатнойФормы.Печатать И ПечатнаяФорма.ВысотаТаблицы > 0
И ПолеТабличногоДокумента.Вывод = ИспользованиеВывода.Разрешить И Не ПолеТабличногоДокумента.Защита;
КонецЦикла;
Элементы.КнопкаПечатьКоманднаяПанель.Доступность = МожноПечатать;
Элементы.КнопкаПечатьВсеДействия.Доступность = МожноПечатать;
Элементы.КнопкаСохранить.Доступность = МожноСохранять;
Элементы.КнопкаСохранитьВсеДействия.Доступность = МожноСохранять;
Элементы.КнопкаОтправить.Доступность = МожноСохранять;
Элементы.КнопкаОтправитьВсеДействия.Доступность = МожноСохранять;
НачатьСохранениеНастроек();
КонецПроцедуры
&НаКлиенте
Процедура НастройкиПечатныхФормПриАктивизацииСтроки(Элемент)
ОтключитьОбработчикОжидания("УстановитьТекущуюСтраницу");
ПодключитьОбработчикОжидания("УстановитьТекущуюСтраницу", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура НастройкиПечатныхФормКоличествоРегулирование(Элемент, Направление, СтандартнаяОбработка)
НастройкаПечатнойФормы = НастройкаТекущейПечатнойФормы();
НастройкаПечатнойФормы.Печатать = НастройкаПечатнойФормы.Количество + Направление > 0;
КонецПроцедуры
&НаКлиенте
Процедура НастройкиПечатныхФормПечататьПриИзменении(Элемент)
НастройкаПечатнойФормы = НастройкаТекущейПечатнойФормы();
Если НастройкаПечатнойФормы.Печатать И НастройкаПечатнойФормы.Количество = 0 Тогда
НастройкаПечатнойФормы.Количество = 1;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура НастройкиПечатныхФормПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
Отказ = Истина;
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура СохранитьНаКомпьютер(Команда)
Оповещение = Новый ОписаниеОповещения("СохранитьНаКомпьютерПриПодключенииРасширения", ЭтотОбъект);
ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботы1СПредприятия(Оповещение);
КонецПроцедуры
&НаКлиенте
Процедура Отправить(Команда)
ОтправитьПечатныеФормыПоПочте();
КонецПроцедуры
&НаКлиенте
Процедура ПерейтиКДокументу(Команда)
СписокВыбора = Новый СписокЗначений;
Для Каждого ОбъектПечати Из ОбъектыПечати Цикл
СписокВыбора.Добавить(ОбъектПечати.Представление, Строка(ОбъектПечати.Значение));
КонецЦикла;
ОписаниеОповещения = Новый ОписаниеОповещения("ПерейтиКДокументуЗавершение", ЭтотОбъект);
СписокВыбора.ПоказатьВыборЭлемента(ОписаниеОповещения, НСтр("ru = 'Перейти к печатной форме'"));
КонецПроцедуры
&НаКлиенте
Процедура ПерейтиКУправлениюМакетами(Команда)
НастройкаПечатнойФормы = НастройкаТекущейПечатнойФормы();
УправлениеПечатьюКлиент.ПерейтиКМакету(НастройкаПечатнойФормы.ПутьКМакету);
КонецПроцедуры
&НаКлиенте
Процедура Печать(Команда)
ТабличныеДокументы = ТабличныеДокументыДляПечати();
УправлениеПечатьюКлиент.РаспечататьТабличныеДокументы(ТабличныеДокументы, ОбъектыПечати,
ТабличныеДокументы.Количество() > 1, ?(НастройкиПечатныхФорм.Количество() > 1, Копий, 1));
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.УчетОригиналовПервичныхДокументов") Тогда
СписокПечати = Новый СписокЗначений;
Для Каждого ПечатнаяФорма Из НастройкиПечатныхФорм Цикл
СписокПечати.Добавить(ПечатнаяФорма.ИмяМакета, ПечатнаяФорма.Название);
КонецЦикла;
МодульУчетОригиналовПервичныхДокументовКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("УчетОригиналовПервичныхДокументовКлиент");
МодульУчетОригиналовПервичныхДокументовКлиент.ЗаписатьСостоянияОригиналовПослеПечати(ОбъектыПечати, СписокПечати);
КонецЕсли;
Оповестить("ТабличныеДокументыНапечатаны", ТабличныеДокументы, ОбъектыПечати);
КонецПроцедуры
&НаКлиенте
Процедура КнопкаПоказатьСкрытьНастройкуКомплекта(Команда)
УстановитьВидимостьНастройкиКоличестваКопий();
КонецПроцедуры
&НаКлиенте
Процедура УстановитьФлажки(Команда)
УстановитьСнятьФлажки(Истина);
КонецПроцедуры
&НаКлиенте
Процедура СнятьФлажки(Команда)
УстановитьСнятьФлажки(Ложь);
КонецПроцедуры
&НаКлиенте
Процедура СброситьНастройкиКомплекта(Команда)
ВосстановитьНастройкиПечатныхФорм();
НачатьСохранениеНастроек();
КонецПроцедуры
&НаКлиенте
Процедура ИзменитьМакет(Команда)
ОткрытьМакетДляРедактирования();
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьРедактирование(Команда)
ПереключитьРедактированиеТекущейПечатнойФормы();
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьСумму(Команда)
ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ТекущаяПечатнаяФорма", Команда.Имя);
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьКоличество(Команда)
ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ТекущаяПечатнаяФорма", Команда.Имя);
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьСреднее(Команда)
ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ТекущаяПечатнаяФорма", Команда.Имя);
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьМинимум(Команда)
ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ТекущаяПечатнаяФорма", Команда.Имя);
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьМаксимум(Команда)
ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ТекущаяПечатнаяФорма", Команда.Имя);
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьВсеПоказатели(Команда)
ОбщегоНазначенияСлужебныйКлиент.УстановитьВидимостьПанелиПоказателей(
Элементы, Не Элементы.РассчитатьВсеПоказатели.Пометка);
КонецПроцедуры
&НаКлиенте
Процедура СвернутьПоказатели(Команда)
ОбщегоНазначенияСлужебныйКлиент.УстановитьВидимостьПанелиПоказателей(Элементы);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ВыполнитьКоманду(Команда)
ПродолжитьВыполнениеНаСервере = Ложь;
ДополнительныеПараметры = Неопределено;
ИнтеграцияПодсистемБСПКлиент.ПечатьДокументовВыполнитьКоманду(
ЭтотОбъект, Команда, ПродолжитьВыполнениеНаСервере, ДополнительныеПараметры);
УправлениеПечатьюКлиентПереопределяемый.ПечатьДокументовВыполнитьКоманду(
ЭтотОбъект, Команда, ПродолжитьВыполнениеНаСервере, ДополнительныеПараметры);
Если ПродолжитьВыполнениеНаСервере Тогда
ПриВыполненииКомандыНаСервере(ДополнительныеПараметры);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПереключитьЯзык(Команда)
УправлениеПечатьюКлиент.ПереключитьЯзык(ЭтотОбъект, Команда);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПриПереключенииЯзыка(КодЯзыка, ДополнительныеПараметры) Экспорт
ОбновитьТекущуюПечатнуюФорму();
УстановитьЗаголовокФормы();
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаСервере
Процедура ИсключитьОфисныеДокументыИзКомплектов(КоллекцияПечатныхФорм)
ОфисныеДокументы = Новый Массив;
Для Счетчик = 1 По КоллекцияПечатныхФорм.Количество() Цикл
Индекс = КоллекцияПечатныхФорм.Количество() - Счетчик;
ПечатнаяФорма = КоллекцияПечатныхФорм[Индекс];
Если ПечатнаяФорма.ОфисныеДокументы <> Неопределено Тогда
ОфисныеДокументы.Добавить(Индекс);
КонецЕсли;
КонецЦикла;
Если КоллекцияПечатныхФорм.Количество() > ОфисныеДокументы.Количество() Тогда
Для Каждого Индекс Из ОфисныеДокументы Цикл
КоллекцияПечатныхФорм.Удалить(Индекс);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьУсловноеОформление()
УсловноеОформление.Элементы.Очистить();
Элемент = УсловноеОформление.Элементы.Добавить();
ПолеЭлемента = Элемент.Поля.Элементы.Добавить();
ПолеЭлемента.Поле = Новый ПолеКомпоновкиДанных(Элементы.НастройкиПечатныхФорм.Имя);
ОтборЭлемента = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборЭлемента.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("НастройкиПечатныхФорм.Печатать");
ОтборЭлемента.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборЭлемента.ПравоеЗначение = Ложь;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", ЦветаСтиля.ТекстЗапрещеннойЯчейкиЦвет);
КонецПроцедуры
&НаКлиенте
Процедура ПослеОткрытия()
Если Элементы.ФлажокПодписьИПечать.Видимость Тогда
ДобавитьУдалитьПодписьПечать();
КонецЕсли;
УстановитьТекущуюСтраницу();
ОбщегоНазначенияСлужебныйКлиент.УстановитьВидимостьПанелиПоказателей(Элементы, РазвернутьОбластьПоказателей);
ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ТекущаяПечатнаяФорма", ОсновнойПоказатель);
УстановитьИмяПринтераВПодсказкеКнопкиПечать();
ИнтеграцияПодсистемБСПКлиент.ПечатьДокументовПослеОткрытия(ЭтотОбъект);
УправлениеПечатьюКлиентПереопределяемый.ПечатьДокументовПослеОткрытия(ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОповеститьОГотовностиПечатныхФорм(СтруктураЕдиногоДокумента = Неопределено)
НастройкиСохранения = Новый Структура("ФорматыСохранения", ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(
НастройкиФорматаСохранения.ТипФайлаТабличногоДокумента));
ФайлыВоВременномХранилище = ПоместитьТабличныеДокументыВоВременноеХранилище(НастройкиСохранения);
ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, НастройкиСохранения);
ПараметрыОткрытия = Новый Структура("ОфисныеДокументы, АдресНастройкиПечатныхФорм, АдресСтруктурыЕдиногоДокумента");
ПараметрыОткрытия.ОфисныеДокументы = ФайлыВоВременномХранилище;
ПараметрыОткрытия.АдресНастройкиПечатныхФорм = ПолучитьАдресНастройкиПечатныхФорм();
ПараметрыОткрытия.АдресСтруктурыЕдиногоДокумента = ПоместитьВоВременноеХранилище(СтруктураЕдиногоДокумента, УникальныйИдентификаторХранилища);
ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьФормуПечатиOfficeOpen", ЭтотОбъект, ПараметрыОткрытия);
Если ФайлыВоВременномХранилище.Количество() = 1 Тогда
ЗаголовокОповещения = НСтр("ru = 'Документ сформирован'");
ТекстОповещения = ФайлыВоВременномХранилище[0].Представление;
ИначеЕсли ФайлыВоВременномХранилище.Количество() > 1 Тогда
ЗаголовокОповещения = НСтр("ru = 'Документы сформированы'");
ТекстОповещения = ФайлыВоВременномХранилище[0].Представление+"...";
Иначе
Возврат;
КонецЕсли;
ПоказатьОповещениеПользователя(ЗаголовокОповещения, ОписаниеОповещения, ТекстОповещения, , , );
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФормуПечатиOfficeOpen(ПараметрыОткрытия) Экспорт
ОткрытьФорму("ОбщаяФорма.ПечатьДокументовOfficeOpen", ПараметрыОткрытия);
КонецПроцедуры
&НаСервере
Функция СформироватьПечатныеФормы(ИменаМакетов, Отказ)
Результат = Неопределено;
Если ЗначениеЗаполнено(Параметры.ИсточникДанных) Тогда
Если ТипЗнч(ПараметрыВывода) = Тип("Структура") И ПараметрыВывода.Свойство("КодЯзыка") Тогда
ПараметрыВывода.КодЯзыка = ТекущийЯзык;
КонецЕсли;
УправлениеПечатью.ПечатьПоВнешнемуИсточнику(
Параметры.ИсточникДанных,
Параметры.ПараметрыИсточника,
Результат,
ОбъектыПечати,
ПараметрыВывода);
Иначе
ТипыОбъектовПечати = Новый Массив;
Параметры.ПараметрыПечати.Свойство("ТипыОбъектовПечати", ТипыОбъектовПечати);
ДополнительныеПараметры = Неопределено;
Параметры.ПараметрыПечати.Свойство("ДополнительныеПараметры", ДополнительныеПараметры);
ПечатныеФормы = УправлениеПечатью.СформироватьПечатныеФормы(Параметры.ИмяМенеджераПечати, ИменаМакетов,
Параметры.ПараметрКоманды, ДополнительныеПараметры, ТипыОбъектовПечати, ТекущийЯзык);
ОбъектыПечати = ПечатныеФормы.ОбъектыПечати;
ПараметрыВывода = ПечатныеФормы.ПараметрыВывода;
Результат = ПечатныеФормы.КоллекцияПечатныхФорм;
ОсновнаяПечатнаяФорма = Неопределено;
Параметры.ПараметрыПечати.Свойство("ОсновнаяПечатнаяФорма", ОсновнаяПечатнаяФорма);
Если ОсновнаяПечатнаяФорма <> Неопределено Тогда
УправлениеПечатью.ПриВыполненииКомандыПечати(Параметры.ПараметрКоманды, Параметры.ПараметрыПечати, Результат);
КонецЕсли;
КонецЕсли;
Если ТипЗнч(Параметры.ПараметрыПечати) = Тип("Структура") И Параметры.ПараметрыПечати.Свойство("ФорматСохранения")
И ЗначениеЗаполнено(Параметры.ПараметрыПечати.ФорматСохранения) Тогда
НайденныйФормат = УправлениеПечатью.НастройкиФорматовСохраненияТабличногоДокумента().Найти(ТипФайлаТабличногоДокумента[Параметры.ПараметрыПечати.ФорматСохранения], "ТипФайлаТабличногоДокумента");
Если НайденныйФормат <> Неопределено Тогда
НастройкиФорматаСохранения = Новый Структура("ТипФайлаТабличногоДокумента,Представление,Расширение,Фильтр");
ЗаполнитьЗначенияСвойств(НастройкиФорматаСохранения, НайденныйФормат);
НастройкиФорматаСохранения.Фильтр = НастройкиФорматаСохранения.Представление + "|*." + НастройкиФорматаСохранения.Расширение;
НастройкиФорматаСохранения.ТипФайлаТабличногоДокумента = Параметры.ПараметрыПечати.ФорматСохранения;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Процедура ЗагрузитьНастройкиКоличестваКопий(Знач ИспользуемыеПараметры = Неопределено)
СохраненныеНастройкиПечатныхФорм = Новый Массив;
Если ИспользуемыеПараметры = Неопределено Тогда
ИспользуемыеПараметры = Параметры;
КонецЕсли;
ИспользоватьСохраненныеНастройки = Истина;
Если ТипЗнч(ИспользуемыеПараметры.ПараметрыПечати) = Тип("Структура") И ИспользуемыеПараметры.ПараметрыПечати.Свойство("ПереопределитьПользовательскиеНастройкиКоличества") Тогда
ИспользоватьСохраненныеНастройки = Не ИспользуемыеПараметры.ПараметрыПечати.ПереопределитьПользовательскиеНастройкиКоличества;
КонецЕсли;
Если ИспользоватьСохраненныеНастройки Тогда
Если ЗначениеЗаполнено(ИспользуемыеПараметры.ИсточникДанных) Тогда
КлючНастроек = Строка(ИспользуемыеПараметры.ИсточникДанных.УникальныйИдентификатор()) + "-" + ИспользуемыеПараметры.ПараметрыИсточника.ИдентификаторКоманды;
Иначе
ИменаМакетов = ИспользуемыеПараметры.ИменаМакетов;
Если ТипЗнч(ИспользуемыеПараметры.ИменаМакетов) = Тип("Массив") Тогда
ИменаМакетов = СтрСоединить(ИспользуемыеПараметры.ИменаМакетов, ",");
КонецЕсли;
КлючНастроек = ИспользуемыеПараметры.ИмяМенеджераПечати + "-" + ИменаМакетов;
КонецЕсли;
СохраненныеНастройкиПечатныхФорм = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиПечатныхФорм", КлючНастроек, Новый Массив);
КонецЕсли;
ВосстановитьНастройкиПечатныхФорм(СохраненныеНастройкиПечатныхФорм);
Если ЭтоПечатьКомплекта() Тогда
Копий = 1;
Иначе
Если НастройкиПечатныхФорм.Количество() > 0 Тогда
Копий = НастройкиПечатныхФорм[0].Количество;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СоздатьРеквизитыИЭлементыФормыДляПечатныхФорм(КоллекцияПечатныхФорм)
НовыеРеквизитыФормы = Новый Массив;
Для НомерПечатнойФормы = 1 По КоллекцияПечатныхФорм.Количество() Цикл
ИмяРеквизита = "ПечатнаяФорма" + Формат(НомерПечатнойФормы,"ЧГ=0");
РеквизитФормы = Новый РеквизитФормы(ИмяРеквизита, Новый ОписаниеТипов("ТабличныйДокумент"),,КоллекцияПечатныхФорм[НомерПечатнойФормы - 1].СинонимМакета);
НовыеРеквизитыФормы.Добавить(РеквизитФормы);
КонецЦикла;
ИзменитьРеквизиты(НовыеРеквизитыФормы);
НомерПечатнойФормы = 0;
ПечатьОфисныхДокументов = Ложь;
ДобавленныеНастройкиПечатныхФорм = Новый Соответствие;
Для Каждого РеквизитФормы Из НовыеРеквизитыФормы Цикл
ОписаниеПечатнойФормы = КоллекцияПечатныхФорм[НомерПечатнойФормы];
НоваяНастройкаПечатнойФормы = НастройкиПечатныхФорм.Добавить();
НоваяНастройкаПечатнойФормы.Представление = ОписаниеПечатнойФормы.СинонимМакета;
НоваяНастройкаПечатнойФормы.Печатать = ОписаниеПечатнойФормы.Экземпляров > 0;
НоваяНастройкаПечатнойФормы.Количество = ОписаниеПечатнойФормы.Экземпляров;
НоваяНастройкаПечатнойФормы.ИмяМакета = ОписаниеПечатнойФормы.ИмяМакета;
НоваяНастройкаПечатнойФормы.ПозицияПоУмолчанию = НомерПечатнойФормы;
НоваяНастройкаПечатнойФормы.Название = ОписаниеПечатнойФормы.СинонимМакета;
НоваяНастройкаПечатнойФормы.ПутьКМакету = ОписаниеПечатнойФормы.ПолныйПутьКМакету;
НоваяНастройкаПечатнойФормы.ИмяФайлаПечатнойФормы = ОбщегоНазначения.ЗначениеВСтрокуXML(ОписаниеПечатнойФормы.ИмяФайлаПечатнойФормы);
НоваяНастройкаПечатнойФормы.ОфисныеДокументы = ?(ПустаяСтрока(ОписаниеПечатнойФормы.ОфисныеДокументы), "", ОбщегоНазначения.ЗначениеВСтрокуXML(ОписаниеПечатнойФормы.ОфисныеДокументы));
Если ОписаниеПечатнойФормы.ТабличныйДокумент.ВысотаТаблицы = 0 Тогда
НоваяНастройкаПечатнойФормы.ПодписьИПечать = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПечатьДокументовOfficeOpen",
"ПодписьИПечать", Ложь)
Иначе
НоваяНастройкаПечатнойФормы.ПодписьИПечать = ЕстьПодписьИПечать(ОписаниеПечатнойФормы.ТабличныйДокумент);
КонецЕсли;
НоваяНастройкаПечатнойФормы.ДоступенВыводНаДругихЯзыках = ОписаниеПечатнойФормы.ДоступенВыводНаДругихЯзыках;
Если ЗначениеЗаполнено(НоваяНастройкаПечатнойФормы.ПутьКМакету) Тогда
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.Мультиязычность.Печать") Тогда
МодульУправлениеПечатьюМультиязычность = ОбщегоНазначения.ОбщийМодуль("УправлениеПечатьюМультиязычность");
НоваяНастройкаПечатнойФормы.ДоступныеЯзыки = СтрСоединить(МодульУправлениеПечатьюМультиязычность.ЯзыкиМакета(НоваяНастройкаПечатнойФормы.ПутьКМакету), ",");
КонецЕсли;
КонецЕсли;
ПечатьОфисныхДокументов = ПечатьОфисныхДокументов ИЛИ НЕ ПустаяСтрока(НоваяНастройкаПечатнойФормы.ОфисныеДокументы);
РанееДобавленнаяНастройкаПечатнойФормы = ДобавленныеНастройкиПечатныхФорм[ОписаниеПечатнойФормы.ИмяМакета];
Если РанееДобавленнаяНастройкаПечатнойФормы = Неопределено Тогда
ИмяРеквизита = РеквизитФормы.Имя;
ЭтотОбъект[ИмяРеквизита] = ОписаниеПечатнойФормы.ТабличныйДокумент;
ИмяСтраницы = "Страница" + ИмяРеквизита;
Страница = Элементы.Добавить(ИмяСтраницы, Тип("ГруппаФормы"), Элементы.Страницы);
Страница.Вид = ВидГруппыФормы.Страница;
Страница.Картинка = БиблиотекаКартинок.ТабличныйДокументВставитьРазрывСтраницы;
Страница.Заголовок = ОписаниеПечатнойФормы.СинонимМакета;
Страница.Подсказка = ОписаниеПечатнойФормы.СинонимМакета;
Страница.Видимость = ЭтотОбъект[ИмяРеквизита].ВысотаТаблицы > 0;
НовыйЭлемент = Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), Страница);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеТабличногоДокумента;
НовыйЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
НовыйЭлемент.ПутьКДанным = ИмяРеквизита;
УстановитьПараметрыПоляТабличногоДокумента(НовыйЭлемент, ОписаниеПечатнойФормы.ТабличныйДокумент);
НоваяНастройкаПечатнойФормы.ИмяСтраницы = ИмяСтраницы;
НоваяНастройкаПечатнойФормы.ИмяРеквизита = ИмяРеквизита;
ДобавленныеНастройкиПечатныхФорм.Вставить(НоваяНастройкаПечатнойФормы.ИмяМакета, НоваяНастройкаПечатнойФормы);
Иначе
НоваяНастройкаПечатнойФормы.ИмяСтраницы = РанееДобавленнаяНастройкаПечатнойФормы.ИмяСтраницы;
НоваяНастройкаПечатнойФормы.ИмяРеквизита = РанееДобавленнаяНастройкаПечатнойФормы.ИмяРеквизита;
КонецЕсли;
НоваяНастройкаПечатнойФормы.ТекстОшибкиФормирования = ОписаниеПечатнойФормы.ТекстОшибкиФормирования;
НомерПечатнойФормы = НомерПечатнойФормы + 1;
КонецЦикла;
Если ПечатьОфисныхДокументов И НЕ ЗначениеЗаполнено(НастройкиФорматаСохранения) Тогда
НастройкиФорматаСохранения = Новый Структура("ТипФайлаТабличногоДокумента,Представление,Расширение,Фильтр")
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьПараметрыПоляТабличногоДокумента(ПолеТабличногоДокумента, ТабличныйДокумент)
ПолеТабличногоДокумента.Вывод = ВычислитьИспользованиеВывода(ТабличныйДокумент);
ПолеТабличногоДокумента.Редактирование = ПолеТабличногоДокумента.Вывод = ИспользованиеВывода.Разрешить И Не ТабличныйДокумент.ТолькоПросмотр;
ПолеТабличногоДокумента.Защита = ТабличныйДокумент.Защита Или Не Пользователи.РолиДоступны("РедактированиеПечатныхФорм");
КонецПроцедуры
&НаСервере
Процедура СохранитьНастройкиКомплектаПоУмолчанию()
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
ЗаполнитьЗначенияСвойств(НастройкиКомплектаПоУмолчанию.Добавить(), НастройкаПечатнойФормы);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура НастроитьВидимостьЭлементовФормы()
ЕстьРазрешенныйВывод = ЕстьРазрешенныйВывод();
ЕстьРазрешенноеРедактирование = ЕстьРазрешенноеРедактирование();
ДоступнаОтправкаПисем = Ложь;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда
МодульРаботаСПочтовымиСообщениями = ОбщегоНазначения.ОбщийМодуль("РаботаСПочтовымиСообщениями");
ДоступнаОтправкаПисем = МодульРаботаСПочтовымиСообщениями.ДоступнаОтправкаПисем();
КонецЕсли;
ВозможнаОтправкаПоПочте = ЕстьРазрешенныйВывод И ДоступнаОтправкаПисем;
ЕстьДанныеДляПечати = ЕстьДанныеДляПечати();
Элементы.КнопкаПерейтиКДокументу.Видимость = ОбъектыПечати.Количество() > 1;
Элементы.КнопкаСохранить.Видимость = ЕстьДанныеДляПечати И ЕстьРазрешенныйВывод И ЕстьРазрешенноеРедактирование;
Элементы.КнопкаСохранитьВсеДействия.Видимость = Элементы.КнопкаСохранить.Видимость;
Элементы.КнопкаОтправить.Видимость = ВозможнаОтправкаПоПочте И ЕстьДанныеДляПечати И ЕстьРазрешенноеРедактирование;
Элементы.КнопкаОтправитьВсеДействия.Видимость = Элементы.КнопкаОтправить.Видимость;
Элементы.КнопкаПечатьКоманднаяПанель.Видимость = ЕстьРазрешенныйВывод И ЕстьДанныеДляПечати;
Элементы.КнопкаПечатьВсеДействия.Видимость = Элементы.КнопкаПечатьКоманднаяПанель.Видимость;
Элементы.Копий.Видимость = ЕстьРазрешенныйВывод И ЕстьДанныеДляПечати;
Элементы.КнопкаРедактирование.Видимость = ЕстьРазрешенныйВывод И ЕстьДанныеДляПечати И ЕстьРазрешенноеРедактирование;
Элементы.КнопкаПереключитьРедактированиеВсеДействия.Видимость = Элементы.КнопкаРедактирование.Видимость;
Элементы.ГруппаПоказатель.Видимость = ЕстьДанныеДляПечати;
Если Элементы.Найти("КнопкаПредварительныйПросмотр") <> Неопределено Тогда
Элементы.КнопкаПредварительныйПросмотр.Видимость = ЕстьРазрешенныйВывод И ЕстьДанныеДляПечати;
КонецЕсли;
Если Элементы.Найти("КнопкаПредварительныйПросмотрВсеДействия") <> Неопределено Тогда
Элементы.КнопкаПредварительныйПросмотрВсеДействия.Видимость = ЕстьРазрешенныйВывод;
КонецЕсли;
Если Элементы.Найти("КнопкаПараметрыСтраницыВсеДействия") <> Неопределено Тогда
Элементы.КнопкаПараметрыСтраницыВсеДействия.Видимость = ЕстьРазрешенныйВывод;
КонецЕсли;
Если Не ЕстьДанныеДляПечати Тогда
Элементы.ТекущаяПечатнаяФорма.УстановитьДействие("ПриАктивизации", "");
КонецЕсли;
ЭтоПечатьКомплекта = ЭтоПечатьКомплекта();
ДоступнаНастройкаКомплекта = Истина;
Если ТипЗнч(Параметры.ПараметрыПечати) = Тип("Структура") И Параметры.ПараметрыПечати.Свойство("ФиксированныйКомплект") Тогда
ДоступнаНастройкаКомплекта = Не Параметры.ПараметрыПечати.ФиксированныйКомплект;
КонецЕсли;
ЭтоПечатьНастраиваемогоКомплекта = ЭтоПечатьКомплекта И ДоступнаНастройкаКомплекта;
Элементы.КнопкаПоказатьСкрытьНастройкуКомплекта.Видимость = ЭтоПечатьКомплекта;
Элементы.КнопкаПоказатьСкрытьНастройкуКомплектаВсеДействия.Видимость = ЭтоПечатьКомплекта;
Элементы.КнопкаСброситьНастройкиКомплекта.Видимость = ЭтоПечатьКомплекта;
Элементы.НастройкиПечатныхФорм.Видимость = ЭтоПечатьКомплекта;
Элементы.ГруппаНастройкаКомплектаКонтекстноеМеню.Видимость = ДоступнаНастройкаКомплекта;
Элементы.УправлениеФлажками.Видимость = ЭтоПечатьНастраиваемогоКомплекта;
Элементы.УправлениеСтроками.Видимость = ЭтоПечатьНастраиваемогоКомплекта;
Элементы.УправлениеФлажкамиВсеДействия.Видимость = ЭтоПечатьНастраиваемогоКомплекта;
Элементы.УправлениеСтрокамиВсеДействия.Видимость = ЭтоПечатьНастраиваемогоКомплекта;
Элементы.НастройкиПечатныхФормПечатать.Видимость = ДоступнаНастройкаКомплекта;
Элементы.НастройкиПечатныхФормКоличество.Видимость = ДоступнаНастройкаКомплекта;
Элементы.НастройкиПечатныхФорм.Шапка = ДоступнаНастройкаКомплекта;
Элементы.НастройкиПечатныхФорм.ГоризонтальныеЛинии = ДоступнаНастройкаКомплекта;
Если Не ДоступнаНастройкаКомплекта Тогда
ДобавитьКоличествоЭкземпляровВПредставленияхПечатныхФорм();
КонецЕсли;
ДоступноИзменениеМакетов = ПравоДоступа("Изменение", Метаданные.РегистрыСведений.ПользовательскиеМакетыПечати) И ЕстьРедактируемыеМакеты();
Элементы.КнопкаИзменитьМакет.Видимость = ДоступноИзменениеМакетов;
Элементы.ФлажокПодписьИПечать.Видимость = ЕстьПечатныеФормыСПодписьюИПечатью() И ЕстьПодписиИПечатиДляОбъектовПечати();
КонецПроцедуры
&НаСервере
Процедура ДобавитьКоличествоЭкземпляровВПредставленияхПечатныхФорм()
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
Если НастройкаПечатнойФормы.Количество <> 1 Тогда
НастройкаПечатнойФормы.Представление = НастройкаПечатнойФормы.Представление
+ " (" + НастройкаПечатнойФормы.Количество + " " + НСтр("ru = 'экз.'") + ")";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура УстановитьПризнакДоступностиВыводаВПредставленияхПечатныхФорм(ЕстьРазрешенныйВывод)
Если ЕстьРазрешенныйВывод Тогда
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
ПолеТабличногоДокумента = Элементы[НастройкаПечатнойФормы.ИмяРеквизита];
Если ПолеТабличногоДокумента.Вывод = ИспользованиеВывода.Запретить Тогда
НастройкаПечатнойФормы.Представление = НастройкаПечатнойФормы.Представление + " (" + НСтр("ru = 'вывод недоступен'") + ")";
ИначеЕсли ПолеТабличногоДокумента.Защита Тогда
НастройкаПечатнойФормы.Представление = НастройкаПечатнойФормы.Представление + " (" + НСтр("ru = 'только печать'") + ")";
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьВидимостьНастройкиКоличестваКопий(Знач Видимость = Неопределено)
Если Видимость = Неопределено Тогда
Видимость = Не Элементы.НастройкиПечатныхФорм.Видимость;
КонецЕсли;
Элементы.НастройкиПечатныхФорм.Видимость = Видимость;
Элементы.УправлениеФлажками.Видимость = Видимость И ДоступнаНастройкаКомплекта;
Элементы.УправлениеСтроками.Видимость = Видимость И ДоступнаНастройкаКомплекта;
Элементы.УправлениеФлажкамиВсеДействия.Видимость = Видимость И ДоступнаНастройкаКомплекта;
Элементы.УправлениеСтрокамиВсеДействия.Видимость = Видимость И ДоступнаНастройкаКомплекта;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьИмяПринтераВПодсказкеКнопкиПечать()
ИмяПринтера = ТекущаяПечатнаяФорма.ИмяПринтера;
Подсказка = Элементы.КнопкаПечатьКоманднаяПанель.РасширеннаяПодсказка;
Если Не ПустаяСтрока(ИмяПринтера) И Не СтрНайти(Подсказка.Заголовок, ИмяПринтера) Тогда
Элементы.КнопкаПечатьКоманднаяПанель.РасширеннаяПодсказка.Заголовок =
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Напечатать на принтере (%1)'"), ИмяПринтера);
КонецЕсли;
ПодключитьОбработчикОжидания("УстановитьИмяПринтераВПодсказкеКнопкиПечать", 3, Истина);
КонецПроцедуры
&НаСервере
Процедура УстановитьЗаголовокФормы()
Перем ЗаголовокФормы;
ПараметрыВывода.Свойство("ЗаголовокФормы", ЗаголовокФормы);
Если Не ЗначениеЗаполнено(ЗаголовокФормы) И ТипЗнч(Параметры.ПараметрыПечати) = Тип("Структура") Тогда
Параметры.ПараметрыПечати.Свойство("ЗаголовокФормы", ЗаголовокФормы);
КонецЕсли;
Если Не ЗначениеЗаполнено(ЗаголовокФормы) Тогда
Если ЭтоПечатьКомплекта() Тогда
ЗаголовокФормы = НСтр("ru = 'Печать комплекта'");
ИначеЕсли ОбъектыПечати.Количество() > 1 Тогда
ЗаголовокФормы = НСтр("ru = 'Печать документов'");
ИначеЕсли ОбъектыПечати.Количество() = 1 И ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ОбъектыПечати[0].Значение))
И ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОбъектыПечати[0].Значение, "Ссылка", Истина) <> Неопределено Тогда
ЗаголовокФормы = Строка(ОбъектыПечати[0].Значение);
Иначе
ЗаголовокФормы = НСтр("ru = 'Печать документа'");
КонецЕсли;
КонецЕсли;
Если ЗначениеЗаполнено(ТекущийЯзык) Тогда
ТекущийЯзыкПредставление = Элементы["Язык_"+ТекущийЯзык].Заголовок;
ЗаголовокФормы = ЗаголовокФормы + " ("+ТекущийЯзыкПредставление+")";
КонецЕсли;
Заголовок = ЗаголовокФормы;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьТекущуюСтраницу()
НастройкаПечатнойФормы = НастройкаТекущейПечатнойФормы();
ТекущаяСтраница = Элементы.СтраницаПечатнаяФормаНедоступна;
ПечатнаяФормаДоступна = НастройкаПечатнойФормы <> Неопределено И ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита].ВысотаТаблицы > 0;
Если ПечатнаяФормаДоступна Тогда
УстановитьТекущийТабличныйДокумент(НастройкаПечатнойФормы.ИмяРеквизита);
ЗаполнитьЗначенияСвойств(Элементы.ТекущаяПечатнаяФорма, Элементы[НастройкаПечатнойФормы.ИмяРеквизита],
"Вывод, Защита, Редактирование");
ТекущаяСтраница = Элементы.СтраницаТекущаяПечатнаяФорма;
КонецЕсли;
Элементы.Страницы.ТекущаяСтраница = ТекущаяСтраница;
ПереключитьПометкуКнопкиРедактирование();
УстановитьДоступностьИзмененияМакета();
УстановитьДоступностьКомандВывода();
Элементы.Язык.Доступность = НастройкаПечатнойФормы.ДоступенВыводНаДругихЯзыках;
ВозниклоИсключениеПриФормировании = Не ПечатнаяФормаДоступна И НастройкаПечатнойФормы <> Неопределено
И ЗначениеЗаполнено(НастройкаПечатнойФормы.ТекстОшибкиФормирования);
ИспользуетсяПользовательскийМакет = ЗначениеЗаполнено(НастройкаПечатнойФормы.ПутьКМакету)
И ИспользуетсяПользовательскийМакет(НастройкаПечатнойФормы.ПутьКМакету);
Если ВозниклоИсключениеПриФормировании И ИспользуетсяПользовательскийМакет Тогда
ТекстВопроса = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Не удалось сформировать печатную форму по причине:
|%1
|
|Подробности см. в журнале регистрации.
|
|Используется измененный макет, переключить на использование стандартного?'"),
НастройкаПечатнойФормы.ТекстОшибкиФормирования);
Кнопки = Новый СписокЗначений;
Кнопки.Добавить(КодВозвратаДиалога.Да, НСтр("ru = 'Использовать стандартный'"));
Кнопки.Добавить(КодВозвратаДиалога.Отмена);
ОписаниеОповещения = Новый ОписаниеОповещения("ПриПолученииОтвета", ЭтотОбъект, НастройкаПечатнойФормы);
ПоказатьВопрос(ОписаниеОповещения, ТекстВопроса, Кнопки, , КодВозвратаДиалога.Да);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПриПолученииОтвета(Ответ, НастройкаПечатнойФормы) Экспорт
Если Ответ = КодВозвратаДиалога.Да Тогда
ОтключитьПользовательскийМакет(НастройкаПечатнойФормы.ПутьКМакету);
ПодключитьОбработчикОжидания("ОбновитьТекущуюПечатнуюФорму", 0.1, Истина);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура УстановитьТекущийТабличныйДокумент(ИмяРеквизита)
ТекущаяПечатнаяФорма = ЭтотОбъект[ИмяРеквизита];
КонецПроцедуры
&НаКлиенте
Процедура УстановитьСнятьФлажки(Пометка)
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
НастройкаПечатнойФормы.Печатать = Пометка;
Если Пометка И НастройкаПечатнойФормы.Количество = 0 Тогда
НастройкаПечатнойФормы.Количество = 1;
КонецЕсли;
КонецЦикла;
НачатьСохранениеНастроек();
КонецПроцедуры
&НаСервере
Функция ВычислитьИспользованиеВывода(ТабличныйДокумент)
Если ТабличныйДокумент.Вывод = ИспользованиеВывода.Авто Тогда
Возврат ?(ПравоДоступа("Вывод", Метаданные), ИспользованиеВывода.Разрешить, ИспользованиеВывода.Запретить);
Иначе
Возврат ТабличныйДокумент.Вывод;
КонецЕсли;
КонецФункции
&НаСервереБезКонтекста
Процедура СохранитьНастройкиПечатныхФорм(КлючНастроек, СохраняемыеНастройкиПечатныхФорм)
ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("НастройкиПечатныхФорм", КлючНастроек, СохраняемыеНастройкиПечатныхФорм);
КонецПроцедуры
&НаСервере
Процедура ВосстановитьНастройкиПечатныхФорм(СохраненныеНастройкиПечатныхФорм = Неопределено)
Если СохраненныеНастройкиПечатныхФорм = Неопределено Тогда
СохраненныеНастройкиПечатныхФорм = НастройкиКомплектаПоУмолчанию;
КонецЕсли;
Если СохраненныеНастройкиПечатныхФорм = Неопределено Тогда
Возврат;
КонецЕсли;
Для Каждого СохраненнаяНастройка Из СохраненныеНастройкиПечатныхФорм Цикл
НайденныеНастройки = НастройкиПечатныхФорм.НайтиСтроки(Новый Структура("ПозицияПоУмолчанию", СохраненнаяНастройка.ПозицияПоУмолчанию));
Для Каждого НастройкаПечатнойФормы Из НайденныеНастройки Цикл
ИндексСтроки = НастройкиПечатныхФорм.Индекс(НастройкаПечатнойФормы);
НастройкиПечатныхФорм.Сдвинуть(ИндексСтроки, НастройкиПечатныхФорм.Количество()-1 - ИндексСтроки);
НастройкаПечатнойФормы.Количество = СохраненнаяНастройка.Количество;
НастройкаПечатнойФормы.Печатать = НастройкаПечатнойФормы.Количество > 0;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция ПоместитьФайлыВАрхив(ПечатныеФормыДокументов, ПереданныеНастройки)
Перем ЗаписьZipФайла, ИмяАрхива;
Результат = Новый Массив;
НастройкиСохранения = НастройкиСохранения();
ЗаполнитьЗначенияСвойств(НастройкиСохранения, ПереданныеНастройки);
Если Не НастройкиСохранения.УпаковатьВАрхив Тогда
Возврат ПечатныеФормыДокументов;
КонецЕсли;
ВариантСохранения = Неопределено;
ПереданныеНастройки.Свойство("ВариантСохранения", ВариантСохранения);
УстанавливатьОбъектПечати = ВариантСохранения = "Присоединить";
ПереводитьИменаФайловВТранслит = НастройкиСохранения.ПереводитьИменаФайловВТранслит;
ИмяВременногоКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла());
СоздатьКаталог(ИмяВременногоКаталога);
СоответствиеДляАрхивов = Новый Соответствие;
Для Каждого СтруктураФайла Из ПечатныеФормыДокументов Цикл
ДанныеФайла = ПолучитьИзВременногоХранилища(СтруктураФайла.АдресВоВременномХранилище);
ПолноеИмяФайла = ИмяВременногоКаталога + СтруктураФайла.Представление;
ПолноеИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ПолноеИмяФайла);
ДанныеФайла.Записать(ПолноеИмяФайла);
ОбъектПечати = ?(УстанавливатьОбъектПечати И ЗначениеЗаполнено(СтруктураФайла.ОбъектПечати), СтруктураФайла.ОбъектПечати, Неопределено);
Если СоответствиеДляАрхивов[ОбъектПечати] = Неопределено Тогда
ИмяАрхива = ПолучитьИмяВременногоФайла("zip");
ЗаписьZipФайла = Новый ЗаписьZipФайла(ИмяАрхива);
ПараметрыЗаписи = Новый Структура("ЗаписьZipФайла, ИмяАрхива", ЗаписьZipФайла, ИмяАрхива);
СоответствиеДляАрхивов.Вставить(ОбъектПечати, ПараметрыЗаписи);
КонецЕсли;
СоответствиеДляАрхивов[ОбъектПечати].ЗаписьZipФайла.Добавить(ПолноеИмяФайла);
КонецЦикла;
Для Каждого АрхивОбъекта Из СоответствиеДляАрхивов Цикл
ЗаписьZipФайла = АрхивОбъекта.Значение.ЗаписьZipФайла;
ИмяАрхива = АрхивОбъекта.Значение.ИмяАрхива;
ЗаписьZipФайла.Записать();
ДвоичныеДанные = Новый ДвоичныеДанные(ИмяАрхива);
ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторХранилища);
ОписаниеФайла = Новый Структура;
ОписаниеФайла.Вставить("Представление", ПолучитьИмяФайлаДляАрхива(ПереводитьИменаФайловВТранслит));
ОписаниеФайла.Вставить("ОбъектПечати", АрхивОбъекта.Ключ);
ОписаниеФайла.Вставить("АдресВоВременномХранилище", ПутьВоВременномХранилище);
Результат.Добавить(ОписаниеФайла);
УдалитьФайлы(ИмяАрхива);
КонецЦикла;
УдалитьФайлы(ИмяВременногоКаталога);
Возврат Результат;
КонецФункции
&НаСервере
Функция ПоместитьТабличныеДокументыВоВременноеХранилище(ПереданныеНастройки)
НастройкиСохранения = НастройкиСохранения();
ЗаполнитьЗначенияСвойств(НастройкиСохранения, ПереданныеНастройки);
Результат = Новый Массив;
ИмяВременногоКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ПолучитьИмяВременногоФайла());
СоздатьКаталог(ИмяВременногоКаталога);
ВыбранныеФорматыСохранения = НастройкиСохранения.ФорматыСохранения;
ПереводитьИменаФайловВТранслит = НастройкиСохранения.ПереводитьИменаФайловВТранслит;
ТаблицаФорматов = УправлениеПечатью.НастройкиФорматовСохраненияТабличногоДокумента();
ОбъектыДляПрикрепления = Неопределено;
Если ПереданныеНастройки.Свойство("ОбъектыДляПрикрепления") Тогда
ОбъектыДляПрикрепления = ОбщегоНазначения.СкопироватьРекурсивно(ПереданныеНастройки.ОбъектыДляПрикрепления);
КонецЕсли;
ОбработанныеПечатныеФормы = Новый Массив;
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
Если НЕ ПустаяСтрока(НастройкаПечатнойФормы.ОфисныеДокументы) Тогда
ФайлыОфисныхДокументов = ОбщегоНазначения.ЗначениеИзСтрокиXML(НастройкаПечатнойФормы.ОфисныеДокументы);
Для Каждого ФайлОфисногоДокумента Из ФайлыОфисныхДокументов Цикл
ИмяФайла = УправлениеПечатью.ИмяФайлаОфисногоДокумента(ФайлОфисногоДокумента.Значение);
ОписаниеФайла = Новый Структура;
ОписаниеФайла.Вставить("Представление", ИмяФайла);
ОписаниеФайла.Вставить("ОбъектПечати", ?(ТипЗнч(ФайлОфисногоДокумента.Значение) = Тип("Строка"), Неопределено, ФайлОфисногоДокумента.Значение));
Если ОбъектыДляПрикрепления <> Неопределено И ОбъектыДляПрикрепления[ОписаниеФайла.ОбъектПечати] <> Истина Тогда
Продолжить;
КонецЕсли;
ОписаниеФайла.Вставить("АдресВоВременномХранилище", ФайлОфисногоДокумента.Ключ);
ОписаниеФайла.Вставить("ЭтоОфисныйДокумент", Истина);
Результат.Добавить(ОписаниеФайла);
КонецЦикла;
Продолжить;
КонецЕсли;
Если Не НастройкаПечатнойФормы.Печатать Тогда
Продолжить;
КонецЕсли;
ПечатнаяФорма = ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита];
Если ОбработанныеПечатныеФормы.Найти(ПечатнаяФорма) = Неопределено Тогда
ОбработанныеПечатныеФормы.Добавить(ПечатнаяФорма);
Иначе
Продолжить;
КонецЕсли;
Если ВычислитьИспользованиеВывода(ПечатнаяФорма) = ИспользованиеВывода.Запретить Тогда
Продолжить;
КонецЕсли;
Если ПечатнаяФорма.Защита Тогда
Продолжить;
КонецЕсли;
Если ПечатнаяФорма.ВысотаТаблицы = 0 Тогда
Продолжить;
КонецЕсли;
ПечатныеФормыПоОбъектам = УправлениеПечатью.ПечатныеФормыПоОбъектам(ПечатнаяФорма, ОбъектыПечати);
Для Каждого СоответствиеОбъектаПечатнойФорме Из ПечатныеФормыПоОбъектам Цикл
ОбъектПечати = СоответствиеОбъектаПечатнойФорме.Ключ;
ПечатнаяФорма = СоответствиеОбъектаПечатнойФорме.Значение;
Если ОбъектыДляПрикрепления <> Неопределено И ОбъектыДляПрикрепления[ОбъектПечати] <> Истина Тогда
Продолжить;
КонецЕсли;
Для Каждого ВыбранныйФормат Из ВыбранныеФорматыСохранения Цикл
ТипФайла = ТипФайлаТабличногоДокумента[ВыбранныйФормат];
НастройкиФормата = ТаблицаФорматов.НайтиСтроки(Новый Структура("ТипФайлаТабличногоДокумента", ТипФайла))[0];
ЗаданныеИменаПечатныхФорм = ОбщегоНазначения.ЗначениеИзСтрокиXML(НастройкаПечатнойФормы.ИмяФайлаПечатнойФормы);
ИмяФайла = УправлениеПечатью.ИмяФайлаПечатнойФормыОбъекта(ОбъектПечати, ЗаданныеИменаПечатныхФорм, НастройкаПечатнойФормы.Название);
ИмяФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайла);
Если ПереводитьИменаФайловВТранслит Тогда
ИмяФайла = СтроковыеФункции.СтрокаЛатиницей(ИмяФайла);
КонецЕсли;
РасширениеФайла = НастройкиФормата.Расширение;
РазмерРасширенияВБайтах = РазмерСтрокиВБайтах(РасширениеФайла);
Если ОбщегоНазначения.ЭтоLinuxСервер() Тогда
ИмяФайла = СократитьРазмерСтрокиВБайтах(ИмяФайла, 255 - РазмерРасширенияВБайтах - 1);
КонецЕсли;
ИмяФайлаСРасширением = ИмяФайла + "." + РасширениеФайла;
ПолноеИмяФайла = ИмяВременногоКаталога + ИмяФайлаСРасширением;
МаксимальнаяДлина = 218;
Если ТипФайла = ТипФайлаТабличногоДокумента.XLS И СтрДлина(ПолноеИмяФайла) > МаксимальнаяДлина Тогда
МаксимальнаяДлина = МаксимальнаяДлина - 5;
Если СтрДлина(ИмяВременногоКаталога) < МаксимальнаяДлина Тогда
ИмяФайла = Лев(ИмяФайла, МаксимальнаяДлина - СтрДлина(ИмяВременногоКаталога) - СтрДлина(РасширениеФайла) - 1);
ИмяФайлаСРасширением = ИмяФайла + "." + РасширениеФайла;
ПолноеИмяФайла = ИмяВременногоКаталога + ИмяФайлаСРасширением;
КонецЕсли;
КонецЕсли;
ПолноеИмяФайла = ФайловаяСистема.УникальноеИмяФайла(ПолноеИмяФайла);
ПечатнаяФорма.Записать(ПолноеИмяФайла, ТипФайла);
Если ТипФайла = ТипФайлаТабличногоДокумента.HTML Тогда
УправлениеПечатью.ВставитьКартинкиВHTML(ПолноеИмяФайла);
КонецЕсли;
ДвоичныеДанные = Новый ДвоичныеДанные(ПолноеИмяФайла);
ПутьВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификаторХранилища);
ОписаниеФайла = Новый Структура;
ОписаниеФайла.Вставить("Представление", ИмяФайлаСРасширением);
ОписаниеФайла.Вставить("АдресВоВременномХранилище", ПутьВоВременномХранилище);
ОписаниеФайла.Вставить("ОбъектПечати", ОбъектПечати);
Если ТипФайла = ТипФайлаТабличногоДокумента.ANSITXT Тогда
ОписаниеФайла.Вставить("Кодировка", "windows-1251");
КонецЕсли;
Результат.Добавить(ОписаниеФайла);
КонецЦикла;
КонецЦикла;
КонецЦикла;
УдалитьФайлы(ИмяВременногоКаталога);
Возврат Результат;
КонецФункции
&НаСервере
Функция ПолучитьИмяФайлаДляАрхива(ПереводитьИменаФайловВТранслит)
Результат = "";
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
Если Не НастройкаПечатнойФормы.Печатать Тогда
Продолжить;
КонецЕсли;
ПечатнаяФорма = ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита];
Если ВычислитьИспользованиеВывода(ПечатнаяФорма) = ИспользованиеВывода.Запретить Тогда
Продолжить;
КонецЕсли;
Если ПустаяСтрока(Результат) Тогда
Результат = НастройкаПечатнойФормы.Название;
Иначе
Результат = НСтр("ru = 'Документы'");
Прервать;
КонецЕсли;
КонецЦикла;
Если ПереводитьИменаФайловВТранслит Тогда
Результат = СтроковыеФункции.СтрокаЛатиницей(Результат);
КонецЕсли;
Возврат Результат + ".zip";
КонецФункции
&НаКлиенте
Процедура СохранитьПечатнуюФормуВФайл()
НастройкиСохранения = Новый Структура("ФорматыСохранения", ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(
НастройкиФорматаСохранения.ТипФайлаТабличногоДокумента));
ФайлыВоВременномХранилище = ПоместитьТабличныеДокументыВоВременноеХранилище(НастройкиСохранения);
ФайлыВоВременномХранилище = ПоместитьФайлыВАрхив(ФайлыВоВременномХранилище, НастройкиСохранения);
ДоступенДиалогПечатиОфисныхДокументов = ФайлыВоВременномХранилище.Количество() И ФайлыВоВременномХранилище[0].ОбъектПечати <> Неопределено;
ВыполняетсяСохранениеТабличныхДокументов = НастройкиФорматаСохранения.ТипФайлаТабличногоДокумента <> Неопределено;
Если ДоступенДиалогПечатиОфисныхДокументов И ИспользоватьДиалогПечатиОфисныхДокументов() И Не ВыполняетсяСохранениеТабличныхДокументов Тогда
ПараметрыОткрытия = Новый Структура("ОфисныеДокументы, АдресНастройкиПечатныхФорм,ПараметрыВывода");
ПараметрыОткрытия.АдресНастройкиПечатныхФорм = ПолучитьАдресНастройкиПечатныхФорм();
ПараметрыОткрытия.ПараметрыВывода = ПараметрыВывода;
ОткрытьФорму("ОбщаяФорма.ПечатьДокументовOfficeOpen", ПараметрыОткрытия, ВладелецФормы, Строка(Новый УникальныйИдентификатор));
ИначеЕсли ДоступенДиалогПечатиОфисныхДокументов И ПечатьОфисныхДокументовОднимФайлом() И Не ВыполняетсяСохранениеТабличныхДокументов Тогда
ДлительнаяОперация = НачатьФормированиеЕдиногоДокумента();
Оповещение = Новый ОписаниеОповещения("ОткрытьЕдиныйДокумент", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(ДлительнаяОперация, Оповещение, ПараметрыОжидания());
Иначе
Контекст = Новый Структура;
Контекст.Вставить("ФайлыВоВременномХранилище", ФайлыВоВременномХранилище);
Контекст.Вставить("ДоступенДиалогПечатиОфисныхДокументов", ДоступенДиалогПечатиОфисныхДокументов);
Оповещение = Новый ОписаниеОповещения("ОткрытьОфисныеДокументыПослеПодключенияРасширения", ЭтотОбъект, Контекст);
ТекстСообщения = НСтр("ru = 'Для печати документа необходимо установить расширение для работы с 1С:Предприятием.'");
ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботы1СПредприятия(Оповещение, ТекстСообщения);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция НачатьФормированиеЕдиногоДокумента()
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.ОжидатьЗавершение = 1;
ПараметрыФормирования = Новый Структура("ПереформироватьЕдиныйДокумент", Истина);
СтруктураЕдиногоДокумента = Новый Структура();
СтруктураЕдиногоДокумента.Вставить("АдресПечатнойФормы", ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификаторХранилища));
СтруктураЕдиногоДокумента.Вставить("ИмяФайлаПечатнойФормы");
СтруктураЕдиногоДокумента.Вставить("Представление");
СтруктураЕдиногоДокумента.Вставить("СоставЕдиногоДокумента", Новый Соответствие());
ОфисныеДокументы = Новый Соответствие;
ТаблицаПечатныхФорм = Новый ТаблицаЗначений;
ТаблицаПечатныхФорм.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
ТаблицаПечатныхФорм.Колонки.Добавить("ФормироватьЗаново", Новый ОписаниеТипов("Булево"));
ТаблицаПечатныхФорм.Колонки.Добавить("ПодписьИПечать", Новый ОписаниеТипов("Булево"));
ТаблицаПечатныхФорм.Колонки.Добавить("ТекущийЯзык", Новый ОписаниеТипов("Строка"));
ТаблицаПечатныхФорм.Колонки.Добавить("Пометка", Новый ОписаниеТипов("Булево"));
ТаблицаПечатныхФорм.Колонки.Добавить("АдресПечатнойФормы", Новый ОписаниеТипов("Строка"));
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
ФайлыОфисныхДокументов = ОбщегоНазначения.ЗначениеИзСтрокиXML(НастройкаПечатнойФормы.ОфисныеДокументы);
Для Каждого ФайлОфисногоДокумента Из ФайлыОфисныхДокументов Цикл
ОфисныеДокументы.Вставить(ФайлОфисногоДокумента.Ключ, ПолучитьИзВременногоХранилища(ФайлОфисногоДокумента.Ключ));
НоваяСтрока = ТаблицаПечатныхФорм.Добавить();
НоваяСтрока.АдресПечатнойФормы = ФайлОфисногоДокумента.Ключ;
НоваяСтрока.Представление = НастройкаПечатнойФормы.Представление;
КонецЦикла;
КонецЦикла;
ТаблицаПечатныхФорм.ЗаполнитьЗначения(ПодписьИПечать, "ПодписьИПечать");
ТаблицаПечатныхФорм.ЗаполнитьЗначения(ОбщегоНазначения.КодОсновногоЯзыка(), "ТекущийЯзык");
ТаблицаПечатныхФорм.ЗаполнитьЗначения(Истина, "Пометка");
Возврат ДлительныеОперации.ВыполнитьФункцию(ПараметрыВыполнения, "УправлениеПечатьюСлужебный.СформироватьПечатныеФормы",
ТаблицаПечатныхФорм, ПараметрыФормирования, ОфисныеДокументы, СтруктураЕдиногоДокумента);
КонецФункции
&НаКлиенте
Процедура ОткрытьЕдиныйДокумент(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Если Результат.Статус <> "Выполнено" Тогда
СтандартныеПодсистемыКлиент.ВывестиИнформациюОбОшибке(
Результат.ИнформацияОбОшибке);
Возврат;
КонецЕсли;
СтруктураЕдиногоДокумента = ПолучитьИзВременногоХранилища(Результат.АдресРезультата);
ОписаниеОповещенияЗавершения = Новый ОписаниеОповещения("ОткрытьЕдиныйДокументЗавершение", ЭтотОбъект, СтруктураЕдиногоДокумента);
СтруктураФайлаВоВременномХранилище = Новый Структура("АдресВоВременномХранилище,Представление");
СтруктураФайлаВоВременномХранилище.АдресВоВременномХранилище = СтруктураЕдиногоДокумента.АдресПечатнойФормы;
СтруктураФайлаВоВременномХранилище.Представление = СтруктураЕдиногоДокумента.ИмяФайлаПечатнойФормы;
ФайлыВоВременномХранилище = Новый Массив();
ФайлыВоВременномХранилище.Добавить(СтруктураФайлаВоВременномХранилище);
Контекст = Новый Структура;
Контекст.Вставить("ФайлыВоВременномХранилище", ФайлыВоВременномХранилище);
Контекст.Вставить("ДоступенДиалогПечатиОфисныхДокументов", Истина);
Контекст.Вставить("ОбработчикЗавершения", ОписаниеОповещенияЗавершения);
Оповещение = Новый ОписаниеОповещения("ОткрытьОфисныеДокументыПослеПодключенияРасширения", ЭтотОбъект, Контекст);
ТекстСообщения = НСтр("ru = 'Для печати документа необходимо установить расширение для работы с 1С:Предприятием.'");
ФайловаяСистемаКлиент.ПодключитьРасширениеДляРаботы1СПредприятия(Оповещение, ТекстСообщения);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьЕдиныйДокументЗавершение(Результат, СтруктураЕдиногоДокумента) Экспорт
ОповеститьОГотовностиПечатныхФорм(СтруктураЕдиногоДокумента);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьОфисныеДокументыПослеПодключенияРасширения(РасширениеПодключено, Контекст) Экспорт
Если РасширениеПодключено Тогда
Оповещение = Новый ОписаниеОповещения("ОткрытьОфисныеДокументыПослеПолученияВременногоКаталога", ЭтотОбъект, Контекст);
Если ИмяВременногоКаталогаКлиент = "" Тогда
ФайловаяСистемаКлиент.СоздатьВременныйКаталог(Оповещение);
Иначе
ВыполнитьОбработкуОповещения(Оповещение, ИмяВременногоКаталогаКлиент);
КонецЕсли;
Иначе
ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайлов();
ПараметрыСохранения.Диалог.Заголовок = НСтр("ru ='Выбор папки для сохранения печатной формы'");
МассивПередаваемыхФайлов = Новый Массив;
Для Каждого ФайлДляЗаписи Из Контекст.ФайлыВоВременномХранилище Цикл
МассивПередаваемыхФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ФайлДляЗаписи.Представление, ФайлДляЗаписи.АдресВоВременномХранилище));
КонецЦикла;
Если МассивПередаваемыхФайлов.Количество() > 1 Тогда
ПараметрыСохранения.Диалог.Заголовок = НСтр("ru ='Выбор папки для сохранения печатных форм'");
КонецЕсли;
ФайловаяСистемаКлиент.СохранитьФайлы(Новый ОписаниеОповещения, МассивПередаваемыхФайлов, ПараметрыСохранения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьОфисныеДокументыПослеПолученияВременногоКаталога(ПолученныйВременныйКаталог, Контекст) Экспорт
ИмяВременногоКаталогаКлиент = ПолученныйВременныйКаталог;
ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьОфисныеДокументыПослеПолученияРазрешения", ЭтотОбъект, Контекст);
Вызовы = Новый Массив();
МассивПередаваемыхФайлов = Новый Массив;
Для Каждого ФайлДляЗаписи Из Контекст.ФайлыВоВременномХранилище Цикл
Вызов = Новый Массив;
Вызов.Добавить("ЗапуститьПриложение");
Вызов.Добавить(ПолученныйВременныйКаталог+ПолучитьРазделительПути()+ФайлДляЗаписи.Представление);
Вызов.Добавить();
Вызов.Добавить(Ложь);
Вызовы.Добавить(Вызов);
МассивПередаваемыхФайлов.Добавить(Новый ОписаниеПередаваемогоФайла(ПолученныйВременныйКаталог+ПолучитьРазделительПути()+ФайлДляЗаписи.Представление, ФайлДляЗаписи.АдресВоВременномХранилище));
КонецЦикла;
Вызов = Новый Массив;
Вызов.Добавить("НачатьПолучениеФайлов");
Вызов.Добавить(МассивПередаваемыхФайлов);
Вызов.Добавить(ПолученныйВременныйКаталог);
Вызов.Добавить(Ложь);
Вызовы.Добавить(Вызов);
Контекст.Вставить("МассивПередаваемыхФайлов", МассивПередаваемыхФайлов);
НачатьЗапросРазрешенияПользователя(ОписаниеОповещения, Вызовы);
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьОфисныеДокументыПослеПолученияРазрешения(РазрешенияПолучены, Контекст) Экспорт
Если РазрешенияПолучены Тогда
Оповещение = Новый ОписаниеОповещения("ОткрытьПослеПослеЗаписиФайла", ЭтотОбъект, Контекст);
ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайла();
ПараметрыСохранения.Интерактивно = Ложь;
ПараметрыСохранения.Диалог.Каталог = ИмяВременногоКаталогаКлиент;
ФайловаяСистемаКлиент.СохранитьФайлы(Оповещение, Контекст.МассивПередаваемыхФайлов, ПараметрыСохранения);
Иначе
ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайлов();
ПараметрыСохранения.Диалог.Заголовок = НСтр("ru ='Выбор папки для сохранения печатной формы'");
ПараметрыСохранения.Диалог.Каталог = ИмяВременногоКаталогаКлиент;
Если Контекст.МассивПередаваемыхФайлов.Количество() > 1 Тогда
ПараметрыСохранения.Диалог.Заголовок = НСтр("ru ='Выбор папки для сохранения печатных форм'");
КонецЕсли;
ФайловаяСистемаКлиент.СохранитьФайлы(Новый ОписаниеОповещения, Контекст.МассивПередаваемыхФайлов, ПараметрыСохранения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьПослеПослеЗаписиФайла(ПолученныеФайлы, Контекст) Экспорт
Для Каждого ПолученныйФайл Из ПолученныеФайлы Цикл
ПараметрыЗавершения = Новый Структура;
ПараметрыЗавершения.Вставить("ПутьКФайлу", ПолученныйФайл.ПолноеИмя);
ПараметрыЗавершения.Вставить("ИмяФайла", ПолученныйФайл.Имя);
ОбработчикЗавершения = Неопределено;
Контекст.Свойство("ОбработчикЗавершения", ОбработчикЗавершения);
ПараметрыЗавершения.Вставить("ОбработчикЗавершения", ОбработчикЗавершения);
ФайлНаДиске = Новый Файл(ПараметрыЗавершения.ПутьКФайлу);
ОписаниеПослеУстановкиТолькоЧтения = Новый ОписаниеОповещения("ОткрытьФайлЗавершение", ЭтотОбъект, ПараметрыЗавершения);
ФайлНаДиске.НачатьУстановкуТолькоЧтения(ОписаниеПослеУстановкиТолькоЧтения, Не ДоступноРедактированиеПечатнойФормы());
КонецЦикла;
Если Контекст.ДоступенДиалогПечатиОфисныхДокументов Тогда
ОповеститьОГотовностиПечатныхФорм();
КонецЕсли;
Если ПолученныеФайлы = Неопределено И ОбработчикЗавершения <> Неопределено Тогда
ВыполнитьОбработкуОповещения(ОбработчикЗавершения);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьФайлЗавершение(ПараметрыЗавершения) Экспорт
ОбработчикЗавершения = ПараметрыЗавершения.ОбработчикЗавершения;
ПутьКФайлу = ПараметрыЗавершения.ПутьКФайлу;
ИмяФайла = ПараметрыЗавершения.ИмяФайла;
ПараметрыОткрытияФайла = ФайловаяСистемаКлиент.ПараметрыОткрытияФайла();
ФайловаяСистемаКлиент.ОткрытьФайл(ПутьКФайлу, ОбработчикЗавершения, ИмяФайла, ПараметрыОткрытияФайла);
КонецПроцедуры
&НаСервере
Функция ДоступноРедактированиеПечатнойФормы()
Возврат Пользователи.РолиДоступны("РедактированиеПечатныхФорм");
КонецФункции
&НаКлиенте
Функция ПараметрыОжидания()
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ВладелецФормы);
ПараметрыОжидания.ТекстСообщения = НСтр("ru = 'Подготовка печатных форм.'");
ПараметрыОжидания.ОповещениеПользователя.Показать = Ложь;
ПараметрыОжидания.ВыводитьОкноОжидания = Истина;
ПараметрыОжидания.Интервал = 0;
ПараметрыОжидания.ВыводитьСообщения = Ложь;
Возврат ПараметрыОжидания;
КонецФункции
&НаСервере
Функция ПолучитьАдресНастройкиПечатныхФорм()
ТаблицаНастройкиПечатныхФорм = РеквизитФормыВЗначение("НастройкиПечатныхФорм", Тип("ТаблицаЗначений"));
Возврат ПоместитьВоВременноеХранилище(ТаблицаНастройкиПечатныхФорм, УникальныйИдентификаторХранилища);
КонецФункции
&НаСервере
Функция ИспользоватьДиалогПечатиОфисныхДокументов()
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
Возврат Истина;
Иначе
Возврат Не ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПечатьДокументовOfficeOpen",
"ВыводитьСразу", Ложь);
КонецЕсли;
КонецФункции
&НаСервере
Функция ПечатьОфисныхДокументовОднимФайлом()
Если ОбщегоНазначения.ЭтоМобильныйКлиент() Тогда
Возврат Ложь;
Иначе
Возврат ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("ПечатьДокументовOfficeOpen",
"ОднимДокументом", Ложь);
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура СохранитьПечатныеФормыВКаталог(СписокФайловВоВременномХранилище, Знач ИмяКаталога = "")
Если РасширениеДляРаботыСФайламиПодключено И ЗначениеЗаполнено(ИмяКаталога) Тогда
ИмяКаталога = ОбщегоНазначенияКлиентСервер.ДобавитьКонечныйРазделительПути(ИмяКаталога);
Иначе
ПриПодготовкеИменФайлов(СписокФайловВоВременномХранилище, "");
Возврат;
КонецЕсли;
ОписаниеОповещения = Новый ОписаниеОповещения("ПриПодготовкеИменФайлов", ЭтотОбъект, ИмяКаталога);
ПараметрыПодготовки = УправлениеПечатьюКлиент.ПараметрыПодготовкиИменФайлов(СписокФайловВоВременномХранилище, ИмяКаталога, ОписаниеОповещения);
ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки);
КонецПроцедуры
&НаКлиенте
Процедура ПриПодготовкеИменФайлов(СписокФайловВоВременномХранилище, ИмяКаталога) Экспорт
СохраняемыеФайлы = Новый Массив;
Для Каждого ФайлДляЗаписи Из СписокФайловВоВременномХранилище Цикл
ИмяФайла = ФайлДляЗаписи.Представление;
СохраняемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(ИмяФайла, ФайлДляЗаписи.АдресВоВременномХранилище));
КонецЦикла;
ПараметрыСохранения = ФайловаяСистемаКлиент.ПараметрыСохраненияФайлов();
ПараметрыСохранения.Диалог.Каталог = ИмяКаталога;
ПараметрыСохранения.Интерактивно = Не ЗначениеЗаполнено(ИмяКаталога);
ФайловаяСистемаКлиент.СохранитьФайлы(Неопределено, СохраняемыеФайлы, ПараметрыСохранения);
#Если Не ВебКлиент Тогда
Если ЗначениеЗаполнено(ИмяКаталога) Тогда
ОписаниеОповещения = Новый ОписаниеОповещения("ОткрытьПапкуСохранения", ЭтотОбъект, ИмяКаталога);
ПоказатьОповещениеПользователя(НСтр("ru = 'Печатная форма сохранена'"), ОписаниеОповещения,
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'в каталог %1'"), ИмяКаталога),
БиблиотекаКартинок.ДиалогИнформация);
КонецЕсли;
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьПапкуСохранения(ИмяКаталога) Экспорт
ФайловаяСистемаКлиент.ОткрытьПроводник(ИмяКаталога);
КонецПроцедуры
&НаСервере
Функция ПрисоединитьПечатныеФормыКОбъекту(ФайлыВоВременномХранилище)
Результат = Новый Массив;
Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСФайлами") Тогда
МодульРаботаСФайлами = ОбщегоНазначения.ОбщийМодуль("РаботаСФайлами");
Для Каждого Файл Из ФайлыВоВременномХранилище Цикл
Если МодульРаботаСФайлами.КОбъектуМожноПрисоединятьФайлы(Файл["ОбъектПечати"]) Тогда
ПараметрыФайла = МодульРаботаСФайлами.ПараметрыДобавленияФайла();
ПараметрыФайла.ВладелецФайлов = Файл["ОбъектПечати"];
ПараметрыФайла.ИмяБезРасширения = Файл.Представление;
Результат.Добавить(МодульРаботаСФайлами.ДобавитьФайл(
ПараметрыФайла, Файл.АдресВоВременномХранилище, , НСтр("ru = 'Печатная форма'")));
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Результат;
КонецФункции
&НаСервере
Функция ЭтоПечатьКомплекта()
Возврат НастройкиПечатныхФорм.Количество() > 1;
КонецФункции
&НаСервере
Функция ЕстьРазрешенныйВывод()
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
Если Элементы[НастройкаПечатнойФормы.ИмяРеквизита].Вывод = ИспользованиеВывода.Разрешить Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
&НаСервере
Функция ЕстьРазрешенноеРедактирование()
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
Если Элементы[НастройкаПечатнойФормы.ИмяРеквизита].Защита = Ложь Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
Возврат Ложь;
КонецФункции
&НаКлиенте
Функция ПолучателейБольшеОдного(Получатель)
Если ТипЗнч(Получатель) = Тип("Массив") Или ТипЗнч(Получатель) = Тип("СписокЗначений") Тогда
Возврат Получатель.Количество() > 1;
Иначе
Возврат ОбщегоНазначенияКлиентСервер.АдресаЭлектроннойПочтыИзСтроки(Получатель).Количество() > 1;
КонецЕсли;
КонецФункции
&НаСервере
Функция ЕстьДанныеДляПечати()
Результат = Ложь;
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
Результат = Результат Или ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита].ВысотаТаблицы > 0;
КонецЦикла;
Возврат Результат;
КонецФункции
&НаСервере
Функция ЕстьРедактируемыеМакеты()
Результат = Ложь;
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
Результат = Результат Или Не ПустаяСтрока(НастройкаПечатнойФормы.ПутьКМакету);
КонецЦикла;
Возврат Результат;
КонецФункции
&НаСервере
Функция ЕстьПечатныеФормыСПодписьюИПечатью()
Результат = Ложь;
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
Результат = Результат Или НастройкаПечатнойФормы.ПодписьИПечать;
КонецЦикла;
Возврат Результат;
КонецФункции
&НаСервере
Функция ЕстьПодписиИПечатиДляОбъектовПечати()
Результат = Ложь;
ПодписиИПечатиОбъектов = УправлениеПечатью.ПодписиИПечатиОбъектов(ОбъектыПечати);
Для Каждого ПодписиИПечатиОбъекта Из ПодписиИПечатиОбъектов Цикл
КоллекцияПодписейИПечатей = ПодписиИПечатиОбъекта.Значение;
Для Каждого ПодписьПечать Из КоллекцияПодписейИПечатей Цикл
Картинка = ПодписьПечать.Значение;
Если Картинка.Вид <> ВидКартинки.Пустая Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ОткрытьМакетДляРедактирования()
НастройкаПечатнойФормы = НастройкаТекущейПечатнойФормы();
ОтобразитьСостояниеТекущейПечатнойФормы(НСтр("ru = 'Макет редактируется'"));
ПараметрыФормы = СтандартныеПодсистемыКлиент.ПараметрыРедактораТабличногоДокумента();
ПараметрыФормы.ИмяДокумента = НастройкаПечатнойФормы.Представление;
ПараметрыФормы.Редактирование = Истина;
ПараметрыФормы.Вставить("ИмяОбъектаМетаданныхМакета", НастройкаПечатнойФормы.ПутьКМакету);
ПараметрыФормы.Вставить("Ссылка", СсылкаМакета(НастройкаПечатнойФормы.ПутьКМакету));
ПараметрыФормы.Вставить("РежимОткрытияОкна", РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
ПараметрыФормы.Вставить("ТипМакета", "MXL");
ПараметрыФормы.Вставить("КодЯзыка", СтрРазделить(ТекущийЯзык, "_", Истина)[0]);
ПараметрыФормы.Вставить("ЭтоПечатнаяФорма", Параметры.ИмяМенеджераПечати = "УправлениеПечатью");
ПараметрыФормы.Вставить("ОсновнаяПечатнаяФорма",
ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры.ПараметрыПечати, "ОсновнаяПечатнаяФорма", Ложь));
ПараметрыФормы.Вставить("НаименованиеПечатнойФормы",
ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(Параметры.ПараметрыПечати, "НаименованиеПечатнойФормы", ""));
СтандартныеПодсистемыКлиент.ПоказатьРедакторТабличногоДокумента(Неопределено, ПараметрыФормы, , ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ОтобразитьСостояниеТекущейПечатнойФормы(ТекстСостояния = "")
ОтображатьСостояние = Не ПустаяСтрока(ТекстСостояния);
ПолеТабличногоДокумента = Элементы.ТекущаяПечатнаяФорма;
ОтображениеСостояния = ПолеТабличногоДокумента.ОтображениеСостояния;
ОтображениеСостояния.Текст = ТекстСостояния;
ОтображениеСостояния.Видимость = ОтображатьСостояние;
ОтображениеСостояния.ДополнительныйРежимОтображения =
?(ОтображатьСостояние, ДополнительныйРежимОтображения.Неактуальность, ДополнительныйРежимОтображения.НеИспользовать);
ПолеТабличногоДокумента.ТолькоПросмотр = ОтображатьСостояние Или ПолеТабличногоДокумента.Вывод = ИспользованиеВывода.Запретить;
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьРедактированиеТекущейПечатнойФормы()
НастройкаПечатнойФормы = НастройкаТекущейПечатнойФормы();
Если НастройкаПечатнойФормы <> Неопределено Тогда
ПолеТабличногоДокумента = Элементы[НастройкаПечатнойФормы.ИмяРеквизита];
ПолеТабличногоДокумента.Редактирование = Не ПолеТабличногоДокумента.Редактирование;
Элементы.ТекущаяПечатнаяФорма.Редактирование = ПолеТабличногоДокумента.Редактирование;
ПереключитьПометкуКнопкиРедактирование();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьПометкуКнопкиРедактирование()
ПечатнаяФормаДоступна = Элементы.Страницы.ТекущаяСтраница <> Элементы.СтраницаПечатнаяФормаНедоступна;
РедактированиеВозможно = Ложь;
Пометка = Ложь;
НастройкаПечатнойФормы = НастройкаТекущейПечатнойФормы();
Если НастройкаПечатнойФормы <> Неопределено Тогда
ПолеТабличногоДокумента = Элементы[НастройкаПечатнойФормы.ИмяРеквизита];
РедактированиеВозможно = ПечатнаяФормаДоступна И Не ПолеТабличногоДокумента.Защита;
Пометка = ПолеТабличногоДокумента.Редактирование И РедактированиеВозможно;
КонецЕсли;
Элементы.КнопкаРедактирование.Пометка = Пометка;
Элементы.КнопкаРедактирование.Доступность = РедактированиеВозможно;
Элементы.КнопкаПереключитьРедактированиеВсеДействия.Пометка = Элементы.КнопкаРедактирование.Пометка;
Элементы.КнопкаПереключитьРедактированиеВсеДействия.Доступность = Элементы.КнопкаРедактирование.Доступность;
КонецПроцедуры
&НаКлиенте
Процедура УстановитьДоступностьИзмененияМакета()
ПечатнаяФормаДоступна = Элементы.Страницы.ТекущаяСтраница <> Элементы.СтраницаПечатнаяФормаНедоступна;
НастройкаПечатнойФормы = НастройкаТекущейПечатнойФормы();
Элементы.КнопкаИзменитьМакет.Доступность = Не ПустаяСтрока(НастройкаПечатнойФормы.ПутьКМакету);
КонецПроцедуры
&НаКлиенте
Процедура УстановитьДоступностьКомандВывода()
НастройкаПечатнойФормы = НастройкаТекущейПечатнойФормы();
ПолеТабличногоДокумента = Элементы[НастройкаПечатнойФормы.ИмяРеквизита];
ПечатнаяФормаДоступна = Элементы.Страницы.ТекущаяСтраница <> Элементы.СтраницаПечатнаяФормаНедоступна;
МожноПечатать = ПечатнаяФормаДоступна И ПолеТабличногоДокумента.Вывод = ИспользованиеВывода.Разрешить;
Если Элементы.Найти("КнопкаПредварительныйПросмотр") <> Неопределено Тогда
Элементы.КнопкаПредварительныйПросмотр.Доступность = МожноПечатать;
КонецЕсли;
Если Элементы.Найти("КнопкаПредварительныйПросмотрВсеДействия") <> Неопределено Тогда
Элементы.КнопкаПредварительныйПросмотрВсеДействия.Доступность = МожноПечатать;
КонецЕсли;
Если Элементы.Найти("КнопкаПараметрыСтраницыВсеДействия") <> Неопределено Тогда
Элементы.КнопкаПараметрыСтраницыВсеДействия.Доступность = МожноПечатать;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьТекущуюПечатнуюФорму()
НастройкаПечатнойФормы = НастройкаТекущейПечатнойФормы();
Если НастройкаПечатнойФормы = Неопределено Тогда
Возврат;
КонецЕсли;
НастройкаПечатнойФормы.ТекстОшибкиФормирования =
ПереформироватьПечатнуюФорму(НастройкаПечатнойФормы.ИмяМакета, НастройкаПечатнойФормы.ИмяРеквизита);
НастройкаПечатнойФормы.ТекущийЯзык = ТекущийЯзык;
ДобавитьУдалитьПодписьПечать();
ОтобразитьСостояниеТекущейПечатнойФормы();
УстановитьТекущуюСтраницу();
НастроитьВидимостьЭлементовФормы();
КонецПроцедуры
&НаСервере
Функция ПереформироватьПечатнуюФорму(ИмяМакета, ИмяРеквизита)
Отказ = Ложь;
КоллекцияПечатныхФорм = СформироватьПечатныеФормы(ИмяМакета, Отказ);
Если Отказ Тогда
ВызватьИсключение НСтр("ru = 'Печатная форма не была переформирована.'");
КонецЕсли;
ТекстОшибкиФормирования = "";
Для Каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
Если ПечатнаяФорма.ИмяМакета = ИмяМакета Тогда
ЭтотОбъект[ИмяРеквизита] = ПечатнаяФорма.ТабличныйДокумент;
ТекстОшибкиФормирования = ПечатнаяФорма.ТекстОшибкиФормирования;
УстановитьПараметрыПоляТабличногоДокумента(Элементы[ИмяРеквизита], ПечатнаяФорма.ТабличныйДокумент);
КонецЕсли;
КонецЦикла;
УстановитьТекущийТабличныйДокумент(ИмяРеквизита);
Возврат ТекстОшибкиФормирования;
КонецФункции
&НаКлиенте
Функция НастройкаТекущейПечатнойФормы()
Возврат УправлениеПечатьюКлиент.НастройкаТекущейПечатнойФормы(ЭтотОбъект);
КонецФункции
&НаКлиенте
Процедура ПерейтиКДокументуЗавершение(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
Если ВыбранныйЭлемент = Неопределено Тогда
Возврат;
КонецЕсли;
ПолеТабличногоДокумента = Элементы.ТекущаяПечатнаяФорма;
ТабличныйДокумент = ТекущаяПечатнаяФорма;
ОбластьВыбранногоДокумента = ТабличныйДокумент.Области.Найти(ВыбранныйЭлемент.Значение);
ПолеТабличногоДокумента.ТекущаяОбласть = ТабличныйДокумент.Область("R1C1");
Если ОбластьВыбранногоДокумента <> Неопределено Тогда
ПолеТабличногоДокумента.ТекущаяОбласть = ТабличныйДокумент.Область(ОбластьВыбранногоДокумента.Верх,,ОбластьВыбранногоДокумента.Низ,);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОтправитьПечатныеФормыПоПочте()
ОписаниеОповещения = Новый ОписаниеОповещения("ОтправитьПечатныеФормыПоПочтеНастройкаУчетнойЗаписиПредложена", ЭтотОбъект);
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.РаботаСПочтовымиСообщениями") Тогда
МодульРаботаСПочтовымиСообщениямиКлиент = ОбщегоНазначенияКлиент.ОбщийМодуль("РаботаСПочтовымиСообщениямиКлиент");
МодульРаботаСПочтовымиСообщениямиКлиент.ПроверитьНаличиеУчетнойЗаписиДляОтправкиПочты(ОписаниеОповещения);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПараметрыОтправкиПисьма(ВыбранныеПараметры, СписокВложений = Неопределено)
Если СписокВложений = Неопределено Тогда
СписокВложений = ПоместитьТабличныеДокументыВоВременноеХранилище(ВыбранныеПараметры);
СписокВложений = ПоместитьФайлыВАрхив(СписокВложений, ВыбранныеПараметры);
КонецЕсли;
ШаблонИмениФайла = "%1%2.%3";
ИспользованныеИменаФайлов = Новый Соответствие;
Для Каждого Вложение Из СписокВложений Цикл
ИмяФайла = Вложение.Представление;
НомерИспользования = ?(ИспользованныеИменаФайлов[ИмяФайла] <> Неопределено,
ИспользованныеИменаФайлов[ИмяФайла] + 1, 1);
ИспользованныеИменаФайлов.Вставить(ИмяФайла, НомерИспользования);
Если НомерИспользования > 1 Тогда
Файл = Новый Файл(ИмяФайла);
ИмяФайла = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ШаблонИмениФайла,
Файл.ИмяБезРасширения, " (" + НомерИспользования + ")", Файл.Расширение);
КонецЕсли;
Вложение.Представление = ИмяФайла;
КонецЦикла;
Получатели = ПараметрыВывода.ПараметрыОтправки.Получатель;
Если ВыбранныеПараметры.Свойство("Получатели") Тогда
Получатели = ВыбранныеПараметры.Получатели;
КонецЕсли;
Результат = Новый Структура;
Результат.Вставить("Получатель", Получатели);
Результат.Вставить("Тема", ПараметрыВывода.ПараметрыОтправки.Тема);
Результат.Вставить("Текст", ПараметрыВывода.ПараметрыОтправки.Текст);
Результат.Вставить("Вложения", СписокВложений);
Результат.Вставить("УдалятьФайлыПослеОтправки", Истина);
Если ОбъектыПечати.Количество() = 1 И ОбщегоНазначения.ЭтоСсылка(ТипЗнч(ОбъектыПечати[0].Значение)) Тогда
Результат.Вставить("Предмет", ОбъектыПечати[0].Значение);
КонецЕсли;
ПечатныеФормы = Новый ТаблицаЗначений;
ПечатныеФормы.Колонки.Добавить("Название");
ПечатныеФормы.Колонки.Добавить("ТабличныйДокумент");
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
Если Не НастройкаПечатнойФормы.Печатать Тогда
Продолжить;
КонецЕсли;
ТабличныйДокумент = ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита];
Если ПечатныеФормы.НайтиСтроки(Новый Структура("ТабличныйДокумент", ТабличныйДокумент)).Количество() > 0 Тогда
Продолжить;
КонецЕсли;
Если ВычислитьИспользованиеВывода(ТабличныйДокумент) = ИспользованиеВывода.Запретить Тогда
Продолжить;
КонецЕсли;
Если ТабличныйДокумент.Защита Тогда
Продолжить;
КонецЕсли;
Если ТабличныйДокумент.ВысотаТаблицы = 0 Тогда
Продолжить;
КонецЕсли;
ОписаниеПечатнойФормы = ПечатныеФормы.Добавить();
ОписаниеПечатнойФормы.Название = НастройкаПечатнойФормы.Название;
ОписаниеПечатнойФормы.ТабличныйДокумент = ТабличныйДокумент;
КонецЦикла;
СписокОбъектов = Параметры.ПараметрКоманды;
Если ОбщегоНазначения.ЗначениеСсылочногоТипа(Параметры.ПараметрКоманды) Тогда
СписокОбъектов = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Параметры.ПараметрКоманды);
КонецЕсли;
ИнтеграцияПодсистемБСП.ПередОтправкойПоПочте(Результат, ПараметрыВывода, СписокОбъектов, ПечатныеФормы);
УправлениеПечатьюПереопределяемый.ПередОтправкойПоПочте(Результат, ПараметрыВывода, СписокОбъектов, ПечатныеФормы);
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура ОтправитьПечатныеФормыПоПочтеНастройкаУчетнойЗаписиПредложена(УчетнаяЗаписьНастроена, ДополнительныеПараметры) Экспорт
Если УчетнаяЗаписьНастроена <> Истина Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = ОбщегоНазначенияСлужебныйКлиент.НастройкиФорматаПечатнойФормы();
ИмяОткрываемойФормы = "ОбщаяФорма.ВыборФорматаВложений";
Если ОбщегоНазначенияКлиент.ПодсистемаСуществует("СтандартныеПодсистемы.Взаимодействия")
И СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента().ИспользоватьПочтовыйКлиент Тогда
Если ПолучателейБольшеОдного(ПараметрыВывода.ПараметрыОтправки.Получатель) Тогда
ПараметрыФормы.Вставить("Получатели", ПараметрыВывода.ПараметрыОтправки.Получатель);
ИмяОткрываемойФормы = "ОбщаяФорма.ПодготовкаНовогоПисьма";
КонецЕсли;
КонецЕсли;
ОткрытьФорму(ИмяОткрываемойФормы, ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры
&НаСервере
Функция ТабличныеДокументыДляПечати()
ТабличныеДокументы = Новый СписокЗначений;
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
Если Элементы[НастройкаПечатнойФормы.ИмяРеквизита].Вывод = ИспользованиеВывода.Разрешить И НастройкаПечатнойФормы.Печатать Тогда
ПечатнаяФорма = ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита];
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Вывести(ПечатнаяФорма);
УправлениеПечатью.СкопироватьСвойстваТабличногоДокумента(ТабличныйДокумент, ПечатнаяФорма);
ТабличныйДокумент.КоличествоЭкземпляров = НастройкаПечатнойФормы.Количество;
ТабличныеДокументы.Добавить(ТабличныйДокумент, НастройкаПечатнойФормы.Представление);
КонецЕсли;
КонецЦикла;
Возврат ТабличныеДокументы;
КонецФункции
&НаКлиенте
Процедура СохранитьНастройки()
СохраняемыеНастройкиПечатныхФорм = Новый Массив;
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
СохраняемаяНастройка = Новый Структура;
СохраняемаяНастройка.Вставить("ИмяМакета", НастройкаПечатнойФормы.ИмяМакета);
СохраняемаяНастройка.Вставить("Количество", ?(НастройкаПечатнойФормы.Печатать,НастройкаПечатнойФормы.Количество, 0));
СохраняемаяНастройка.Вставить("ПозицияПоУмолчанию", НастройкаПечатнойФормы.ПозицияПоУмолчанию);
СохраняемыеНастройкиПечатныхФорм.Добавить(СохраняемаяНастройка);
КонецЦикла;
СохранитьНастройкиПечатныхФорм(КлючНастроек, СохраняемыеНастройкиПечатныхФорм);
КонецПроцедуры
&НаКлиенте
Процедура НачатьСохранениеНастроек()
ОтключитьОбработчикОжидания("СохранитьНастройки");
Если ПустаяСтрока(КлючНастроек) Тогда
Возврат;
КонецЕсли;
ПодключитьОбработчикОжидания("СохранитьНастройки", 2, Истина);
КонецПроцедуры
&НаСервереБезКонтекста
Функция НастройкиСохранения()
Возврат УправлениеПечатью.НастройкиСохранения();
КонецФункции
&НаСервереБезКонтекста
Функция ЕстьПодписьИПечать(ТабличныйДокумент)
Если Не УправлениеПечатью.НастройкиПечати().ИспользоватьПодписиИПечати Тогда
Возврат Ложь;
КонецЕсли;
Для Каждого Рисунок Из ТабличныйДокумент.Рисунки Цикл
Для Каждого Префикс Из УправлениеПечатью.ПрефиксыИменОбластейСПодписьюИПечатью() Цикл
Если СтрНачинаетсяС(Рисунок.Имя, Префикс) Тогда
Возврат Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Ложь;
КонецФункции
&НаСервере
Процедура ДобавитьПодписьИПечать()
ПодписиИПечатиОбластей = УправлениеПечатью.ПодписиИПечатиОбластей(ОбъектыПечати);
ПодписиИПечати = Неопределено;
Если ЭтоАдресВременногоХранилища(АдресХранилищаРисунков) Тогда
ПодписиИПечати = ПолучитьИзВременногоХранилища(АдресХранилищаРисунков);
КонецЕсли;
ОбработанныеТабличныеДокументы = Новый Соответствие;
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
Если Не НастройкаПечатнойФормы.ПодписьИПечать Тогда
Продолжить;
КонецЕсли;
ИмяРеквизитаСТабличнымДокументом = НастройкаПечатнойФормы.ИмяРеквизита;
Если ОбработанныеТабличныеДокументы[ИмяРеквизитаСТабличнымДокументом] <> Неопределено Тогда
Продолжить;
Иначе
ОбработанныеТабличныеДокументы.Вставить(ИмяРеквизитаСТабличнымДокументом, Истина);
КонецЕсли;
ТабличныйДокумент = ЭтотОбъект[ИмяРеквизитаСТабличнымДокументом];
Если ПодписиИПечати <> Неопределено Тогда
РисункиТабличногоДокумента = ПодписиИПечати[ИмяРеквизитаСТабличнымДокументом];
Для Каждого СохраненныйРисунок Из РисункиТабличногоДокумента Цикл
НовыйРисунок = ТабличныйДокумент.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка);
ЗаполнитьЗначенияСвойств(НовыйРисунок, СохраненныйРисунок);
КонецЦикла;
КонецЕсли;
ДанныеПечатиРисунковТабличногоДокумента = УправлениеПечатью.ПодписиИПечатиТабличногоДокумента(ОбъектыПечати, ТабличныйДокумент, ТекущийЯзык);
Для Каждого ПодписиИПечатиОбласти Из ПодписиИПечатиОбластей Цикл
ИмяОбласти = ПодписиИПечатиОбласти.Ключ;
Если ДанныеПечатиРисунковТабличногоДокумента[ИмяОбласти] = Неопределено Тогда
ДанныеПечатиРисунковТабличногоДокумента[ИмяОбласти] = Новый Соответствие();
КонецЕсли;
Для Каждого Элемент Из ПодписиИПечатиОбласти.Значение Цикл
ДанныеПечатиРисунковТабличногоДокумента[ИмяОбласти][Элемент.Ключ] = Элемент.Значение;
КонецЦикла;
КонецЦикла;
УправлениеПечатью.ДобавитьПодписьИПечать(ТабличныйДокумент, ДанныеПечатиРисунковТабличногоДокумента);
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура УбратьПодписьИПечать()
СкрыватьПодписиИПечати = УправлениеПечатью.НастройкиПечати().СкрыватьПодписиИПечатиДляРедактирования;
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
Если Не НастройкаПечатнойФормы.ПодписьИПечать Тогда
Продолжить;
КонецЕсли;
ТабличныйДокумент = ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита];
УправлениеПечатью.УбратьПодписьИПечать(ТабличныйДокумент, СкрыватьПодписиИПечати);
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПодписиИПечатиТабличногоДокумента(ТабличныйДокумент)
РисункиТабличногоДокумента = Новый Массив;
Для Каждого Рисунок Из ТабличныйДокумент.Рисунки Цикл
Если УправлениеПечатью.ЭтоПодписьИлиПечать(Рисунок) Тогда
ОписаниеРисунка = Новый Структура("Лево,Верх,Ширина,Высота,Картинка,Владелец,ЦветФона,Имя,Линия,
|РазмерКартинки,ВертикальноеПоложение,ГоризонтальноеПоложение");
ЗаполнитьЗначенияСвойств(ОписаниеРисунка, Рисунок);
РисункиТабличногоДокумента.Добавить(ОписаниеРисунка);
КонецЕсли;
КонецЦикла;
Возврат РисункиТабличногоДокумента;
КонецФункции
&НаСервере
Функция ПодписиИПечатиТабличныхДокументов()
ПодписиИПечати = Новый Структура;
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
Если Не НастройкаПечатнойФормы.ПодписьИПечать Тогда
Продолжить;
КонецЕсли;
ТабличныйДокумент = ЭтотОбъект[НастройкаПечатнойФормы.ИмяРеквизита];
РисункиТабличногоДокумента = ПодписиИПечатиТабличногоДокумента(ТабличныйДокумент);
Если Не ПодписиИПечати.Свойство(НастройкаПечатнойФормы.ИмяРеквизита) Тогда
ПодписиИПечати.Вставить(НастройкаПечатнойФормы.ИмяРеквизита, РисункиТабличногоДокумента);
КонецЕсли;
КонецЦикла;
Возврат ПодписиИПечати;
КонецФункции
&НаКлиенте
Процедура ДобавитьУдалитьПодписьПечать()
Если ПодписьИПечать Тогда
ДобавитьПодписьИПечать();
Иначе
УбратьПодписьИПечать();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриВыполненииКомандыНаСервере(ДополнительныеПараметры)
ИнтеграцияПодсистемБСП.ПечатьДокументовПриВыполненииКоманды(ЭтотОбъект, ДополнительныеПараметры);
УправлениеПечатьюПереопределяемый.ПечатьДокументовПриВыполненииКоманды(ЭтотОбъект, ДополнительныеПараметры);
КонецПроцедуры
&НаКлиенте
Процедура РассчитатьПоказателиДинамически()
ОбщегоНазначенияСлужебныйКлиент.РассчитатьПоказатели(ЭтотОбъект, "ТекущаяПечатнаяФорма");
КонецПроцедуры
&НаСервере
Функция ДоступныеЯзыкиПечатныхФорм()
Результат = Новый Массив;
Для Каждого НастройкаПечатнойФормы Из НастройкиПечатныхФорм Цикл
Если Не НастройкаПечатнойФормы.ДоступенВыводНаДругихЯзыках Тогда
Продолжить;
КонецЕсли;
Для Каждого КодЯзыка Из СтрРазделить(НастройкаПечатнойФормы.ДоступныеЯзыки, ",", Ложь) Цикл
Если Результат.Найти(КодЯзыка) = Неопределено Тогда
Результат.Добавить(КодЯзыка);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат Результат;
КонецФункции
&НаКлиенте
Процедура СохранитьНаКомпьютерПриПодключенииРасширения(РасширениеПодключено, ДополнительныеПараметры) Экспорт
РасширениеДляРаботыСФайламиПодключено = РасширениеПодключено;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ОбъектыПечати", ОбъектыПечати);
ПараметрыФормы.Вставить("РасширениеДляРаботыСФайламиПодключено", РасширениеПодключено);
ПараметрыФормы.Вставить("Назначение", "Компьютер");
ОткрытьФорму("ОбщаяФорма.СохранениеПечатнойФормы", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры
&НаКлиенте
Процедура ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки)
УправлениеПечатьюКлиент.ПодготовитьИменаФайловДляСохраненияВКаталог(ПараметрыПодготовки);
КонецПроцедуры
&НаСервере
Функция СсылкаМакета(ИмяОбъектаМетаданныхМакета)
Возврат Справочники.МакетыПечатныхФорм.СсылкаМакета(ИмяОбъектаМетаданныхМакета);
КонецФункции
&НаКлиенте
Процедура ТекущаяПечатнаяФормаВыбор(Элемент, Область, СтандартнаяОбработка)
Если ТипЗнч(Область) <> Тип("ОбластьЯчеекТабличногоДокумента") И ТипЗнч(Область) <> Тип("РисунокТабличногоДокумента") Тогда
Возврат;
КонецЕсли;
Ссылки = Новый Структура("Текст,Расшифровка,Маска","","","");
ЗаполнитьЗначенияСвойств(Ссылки, Область);
Если ПерейтиПоСсылке(Ссылки.Текст) Или ПерейтиПоСсылке(Ссылки.Расшифровка) Или ПерейтиПоСсылке(Ссылки.Маска) Тогда
СтандартнаяОбработка = Ложь;
Возврат;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ПерейтиПоСсылке(АдресСсылки)
Если ПустаяСтрока(АдресСсылки) Тогда
Возврат Ложь;
КонецЕсли;
АдресСсылкиВРег = ВРег(АдресСсылки);
Если СтрНачинаетсяС(АдресСсылкиВРег, ВРег("http://"))
Или СтрНачинаетсяС(АдресСсылкиВРег, ВРег("https://"))
Или СтрНачинаетсяС(АдресСсылкиВРег, ВРег("e1cib/"))
Или СтрНачинаетсяС(АдресСсылкиВРег, ВРег("e1c://")) Тогда
ФайловаяСистемаКлиент.ОткрытьНавигационнуюСсылку(АдресСсылки);
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
&НаСервереБезКонтекста
Процедура ОтключитьПользовательскийМакет(ПутьКМакету)
УправлениеПечатью.ОтключитьПользовательскийМакет(ПутьКМакету);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ИспользуетсяПользовательскийМакет(ПутьКМакету)
Возврат УправлениеПечатью.ИспользуетсяПользовательскийМакет(ПутьКМакету);
КонецФункции
&НаСервереБезКонтекста
Функция РазмерСтрокиВБайтах(Строка)
Поток = Новый ПотокВПамяти();
ЗаписьТекста = Новый ЗаписьТекста(Поток, КодировкаТекста.Системная);
ЗаписьТекста.Записать(Строка);
ЗаписьТекста.Закрыть();
ДвоичныеДанные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
Возврат ДвоичныеДанные.Размер();
КонецФункции
&НаСервереБезКонтекста
Функция СократитьРазмерСтрокиВБайтах(Строка, ТребуемыйРазмерВБайтах)
Результат = "";
ТекущийРазмерСтрокиРезультата = 0;
Для НомерСимвола = 1 По СтрДлина(Строка) Цикл
Символ = Сред(Строка, НомерСимвола, 1);
РазмерСимвола = РазмерСтрокиВБайтах(Символ);
Если ТекущийРазмерСтрокиРезультата + РазмерСимвола > ТребуемыйРазмерВБайтах Тогда
Возврат Результат;
КонецЕсли;
Результат = Результат + Символ;
ТекущийРазмерСтрокиРезультата = ТекущийРазмерСтрокиРезультата + РазмерСимвола;
КонецЦикла;
Возврат Результат;
КонецФункции
#КонецОбласти