Здравствуйте.
У меня два вопроса.
1. Где можно посмотреть внятную помощь по вопросу Сериализации/десериализации данных в террасофте? На форуме не нашел. В файле с SDK - только пара слов: "Serialize/deserialize() - метод сохранения/восстановления объекта". А как пользоваться - не описано.

2. Как следствие, у меня возникает ошибка при попытке десериализации:

var XMLStorage = GetNewXMLStorage();
XMLStorage.InitRootNode('FiltersBuilderRootNode');
fbcFilters.FiltersBuilder.RootItems.Serialize(XMLStorage.RootNode);
FilterText = XMLStorage.Text; // тут все нормально

// теперь десериализуем. Пишем всё тоже, что и выше только теперь:
// А вот тут вдруг ни с того ни с сего ошибка "parse Error!":
XMLStorage.Text = FilterText;

Почему? Как это исправить?

Нравится

4 комментария

Здравствуйте.

Хороший пример реализации хранения данных в профиле можно посмотреть в скрипте wnd_PlanningViewPeriodTreeScript в функциях SavePeriodTreeToProfile() и LoadPeriodTreeFromProfile().

Спасибо, Дмитрий, но у меня, к сожалению, такого скрипта нету. Версия софта - 3.2.0.87

Здравствуйте.

Скопирую сюда:

function SavePeriodTreeToProfile() {
	if (!PlanningViewPeriodTree.Planning) {
		return;
	}
 
	var XMLStorage = GetNewXMLStorage();
	var Node;
	var Today = new Date;
	var Data;
 
	XMLStorage.Clear();
	XMLStorage.InitRootNode('PeriodTree');
	Node = XMLStorage.RootNode;
	Node.SetAttributeAsInt('BeginYear', PlanningViewPeriodTree.BeginYear, 
		Today.getFullYear());
	Node.SetAttributeAsInt('EndYear', PlanningViewPeriodTree.EndYear, 
		Today.getFullYear());
	Node.SetAttributeAsStr('Period', PlanningViewPeriodTree.Planning.Period, 
		'');
	Node.SetAttributeAsBool('IsRefreshManually', cbRefreshManually.IsChecked, 
		false);
 
	Data = DatasetToMime(dlData.Dataset);
	Node.SetAttributeAsStr('Dataset', Data, '');
 
	var Key = PlanningViewPeriodTree.Planning.ID;
	Key = '_PeriodTree_' + Key.replace(/[{}-]/g, '');
	Services.SaveItemProfileStorage(Self.USI, Key, XMLStorage);
}
function LoadPeriodTreeFromProfile() {
	if (!PlanningViewPeriodTree.Planning) {
		return false;
	}
 
	var XMLStorage;
	var Node;
	var Today = new Date;
	var Data;
 
	var Key = PlanningViewPeriodTree.Planning.ID;
	Key = '_PeriodTree_' + Key.replace(/[{}-]/g, '');
	XMLStorage = Services.GetItemProfileStorage(Self.USI, Key);
	if (!XMLStorage) {
		return false;
	}
	XMLStorage.InitRootNode('PeriodTree');
	Node = XMLStorage.RootNode;
	PlanningViewPeriodTree.BeginYear = Node.GetAttributeAsInt('BeginYear', 
		Today.getYear());
	PlanningViewPeriodTree.EndYear = Node.GetAttributeAsInt('EndYear', 
		Today.getYear());
	edtFromYear.Value = PlanningViewPeriodTree.BeginYear;
	edtToYear.Value = PlanningViewPeriodTree.EndYear;
	cbRefreshManually.IsChecked = Node.GetAttributeAsBool('IsRefreshManually', 
		false);
 
	var Period = Node.GetAttributeAsStr('Period', '');
	if (IsEmptyGUID(Period) || 
		(Period != PlanningViewPeriodTree.Planning.Period)) {
		return false;
	}
	Data = Node.GetAttributeAsStr('Dataset', '');
	if (Data == '') {
		return false;
	}
 
	var Dataset = dlData.Dataset;
	if (!MimeToDataset(Dataset, Data)) {
		return false;
	}
	Dataset.Attributes('Filled') = true;
	ExpandTree();
	return true;
}

Спасибо ещё раз. Посмотрел. Не всё, конечно, понятно, но разобрался с тем, что хотел :)

Показать все комментарии

При редактировании конфигурации сохраненная схема не заменяется, а добавляется в систему. Таким образом, в базе данных хранятся все предыдущие версии, и их при необходимости можно применить.

Если у Вас возникли проблемы с доработкой схемы конфигурации, и она была повреждена до такой степени, что не открывается, можно откатиться до предыдщей версии запросом на уровне базы данных:

SELECT Max(Version) FROM SysSchemaInSolution WHERE Name = 'TestSchema'

UPDATE SysSchemaInSolution SET Version = -maxVersion WHERE Version = maxVersion;

где 'TestSchema' - название поврежденной схемы.

Нравится

Поделиться

0 комментариев
Показать все комментарии