First, see this answer to What are the most common pitfalls awaiting new users? for the use of _?NumericQ.
A second issue is the dependence of a function on a global variable. This is particularly easy to overlook when the variable, such as x in sol1[], is not treated as a programming variable but as an inert symbol. However, Plot[.., {x,..}] sets the value of the global variable x when evaluating the function to be plotted. When sol1[] is called via pu1[x, -1.2] inside Plot, the symbol x will have been given a numeric value and NDSolve will fail. So it's often important to localize such variables. This can be done via Module[{x},..] or Block[{x},..]. Module[] creates new unique symbols; Block[] temporarily clears any values of a global symbol. In the little bit of code where it is used, it makes little difference which you choose. If you're feeling overprotective, then localizing the global symbol sy1 might be good. But that would have consequences, since other functions (e.g. u1/pu1) use sy1 and would require them to be rewritten.
For the sake of efficiency, I mimicked the functionality of ParametricNDSolveValue, which stores the last NDSolve[] solution and reuses it unless the values of the parameters change (just e in this case). To prevent an excessive use of memory, when the parameters change values, the old saved solution is cleared (Unset[]). The line sol1[e] = First@res stores the solution, which will be used when sol1[e] is called until the value of e changes; see What does the construct f[x_] := f[x] = ... mean?.
ClearAll[pot, sol1, u1, pu1, sy1];
v0 = 100.; a = 1.;
pot[x_] := If[Abs[x] <= a, -v0*(1 - Abs[x]/a), 0];
sol1[e_?NumericQ] := Block[{x},
Quiet@Unset[sol1[#]] &@sol1["last"]; (* Unset last e *)
With[{res = NDSolve[{sy1''[x] + sy1[x]*(e - pot[x]) == 0, sy1[0] == 1,
sy1'[0] == 0}, {sy1}, {x, -a, 0}]},
(sol1["last"] = e; (* remember last e so that it can be Unset *)
sol1[e] = First@res) /; ListQ[res] (* NDSolve succeeds => res is a List *)
]
];
u1[x_, e_?NumericQ] := sy1[x] /. sol1[e];
pu1[x_, e_?NumericQ] := sy1'[x] /. sol1[e];
Plot[pu1[x, -1.3], {x, 0, -1}]
