gifts2017

Конфигурация "Внешнее хранилище версий + картинок + печатных форм + отчетов" и обработки для просмотра

Опубликовал Федір Гордієвич (gfo) в раздел Программирование - Практика программирования

Конфигурация позволяет сохранять в себя и в дальнейшем получать:
1. Версии объектов
2. Картинки
3. Печатные формы
4. Варианты отчетов.

В связи с излишним распуханием базы от информации, наличие которой в локальной базе совсем не обязательно, увеличением времени выполнения регламентных операций и времени обмена между распределенными базами была разработана эта конфигурация. Все работает посредством Веб-сервисов. Моя база уже благополучно перевалила за 10 гигов версий.

Внимание!!! База работает в связке с УПП. Совместимость с другими конфигурациями потребует их доработоку которая скорее всего не будет соответствовать примерам. + и в примерах и в обработке сравнения будет необходимо изменить части кода, которые отвечают за место хранения информации о подключении к внешнему хранилищу. А именно: адрес веб сервиса, пространство имен, адвес ВСДЛ определения и некоторые сервисные функции которых скорее всего в вашей конфе не будет (напр: мОбщегоНазначения.ПолучитьИмяБази() или мСервер.ТекущаяДатаСервер() )

Для запуска необходим апач и публикация вебсервисов.

Она позволяет:

1. Онлайн сохранять версии объектов во внешнее хранилище а также получать сохраненные версии для объекта метаданных для их анализа и сравнения. Использует стандартный механиз версионирования но требует небольших изменений в модуле ВерсионированиеОбъектовПривилегированный процедура  ЗаписатьВерсиюОбъекта 

При сохранении в внешнее хранилище версии с одинаковым хешем сливаются (только идущие подряд с одинаковым хешем). 

УдаленноеХранилище=ТутКонстантаКотораяОпределяетКакойМеханизмВерсионированияИспользовать(Истина,Ложь);

Если УдаленноеХранилище=Истина Тогда
//// пишем в удаленное хранилище
попытка
Определение=Новый WSОпределения(СокрЛП(Константы.ВерАдресВДСЛ.Получить()));
Прокси=Новый WSПрокси(Определение,СокрЛП(Константы.ВерПространствоИмен.Получить()),СокрЛП(Константы.ВерСервис.Получить()),СокрЛП(Константы.ВерСервис.Получить())+"Soap");
ЭтоСправочник = Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка));
ЭтоДокумент = Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка));

Если ЭтоСправочник=Истина Тогда
Код=Ссылка.Код;
Название=Ссылка.Наименование;
ИначеЕсли ЭтоДокумент=Истина Тогда
Код=Ссылка.Номер;
Название=Строка(Ссылка);
Иначе
Код="";
Название=Строка(Ссылка);
КонецЕсли; 

Результат=прокси.Save(Ссылка.УникальныйИдентификатор(),мСервер.ТекущаяДатаСервер(),ПараметрыСеанса.ТекущийПользователь.Наименование, ХранилищеДанных,Код,Название,Ссылка.Метаданные().Представление(),Строка(Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Получить()),мОбщегоНазначения.ПолучитьИмяБази());

Исключение
Сообщить("Попытка записи версии в удаленное хранилище неудалась");
КонецПопытки;
Иначе 
//// пишем по старому в регистр
МенеджерЗаписиВерсииОбъектов = РегистрыСведений.ВерсииОбъектов.СоздатьМенеджерЗаписи();

МенеджерЗаписиВерсииОбъектов.Объект = Ссылка;
МенеджерЗаписиВерсииОбъектов.ДатаВерсии = мСервер.ТекущаяДатаСервер();//ТекущаяДата();
МенеджерЗаписиВерсииОбъектов.ВерсияОбъекта = ХранилищеДанных;
МенеджерЗаписиВерсииОбъектов.НомерВерсии = ЧислоВерсийОбъекта + 1;
МенеджерЗаписиВерсииОбъектов.АвторВерсии = ПараметрыСеанса.ТекущийПользователь;
МенеджерЗаписиВерсииОбъектов.УдалитьСжато = Истина;
МенеджерЗаписиВерсииОбъектов.База = Константы.ПрефиксУзлаРаспределеннойИнформационнойБазы.Получить(); //м13(2014.07.23) 
МенеджерЗаписиВерсииОбъектов.Записать();
КонецЕсли; 

Измененная обработка просмотра и сравнения версий из удаленного хранилища в приложении. ()

Пример процедуры для переноса версии обьекта из локального хранилища в удаленное. Перечень объектов можно подобрать, например, обработкой "подбор и обработка объектов" из ИР и в нем, выполнив произвольный алгоритм. вызвать эту функцию и слить версии в удаленную базу.

 

Процедура ПеренестиВерсииВоВнешнееХранилище(СсылкаНаОбъект) Экспорт
	
	НаборВерсий=РегистрыСведений.ВерсииОбъектов.СоздатьНаборЗаписей();
	НаборВерсий.Отбор.Объект.Использование=Истина;
	НаборВерсий.Отбор.Объект.Значение=СсылкаНаОбъект;
	НаборВерсий.Прочитать();
	ТаблицаВерсий=Новый ТаблицаЗначений;
	ТаблицаВерсий=НаборВерсий.Выгрузить();
	ТаблицаВерсий.Сортировать("ДатаВерсии Возр");
	
	попытка
		Определение=Новый WSОпределения(СокрЛП(константы.ВерАдресВДСЛ.получить()));
		Прокси=Новый WSПрокси(Определение,СокрЛП(Константы.ВерПространствоИмен.Получить()),СокрЛП(Константы.ВерСервис.Получить()),СокрЛП(Константы.ВерСервис.получить())+"Soap");
    	ЭтоСправочник = Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(СсылкаНаОбъект));
		ЭтоДокумент = Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(СсылкаНаОбъект));
	
	Для каждого Версия Из ТаблицаВерсий Цикл
	
		
		Если ЭтоСправочник=Истина Тогда
			Код=СсылкаНаОбъект.Код;
			Название=СсылкаНаОбъект.Наименование;
		ИначеЕсли ЭтоДокумент=Истина Тогда
			Код=СсылкаНаОбъект.Номер;
			Название=Строка(СсылкаНаОбъект);
		Иначе
			Код="";
			Название=Строка(СсылкаНаОбъект);
		КонецЕсли; 
		
		Значение=Версия.ВерсияОбъекта.Получить();
		Если ТипЗНЧ(Значение)=Тип("ДвоичныеДанные") Тогда
			ИФ=ПолучитьИмяВременногоФайла();
			Значение.Записать(ИФ);
			ТД=Новый ТекстовыйДокумент;
			ТД.Прочитать(ИФ, КодировкаТекста.UTF8);
			СтрокаХМЛ=ТД.ПолучитьТекст();
		Иначе	
			СтрокаХМЛ=Значение;
		КонецЕсли; 
		ХранилищеДанных = Новый ХранилищеЗначения(СтрокаХМЛ, Новый СжатиеДанных(9));
		Результат=прокси.Save(СсылкаНаОбъект.УникальныйИдентификатор(),Версия.ДатаВерсии,Версия.АвторВерсии.Наименование,ХранилищеДанных,Код,Название,СсылкаНаОбъект.Метаданные().Представление(),Версия.База);
	
	КонецЦикла; 
	НаборВерсий.Очистить();
	НаборВерсий.Записать();
	
	Исключение
			Сообщить("Попытка переноса "+СсылкаНаОбъект+" в удаленное хранилище неудалась");
	КонецПопытки;	

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

 

2. Сохранять печатные формы документов которые выводились пользователями на печать.

Для этого нужно в коде который отвечает за вывод печатной формы на экран или запуск напрямуя на принтер влепить кусочек кода который вызывает функцию

Функция СохранитьПечать(Юид,Таб) Экспорт
	попытка
    	Определение=Новый WSОпределения(СокрЛП(Константы.ПечФАдресВДСЛ.получить()));
		Прокси=Новый WSПрокси(Определение,СокрЛП(Константы.ПечФПространствоИмен.получить()),СокрЛП(Константы.ПечФСервис.получить()),СокрЛП(Константы.ПечФСервис.получить())+"Soap");
		Хранилище=Новый ХранилищеЗначения(Таб);
		Результат=прокси.SaveForm(Юид,Хранилище,параметрыСеанса.ТекущийПользователь.Наименование,ТекущаяДата(),мОбщегоНазначения.ПолучитьИмяБази());
		//Сообщить("регистрация печати выполнена");
    	Возврат результат;
	Исключение
	    Возврат Ложь;
	КонецПопытки;	
КонецФункции

Обработка для просмотра истории печати в локально базе прикреплена в приложениях. (замечания те же что и для версий. придется подправить код для чтения констант).

3. Сохранять варианты отчетов

Например я сохраняю туда отчет по складу и по взаиморасчетам каждый день. В связи с тем что пользователи любят подергать документы задним числом. Вариант сохраниния можно выбрать самому. Я использую схему компоновки данных которая зашита в общем макете и по регламенту програмно обрабатываю эту схему и сохраняю отчет.

Функция СохранитьОтчет(Объект,Таблица) экспорт
	попытка
    	Определение=Новый WSОпределения(СокрЛП(константы.ОтчАдресВДСЛ.получить()));
		Прокси=Новый WSПрокси(Определение,СокрЛП(Константы.ОтчПространствоИмен.Получить()),СокрЛП(константы.ОтчСервис.Получить()),СокрЛП(Константы.ОтчСервис.Получить())+"Soap");
		Хранилище=Новый ХранилищеЗначения(Таблица);
		Результат=прокси.SaveReport(Объект.Метаданные().Имя,Объект.Метаданные().Представление()+" "+ТекущаяДата(),ТекущаяДата(),Хранилище,параметрыСеанса.ТекущийПользователь.Наименование,мОбщегоНазначения.ПолучитьИмяБази());
		
    	Возврат результат;
	Исключение
	    Возврат Ложь;
	КонецПопытки;	
	
КонецФункции	

4. Сохранять и получать картинки во внешнем хранилище.

Функционал в хранилище есть, но к живой базе пока не подключался.

Если будут какие-то вопросы с запуском - помогу, чем смогу.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Конфигурация внешнее хранилище
.cf 87,93Kb
28.12.15
3
.cf 0.9 87,93Kb 3 Скачать
Просморт и сравнение версий
.erf 36,45Kb
28.12.15
3
.erf 1 36,45Kb 3 Скачать
просмотр истории печати
.epf 8,90Kb
28.12.15
2
.epf 1 8,90Kb 2 Скачать

См. также

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