Bei der Verwendung von `\AtEndDocument` für die Erzeugung eines Labels am Ende des Dokuments gibt es mehrere Probleme:
* Ein späteres `\AtEndDocument` kann zur Ausgabe weiterer Seiten führen, was laut Doku im Gegensatz zur Ausgabe von Material via `\AtBeginDocument` auch nicht verboten ist. Damit ist dann das `\label` nicht mehr auf der letzten Seite.
* Die Klasse, ein Paket oder irgendwelcher Präambel-Code kann zuvor ein `\clearpage` via `\AtEndDocument` eingefügt haben. Damit steht das `\label` ggf. hinter der letzten Seite. Da `\label` Code via `\write` in die `aux`-Datei schreibt, solche `\write`-Anweisungen (im Gegensatz zu `\immediate\write`) aber erst bei der Ausgabe der Seite ausgeführt werden, wird die `\label`-Anweisung quasi ignoriert, wenn sie nach der Ausgabe der letzten Seite steht. Das führt dann zu einem »*undefined reference*«-Fehler.
* Das Dokument könnte zufällig mit der Ausgabe der letzten Seite enden, bevor der `\AtEndDocument`-Code ausgeführt wird. Auch dann wird die `\label`-Anweisung kein Label mehr erzeugen.
* Einige wenige Pakete und Klassen schreiben Code in die `aux`-Datei, die zu einer weiteren Ausgabe führen. Die `aux`-Datei wird innerhalb von `\end{document}` gelesen, nachdem der `\AtEndDocument`-Code ausgeführt wird. Damit würde die `\label`-Anweisung ebenfalls zu früh stehen.
Für die ersten drei Probleme gibt es im Paket [`scrlfile`](http://www.ctan.org/pkg/koma-script) eine sehr einfache Lösung: `\BeforeClosingMainAux`. Es ist dokumentiert, dass damit gesetzter Code nach dem `\AtEndDocument`-Code ausgeführt wird und zu keiner weiteren Ausgabe führen darf. Gleichzeitig wird dafür gesorgt, dass die interne LaTeX-Anweisung `\protected@write`, die von `\label` verwendet wird, vor der Ausführung des Codes so umdefiniert wird, dass `\immediate\write` verwendet wird. Damit kann auch `\label` innerhalb von `\BeforeClosingMainAux` verwendet werden.
Für das letzte Problem gibt es keine Lösung. Da `\label` unbedingt in die `aux`-Datei schreiben muss, kann `\label` nur verwendet werden, bevor die `aux`-Datei geschlossen wird. Gelesen wird die `aux`-Datei aber natürlich erst, nachdem sie geschlossen wurde. Daher kann in der `aux`-Datei selbst kein `\label` gesetzt werden. Jeglicher Code in der `aux`-Datei, der zu einer Ausgabe führt, ist daher als kritisch zu betrachten. Derzeit kenne ich auch nur eine Klasse, die so etwas macht: die Standard-`letter`-Klasse.
Zusammenfassend sei daher als Lösung:
\usepackage{scrlfile}
\BeforeClosingMainAux{\label{page:ende}}
\BeforeClosingMainAux{%
\addtocounter{page}{-1}% Da wir uns ja nach der letzten Seite befinden.
\label{page:ende}%
\stepcounter{page}% Korrektur (s. o.) wieder rückgängig machen!
}
empfohlen. Näheres zu der Anweisung und der Problematik rund um `\AtEndDocument` und `\clearpage` findet sich übrigens in der Erklärung zu `\BeforeClosingMainAux` und `\AfterReadingMainAux` in (derzeit) Kapitel 12 der [KOMA-Script-Anleitung](http://www.komascript.de/scrguide) und natürlich auch im [KOMA-Script-Buch](http://www.komascript.de/komascriptbuch).
Das Paket [`lastpage`](http://www.ctan.org/pkg/lastpage) macht übrigens allerlei Verrenkungen, um das Problem ebenfalls zu lösen, führt aber letztlich nur ein `\clearpage` aus, bevor es die Label-Informationen per `\immediate\write` in die `aux`-Datei schreibt, kann also insbesondere das erste Problem nicht lösen und verschlimmert die Situation für andere Pakete, die Code für die letzte Seite bzw. nach der letzten Seite ausführen wollen, durch das `\clearpage` noch.