Для работы производится подключение во внешних обработках в не безопасном режиме т.к. требуется сохрание файлов в каталог при выборе определенного режима.
А теперь с самого начала разберемся, как она работает по внутренностям.
В процедуре формы ПриСозданииНаСервере заполняем список типов документов / справочников используя функцию УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати, функция вернет массив менеджеров объектов, по которым подключена подсистема печати, по менеджеру объекта получим метаданные для получения имени метаданного и его синонима.
&НаКлиенте
Перем СписокОконДоПечати,
СписокДокументов,
СтрокиПечать;
#Область СобытияФормы
//Заполним список выбора вида объекта
//данными функции ПриОпределенииОбъектовСКомандамиПечати
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
МассивОбъектов = Новый Массив;
УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати(МассивОбъектов);
МетаданныеЖурналыДокументов = Метаданные.ЖурналыДокументов;
Для Каждого ЭлементПечати Из МассивОбъектов Цикл
МетаданноеПечати = Метаданные.НайтиПоТипу(ТипЗнч(ЭлементПечати));
//Если это журнал документов то пропускаем
Если МетаданныеЖурналыДокументов.Содержит(МетаданноеПечати) Тогда
Продолжить;
КонецЕсли;
//Заполняем список выбора ВидОбъекта полным именем метаданного
Элементы.ВидОбъекта.СписокВыбора.Добавить(МетаданноеПечати.ПолноеИмя(),
МетаданноеПечати.Синоним);
КонецЦикла;
ЗагрузитьОбщиеНастройки();
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ОкнаПечатиФоново = Новый Массив;
//Производим первоначальную инициализацию элементов при сохраненной настройке ВидОбъекта
Если ЗначениеЗаполнено(ВидОбъекта) Тогда
ВидДокументовПриИзмененииСервер();
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СобытияЭлементовФормы
&НаКлиенте
Процедура ВидДокументовПриИзменении(Элемент)
ВидДокументовПриИзмененииСервер();
КонецПроцедуры
&НаСервере
Процедура ВидДокументовПриИзмененииСервер()
//Сохраним текущие пользовательские настройки ТаблицаДокументов
Если ЗначениеЗаполнено(ТаблицаДокументов.КлючТекущихПользовательскихНастроек) Тогда
ХранилищеПользовательскихНастроекДинамическихСписков.Сохранить("УППД",
ТаблицаДокументов.КлючТекущихПользовательскихНастроек,
ТаблицаДокументов.КомпоновщикНастроек.ПользовательскиеНастройки,
,
ПараметрыСеанса.ТекущийПользователь);
КонецЕсли;
//Если очистили ВидОбъекта то убираем кнопки
Если ВидОбъекта = "" Тогда
Элементы.Печать.Видимость = Ложь;
Элементы.ПутьВывода.Видимость = Ложь;
Элементы.ПечатьВыделенные.Видимость = Ложь;
Элементы.Основная.Видимость = Ложь;
Возврат;
КонецЕсли;
Элементы.Печать.Видимость = Истина;
Элементы.ПутьВывода.Видимость = Истина;
Элементы.ПечатьВыделенные.Видимость = Истина;
Элементы.Основная.Видимость = Истина;
СозданиеЭлементовТаблицыСервер();
ЗаполнитьПечатныеФормыНаСервере();
ТаблицаДокументов.КлючТекущихПользовательскихНастроек = ВидОбъекта;
//Получим сохраненные ранее пользовательские настройки
ВыборкаНастройки = ХранилищеПользовательскихНастроекДинамическихСписков.Выбрать(
Новый Структура("КлючОбъекта, КлючНастроек, Пользователь",
"УППД",
ВидОбъекта,
ПараметрыСеанса.ТекущийПользователь));
Попытка
ЕстьНастройки = ВыборкаНастройки.Следующий();
Исключение
лкИнформацияОбОшибке = ИнформацияОбОшибке();
Сообщить(КраткоеПредставлениеОшибки(лкИнформацияОбОшибке));
ЗаписьЖурналаРегистрации("Уппд.ВидДокументовПриИзменении",
УровеньЖурналаРегистрации.Ошибка,,,
ОбработкаОшибок.ПодробноеПредставлениеОшибки(лкИнформацияОбОшибке));
Возврат;
КонецПопытки;
//Восстановим пользовательские настройки ЗагрузитьПользовательскиеНастройки
Если ЕстьНастройки = Ложь
Или ВыборкаНастройки.Настройки = Неопределено Тогда
//Если нет сохраненных настроек то очистим отборы списка
Для Каждого ЭлПользНастр Из ТаблицаДокументов.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
Если ТипЗнч(ЭлПользНастр) = Тип("ОтборКомпоновкиДанных") Тогда
ЭлПользНастр.Элементы.Очистить();
КонецЕсли;
КонецЦикла;
Иначе
ТаблицаДокументов.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(ВыборкаНастройки.Настройки);
КонецЕсли;
Элементы.ТаблицаДокументов.СоздатьЭлементыФормыПользовательскихНастроек(
Элементы.СписокКомпоновщикНастроекПользовательскиеНастройки,
РежимОтображенияНастроекКомпоновкиДанных.БыстрыйДоступ);
КонецПроцедуры
//Проставим нулевое количество во всех строчках и сохраним настройки
&НаКлиенте
Процедура ОтметитьВсе(Команда)
Для Каждого Стр Из ПечатныеФормы Цикл
Если Стр.Количество = 0 Тогда
Стр.Количество = 1;
КонецЕсли;
КонецЦикла;
СохранитьНастройкиСервер();
КонецПроцедуры
&НаКлиенте
Процедура Печать(Команда)
Если НеВозможнаПечать() Тогда
Возврат;
КонецЕсли;
СписокДокументов = ПолучитьДокументыПоДинамическомуСписку();
ПечатьПоСпискам();
КонецПроцедуры
&НаКлиенте
Процедура ПечатьВыделенные(Команда)
Если НеВозможнаПечать() Тогда
Возврат;
КонецЕсли;
ВыделенныеЭлементы = Элементы.ТаблицаДокументов.ВыделенныеСтроки;
СписокДокументов = ПолучитьДокументыПоДинамическомуСписку(ВыделенныеЭлементы);
ПечатьПоСпискам();
КонецПроцедуры
&НаКлиенте
Функция НеВозможнаПечать()
Если ЗначениеЗаполнено(ВидОбъекта) Тогда
Возврат Ложь;
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не заполнен вид документа / справочника";
Сообщение.Поле = "ВидДокументов";
Сообщение.Сообщить();
Возврат Истина;
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура ПечатьПоСпискам()
ВыделенныеЭлементы = Элементы.ТаблицаДокументов.ВыделенныеСтроки;
СписокДокументов = ПолучитьДокументыПоДинамическомуСписку(ВыделенныеЭлементы);
СтрокиПечать = ПолучитьПараметрыПечатиСервер();
ВыполнитьПечатьПоСпискуДокументовКлиент(СтрокиПечать);
КонецПроцедуры
&НаКлиенте
Процедура СнятьВсе(Команда)
Для Каждого Стр Из ПечатныеФормы Цикл
Стр.Количество = 0;
КонецЦикла;
СохранитьНастройкиСервер();
КонецПроцедуры
&НаКлиенте
Процедура СохранитьНастройку(Команда)
СохранитьНастройкиСервер();
КонецПроцедуры
#КонецОбласти
#Область ПрограмныйИнтерфейс
&НаСервере
Процедура СозданиеЭлементовТаблицыСервер()
РеквизитТаблЗначений = ЭтаФорма.ТаблицаДокументов;
РеквизитТаблЗначений.ОсновнаяТаблица = ВидОбъекта;
РеквизитТаблЗначений.ПроизвольныйЗапрос = Ложь;
МассивЭлементовУдаление = Новый Массив;
//Удалим сначала ПодчиненныеЭлементы элемента ТаблицаДокументов
Для Каждого ЭлементУдаление Из Элементы.ТаблицаДокументов.ПодчиненныеЭлементы Цикл
МассивЭлементовУдаление.Добавить(ЭлементУдаление);
КонецЦикла;
Для Каждого ЭлементУдаление Из МассивЭлементовУдаление Цикл
Элементы.Удалить(ЭлементУдаление);
КонецЦикла;
ДанныеОбъекта = ПолучитьДанныеВидаОбъекта(ВидОбъекта);
Если ДанныеОбъекта = Неопределено Тогда
Возврат;
КонецЕсли;
//Добавим стандартные реквизиты кроме Наименование, Дата и др.
Для Каждого Эл Из Метаданные[ДанныеОбъекта.ТипОбъекта][ДанныеОбъекта.ИмяОбъекта].СтандартныеРеквизиты Цикл
Если Эл.Имя = "Наименование" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "Дата" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "Номер" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "ПометкаУдаления" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "Проведен" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "Владелец" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "Родитель" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "ЭтоГруппа" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "ПометкаУдаления" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "Предопределенный" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "ИмяПредопределенныхДанных" Тогда
Продолжить;
КонецЕсли;
НоваяКолонкаТаблицы = Элементы.Добавить(Эл.Имя, Тип("ПолеФормы"), Элементы.ТаблицаДокументов);
НоваяКолонкаТаблицы.ПутьКДанным = "ТаблицаДокументов." + Эл.Имя;
Если Эл.Имя = "Ссылка" Тогда
Если ДанныеОбъекта.ТипОбъекта = "Документы" Тогда
НоваяКолонкаТаблицы.Заголовок = "Документ";
ИначеЕсли ДанныеОбъекта.ТипОбъекта = "Справочники" Тогда
НоваяКолонкаТаблицы.Заголовок = "Справочник";
Иначе
НоваяКолонкаТаблицы.Заголовок = ДанныеОбъекта.ТипОбъекта;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПечатныеФормыНаСервере()
ПечатныеФормы.Очистить();
ТаблКомандПечати = ПолучитьКомандыПечатиСервер(ВидОбъекта);
ВосстановитьНастройку(ТаблКомандПечати);
КонецПроцедуры
//Выполняя схему скд из настроек ТаблицаДокументов получаем массив документов
&НаСервере
Функция ПолучитьДокументыПоДинамическомуСписку(МассивОбъектов = Неопределено)
СхемаКомпоновкиДанных = Элементы.ТаблицаДокументов.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
НастройкиКомпоновкиДанных = Элементы.ТаблицаДокументов.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
Если МассивОбъектов <> Неопределено Тогда
НовыйОтбор = НастройкиКомпоновкиДанных.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ПолеСсылка = Новый ПолеКомпоновкиДанных("Ссылка");
НовыйОтбор.ЛевоеЗначение = ПолеСсылка;
НовыйОтбор.ПравоеЗначение = МассивОбъектов;
НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
НовыйОтбор.Использование = Истина;
КонецЕсли;
Если НастройкиКомпоновкиДанных.Структура.Количество() Тогда
ВыбранноеПолеКомпоновкиДанных = НастройкиКомпоновкиДанных.Структура[0].Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
Иначе
ВыбранноеПолеКомпоновкиДанных = НастройкиКомпоновкиДанных.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
АвтоВыбранноеПолеКомпоновкиДанных = НастройкиКомпоновкиДанных.Структура[0].Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеКомпоновкиДанных = НастройкиКомпоновкиДанных.Структура[0].Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
КонецЕсли;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,НастройкиКомпоновкиДанных,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет);
ТаблицаСсылок = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаСсылок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
Возврат ТаблицаСсылок.ВыгрузитьКолонку("Ссылка");
КонецФункции
//Получаем команды печати для формы объекта из ВидОбъекта
&НаСервереБезКонтекста
Функция ПолучитьКомандыПечатиСервер(Знач ВидОбъекта)
ДанныеОбъекта = ПолучитьДанныеВидаОбъекта(ВидОбъекта);
Если ДанныеОбъекта = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
МетаданныеДокумента = Метаданные[ДанныеОбъекта.ТипОбъекта][ДанныеОбъекта.ИмяОбъекта];
Если ТипЗнч(МетаданныеДокумента.ОсновнаяФормаСписка) = Тип("ОбъектМетаданных") Тогда
ФормаОбъекта = МетаданныеДокумента.ОсновнаяФормаСписка;
ИначеЕсли ТипЗнч(МетаданныеДокумента.ОсновнаяФормаОбъекта) = Тип("ОбъектМетаданных") Тогда
ФормаОбъекта = МетаданныеДокумента.ОсновнаяФормаОбъекта;
Иначе
ВызватьИсключение "Для объекта "
+ ДанныеОбъекта.ИмяОбъекта
+ " не задана основная форма";
КонецЕсли;
КомандыПечатиФормы = УправлениеПечатью.КомандыПечатиФормы(ВидОбъекта + ".Форма." + ФормаОбъекта.Имя);
Возврат КомандыПечатиФормы;
КонецФункции
//Подготавливаем массив строк печати,
//соединяя поля от ПолучитьКомандыПечатиСервер и ПечатныеФормы
&НаСервере
Функция ПолучитьПараметрыПечатиСервер()
МассивПолейПечатныхФорм = Новый Массив;
МассивПолейПечатныхФорм.Добавить("ОписаниеКоманды");
МассивПолейПечатныхФорм.Добавить("ОбъектыПечати");
МассивПолейПечатныхФорм.Добавить("Форма");
МассивПолейПечатныхФорм.Добавить("МенеджерПечати");
МассивПолейПечатныхФорм.Добавить("Представление");
МассивПолейПечатныхФорм.Добавить("Идентификатор");
МассивПолейПечатныхФорм.Добавить("Количество");
ПоляПечатныхФорм = СтрСоединить(МассивПолейПечатныхФорм, ", ");
КомандыПечати = ПолучитьКомандыПечатиСервер(ВидОбъекта);
МассивПолейКомандПечати = Новый Массив;
Для Каждого Колонка Из КомандыПечати.Колонки Цикл
МассивПолейКомандПечати.Добавить(Колонка.Имя);
КонецЦикла;
ПоляКомандПечати = СтрСоединить(МассивПолейКомандПечати, ", ");
СтрокиПечать = Новый Массив;
Отб = Новый Структура("Идентификатор, Представление");
Для Каждого СтрПечФорма Из ПечатныеФормы Цикл
Если СтрПечФорма.Количество <> 0 Тогда
ЗаполнитьЗначенияСвойств(Отб, СтрПечФорма);
НайденныеСтроки = КомандыПечати.НайтиСтроки(Отб);
Если НайденныеСтроки.Количество() = 1 Тогда
НовСтр = Новый Структура(ПоляПечатныхФорм);
ЗаполнитьЗначенияСвойств(НовСтр, СтрПечФорма);
СтруктураКоманд = Новый Структура(ПоляКомандПечати);
ЗаполнитьЗначенияСвойств(СтруктураКоманд, НайденныеСтроки[0]);
НовСтр.ОписаниеКоманды = СтруктураКоманд;
СтрокиПечать.Добавить(НовСтр);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат СтрокиПечать;
КонецФункции
//Выполняем печать испольуя сначала функцию УправлениеПечатьюСлужебныйКлиент
//в случае выдачи исключительной ситуации заполняем ОписаниеКоманды.Обработчик,
//для печатный форм не из менеджера объекта производим печать вызывая ПроизвестиПечатьИзОткрытыхОкон
&НаКлиенте
Процедура ВыполнитьПечатьПоСпискуДокументовКлиент(СтрокиПечать)
ОбработатьФоновуюПечать = Ложь;
ТекущиеОкна = ПолучитьОкна();
СписокОконДоПечати = Новый Массив;
Для Каждого ОкноКП Из ТекущиеОкна Цикл
СписокОконДоПечати.Добавить(ОкноКП);
КонецЦикла;
Если ПутьВывода.НайтиПоЗначению("Сохранить") <> Неопределено
И СоответствиеФорматов.Количество() = 0 Тогда
ЗаполнитьСоответствиеФорматовСохраненияТабличногоДокумента();
КонецЕсли;
Для Каждого Эл Из СписокДокументов Цикл
Для Каждого СтрПечФорма Из СтрокиПечать Цикл
СтрПечФорма.ОписаниеКоманды.ДополнительныеПараметры.Вставить("ИдентификаторПФ",
СтрПечФорма.Идентификатор);
Если ПодокументнаяОтправка Тогда
Для Инд = 1 По СтрПечФорма.Количество Цикл
ПечатьПоСтрокеПечатнойФормы(Эл,
СтрПечФорма,
1,
ОбработатьФоновуюПечать);
КонецЦикла;
Иначе
ПечатьПоСтрокеПечатнойФормы(Эл,
СтрПечФорма,
СтрПечФорма.Количество,
ОбработатьФоновуюПечать);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если ОбработатьФоновуюПечать Тогда
ПодключитьОбработчикОжидания("ПроизвестиОбработкуФоновойПечати", 1);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроизвестиОбработкуФоновойПечати() Экспорт
Перем лкПараметрыПечати,
лкДополнительныеПараметры,
лкИдентификаторПФ;
СоответствиеФоновойПечати = Новый Соответствие;
СписокОконПослеПечати = ПолучитьОкна();
Для Каждого ОкноПосле Из СписокОконПослеПечати Цикл
Если СписокОконДоПечати.Найти(ОкноПосле) <> Неопределено Тогда
Продолжить;
КонецЕсли;
Если ОкноПосле.Содержимое.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
ФормаОткрытая = ОкноПосле.Содержимое[0];
Если ФормаОткрытая.ИмяФормы = "ОбщаяФорма.ДлительнаяОперация" Тогда
Возврат;
ИначеЕсли ФормаОткрытая.ВладелецФормы <> ЭтаФорма Тогда
Продолжить;
ИначеЕсли ФормаОткрытая.ИмяФормы = "ОбщаяФорма.ПечатьДокументов" Тогда
Если ФормаОткрытая.ОбъектыПечати.Количество() Тогда
Если ФормаОткрытая.Параметры.Свойство("ПараметрыПечати", лкПараметрыПечати) = Ложь Тогда
Продолжить;
КонецЕсли;
Если лкПараметрыПечати.Свойство("ДополнительныеПараметры", лкДополнительныеПараметры) = Ложь Тогда
Продолжить;
КонецЕсли;
Если лкДополнительныеПараметры.Свойство("ИдентификаторПФ", лкИдентификаторПФ) = Ложь Тогда
Продолжить;
КонецЕсли;
СоотвествиеОбъектПечати = СоответствиеФоновойПечати.Получить(ФормаОткрытая.ОбъектыПечати[0].Значение);
Если СоотвествиеОбъектПечати = Неопределено Тогда
СоотвествиеОбъектПечати = Новый Соответствие;
МассивФорм = Новый Массив;
МассивФорм.Добавить(ФормаОткрытая);
СоотвествиеОбъектПечати.Вставить(лкИдентификаторПФ,
МассивФорм);
СоответствиеФоновойПечати.Вставить(ФормаОткрытая.ОбъектыПечати[0].Значение,
СоотвествиеОбъектПечати);
Иначе
МассивФорм = СоотвествиеОбъектПечати.Получить(лкИдентификаторПФ);
Если МассивФорм = Неопределено Тогда
МассивФорм = Новый Массив;
МассивФорм.Добавить(ФормаОткрытая);
СоотвествиеОбъектПечати.Вставить(лкИдентификаторПФ,
МассивФорм);
Иначе
МассивФорм.Добавить(ФормаОткрытая);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ОтключитьОбработчикОжидания("ПроизвестиОбработкуФоновойПечати");
МассивОбработкаНаСервере = Новый Массив;
СоответствиеПечФорм = Новый Соответствие;
Для Каждого Эл Из СписокДокументов Цикл
СоотвествиеОбъектПечати = СоответствиеФоновойПечати.Получить(Эл);
Если СоотвествиеОбъектПечати = Неопределено Тогда
Продолжить;
КонецЕсли;
Для Каждого СтрПечФорма Из СтрокиПечать Цикл
МассивФорм = СоотвествиеОбъектПечати.Получить(СтрПечФорма.ОписаниеКоманды.ДополнительныеПараметры.ИдентификаторПФ);
Если МассивФорм = Неопределено Тогда
Продолжить;
КонецЕсли;
Для Каждого ФормаОткрытая Из МассивФорм Цикл
Попытка
НапечататьИЗФормы(ФормаОткрытая,
ФормаОткрытая.ОбъектыПечати[0].Значение,
СтрПечФорма.Количество,
МассивОбработкаНаСервере,
СоответствиеПечФорм);
Исключение
ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации("Уппд.ФоноваяПечать",
"Ошибка",
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,
Истина);
КонецПопытки;
КонецЦикла;
КонецЦикла;
КонецЦикла;
ПостОбработкаКлиентПечать(МассивОбработкаНаСервере, СоответствиеПечФорм);
СоответствиеФорматов = Неопределено;
КонецПроцедуры
&НаКлиенте
Процедура ПостОбработкаКлиентПечать(МассивОбработкаНаСервере, СоответствиеПечФорм)
МассивОбработкаКлиент = ОбработатьПечатьИзОткрытыхОконСервер(МассивОбработкаНаСервере);
Если МассивОбработкаКлиент <> Неопределено Тогда
Для Каждого Эл Из МассивОбработкаКлиент Цикл
ПечатнаяФорма = СоответствиеПечФорм.Получить(Эл.ИДПечформы);
ПечатнаяФорма.Записать(Эл.ПолноеИмяФайла,
Эл.ТипФайла);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПечатьПоСтрокеПечатнойФормы(Эл,
СтрПечФорма,
Количество,
ОбработатьФоновуюПечать)
ОбъектыПечати = Новый Массив();
ОбъектыПечати.Добавить(Эл);
СтрПечФорма.ОписаниеКоманды.СразуНаПринтер = СразуНаПринтер;
СтрПечФорма.Форма = ЭтаФорма;
СтрПечФорма.ОбъектыПечати = ОбъектыПечати;
ОбработчикПечати = СтрПечФорма.ОписаниеКоманды.Обработчик;
СтрПечФорма.ОписаниеКоманды.ДополнительныеПараметры.Вставить("Экземпляров", Количество);
Если СразуНаПринтер Тогда
СтрПечФорма.Вставить("СразуНаПринтер", Истина);
КонецЕсли;
Отказ = Ложь;
Попытка
УправлениеПечатьюСлужебныйКлиент.ОбработчикКоманды(ОбъектыПечати, СтрПечФорма);
ПроизвестиПечатьИзОткрытыхОкон(Количество,
ОбработатьФоновуюПечать,
Эл,
СтрПечФорма.ОписаниеКоманды.ДополнительныеПараметры.ИдентификаторПФ);
Исключение
Отказ = Истина;
ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации("Уппд.ПечатьПоСтроке",
"Ошибка",
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,
Истина);
КонецПопытки;
Если Отказ Тогда
СтрПечФорма.ОписаниеКоманды.Обработчик = ОбработчикПечати;
Попытка
УправлениеПечатьюСлужебныйКлиент.ОбработчикКоманды(ОбъектыПечати, СтрПечФорма);
Исключение
лкИнформацияОбОшибке = ИнформацияОбОшибке();
Сообщить("При печати печатной формы"
+ СтрПечФорма.Представление
+ " по документу "
+ Строка(Эл)
+ " возникла ошибка: "
+ КраткоеПредставлениеОшибки(лкИнформацияОбОшибке));
ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации("Уппд.ПечатьПоСтроке",
"Ошибка",
ОбработкаОшибок.ПодробноеПредставлениеОшибки(лкИнформацияОбОшибке),,
Истина);
КонецПопытки;
ПроизвестиПечатьИзОткрытыхОкон(Количество,
ОбработатьФоновуюПечать,
Эл,
СтрПечФорма.ОписаниеКоманды.ДополнительныеПараметры.ИдентификаторПФ);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьСоответствиеФорматовСохраненияТабличногоДокумента()
СоответствиеФорматов.Добавить(ТипФайлаТабличногоДокумента.PDF_A_3, "pdf");
СоответствиеФорматов.Добавить(ТипФайлаТабличногоДокумента.MXL, "mxl");
СоответствиеФорматов.Добавить(ТипФайлаТабличногоДокумента.XLSX, "xlsx");
СоответствиеФорматов.Добавить(ТипФайлаТабличногоДокумента.XLS, "xls");
СоответствиеФорматов.Добавить(ТипФайлаТабличногоДокумента.ODS, "ods");
СоответствиеФорматов.Добавить(ТипФайлаТабличногоДокумента.DOCX, "docx");
СоответствиеФорматов.Добавить(ТипФайлаТабличногоДокумента.HTML5, "html");
СоответствиеФорматов.Добавить(ТипФайлаТабличногоДокумента.TXT, "txt");
СоответствиеФорматов.Добавить(ТипФайлаТабличногоДокумента.ANSITXT, "txt");
КонецПроцедуры
&НаСервере
Функция ЗначениеИзСтрокиXML(СтрокаXML)
Возврат ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаXML);
КонецФункции
&НаСервере
Функция ИмяФайлаПечатнойФормыОбъекта(ОбъектПечати, ЗаданныеИменаПечатныхФорм, Название)
Возврат УправлениеПечатью.ИмяФайлаПечатнойФормыОбъекта(ОбъектПечати, ЗаданныеИменаПечатныхФорм, Название);
КонецФункции
&НаКлиенте
Процедура НапечататьИЗФормы(ФормаОткрытая,
ОбъектПечати,
ЧислоЭкземпляров,
МассивОбработкаНаСервере,
СоответствиеПечФорм)
Если ПодокументнаяОтправка Тогда
ФормаОткрытая.Копий = 1;
Иначе
ФормаОткрытая.Копий = ЧислоЭкземпляров;
КонецЕсли;
Для Каждого НастройкаПечатнойФормы Из ФормаОткрытая.НастройкиПечатныхФорм Цикл
Если НастройкаПечатнойФормы.Печатать Тогда
ПечатнаяФорма = ФормаОткрытая[НастройкаПечатнойФормы.ИмяРеквизита];
Если ПодокументнаяОтправка Тогда
ПечатнаяФорма.КоличествоЭкземпляров = 1;
Иначе
ПечатнаяФорма.КоличествоЭкземпляров = ЧислоЭкземпляров;
КонецЕсли;
Если ПутьВывода.НайтиПоЗначению("На принтер") <> Неопределено Тогда
ПечатнаяФорма.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
КонецЕсли;
Если ПутьВывода.НайтиПоЗначению("Сохранить") <> Неопределено Тогда
ИДПечформы = Новый УникальныйИдентификатор();
Если ВариантСохранения = "СохранитьВПапку" Тогда
Для Каждого ФорматСохранения Из ВыбранныеФорматыСохранения Цикл
ЗаданныеИменаПечатныхФорм = ЗначениеИзСтрокиXML(НастройкаПечатнойФормы.ИмяФайлаПечатнойФормы);
СтрТабДок = Новый Структура(
"ВидОбработки,
|ОбъектПечати,
|ЗаданныеИменаПечатныхФорм,
|НастройкаПечатнойФормы_Название,
|ПечатнаяФорма,
|ФорматСохранения_Значение,
|ИДПечформы");
СтрТабДок.ВидОбработки = "ЗаписьВФайл";
СтрТабДок.ОбъектПечати = ОбъектПечати;
СтрТабДок.ЗаданныеИменаПечатныхФорм = ЗаданныеИменаПечатныхФорм;
СтрТабДок.НастройкаПечатнойФормы_Название = НастройкаПечатнойФормы.Название;
СтрТабДок.ПечатнаяФорма = ПечатнаяФорма;
СтрТабДок.ФорматСохранения_Значение = ФорматСохранения.Значение;
СтрТабДок.ИДПечформы = ИДПечформы;
МассивОбработкаНаСервере.Добавить(СтрТабДок);
КонецЦикла;
Иначе
Для Каждого ФорматСохранения Из ВыбранныеФорматыСохранения Цикл
ПотокФайла = Новый ПотокВПамяти();
ПечатнаяФорма.Записать(ПотокФайла, ФорматСохранения.Значение);
ДвоичныеДанныеФайла = ПотокФайла.ЗакрытьИПолучитьДвоичныеДанные();
ЗаданныеИменаПечатныхФорм = ЗначениеИзСтрокиXML(НастройкаПечатнойФормы.ИмяФайлаПечатнойФормы);
СтрТабДок = Новый Структура(
"ВидОбработки,
|ЗаданныеИменаПечатныхФорм,
|НастройкаПечатнойФормы_Название,
|ОбъектПечати,
|ДвоичныеДанныеФайла,
|ФорматСохранения_Значение,
|ИДПечформы");
СтрТабДок.ВидОбработки = "ПрикрепитьКДокументу";
СтрТабДок.ЗаданныеИменаПечатныхФорм = ЗаданныеИменаПечатныхФорм;
СтрТабДок.НастройкаПечатнойФормы_Название = НастройкаПечатнойФормы.Название;
СтрТабДок.ОбъектПечати = ОбъектПечати;
СтрТабДок.ДвоичныеДанныеФайла = ДвоичныеДанныеФайла;
СтрТабДок.ФорматСохранения_Значение = ФорматСохранения.Значение;
СтрТабДок.ИДПечформы = ИДПечформы;
МассивОбработкаНаСервере.Добавить(СтрТабДок);
КонецЦикла;
КонецЕсли;
СоответствиеПечФорм.Вставить(ИДПечформы, ПечатнаяФорма);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ПутьВывода.НайтиПоЗначению("На экран") = Неопределено Тогда
ФормаОткрытая.Закрыть();
КонецЕсли;
КонецПроцедуры
//Для печатных форм не из менеджера печати
//обходим открывшиеся в момент печати формы и вызываем из них печать
&НаКлиенте
Процедура ПроизвестиПечатьИзОткрытыхОкон(ЧислоЭкземпляров,
ОбработатьФоновуюПечать,
ОбъектПечати,
ИдентификаторПФ)
Перем лкПараметрыПечати,
лкДополнительныеПараметры,
лкИдентификаторПФ;
//Закоммент - тестирование фоновой печати
//ОбработатьФоновуюПечать = Истина;
//Закоммент - тестирование фоновой печати
Если ОбработатьФоновуюПечать Тогда
Возврат;
КонецЕсли;
НайденаФорма = Ложь;
СписокОконПослеПечати = ПолучитьОкна();
МассивОбработкаНаСервере = Новый Массив;
СоответствиеПечФорм = Новый Соответствие;
Для Каждого ОкноПосле Из СписокОконПослеПечати Цикл
Если СписокОконДоПечати.Найти(ОкноПосле) <> Неопределено Тогда
Продолжить;
ИначеЕсли ОкноПосле.Содержимое.Количество() = 0 Тогда
СписокОконДоПечати.Добавить(ОкноПосле);
Иначе
ФормаОткрытая = ОкноПосле.Содержимое[0];
Попытка
Если ФормаОткрытая.ВладелецФормы <> ЭтаФорма Тогда
СписокОконДоПечати.Добавить(ОкноПосле);
Продолжить;
КонецЕсли;
Если ФормаОткрытая.ИмяФормы = "ОбщаяФорма.ДлительнаяОперация" Тогда
СписокОконДоПечати.Добавить(ОкноПосле);
ОбработатьФоновуюПечать = Истина;
Прервать;
КонецЕсли;
Если ФормаОткрытая.Параметры.Свойство("ПараметрыПечати", лкПараметрыПечати) = Ложь Тогда
СписокОконДоПечати.Добавить(ОкноПосле);
ОбработатьФоновуюПечать = Истина;
Продолжить;
КонецЕсли;
Если лкПараметрыПечати.Свойство("ДополнительныеПараметры", лкДополнительныеПараметры) = Ложь Тогда
СписокОконДоПечати.Добавить(ОкноПосле);
ОбработатьФоновуюПечать = Истина;
Продолжить;
КонецЕсли;
Если лкДополнительныеПараметры.Свойство("ИдентификаторПФ", лкИдентификаторПФ) = Ложь Тогда
СписокОконДоПечати.Добавить(ОкноПосле);
ОбработатьФоновуюПечать = Истина;
КонецЕсли;
Если лкИдентификаторПФ <> ИдентификаторПФ Тогда
Продолжить;
КонецЕсли;
Если ФормаОткрытая.ОбъектыПечати.НайтиПоЗначению(ОбъектПечати) = Неопределено Тогда
Продолжить;
КонецЕсли;
НайденаФорма = Истина;
СписокОконДоПечати.Добавить(ФормаОткрытая);
НапечататьИЗФормы(ФормаОткрытая,
ФормаОткрытая.ОбъектыПечати[0].Значение,
ЧислоЭкземпляров,
МассивОбработкаНаСервере,
СоответствиеПечФорм);
Исключение
ОбработатьФоновуюПечать = Истина;
ЖурналРегистрацииКлиент.ДобавитьСообщениеДляЖурналаРегистрации("Уппд.ПечатьИзОткрытыхОкон",
"Ошибка",
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()),,
Истина);
КонецПопытки;
КонецЕсли;
КонецЦикла;
ПостОбработкаКлиентПечать(МассивОбработкаНаСервере, СоответствиеПечФорм);
Если НайденаФорма = Ложь Тогда
ОбработатьФоновуюПечать = Истина;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ОбработатьПечатьИзОткрытыхОконСервер(МассивОбработкаНаСервере)
МассивОбработкаКлиент = Новый Массив;
Для Каждого Эл Из МассивОбработкаНаСервере Цикл
Если Эл.ВидОбработки = "ЗаписьВФайл" Тогда
Элемент_РасширениеФайла = СоответствиеФорматов.НайтиПоЗначению(Эл.ФорматСохранения_Значение);
РасширениеФайла = Элемент_РасширениеФайла.Представление;
ИмяФайла = ИмяФайлаПечатнойФормыОбъекта(Эл.ОбъектПечати,
Эл.ЗаданныеИменаПечатныхФорм,
Эл.НастройкаПечатнойФормы_Название);
ИмяФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайла);
ИмяФайлаСРасширением = ИмяФайла + "." + РасширениеФайла;
ПолноеИмяФайла = КаталогСохраненияПоУмолчанию + "\" + ИмяФайлаСРасширением;
МаксимальнаяДлина = 218; // https://docs.microsoft.com/en-us/office/troubleshoot/office-suite-issues/error-open-document
Если Эл.ФорматСохранения_Значение = ТипФайлаТабличногоДокумента.XLS И СтрДлина(ПолноеИмяФайла) > МаксимальнаяДлина Тогда
МаксимальнаяДлина = МаксимальнаяДлина - 5; // Резерв для формирования уникального имени.
Если СтрДлина(КаталогСохраненияПоУмолчанию) < МаксимальнаяДлина Тогда
ИмяФайла = Лев(ИмяФайла, МаксимальнаяДлина - СтрДлина(КаталогСохраненияПоУмолчанию) - СтрДлина(РасширениеФайла) - 1);
ИмяФайлаСРасширением = ИмяФайла + "." + РасширениеФайла;
ПолноеИмяФайла = КаталогСохраненияПоУмолчанию + ИмяФайлаСРасширением;
КонецЕсли;
КонецЕсли;
ПолноеИмяФайла = ФайловаяСистемаСлужебныйКлиентСервер.УникальноеИмяФайла(ПолноеИмяФайла);
МассивОбработкаКлиент.Добавить(Новый Структура("ВидОбработки, ПолноеИмяФайла, ТипФайла, ИДПечформы",
Эл.ВидОбработки,
ПолноеИмяФайла,
Эл.ФорматСохранения_Значение,
Эл.ИДПечформы));
ИначеЕсли Эл.ВидОбработки = "ПрикрепитьКДокументу" Тогда
УИДХранения = Новый УникальныйИдентификатор();
АдресФайлаВоВременномХранилище = ПоместитьВоВременноеХранилище(Эл.ДвоичныеДанныеФайла, УИДХранения);
Элемент_РасширениеФайла = СоответствиеФорматов.НайтиПоЗначению(Эл.ФорматСохранения_Значение);
РасширениеФайла = Элемент_РасширениеФайла.Представление;
ИмяФайла = ИмяФайлаПечатнойФормыОбъекта(Эл.ОбъектПечати, Эл.ЗаданныеИменаПечатныхФорм, Эл.НастройкаПечатнойФормы_Название);
ИмяФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ИмяФайла);
ИмяФайлаСРасширением = ИмяФайла + "." + РасширениеФайла;
МаксимальнаяДлина = 218; // https://docs.microsoft.com/en-us/office/troubleshoot/office-suite-issues/error-open-document
Если Эл.ФорматСохранения_Значение = ТипФайлаТабличногоДокумента.XLS И СтрДлина(ИмяФайлаСРасширением) > МаксимальнаяДлина Тогда
МаксимальнаяДлина = МаксимальнаяДлина - 5; // Резерв для формирования уникального имени.
ИмяФайла = Лев(ИмяФайла, МаксимальнаяДлина - СтрДлина(РасширениеФайла) - 1);
ИмяФайлаСРасширением = ИмяФайла + "." + РасширениеФайла;
КонецЕсли;
ИмяФайлаСРасширением = ФайловаяСистемаСлужебныйКлиентСервер.УникальноеИмяФайла(ИмяФайлаСРасширением);
ПрикрепитьФайлСервер(АдресФайлаВоВременномХранилище,
Эл.ОбъектПечати,
ИмяФайлаСРасширением);
КонецЕсли;
КонецЦикла;
Возврат МассивОбработкаКлиент;
КонецФункции
&НаСервере
Процедура ПрикрепитьФайлСервер(АдресФайлаВоВременномХранилище, ОбъектПечати, ИмяФайла)
ПараметрыФайла = РаботаСФайлами.ПараметрыДобавленияФайла();
ПараметрыФайла.ВладелецФайлов = ОбъектПечати;
ПараметрыФайла.ИмяБезРасширения = ИмяФайла;
РаботаСФайлами.ДобавитьФайл(ПараметрыФайла,
АдресФайлаВоВременномХранилище);
КонецПроцедуры
//Разделяя строку ВидОбъекта через . получаем ИмяОбъекта и ТипОбъекта
&НаСервереБезКонтекста
Функция ПолучитьДанныеВидаОбъекта(Знач ВидОбъекта)
РазделеннаяСтрокаВидаОбъекта = СтрРазделить(ВидОбъекта, ".");
Если РазделеннаяСтрокаВидаОбъекта.ВГраница() < 1 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Перевыберите вид документа / справочника";
Сообщение.Поле = "ВидОбъекта";
Сообщение.Сообщить();
Возврат Неопределено;
КонецЕсли;
ТипОбъекта = РазделеннаяСтрокаВидаОбъекта[0];
Если ТипОбъекта = "Справочник" Тогда
ТипОбъекта = "Справочники";
ИначеЕсли ТипОбъекта = "Документ" Тогда
ТипОбъекта = "Документы";
КонецЕсли;
ИмяОбъекта = РазделеннаяСтрокаВидаОбъекта[1];
СтруктураРезультат = Новый Структура("ТипОбъекта, ИмяОбъекта",
ТипОбъекта, ИмяОбъекта);
Возврат СтруктураРезультат;
КонецФункции
#КонецОбласти
#Область НастройкиПользователя
//Сохраним настройки ПечатныеФормы в ХранилищеОбщихНастроек
&НаСервере
Процедура СохранитьНастройкиСервер()
ТаблПечатныеФормы = ПечатныеФормы.Выгрузить();
ХранилищеОбщихНастроек.Сохранить("УниверсальнаяПакетнаяПечатьДокументов",
ВидОбъекта,
ТаблПечатныеФормы);
КонецПроцедуры
//Загружаем настройку из ХранилищеОбщихНастроек и заполняем ПечатныеФормы
&НаСервере
Процедура ВосстановитьНастройку(ТаблКомандПечати)
СохраненныеНастройки = ХранилищеОбщихНастроек.Загрузить("УниверсальнаяПакетнаяПечатьДокументов",
ВидОбъекта);
Если ТипЗнч(СохраненныеНастройки) = Тип("ТаблицаЗначений")
И СохраненныеНастройки.Колонки.Найти("Идентификатор") <> Неопределено
И СохраненныеНастройки.Колонки.Найти("Представление") <> Неопределено Тогда
Отб = Новый Структура("Идентификатор, Представление");
Для Каждого ЭлКомандаПечати Из ТаблКомандПечати Цикл
ЗаполнитьЗначенияСвойств(Отб, ЭлКомандаПечати);
НайденныеСтроки = СохраненныеНастройки.НайтиСтроки(Отб);
Если НайденныеСтроки.Количество() = 0 Тогда
СтрПечФорма = ПечатныеФормы.Добавить();
ЗаполнитьЗначенияСвойств(СтрПечФорма, ЭлКомандаПечати);
КонецЕсли;
КонецЦикла;
МассивСтрокУдаление = Новый Массив;
Для Каждого ЭлПечатнаяформа Из СохраненныеНастройки Цикл
ЗаполнитьЗначенияСвойств(Отб, ЭлКомандаПечати);
НайденныеСтроки = ТаблКомандПечати.НайтиСтроки(Отб);
Если НайденныеСтроки.Количество() = 0 Тогда
МассивСтрокУдаление.Добавить(ЭлПечатнаяформа);
КонецЕсли;
КонецЦикла;
Для Каждого СтрУдаление Из МассивСтрокУдаление Цикл
СохраненныеНастройки.Удалить(СтрУдаление);
КонецЦикла;
ПечатныеФормы.Загрузить(СохраненныеНастройки);
Иначе
ПечатныеФормы.Загрузить(ТаблКомандПечати);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ТаблицаДокументовПриОбновленииСоставаПользовательскихНастроекНаСервере(СтандартнаяОбработка)
Элементы.ТаблицаДокументов.СоздатьЭлементыФормыПользовательскихНастроек(Элементы.СписокКомпоновщикНастроекПользовательскиеНастройки,
РежимОтображенияНастроекКомпоновкиДанных.БыстрыйДоступ);
КонецПроцедуры
//Сохраним в ХранилищеПользовательскихНастроекДинамическихСписков ПользовательскиеНастройки для ТаблицаДокументов
&НаСервере
Процедура ТаблицаДокументовПриСохраненииПользовательскихНастроекНаСервере(Элемент, Настройки)
Если ЗначениеЗаполнено(ТаблицаДокументов.КлючТекущихПользовательскихНастроек) Тогда
ХранилищеПользовательскихНастроекДинамическихСписков.Сохранить("УППД",
ТаблицаДокументов.КлючТекущихПользовательскихНастроек,
ТаблицаДокументов.КомпоновщикНастроек.ПользовательскиеНастройки,
,
ПараметрыСеанса.ТекущийПользователь);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПечатныеФормыПриИзменении(Элемент)
СохранитьНастройкиСервер();
КонецПроцедуры
//Скопируем строчку печатной формы и сохраним настройки
&НаКлиенте
Процедура СкопироватьПечатнуюФорму(Команда)
ТекСтр = Элементы.ПечатныеФормы.ТекущиеДанные;
Если ТекСтр = Неопределено Тогда
Возврат;
КонецЕсли;
НоваяСтрока = ПечатныеФормы.Вставить(ПечатныеФормы.Индекс(ТекСтр) + 1);
ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтр);
СохранитьНастройкиСервер();
КонецПроцедуры
//Удалим строчку печатной формы и сохраним настройки
&НаКлиенте
Процедура УдалитьПечатнуюФорму(Команда)
ТекСтр = Элементы.ПечатныеФормы.ТекущиеДанные;
Если ТекСтр = Неопределено Тогда
Возврат;
КонецЕсли;
ИндексТекущейСтроки = ПечатныеФормы.Индекс(ТекСтр);
Отб = Новый Структура("Идентификатор, Представление");
ЗаполнитьЗначенияСвойств(Отб, ТекСтр);
НайденныеСтроки = ПечатныеФормы.НайтиСтроки(Отб);
Если НайденныеСтроки.Количество() < 2 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Последняя строчка печатной формы не удаляется";
Сообщение.Поле = "ПечатныеФормы[" + Формат(ИндексТекущейСтроки, "ЧГ=0") + "]";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
ПечатныеФормы.Удалить(ИндексТекущейСтроки);
СохранитьНастройкиСервер();
КонецПроцедуры
&НаКлиенте
Процедура Настройки(Команда)
ОповещениеПослеЗакрытияНастроек = Новый ОписаниеОповещения("ПослеЗакрытияОкнаНастроек",
ЭтаФорма);
ПараметрыФормы = Новый Структура("ПодокументнаяОтправка,
|МассивФорматов,
|ВариантСохранения,
|КаталогСохраненияПоУмолчанию",
ПодокументнаяОтправка,
ВыбранныеФорматыСохранения.ВыгрузитьЗначения(),
ВариантСохранения,
КаталогСохраненияПоУмолчанию);
ОткрытьФорму("ВнешняяОбработка.дк_УниверсальнаяПакетнаяПечатьДокументов.Форма.ФормаНастройки",
ПараметрыФормы,
ЭтаФорма,
,
,
,
ОповещениеПослеЗакрытияНастроек);
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗакрытияОкнаНастроек(РезультатЗакрытия,
ДополнительныеПараметры) Экспорт
Если РезультатЗакрытия = Истина Тогда
ЗагрузитьОбщиеНастройки();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьОбщиеНастройки()
Перем МассивФорматов;
ОбщиеНастройки = ХранилищеОбщихНастроек.Загрузить("УниверсальнаяПакетнаяПечатьДокументов",
"ОбщиеНастройки");
Если ТипЗнч(ОбщиеНастройки) = Тип("Структура") Тогда
ОбщиеНастройки.Свойство("ПодокументнаяОтправка", ПодокументнаяОтправка);
ОбщиеНастройки.Свойство("КаталогСохраненияПоУмолчанию", КаталогСохраненияПоУмолчанию);
Если ОбщиеНастройки.Свойство("МассивФорматов", МассивФорматов) Тогда
ВыбранныеФорматыСохранения.ЗагрузитьЗначения(МассивФорматов);
КонецЕсли;
ОбщиеНастройки.Свойство("ВариантСохранения", ВариантСохранения);
КонецЕсли;
Настройки_ПутьВывода = ХранилищеОбщихНастроек.Загрузить("УниверсальнаяПакетнаяПечатьДокументов",
"ПутьВывода");
Если ТипЗнч(Настройки_ПутьВывода) = Тип("Массив") Тогда
ПутьВывода.ЗагрузитьЗначения(Настройки_ПутьВывода);
КонецЕсли;
Если ПутьВывода.Количество() = 0 Тогда
ПутьВывода.Добавить("На экран",
"На экран",
Истина);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПутьВыводаАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, Ожидание, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ДанныеВыбора = Новый СписокЗначений;
ДанныеВыбора.Добавить("На принтер", "На принтер", Ложь);
ДанныеВыбора.Добавить("На экран", "На экран", Ложь);
ДанныеВыбора.Добавить("Сохранить", "Сохранить", Ложь);
КонецПроцедуры
&НаСервере
Процедура ПутьВыводаПриИзмененииНаСервере()
ХранилищеОбщихНастроек.Сохранить("УниверсальнаяПакетнаяПечатьДокументов",
"ПутьВывода",
ПутьВывода.ВыгрузитьЗначения());
КонецПроцедуры
&НаКлиенте
Процедура ПутьВыводаПриИзменении(Элемент)
ПутьВыводаПриИзмененииНаСервере();
КонецПроцедуры
#КонецОбласти
Можно скачать файл обработки для всех платформ 1С и так же для версии от 8.3.24.1201, использующий добавленный функционал работы со списками.
Проверено на следующих конфигурациях и релизах:
- Управление торговлей, редакция 11, релизы 11.5.13.109
- Бухгалтерия предприятия, редакция 3.0, релизы 3.0.153.18