Выбор вспомогательного глагола sein или haben для прошедшего времени Perfekt зависит от значения основного глагола.
Достаточно запомнить правила для глаголов с sein, а остальные глаголы употреблять с haben.
Вспомогательный глагол sein употребляется:
1) с глаголами движения: Anna ist in die Stadt gefahren. - Анна уехала в город.
Примеры таких глаголов: kommen, gehen, schwimmen, springen, laufen ...
2) с глаголами, обозначающими переходные состояния: Ich bin gestern um 23 Uhr eingeschlafen. - Я вчера уснул/а в 11 часов вечера.
Примеры таких глаголов: sterben, aufstehen, wachsen ...
3) с рядом глаголов: sein, werden, bleiben, gelingen, geschehen, passieren: Was ist passiert? Was ist los? - Что случилось?
Картинка для лучшего запоминания:
С остальным большинством глаголов используется вспомогательный глагол haben:
1) со всеми переходными глаголами (имеющими после себя прямой объект и падеж Akkusativ): Ich habe den Schlüssel vergessen. - Я забыл/а ключ.
2) с глаголами, описывающими явления природы: Es hat gestern geregnet. - Вчера шел дождь.
3) с возвратными глаголами (с sich): Ich habe mich gut erholt. - Я хорошо отдохнул /а.
4) с большинством других глаголов: Ich habe ihm immer geholfen. - Я всегда ему помогал.
Даже немцы иногда дискутируют о том, требуют ли какой-то определённый глагол haben или sein.
Часто всего это из-за региональных различий. Например, на севере Германии говорят «Ich HABE gesessen» (Я сидела), тогда как на юге – «Ich BIN gesessen». По словарю и своду правил грамматики «Дуден» оба варианта являются правильными.
Есть глаголы, которые меняют своё значие в зависимости от употребления с haben или sein.
Например:
fahren + haben: Ich habe den Sohn nach München gefahren. - Я отвёз сына в Мюнхен.
fahren + sein: Ich bin nach München gefahren. - Я поехал в Мюнхен.
Разница в том, что с haben ставится акцент на том, что вы водите машину и везёте сына, а это не совсем то "движение", которое требует глагола sein, поэтому и используется haben. Не путайте это!