Zenit left Arena Khimki with all three points after Igor Smolnikov side-footed home Danny's expert throughball in the 17th minute.
However, Andre Villas-Boas' men - who played Torino in the UEFA Europa League on Thursday - struggled for fluency after the break, with Dynamo perhaps unlucky not to take a point.
Zenit managed to hold out, though, and Villas-Boas believes the win could end Dynamo's title hopes.
"It's a very important win for us," he told Zenit's official website. "It's one that gives us the advantage in the race for the championship over Dynamo, but not yet over CSKA."
Sunday's other fixtures saw Kuban Krasnodar beat Terek Grozny 1-0, while Mordovia Saransk and Lokomotiv Moscow played out a 0-0 draw.
CSKA remain five points adrift of Zenit after a comprehensive 4-1 victory over Arsenal Tula on Saturday - the fixture was played on the synthetic turf of Lokomotiv Moscow's reserve arena due to the poor state of Tula's pitch.
Alan Dzagoev got CSKA off the idea start in the third minute when he headed home Zoran Tosic's delivery and Bebras Natcho hammered home the second shortly after the restart.
Rinat Timokhin halved the deficit, but Roman Eremenko drilled in from 18 yards with eight minutes left to restore the two-goal cushion and teenage forward Carlos Strandberg rounded off the win with a fine solo effort.
Saturday also saw Rubin Kazan climb to fourth courtesy of a comfortable 2-0 win over rock-bottom Rostov, while relegation-threatened Amkar Perm lost 1-0 at Ural.
Fellow strugglers Torpedo Moscow were beaten 1-0 at home to city rivals Spartak at the Otkrytie Arena in a match played behind closed doors after certain sections of Torpedo supporters aimed racist abuse at Zenit forward Hulk in last weekend's 1-1 draw at Saturn Stadium.
The action started on Friday as title hopefuls Krasnodar were 2-0 winners at Ufa - goals in each half from Vitali Kaleshin and Ari sending Oleg Kononov's men third.
Get the best features, fun and footballing frolics straight to your inbox every week.