gifts2017

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

Опубликовал mangy в раздел Управление - Пользователю системы

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

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

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

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

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

 

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

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

1. Общий модуль "Универсальные механизмы", функция "Напечатать документ"

1.1 Добавляем параметр

СсылкаНаОбъект = Неопределено;

1.2 В конец функции добавляем  строку

ФормаПечати.СсылкаНаОбъект = СсылкаНаОбъект;

В результате  должно получиться:

Функция НапечататьДокумент(ПечДокумент, КоличествоЭкземпляров = 0, НаПринтер = Ложь, Заголовок = "", ПараметрыРасшифровки = Неопределено, ПараметрыПечДокумента = Неопределено, СсылкаНаОбъект = Неопределено) Экспорт
	Если ПечДокумент = Неопределено тогда
		Возврат Неопределено;
	КонецЕсли;
	// Получить необходимое количество копий
	Если КоличествоЭкземпляров > 0 Тогда
		ПечДокумент.КоличествоЭкземпляров = КоличествоЭкземпляров;
	КонецЕсли;
	Если НаПринтер Тогда
		ПечДокумент.Напечатать();		
		Возврат Неопределено;		
	Иначе
		// Отобразить печатный документ на экране
		ФормаПечати = ПолучитьОбщуюФорму("ПечатьДокументов",, ПечДокумент);
		ФормаПечати.ПечатныйДокумент = ПечДокумент;
		ФормаПечати.Заголовок = Заголовок;
		ФормаПечати.Защита = УправлениеДопПравамиПользователей.ЗащитаТаблиц();
		ФормаПечати.ПараметрыРасшифровки = ПараметрыРасшифровки;
		ФормаПечати.ПараметрыПечатногоДокумента	= ПараметрыПечДокумента;

		//Сохранение макетов + 
                ФормаПечати.СсылкаНаОбъект = СсылкаНаОбъект; 
                //Сохранение макетов - 
  
		ФормаПечати.Открыть();
		Возврат ФормаПечати;		
	КонецЕсли;	
КонецФункции

2. Общая форма "ПечатьДокументов"

2.1 В форме добавляем реквизиты: 

ДОП_КоличествоКопий (Тип: Число)

СсылкаНаОбъект (Тип: ДокументСсылка)

2.2 В модуль формы добавляем следующие функции:

//функции для сохранения макетов + 
Процедура КоманднаяПанельФормыСохранитьМакет()
	
	ИмяФайла = ПолучитьПолноеИмяВременногоФайла();	
	
	ЭлементыФормы.ПолеТабличногоДокумента.Записать(ИмяФайла); 
	
	НаборЗаписей = РегистрыСведений.ДОП_МакетыДокументов.СоздатьНаборЗаписей();      		
	НаборЗаписей.Отбор.СсылкаНаОбъект.Установить(СсылкаНаОбъект);
	НаборЗаписей.Прочитать();
	Если НаборЗаписей.Количество() > 0 Тогда
		
		Ответ = Вопрос("По данному документу уже сохранен макет, заменить?", РежимДиалогаВопрос.ДаНет);
		Отказ = (Ответ = КодВозвратаДиалога.Нет);
		Если Отказ Тогда
			УдалитьВременныйФайлМакета(ИмяФайла);
			Возврат;
		КонецЕсли;		
	КонецЕсли;   
	
	НаборЗаписей.Очистить();
	ЛокХранилище = Новый ХранилищеЗначения(Новый ДвоичныеДанные(ИмяФайла));
	
	НоваяЗапись = НаборЗаписей.Добавить();      		
	НоваяЗапись.СсылкаНаОбъект = СсылкаНаОбъект;
	НоваяЗапись.Макет = ЛокХранилище;	
	НаборЗаписей.Записать(Истина);  	

	УдалитьВременныйФайлМакета(ИмяФайла);  	
	
КонецПроцедуры

