The 21-year-old wicketkeeper-opening batsman made 38 to equal the mark of England’s Jonathan Trott in reaching the landmark of 1,000 runs in only 21 one-day games.
Faf du Plessis top-scored with 55 as South Africa were bowled out for 257 in 49.4 overs after being put in to bat.
It was only the third time in 34 ODI meetings that Zimbabwe had bowled out their southern African rivals.
Out-of-form South Africa captain AB de Villiers was involved in a bizarre dismissal.
He missed a delivery from spinner Prosper Utseya and, in the mistaken belief that Richmond Mutumbami did the same, set off for a single only for the bemused wicketkeeper to run him out for one.
Sean Williams (55) then passed 50 for the second successive match but Zimbabwe were bowled out for 196 in 49.1 overs.
Paceman Wayne Parnell took three for 28 while all-rounder Ryan McLaren picked up three for 21.
The final match is also in Bulawayo on Thursday before South Africa and Zimbabwe are joined by Australia for a triangular series that stars in Harare on Monday. (Reuters)