//---------------------------------------------
// Модуль менеджера документа
//---------------------------------------------
// Формирует печатные формы.
//
// Параметры:
// МассивОбъектов - Массив - ссылки на объекты, которые нужно распечатать;
// ПараметрыПечати - Структура - дополнительные настройки печати;
// КоллекцияПечатныхФорм - ТаблицаЗначений - сформированные табличные документы (выходной параметр),
// см. УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм.
// ОбъектыПечати - СписокЗначений - значение - ссылка на объект;
// представление - имя области в которой был выведен объект (выходной
// параметр);
// ПараметрыВывода - Структура - дополнительные параметры сформированных табличных документов (выходной
// параметр).
//
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// печать Приказ об организации прохождения практики
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ПриказОбОрганизацииПрохожденияПрактики");
Если ПечатнаяФорма <> Неопределено Тогда
ИмяМакета = "ПриказОбОрганизацииПрохожденияПрактики";
МакетИДанныеОбъекта = УправлениеПечатьюВызовСервера.МакетыИДанныеОбъектовДляПечати(
"Документ.ПриказОбОрганизацииПрохожденияПрактики",
ИмяМакета,
МассивОбъектов);
ОфисныеДокументы = Новый Соответствие;
Шаблон = НСтр("ru = 'Приказ об организации прохождения практики №[Номер] от [Дата]'");
ЗначенияРеквизитовДокументов = ОбщегоНазначения.ЗначенияРеквизитовОбъектов(МассивОбъектов, "Номер, Дата, Ссылка");
Для Каждого Ссылка Из МассивОбъектов Цикл
ЗначенияРеквизитовДокумента = ЗначенияРеквизитовДокументов[Ссылка];
ЗначенияРеквизитовДокумента.Дата = Формат(ЗначенияРеквизитовДокумента.Дата, "ДЛФ=D");
ЗначенияРеквизитовДокумента.Номер = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(
ЗначенияРеквизитовДокумента.Номер);
ИмяДокумента = СтроковыеФункцииКлиентСервер.ВставитьПараметрыВСтроку(Шаблон, ЗначенияРеквизитовДокументов[Ссылка]);
АдресХранилищаОфисныйДокумент = ПодготовитьДокументПриказ(Ссылка,
МакетИДанныеОбъекта,
ИмяМакета);
ОфисныеДокументы.Вставить(АдресХранилищаОфисныйДокумент, ИмяДокумента);
КонецЦикла;
ПечатнаяФорма.СинонимМакета = НСтр("ru = 'Приказ об организации прохождения практики'");
ПечатнаяФорма.ОфисныеДокументы = ОфисныеДокументы;
КонецЕсли;
КонецПроцедуры
Функция ПолучитьДанныеПечати(Знач МассивДокументов, Знач МассивИменМакетов) Экспорт
ДанныеПоВсемОбъектам = Новый Соответствие;
ОписаниеОбластей = Новый Соответствие;
ДвоичныеДанныеМакетов = Новый Соответствие;
ДвоичныеДанныеБланков = Новый Соответствие;
ТипыМакетов = Новый Соответствие;
СоответствиеИмениМакетаПути = ШаблоныПриказовСерверПовтИсп.ПолучитьСоответствиеИменМакетовИПутей();
Для Каждого ОбъектСсылка Из МассивДокументов Цикл
ДанныеОбъектаПоМакетам = Новый Соответствие;
Для Каждого ИмяМакета Из МассивИменМакетов Цикл
Если ИмяМакета = "ПриказОбОрганизацииПрохожденияПрактики" Тогда
ДанныеОбъектаПоМакетам.Вставить(ИмяМакета, ПолучитьДанныеПриказа(ОбъектСсылка));
КонецЕсли;
ДвоичныеДанныеМакета = УправлениеПечатью.МакетПечатнойФормы(СоответствиеИмениМакетаПути[ИмяМакета]);
ДвоичныеДанныеМакетов.Вставить(ИмяМакета, ДвоичныеДанныеМакета);
КонецЦикла;
ДанныеПоВсемОбъектам.Вставить(ОбъектСсылка, ДанныеОбъектаПоМакетам);
КонецЦикла;
Для Каждого ИмяМакета Из МассивИменМакетов Цикл
ТипыМакетов.Вставить(ИмяМакета, "DOC");
ОписаниеОбластей.Вставить(ИмяМакета, ПолучитьОписаниеОбластейМакетаОфисногоДокумента());
КонецЦикла;
Макеты = Новый Структура;
Макеты.Вставить("ОписаниеОбластей", ОписаниеОбластей);
Макеты.Вставить("ТипыМакетов", ТипыМакетов);
Макеты.Вставить("ДвоичныеДанныеМакетов", ДвоичныеДанныеМакетов);
Результат = Новый Структура;
Результат.Вставить("Данные", ДанныеПоВсемОбъектам);
Результат.Вставить("Макеты", Макеты);
Возврат Результат;
КонецФункции
Функция ПодготовитьДокументПриказ(ДокументСсылка, МакетИДанныеОбъекта, ИмяМакета)
ТипМакета = МакетИДанныеОбъекта.Макеты.ТипыМакетов[ИмяМакета];
ДвоичныеДанныеМакетов = МакетИДанныеОбъекта.Макеты.ДвоичныеДанныеМакетов;
Области = МакетИДанныеОбъекта.Макеты.ОписаниеОбластей;
ДанныеОбъекта = МакетИДанныеОбъекта.Данные[ДокументСсылка][ИмяМакета];
Макет = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(
ДвоичныеДанныеМакетов[ИмяМакета],
ТипМакета,
ИмяМакета);
// Бланк необходим для вывода особенных колонтитулов
ЕстьБланк = ЗначениеЗаполнено(ДанныеОбъекта.БланкДвоичныеДанные);
МакетДляКолонтитулов = Макет;
Если ЕстьБланк Тогда
МакетДляКолонтитулов = УправлениеПечатью.ИнициализироватьМакетОфисногоДокумента(
ДанныеОбъекта.БланкДвоичныеДанные,
"DOC",
ИмяМакета);
КонецЕсли;
Если Макет = Неопределено Тогда
Возврат "";
КонецЕсли;
ЗакрытьОкноПечатнойФормы = Ложь;
Попытка
ПечатнаяФорма = УправлениеПечатью.ИнициализироватьПечатнуюФорму(
ТипМакета,
Макет.НастройкиСтраницыМакета,
МакетДляКолонтитулов);
Если ПечатнаяФорма = Неопределено Тогда
УправлениеПечатью.ОчиститьСсылки(Макет);
Возврат "";
КонецЕсли;
МакетДляКолонтитулов.СтруктураДокумента.КаталогКартинок = ПечатнаяФорма.СтруктураДокумента.КаталогКартинок;
// Вывод верхнего титульного колонтитула
Область = УправлениеПечатью.ОбластьМакета(МакетДляКолонтитулов, Области[ИмяМакета]["ВерхнийТитульныйКолонтитул"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта.Шапка, Ложь);
// Вывод верхнего колонтитула
Область = УправлениеПечатью.ОбластьМакета(МакетДляКолонтитулов, Области[ИмяМакета]["ВерхнийКолонтитул"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта.Шапка, Ложь);
// Вывод шапки документа - даты/номера документа
Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["Шапка"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта.Шапка, Ложь);
// Вывод заголовка
Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["Заголовок"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта.Шапка, Ложь);
// Вывод преамбулы
Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["Преамбула"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта.Шапка, Ложь);
// Вывод таблицы ПунктыПриказа
Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["ПунктыПриказа"]);
УправлениеПечатью.ПрисоединитьИЗаполнитьКоллекцию(ПечатнаяФорма, Область, ДанныеОбъекта.ТабличнаяЧасть, Ложь);
// Вывод нижней части документа - обычная область с параметрами.
Область = УправлениеПечатью.ОбластьМакета(Макет, Области[ИмяМакета]["Подвал"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта.Шапка, Ложь);
// Вывод нижнего колонтитула
Область = УправлениеПечатью.ОбластьМакета(МакетДляКолонтитулов, Области[ИмяМакета]["НижнийКолонтитул"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта.Шапка, Ложь);
// Вывод нижнего титульного колонтитула
Область = УправлениеПечатью.ОбластьМакета(МакетДляКолонтитулов, Области[ИмяМакета]["НижнийТитульныйКолонтитул"]);
УправлениеПечатью.ПрисоединитьОбластьИЗаполнитьПараметры(ПечатнаяФорма, Область, ДанныеОбъекта.Шапка, Ложь);
АдресХранилищаПечатнойФормы = УправлениеПечатью.СформироватьДокумент(ПечатнаяФорма);
Исключение
ОбщегоНазначения.СообщитьПользователю(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
ЗакрытьОкноПечатнойФормы = Истина;
Возврат "";
КонецПопытки;
УправлениеПечатью.ОчиститьСсылки(ПечатнаяФорма, ЗакрытьОкноПечатнойФормы);
УправлениеПечатью.ОчиститьСсылки(Макет);
УправлениеПечатью.ОчиститьСсылки(МакетДляКолонтитулов);
Возврат АдресХранилищаПечатнойФормы;
КонецФункции
Функция ПолучитьДанныеПриказа(ОбъектСсылка)
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить("БланкДвоичныеДанные", Неопределено);
СтруктураДанных.Вставить("Шапка", Неопределено);
СтруктураДанных.Вставить("ТабличнаяЧасть", Новый Массив);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Приказ.Номер КАК Номер,
| Приказ.Дата КАК Дата,
| Приказ.ЗаголовокПриказа КАК ТекстЗаголовока,
| Приказ.ПреамбулаПриказа КАК ТекстПреамбулы,
| Приказ.Организация КАК Организация,
| Приказ.Подразделение КАК Подразделение
|ПОМЕСТИТЬ ДанныеДокумента
|ИЗ
| Документ.ПриказОбОрганизацииПрохожденияПрактики КАК Приказ
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ФизическиеЛица КАК ФизическиеЛица
| ПО Приказ.Подписывающий.ФизическоеЛицо = ФизическиеЛица.Ссылка
|ГДЕ
| Приказ.Ссылка = &ОбъектСсылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Бланки.Файл КАК Файл
|ИЗ
| Справочник.БланкиПриказовПисем КАК Бланки
|ГДЕ
| Бланки.ТипБланка = ЗНАЧЕНИЕ(Перечисление.ТипыБланков.Приказ)
| И (Бланки.Организация, Бланки.Подразделение) В
| (ВЫБРАТЬ
| ДанныеДокумента.Организация КАК Организация,
| ДанныеДокумента.Подразделение КАК Подразделение
| ИЗ
| ДанныеДокумента КАК ДанныеДокумента)
| И Бланки.Файл <> ЗНАЧЕНИЕ(Справочник.БланкиПриказовПисемПрисоединенныеФайлы.ПустаяСсылка)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДанныеДокумента.Номер КАК Номер,
| ДанныеДокумента.Дата КАК Дата,
| ДанныеДокумента.ТекстЗаголовока КАК ТекстЗаголовока,
| ДанныеДокумента.ТекстПреамбулы КАК ТекстПреамбулы
|ИЗ
| ДанныеДокумента КАК ДанныеДокумента
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Приказ.СодержаниеПункта КАК ТекстПункта
|ИЗ
| Документ.ПриказОбОрганизацииПрохожденияПрактики.ПунктыПриказа КАК Приказ
|ГДЕ
| Приказ.Ссылка = &ОбъектСсылка
|
|УПОРЯДОЧИТЬ ПО
| Приказ.НомерСтроки";
Запрос.УстановитьПараметр("ОбъектСсылка", ОбъектСсылка);
РезультатыЗапроса = Запрос.ВыполнитьПакет();
ГраницаРезультатов = РезультатыЗапроса.ВГраница();
Если РезультатыЗапроса[ГраницаРезультатов - 1].Пустой() Тогда
Возврат СтруктураДанных;
КонецЕсли;
ТаблицаДанных = РезультатыЗапроса[ГраницаРезультатов - 1].Выгрузить();
СтруктураДанных.Шапка = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(ТаблицаДанных[0]);
СтруктураДанных.Шапка.Дата = Формат(СтруктураДанных.Шапка.Дата, "ДЛФ=DD");
СтруктураДанных.Шапка.Номер = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(СтруктураДанных.Шапка.Номер);
ТаблицаДанных = РезультатыЗапроса[ГраницаРезультатов].Выгрузить();
Для каждого Строка Из ТаблицаДанных Цикл
СтруктураДанных.ТабличнаяЧасть.Добавить(ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(Строка));
КонецЦикла;
Если НЕ РезультатыЗапроса[ГраницаРезультатов - 2].Пустой() Тогда
Выборка = РезультатыЗапроса[ГраницаРезультатов - 2].Выбрать();
Выборка.Следующий();
СтруктураДанных.БланкДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(Выборка.Файл);
КонецЕсли;
Возврат СтруктураДанных;
КонецФункции
Функция ПолучитьОписаниеОбластейМакетаОфисногоДокумента()
ОписаниеОбластей = Новый Структура;
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ВерхнийТитульныйКолонтитул", "ВерхнийТитульныйКолонтитул");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ВерхнийКолонтитул", "ВерхнийКолонтитул");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Шапка", "Общая");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Заголовок", "Общая");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Преамбула", "Общая");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "ПунктыПриказа", "Список");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Подписанты", "Общая");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "Подвал", "Общая");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "НижнийКолонтитул", "НижнийКолонтитул");
УправлениеПечатью.ДобавитьОписаниеОбласти(ОписаниеОбластей, "НижнийТитульныйКолонтитул", "НижнийТитульныйКолонтитул");
Возврат ОписаниеОбластей;
КонецФункции
//---------------------------------------------
// Общий модуль ШаблоныПриказовСерверПовтИсп
//---------------------------------------------
Функция ПолучитьСоответствиеИменМакетовИПутей() Экспорт
Соответствие = Новый Соответствие;
Соответствие.Вставить("ПриказОбОрганизацииПрохожденияПрактики",
"Справочник.ШаблоныПриказов.DOC_ПриказОбОрганизацииПрохожденияПрактики");
// Тут должны быть еще шаблоны, но для примера хватит и одного
Возврат Соответствие;
КонецФункции