Процедура КоманднаяПанельФормыЗагрузитьМакет()
	
	ИмяФайла = ПолучитьПолноеИмяВременногоФайла();
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("СсылкаНаОбъект",СсылкаНаОбъект);
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ДОП_МакетыДокументов.Макет
	|ИЗ
	|	РегистрСведений.ДОП_МакетыДокументов КАК ДОП_МакетыДокументов
	|ГДЕ
	|	ДОП_МакетыДокументов.СсылкаНаОбъект = &СсылкаНаОбъект";
	Выборка = Запрос.Выполнить().Выбрать();
	
	Если Выборка.Количество() = 0 Тогда  		
		Ответ = Вопрос("По данному документу не сохранен макет", РежимДиалогаВопрос.ОК);
		Возврат; 		
	Иначе
		Выборка.Следующий();   	
		Макет = Выборка.Макет;
		Макет.Получить().Записать(ИмяФайла);	
	
		ЭлементыФормы.ПолеТабличногоДокумента.Прочитать(ИмяФайла);	
		УдалитьВременныйФайлМакета(ИмяФайла);		
		
	КонецЕсли;
	
		
КонецПроцедуры

Функция ПолучитьПолноеИмяВременногоФайла()
	
	ЮзерИД = ПользователиИнформационнойБазы.ТекущийПользователь().УникальныйИдентификатор;
	
	//здесь прописываем путь к каталогу временных файлов
	КаталогВременныхФайлов = ПолучитьКаталогВременныхФайлов();
	КаталогНаДиске = Новый Файл(КаталогВременныхФайлов);
	Если Не КаталогНаДиске.Существует() Тогда
		 СоздатьКаталог(КаталогВременныхФайлов);
	КонецЕсли;
	
	Возврат  Строка("\"+КаталогВременныхФайлов+"\"+строка(ЮзерИД)+".mxl");	
	
КонецФункции

 Функция ПолучитьКаталогВременныхФайлов()
	 
	 //здесь прописываем путь к каталогу временных файлов
	Возврат  Строка("C:\temp111");	
	
КонецФункции


Процедура УдалитьВременныйФайлМакета(КаталогВременныхФайлов)
	
	УдалитьФайлы(КаталогВременныхФайлов);	
	
КонецПроцедуры

Процедура КоманднаяПанельФормыАБ_Сохранить(Кнопка)
	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	Диалог.Заголовок = "Save as";
	Диалог.ПолноеИмяФайла = СтрЗаменить(ЭтаФорма.Заголовок,".","");
	Диалог.ПредварительныйПросмотр = Ложь;
	Диалог.Фильтр = ПолучитьФильтрФайлов();
	Если Диалог.Выбрать() Тогда
		ИмяФайла = Диалог.ПолноеИмяФайла;
		Попытка
			ЭлементыФормы.ПолеТабличногоДокумента.Записать(ИмяФайла, ?(Прав(ИмяФайла,3) = "xls", ТипФайлаТабличногоДокумента.XLS, ТипФайлаТабличногоДокумента.MXL));
		Исключение
			Предупреждение("Ошибка при записи. Файл не записан.");
		КонецПопытки;		
	КонецЕсли;

КонецПроцедуры

Функция ПолучитьФильтрФайлов() Экспорт

	Возврат "Табличный документ (*.mxl)|*.mxl|"
	      + "Документ Microsoft Excel (*.xls)|*.xls|";

КонецФункции // ПолучитьФильтрФайлов()

Процедура КоманднаяПанельФормыАБ_ТолькоПросмотр(Кнопка)
	ЭлементыФормы.ПолеТабличногоДокумента.ТолькоПросмотр      = НЕ ЭлементыФормы.ПолеТабличногоДокумента.ТолькоПросмотр;
	ЭлементыФормы.АБ_Панель2.Кнопки.АБ_ТолькоПросмотр.Пометка = НЕ ЭлементыФормы.АБ_Панель2.Кнопки.АБ_ТолькоПросмотр.Пометка;

КонецПроцедуры

Процедура КоманднаяПанельФормыАБ_Печать(Кнопка)
	ЭлементыФормы.ПолеТабличногоДокумента.КоличествоЭкземпляров = ДОП_КоличествоКопий;
	ЭлементыФормы.ПолеТабличногоДокумента.Напечатать(РежимИспользованияДиалогаПечати.Использовать);
КонецПроцедуры           
//функции для сохранения макетов -

2.2 В функцию "ПриОткрытии" модуля формы добавляем строки:

Процедура ПриОткрытии()
	
	ЭлементыФормы.ПолеТабличногоДокумента.ВставитьОбласть(ПечатныйДокумент.Область());
	ЭлементыФормы.ПолеТабличногоДокумента.ИмяПараметровПечати = ПечатныйДокумент.ИмяПараметровПечати;
	ЭлементыФормы.ПолеТабличногоДокумента.ОтображатьЗаголовки = Ложь;
	ЭлементыФормы.ПолеТабличногоДокумента.ОтображатьСетку     = Ложь;
	ЭлементыФормы.ПолеТабличногоДокумента.Защита              = Защита;
	ЭлементыФормы.ПолеТабличногоДокумента.ТолькоПросмотр      = Истина;
	
	Если ПараметрыПечатногоДокумента <> Неопределено Тогда
		ЗаполнитьЗначенияСвойств(ЭлементыФормы.ПолеТабличногоДокумента, ПараметрыПечатногоДокумента,, "ОтображатьЗаголовки, ОтображатьСетку, ТолькоПросмотр, Защита, ИмяПараметровПечати");
	КонецЕсли;
// механизм сохранения макетов  + 
	Если СсылкаНаОбъект <> Неопределено Тогда
		ДействиеСохранитьМакет = Новый Действие("КоманднаяПанельФормыСохранитьМакет");  
		КнопкаСохранитьМакет = ЭлементыФормы.КоманднаяПанельФормы.Кнопки.Добавить("СохранитьМакет", ТипКнопкиКоманднойПанели.Действие,"Сохранить макет",ДействиеСохранитьМакет);
		
		ДействиеЗагрузитьМакет = Новый Действие("КоманднаяПанельФормыЗагрузитьМакет");  
		КнопкаЗагрузитьМакет = ЭлементыФормы.КоманднаяПанельФормы.Кнопки.Добавить("ЗагрузитьМакет", ТипКнопкиКоманднойПанели.Действие,"Загрузить макет",ДействиеЗагрузитьМакет);
	КонецЕсли;
	//механизм сохранения макетов -   
КонецПроцедуры

3. В модулях объекта тех документов, макеты которых необходимо сохранять, вносим изменения в вызов функции "УниверсальныеМеханизмы.НапечататьДокумент": добавляем параметр "Ссылка" в конце

Возврат УниверсальныеМеханизмы.НапечататьДокумент(ТабДокумент, КоличествоЭкземпляров, НаПринтер, ОбщегоНазначенияЗК.СформироватьЗаголовокДокумента(ЭтотОбъект,"Прием на работу в организацию "),,ТабДокумент,Ссылка); 

4. Добавляем регистр сведений "ДОП_МакетыДокументов" (непериодический, независимый)

Измерение:  "Ссылка на объект" (Тип: ДокументСсылка);

Ресурс: "Макет" (Тип: ХранилищеЗначения);


5. Всё! Проверяем, радуем кадровиков.  

 

 

 

 

 

 

 

См. также

Подписаться Добавить вознаграждение
Комментарии
1. anry mc (AnryMc) 24.02.14 18:37
Конечно это не обязательно, а из серии - юзабилити...

Кнопка "Загрузить макет" должна быть доступна только если есть сохраненные...
2. mangy 24.02.14 20:53
(1) AnryMc, логично. Правда данный "шедевр" был разработан под конкретную задачу, и возможность довести до совершенства я оставляю всем заинтересовашимся.
3. pepe (pepe) 25.02.14 16:39
Я правильно понял Вас, ваш механизм позволяет сохранять документы? Если пользователь сформирует новый отчет, с новыми данными заполненными из программы, то они затрутся?
4. mangy 25.02.14 17:35
(3) pepe, только печатные формы. О документах и отчетах речи нет.