Что в результате
В окне вывода печатной формы появятся две кнопки «Сохранить макет» и «Загрузить макет».
Кнопка «Сохранить макет» позволяет сохранить изменения, внесенные в макете вручню.
Кнопка «Загрузить макет» позволяет загрузить внесенные изменения.
Доработка системы
Необходимо внести в систему следующие изменения:
1. Общий модуль «Универсальные механизмы», функция «Напечатать документ»
1.1 Добавляем параметр
СсылкаНаОбъект = Неопределено;
1.2 В конец функции добавляем строку
ФормаПечати.СсылкаНаОбъект = СсылкаНаОбъект;
В результате должно получиться:
Функция НапечататьДокумент(ПечДокумент, КоличествоЭкземпляров = 0, НаПринтер = Ложь, Заголовок = "", ПараметрыРасшифровки = Неопределено, ПараметрыПечДокумента = Неопределено, СсылкаНаОбъект = Неопределено) Экспорт
Если ПечДокумент = Неопределено тогда
Возврат Неопределено;
КонецЕсли;
// Получить необходимое количество копий
Если КоличествоЭкземпляров > 0 Тогда
ПечДокумент.КоличествоЭкземпляров = КоличествоЭкземпляров;
КонецЕсли;
Если НаПринтер Тогда
ПечДокумент.Напечатать();
Возврат Неопределено;
Иначе
// Отобразить печатный документ на экране
ФормаПечати = ПолучитьОбщуюФорму("ПечатьДокументов",, ПечДокумент);
ФормаПечати.ПечатныйДокумент = ПечДокумент;
ФормаПечати.Заголовок = Заголовок;
ФормаПечати.Защита = УправлениеДопПравамиПользователей.ЗащитаТаблиц();
ФормаПечати.ПараметрыРасшифровки = ПараметрыРасшифровки;
ФормаПечати.ПараметрыПечатногоДокумента = ПараметрыПечДокумента;
//Сохранение макетов +
ФормаПечати.СсылкаНаОбъект = СсылкаНаОбъект;
//Сохранение макетов -
ФормаПечати.Открыть();
Возврат ФормаПечати;
КонецЕсли;
КонецФункции
2. Общая форма «ПечатьДокументов»
2.1 В форме добавляем реквизиты:
ДОП_КоличествоКопий (Тип: Число)
СсылкаНаОбъект (Тип: ДокументСсылка)
2.2 В модуль формы добавляем следующие функции:
//функции для сохранения макетов +
Процедура КоманднаяПанельФормыСохранитьМакет()
ИмяФайла = ПолучитьПолноеИмяВременногоФайла();
ЭлементыФормы.ПолеТабличногоДокумента.Записать(ИмяФайла);
НаборЗаписей = РегистрыСведений.ДОП_МакетыДокументов.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.СсылкаНаОбъект.Установить(СсылкаНаОбъект);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() > 0 Тогда
Ответ = Вопрос("По данному документу уже сохранен макет, заменить?", РежимДиалогаВопрос.ДаНет);
Отказ = (Ответ = КодВозвратаДиалога.Нет);
Если Отказ Тогда
УдалитьВременныйФайлМакета(ИмяФайла);
Возврат;
КонецЕсли;
КонецЕсли;
НаборЗаписей.Очистить();
ЛокХранилище = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайла));
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.СсылкаНаОбъект = СсылкаНаОбъект;
НоваяЗапись.Макет = ЛокХранилище;
НаборЗаписей.Записать(Истина);
УдалитьВременныйФайлМакета(ИмяФайла);
КонецПроцедуры
Процедура КоманднаяПанельФормыЗагрузитьМакет()
ИмяФайла = ПолучитьПолноеИмяВременногоФайла();
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("СсылкаНаОбъект",СсылкаНаОбъект);
Запрос.Текст =
"ВЫБРАТЬ
| ДОП_МакетыДокументов.Макет
|ИЗ
| РегистрСведений.ДОП_МакетыДокументов КАК ДОП_МакетыДокументов
|ГДЕ
| ДОП_МакетыДокументов.СсылкаНаОбъект = &СсылкаНаОбъект";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Количество() = 0 Тогда
Ответ = Вопрос("По данному документу не сохранен макет", РежимДиалогаВопрос.ОК);
Возврат;
Иначе
Выборка.Следующий();
Макет = Выборка.Макет;
Макет.Получить().Записать(ИмяФайла);
ЭлементыФормы.ПолеТабличногоДокумента.Прочитать(ИмяФайла);
УдалитьВременныйФайлМакета(ИмяФайла);
КонецЕсли;
КонецПроцедуры
Функция ПолучитьПолноеИмяВременногоФайла()
ЮзерИД = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор;
//здесь прописываем путь к каталогу временных файлов
КаталогВременныхФайлов = ПолучитьКаталогВременныхФайлов();
КаталогНаДиске = Новый Файл(КаталогВременныхФайлов);
Если Не КаталогНаДиске.Существует() Тогда
СоздатьКаталог(КаталогВременныхФайлов);
КонецЕсли;
Возврат Строка(""+КаталогВременныхФайлов+""+строка(ЮзерИД)+".mxl");
КонецФункции
Функция ПолучитьКаталогВременныхФайлов()
//здесь прописываем путь к каталогу временных файлов
Возврат Строка("C: emp111");
КонецФункции
Процедура УдалитьВременныйФайлМакета(КаталогВременныхФайлов)
УдалитьФайлы(КаталогВременныхФайлов);
КонецПроцедуры
Процедура КоманднаяПанельФормыАБ_Сохранить(Кнопка)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Save as";
Диалог.ПолноеИмяФайла = СтрЗаменить(ЭтаФорма.Заголовок,".","");
Диалог.ПредварительныйПросмотр = Ложь;
Диалог.Фильтр = ПолучитьФильтрФайлов();
Если Диалог.Выбрать() Тогда
ИмяФайла = Диалог.ПолноеИмяФайла;
Попытка
ЭлементыФормы.ПолеТабличногоДокумента.Записать(ИмяФайла, ?(Прав(ИмяФайла,3) = "xls", ТипФайлаТабличногоДокумента.XLS, ТипФайлаТабличногоДокумента.MXL));
Исключение
Предупреждение("Ошибка при записи. Файл не записан.");
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Функция ПолучитьФильтрФайлов() Экспорт
Возврат "Табличный документ (*.mxl)|*.mxl|"
+ "Документ Microsoft Excel (*.xls)|*.xls|";
КонецФункции // ПолучитьФильтрФайлов()
Процедура КоманднаяПанельФормыАБ_ТолькоПросмотр(Кнопка)
ЭлементыФормы.ПолеТабличногоДокумента.ТолькоПросмотр = НЕ ЭлементыФормы.ПолеТабличногоДокумента.ТолькоПросмотр;
ЭлементыФормы.АБ_Панель2.Кнопки.АБ_ТолькоПросмотр.Пометка = НЕ ЭлементыФормы.АБ_Панель2.Кнопки.АБ_ТолькоПросмотр.Пометка;
КонецПроцедуры
Процедура КоманднаяПанельФормыАБ_Печать(Кнопка)
ЭлементыФормы.ПолеТабличногоДокумента.КоличествоЭкземпляров = ДОП_КоличествоКопий;
ЭлементыФормы.ПолеТабличногоДокумента.Напечатать(РежимИспользованияДиалогаПечати.Использовать);
КонецПроцедуры
//функции для сохранения макетов -
2.2 В функцию «ПриОткрытии» модуля формы добавляем строки:
Процедура ПриОткрытии()
ЭлементыФормы.ПолеТабличногоДокумента.ВставитьОбласть(ПечатныйДокумент.Область());
ЭлементыФормы.ПолеТабличногоДокумента.ИмяПараметровПечати = ПечатныйДокумент.ИмяПараметровПечати;
ЭлементыФормы.ПолеТабличногоДокумента.ОтображатьЗаголовки = Ложь;
ЭлементыФормы.ПолеТабличногоДокумента.ОтображатьСетку = Ложь;
ЭлементыФормы.ПолеТабличногоДокумента.Защита = Защита;
ЭлементыФормы.ПолеТабличногоДокумента.ТолькоПросмотр = Истина;
Если ПараметрыПечатногоДокумента <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(ЭлементыФормы.ПолеТабличногоДокумента, ПараметрыПечатногоДокумента,, "ОтображатьЗаголовки, ОтображатьСетку, ТолькоПросмотр, Защита, ИмяПараметровПечати");
КонецЕсли;
// механизм сохранения макетов +
Если СсылкаНаОбъект <> Неопределено Тогда
ДействиеСохранитьМакет = Новый Действие("КоманднаяПанельФормыСохранитьМакет");
КнопкаСохранитьМакет = ЭлементыФормы.КоманднаяПанельФормы.Кнопки.Добавить("СохранитьМакет", ТипКнопкиКоманднойПанели.Действие,"Сохранить макет",ДействиеСохранитьМакет);
ДействиеЗагрузитьМакет = Новый Действие("КоманднаяПанельФормыЗагрузитьМакет");
КнопкаЗагрузитьМакет = ЭлементыФормы.КоманднаяПанельФормы.Кнопки.Добавить("ЗагрузитьМакет", ТипКнопкиКоманднойПанели.Действие,"Загрузить макет",ДействиеЗагрузитьМакет);
КонецЕсли;
//механизм сохранения макетов -
КонецПроцедуры
3. В модулях объекта тех документов, макеты которых необходимо сохранять, вносим изменения в вызов функции «УниверсальныеМеханизмы.НапечататьДокумент»: добавляем параметр «Ссылка» в конце
Возврат УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, ОбщегоНазначенияЗК.СформироватьЗаголовокДокумента(ЭтотОбъект,"Прием на работу в организацию "),,ТабДокумент,Ссылка);
4. Добавляем регистр сведений «ДОП_МакетыДокументов» (непериодический, независимый)
Измерение: «Ссылка на объект» (Тип: ДокументСсылка);
Ресурс: «Макет» (Тип: ХранилищеЗначения);
5. Всё! Проверяем, радуем кадровиков.
Конечно это не обязательно, а из серии — юзабилити…
Кнопка «Загрузить макет» должна быть доступна только если есть сохраненные…
(1) AnryMc, логично. Правда данный «шедевр» был разработан под конкретную задачу, и возможность довести до совершенства я оставляю всем заинтересовашимся.
Я правильно понял Вас, ваш механизм позволяет сохранять документы? Если пользователь сформирует новый отчет, с новыми данными заполненными из программы, то они затрутся?
(3) pepe, только печатные формы. О документах и отчетах речи нет.
Идея верная и реализация неплохая. Бросается в глаза только следующее — ПолучитьПолноеИмяВременногоФайла() И ПолучитьКаталогВременныхФайлов() функции не нужны, есть стандартная функция — ПолучитьИмяВременногоФайла(«mxl») — возвращает имя временного файла с каталогом