A general solution for your problem should not create all tuples, only to throw most of them away. Additionally, one should consider the situation when the elements in the list cannot be compared, but the user knows that they are ordered. Therefore, here is an approach which creates the positions rather the elements itself.
When we create all tuples and highlight the elements for your specific example, we notice a pattern:

Staring at this a while, you might notice that you can solve this with a nested Table
Table[{i, j, k}, {i, 4}, {j, i, 4}, {k, j, 4}]
(* {{{{1, 1, 1}, {1, 1, 2}, {1, 1, 3}, {1, 1, 4}}, {{1, 2,
2}, {1, 2, 3}, {1, 2, 4}}, {{1, 3, 3}, {1, 3, 4}}, {{1, 4,
4}}}, {{{2, 2, 2}, {2, 2, 3}, {2, 2, 4}}, {{2, 3, 3}, {2, 3,
4}}, {{2, 4, 4}}}, {{{3, 3, 3}, {3, 3, 4}}, {{3, 4, 4}}}, {{{4, 4, 4}}}} *)
If you look closer at the iterators i,j, and k you see how it works: You need 3 iterators because you want tuples of length 3 and you need to iterate to 4, because your list has length 4. If you now take the above outcome as positions in a list, you can create the result for a general (uncomparable) list:
Table[Part[{a, b, c, d}, {i, j, k}], {i, 4}, {j, i, 4}, {k, j, 4}]
(* {{{{a, a, a}, {a, a, b}, {a, a, c}, {a, a, d}}, {{a, b,
b}, {a, b, c}, {a, b, d}}, {{a, c, c}, {a, c, d}}, {{a, d,
d}}}, {{{b, b, b}, {b, b, c}, {b, b, d}}, {{b, c, c}, {b, c,
d}}, {{b, d, d}}}, {{{c, c, c}, {c, c, d}}, {{c, d, d}}}, {{{d, d, d}}}} *)
What's left is to do is to flatten the result appropriately and to create this Table
dynamically for any list and any tuple-length:
f[l_List, n_] :=
With[{iter = {#2, #1, Length[l]} & @@@
Partition[Prepend[Array[Unique[] &, n], 1], 2, 1]},
Part[l, #] & /@
Flatten[Table @@ {iter[[All, 1]], Sequence @@ iter}, n - 1]
]
And now you can use the approach for any kind of list. Be careful, you have to ensure that the input list is sorted to your needs:
