За допомогою вищих сил, вдалося роздобути, зрозуміти та відредагувати код. Та все ж виводить сполучення в порядку спадання.
program z1;
const
  m = 10;
var
  a: array [1..m] of integer; 
  b: array [1..100] of byte;
  n, NN, r, i, j, k,fr,fch,fzn: integer;
  c: real;
Procedure Swapb(i, k: byte);
var
  x : byte;
begin
  x    := b[i];
  b[i] := b[k];
  b[k] := x;
end;
Procedure Writeb;
var
  i, j : byte;
begin
  j := 1;
  for i := 1 to NN do
    if b[i] = 0 then
      Inc(j)
    else
      write(a[j]);
  writeln;
end;
begin
  repeat
    write('n = ');
    readln(n);
    if (n < 2) or (n > m) then writeln('n за межами 2..', m, ', повторити.')
  until (n >= 2) and (n <= m);
  repeat
    write('r = ');
    readln(r);
    if (r < 1) then writeln('r має бути натуральним числом, повторити.')
  until (r >= 1);
       fch:=1;
     for i:=2 to (n+r-1) do
        fch:=fch*i;
     fr:=1;
     for i:=2 to r do
        fr:=fr*i;
     fzn:=1;
     for i:=2 to (n-1) do
        fzn:=fzn*i;
     c:=fch/(fr*fzn);
     writeln('Кількість сполучень - ',c);
  NN := n-1+r; 
  for i:=1 to n do a[i]:=i; 
  for i:=1 to n-1 do b[i]:=0; 
  for i:=n to n+r-1 do b[i]:=1;
  WriteB;
  while (true) do
  begin
    i:=NN;
    while (i>0) and (b[i] >= b[i+1]) do i:=i-1;
    if i=0 then exit;
    for j:=i+1 to NN do
      if (b[j]>b[i]) then k:=j;
    SwapB(i,k);
    for j:=i+1 to (i+ ((NN+1-i) div 2)) do
      SwapB(j,NN+i+1-j);
    WriteB;
  end;
  readln
end.
Змінювала в процедурі значення 0 на 1. В деяких випадках виводить в порядку зростання, в інших - взагалі не вірні сполучення...
Procedure Writeb;
var
  i, j : byte;
begin
  j := 1;
  for i := 1 to NN do
    if b[i] = 1 then
      Inc(j)
    else
      write(a[j]);
  writeln;
end;
Можливо знаєте як вивести в порядку зростання? Буду вельми вдячна)