private void SaveProperty(string name, object value, object comObject, Stack <object> pending, Metadata metadata) { var list = value as IList; if (list != null) { var tableSection = ComHelpers.GetProperty(comObject, name); ComHelpers.Invoke(tableSection, "Очистить"); foreach (Abstract1CEntity item in (IList)value) { Save(item, ComHelpers.Invoke(tableSection, "Добавить"), pending); } return; } var syncList = value as SyncList; if (syncList != null) { var tableSection = ComHelpers.GetProperty(comObject, name); foreach (var cmd in syncList.Commands) { switch (cmd.CommandType) { case SyncList.CommandType.Delete: var deleteCommand = (SyncList.DeleteCommand)cmd; ComHelpers.Invoke(tableSection, "Удалить", deleteCommand.index); break; case SyncList.CommandType.Insert: var insertCommand = (SyncList.InsertCommand)cmd; var newItemComObject = ComHelpers.Invoke(tableSection, "Вставить", insertCommand.index); pending.Push(insertCommand.index); Save(insertCommand.item, newItemComObject, pending); pending.Pop(); break; case SyncList.CommandType.Move: var moveCommand = (SyncList.MoveCommand)cmd; ComHelpers.Invoke(tableSection, "Сдвинуть", moveCommand.from, moveCommand.delta); break; case SyncList.CommandType.Update: var updateCommand = (SyncList.UpdateCommand)cmd; pending.Push(updateCommand.index); Save(updateCommand.item, Call.Получить(tableSection, updateCommand.index), pending); pending.Pop(); break; default: throw new ArgumentOutOfRangeException(); } } return; } object valueToSet; var abstractEntity = value as Abstract1CEntity; if (abstractEntity != null) { Save(abstractEntity, null, pending); valueToSet = abstractEntity.Controller.ValueSource.GetBackingStorage(); } else { if (metadata != null && value != null) { metadata.Validate(name, value); } valueToSet = comObjectMapper.MapTo1C(value); } ComHelpers.SetProperty(comObject, name, valueToSet); }