Сохранение ручных корректировок в печатных формах


Доработка позволяет сохранять и загружать ручные корректировки пользователей в приказах и других печатных формах. Печатные формы сохраняются в базе как хранилище значения.

Что в результате

В окне вывода печатной формы появятся две кнопки «Сохранить макет» и «Загрузить макет». 

Кнопка «Сохранить макет» позволяет сохранить изменения, внесенные в макете вручню.

Кнопка «Загрузить макет» позволяет загрузить внесенные изменения.

 

Доработка системы 

Необходимо внести в систему следующие изменения:

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. Всё! Проверяем, радуем кадровиков.  

 

 

 

 

 

 

 

5 Comments

  1. AnryMc

    Конечно это не обязательно, а из серии — юзабилити…

    Кнопка «Загрузить макет» должна быть доступна только если есть сохраненные…

    Reply
  2. mangy

    (1) AnryMc, логично. Правда данный «шедевр» был разработан под конкретную задачу, и возможность довести до совершенства я оставляю всем заинтересовашимся.

    Reply
  3. pepe

    Я правильно понял Вас, ваш механизм позволяет сохранять документы? Если пользователь сформирует новый отчет, с новыми данными заполненными из программы, то они затрутся?

    Reply
  4. mangy

    (3) pepe, только печатные формы. О документах и отчетах речи нет.

    Reply
  5. AndrewUtkaev

    Идея верная и реализация неплохая. Бросается в глаза только следующее — ПолучитьПолноеИмяВременногоФайла() И ПолучитьКаталогВременныхФайлов() функции не нужны, есть стандартная функция — ПолучитьИмяВременногоФайла(«mxl») — возвращает имя временного файла с каталогом

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *