Сохранение любого документа из базы в файл (резервная копия), восстановление документа из файла

Обработки - Обработка документов

Обработка сохранение в файл документа восстановление документа из файла редактирование заблокированного документа

28
Обработка позволяет выгрузить (загрузить) любой документ из (в) базы данных в файл с расширением xml.

Иногда необходимо заполнить документ, но в нем уже есть данные. Данная обработка предназначения сделать резервную копию содержимого документа в файл и если необходимо восстановить данные документа из файла. Есть возможность сохранить движения документа по регистрам. Есть возможность редактировать документ без ограничений при наличии полных прав у пользователя. Формат файла XML. Обработка реализована для конфигурации на управляемых формах. Может быть добавлена как внешняя обработка в конфигурацию, есть процедура регистрации. Конфигурация может быть любая, форма обработки создается программно. Обработка тестировалась на платформе версии 8.3.12.1595.

28

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

Наименование Файл Версия Размер
Сохранение любого документа из базы в файл (резервная копия), восстановление документа из файла:
.epf 18,20Kb
10.10.18
4
.epf 1.9 18,20Kb 4 Скачать

См. также

Комментарии
Избранное Подписка Сортировка: Древо
1. bsturtle 165 21.09.18 11:02 Сейчас в теме
Интересная штука.
скажите . движения сохраняет/восстанавливает? или только реквизиты и табличные части?
2. PerlAmutor 30 24.09.18 08:09 Сейчас в теме
Элементы справочников сохраняет? Отсутствующие элементы справочников создает заново?
3. XSlava 126 24.09.18 09:19 Сейчас в теме
Движения сохраняет, восстанавливает. При формировании файла, для ссылочных типов сохраняется только ссылка на элемент. Как следствие при восстановлении если элемент удален, то будет восстановлена только ссылка на элемент, а не сам объект. Но и такую задачу можно решить, только объем файла увеличиться.
4. user948418 24.09.18 10:03 Сейчас в теме
Это так скажем часть функции которые используются при конвертации данных? Структуру бы самого импортированного xml-файла посмотреть)
5. XSlava 126 24.09.18 10:18 Сейчас в теме
Нет это не часть функции которая используется при конвертации данных, при сохранении (восстановлении) до банального все просто. Файл примера прикладываю.
Прикрепленные файлы:
Ведомость объема работ по субподрядчику (собственные силы) АВУУ-0723 от 20.09.18.xml
6. madonov 159 24.09.18 10:29 Сейчас в теме
Старое доброе?

Процедура СохранитьРеквизитыИТабличныеЧасти (Объект, ИмяФайлаXML=Неопределено)
	ФайлXML = Новый ЗаписьXML;
	ФайлXML.ОткрытьФайл(ИмяФайлаXML);
	ФайлXML.ЗаписатьОбъявлениеXML();
	ФайлXML.ЗаписатьНачалоЭлемента("Root");
	ФайлXML.ЗаписатьАтрибут("Объект",Объект.Метаданные().Имя);
	//Сохраняем реквизиты
	Для Каждого Реквизит Из Объект.Метаданные().Реквизиты Цикл
		ФайлXML.ЗаписатьНачалоЭлемента("Реквизит");
		ФайлXML.ЗаписатьАтрибут("Имя", Реквизит.Имя);
		ТипЗначения = ТипЗнч(Объект[Реквизит.Имя]);
		Если Не ТипЗначения = Тип("Неопределено") Тогда
			ФайлXML.ЗаписатьАтрибут("ИмяТипа", XMLТип(ТипЗначения).ИмяТипа);
			ФайлXML.ЗаписатьАтрибут("URI", XMLТип(ТипЗначения).URIПространстваИмен);
		КонецЕсли;
		ФайлXML.ЗаписатьТекст(XMLСтрока(Объект[Реквизит.Имя]));
		ФайлXML.ЗаписатьКонецЭлемента();
	КонецЦикла;
	//Сохраняем табличные части
	Для Каждого ТЧ из Объект.Метаданные().ТабличныеЧасти Цикл
		ФайлXML.ЗаписатьНачалоЭлемента("ТабличнаяЧасть");
		ФайлXML.ЗаписатьАтрибут("Имя", ТЧ.Имя);
		Для Каждого СтрокаТЧ из Объект[ТЧ.Имя] Цикл
			ФайлXML.ЗаписатьНачалоЭлемента("ЭлементКоллекции");
			Для Каждого РеквизитТЧ Из ТЧ.Реквизиты Цикл
				ФайлXML.ЗаписатьНачалоЭлемента("Реквизит");
				ФайлXML.ЗаписатьАтрибут("Имя", РеквизитТЧ.Имя);
				ТипЗначения = ТипЗнч(СтрокаТЧ[РеквизитТЧ.Имя]);
				Если Не ТипЗначения = Тип("Неопределено") Тогда
					ФайлXML.ЗаписатьАтрибут("ИмяТипа", XMLТип(ТипЗначения).ИмяТипа);
					ФайлXML.ЗаписатьАтрибут("URI", XMLТип(ТипЗначения).URIПространстваИмен);
				КонецЕсли;
				ФайлXML.ЗаписатьТекст(XMLСтрока(СтрокаТЧ[РеквизитТЧ.Имя]));
				ФайлXML.ЗаписатьКонецЭлемента();
			КонецЦикла;
			ФайлXML.ЗаписатьКонецЭлемента();
		КонецЦикла;
		ФайлXML.ЗаписатьКонецЭлемента();
	КонецЦикла;
	Если Не ФайлXML=Null Тогда
		ФайлXML.ЗаписатьКонецЭлемента();
		ФайлXML.Закрыть();
	КонецЕсли;
КонецПроцедуры

Процедура ЗагрузитьРеквизитыИТабличныеЧасти(Объект, ИмяФайлаXML=Неопределено) Экспорт
	Если Не ИмяФайлаXML = Неопределено Тогда
		ФайлXML = Новый ЧтениеXML;
		ФайлXML.ОткрытьФайл(ИмяФайлаXML);
		Пока ФайлXML.Прочитать() Цикл
			Если ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
				ЗагрузитьОбъектРекурсивно(ФайлXML, Объект, ФайлXML.Имя);
			КонецЕсли
		КонецЦикла;
	КонецЕсли;
КонецПроцедуры

Процедура ЗагрузитьОбъектРекурсивно(ФайлXML, Объект, знач ИмяУзла)
	ИмяТипа = "";
	ПространствоИмен = "";
	Пока ФайлXML.ПрочитатьАтрибут() Цикл
		Если ФайлXML.Имя = "ИмяТипа" Тогда
			ИмяТипа = ФайлXML.Значение;
		ИначеЕсли ФайлXML.Имя = "URI" Тогда
			ПространствоИмен = ФайлXML.Значение;
		КонецЕсли;
	КонецЦикла;
	Пока ФайлXML.Прочитать() Цикл
		Если ФайлXML.ТипУзла = ТипУзлаXML.КонецЭлемента И ФайлXML.Имя = ИмяУзла Тогда
			Возврат;
		ИначеЕсли ФайлXML.ТипУзла = ТипУзлаXML.Текст Тогда
			ТипОбъекта = ИзXMLТипа(ИмяТипа, ПространствоИмен);
			Если НЕ ТипОбъекта = Неопределено тогда
				Объект = XMLЗначение(ТипОбъекта, ФайлXML.Значение);
			КонецЕсли;
		ИначеЕсли ФайлXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			ИмяТекУзла = ФайлXML.Имя;
			Если ФайлXML.Имя = "ЭлементКоллекции" Тогда
				ЗагрузитьОбъектРекурсивно(ФайлXML, Объект.Добавить(), ИмяТекУзла);
			Иначе
				Если ФайлXML.ПрочитатьАтрибут() Тогда
					ЗагрузитьОбъектРекурсивно(ФайлXML, Объект[ФайлXML.Значение], ИмяТекУзла);
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры
Показать

В любом случае большинство современных конфигураций имеют встроенные механизмы версионирования. Перезаполнил, посмотрел итог, откатился на предыдущую версию.
8. Artem-B 74 24.09.18 11:12 Сейчас в теме
(6) На больших объемах данных пробовали БСПшное версионирование включать? Автору плюс, вроде просто, но очень полезно
10. buganov 49 24.09.18 13:03 Сейчас в теме
(8) база 3Тб. Версионирование на основные документы включено. Нормально работает. Если не брать в расчет fastinfoset и баг в платформе с составными реквизитами. УТ 11.0, 8.2.19.130, SQL 2016.
11. XSlava 126 24.09.18 13:12 Сейчас в теме
Так все таки "баги" есть в типовом решении. В типовом решении хорошо выглядит сравнение версий. Объем базы важен для тестирования и различных проверок.
7. XSlava 126 24.09.18 10:42 Сейчас в теме
Нет не старое доброе, это сложно. Есть фабрика, которая делает все за программиста. Механизм версионирования не очень серьезная вещь. У нее есть два недостатка, с которыми я столкнулся, версия храниться в базе (увеличение объема базы) нужно периодически чистить. Самое главное, если сначала сохранить версию объекта, затем изменить структуру объекта, добавить реквизит или изменить тип у какого нибудь реквизита, то версия не восстановится. Это не позволяет в динамически развивающихся базах (на этапе внедрения, разработки) использовать механизм версионирования. Я от него отказался. Для небольших баз и типовых решения без обслуживания программиста, это удобно, но не более. Это мое личное мнение.
TreeDogNight; acanta; +2 Ответить
9. XSlava 126 24.09.18 11:28 Сейчас в теме
У нас основная база 50 Gb, включили для одного документа. Когда понадобилось восстановить документ, через полгода, не смогли. В документ были добавлены новые реквизиты, отключили версионирование и забыли о нем.
12. Ramzay82 27.09.18 08:41 Сейчас в теме
Спасибо, может пригодится
user1057077; +1 Ответить
13. Жискар 7 08.10.18 18:57 Сейчас в теме
Возникла острая необходимость в обработке.
Применил для выгрузки операции. Операция огромная 1330 записей.
Получил ошибку: Ошибка доступа к файлу
Попробовал выгрузить на другой базе, результат тот же.
Можете помочь?
Прикрепленные файлы:
Возникла острая необходимость в обработке.docx
14. XSlava 126 09.10.18 07:57 Сейчас в теме
(13) Помочь могу, у меня нет таких объемных операций.
Предлагаю два варианта:
а. Я подключусь удаленно и с помощью отладчика на вашем ПК проверю и внесу изменения.
б. Сохраняете базу и выкладываете на яндекс диск, я ее от туда забираю и тестирую.
Моя почта Konors2007@ya.ru.
15. XSlava 126 09.10.18 08:05 Сейчас в теме
(13) Попробуйте в строчке №173
В место строки:

ТаблицаЗаписей.Вставить("Строка_"+НомерСтроки, СтрокаТаблицы);

Вставьте вот эту строку:

ТаблицаЗаписей.Вставить("Строка_"+Формат(""+НомерСтроки,"ЧГ=0"), СтрокаТаблицы);


Должно заработать.
Оставьте свое сообщение