Могу предложить такой вариант...
Код: Выделить всё
  PROGRAM
  MAP
  END                       
  
IteratorQueue     QUEUE,TYPE
Item                &CSTRING
                  END
Iterator          CLASS,TYPE
Items               &IteratorQueue,PRIVATE
Position            LONG,PRIVATE
Construct           PROCEDURE
Destruct            PROCEDURE
Init                PROCEDURE(*QUEUE Q, LONG FieldPosition=1)
Init                PROCEDURE(STRING Items)
AddItem             PROCEDURE(STRING Item)
Count               PROCEDURE(),LONG   
Get                 PROCEDURE(),STRING  
Next                PROCEDURE(),STRING  
Kill                PROCEDURE 
                  END
  
IterOne           Iterator
TestQueue         QUEUE
ID                  LONG  
Number              LONG
                  END
  
  CODE            
  ! вариант 1
  IterOne.Init('1,2,3')
  LOOP IterOne.Count() TIMES
    MESSAGE(IterOne.Get())
  END
  IterOne.Kill           
  
  ! вариант 2
  IterOne.AddItem(100)
  IterOne.AddItem(200)
  IterOne.AddItem(300)
  LOOP IterOne.Count() TIMES
    MESSAGE(IterOne.Get())
  END
  IterOne.Kill           
  ! вариант 3
  LOOP W# = 1 TO 5
     TestQueue.ID = W#
     TestQueue.Number = RANDOM(1,1000)
     ADD(TestQueue)
  END
  IterOne.Init(TestQueue, 2)
  LOOP IterOne.Count() TIMES
    MESSAGE(IterOne.Get())
  END
Iterator.Construct           PROCEDURE
  CODE                            
  SELF.Items &= NEW IteratorQueue
  
Iterator.Destruct            PROCEDURE
  CODE           
  SELF.Kill
  DISPOSE(SELF.Items)
Iterator.Init                PROCEDURE(*QUEUE Q, LONG FieldPosition=1)
Cnt                          LONG
Field                        ANY   
  CODE
  LOOP Cnt = 1 TO RECORDS(Q)
    GET(Q, Cnt)
    Field &= WHAT(Q, FieldPosition)
    SELF.AddItem(Field)
  END
Iterator.Init                PROCEDURE(STRING Items)
SplitStrPos                  LONG,AUTO
StartPos                     LONG(1)      
Delimiter                    EQUATE(',')
  CODE                                                       
  LOOP
    SplitStrPos = INSTRING(Delimiter, Items, 1, StartPos)
    IF SplitStrPos
      SELF.AddItem(Items[StartPos : SplitStrPos-1])
      StartPos = SplitStrPos + LEN(Delimiter)
      IF StartPos > LEN(Items)
        BREAK
      END
    ELSE
      SELF.AddItem(Items[StartPos : LEN(Items)])
      BREAK
    END
  END
Iterator.AddItem             PROCEDURE(STRING Item)
  CODE                     
  SELF.Items.Item &= NEW CSTRING(LEN(Item)+1)
  SELF.Items.Item = CLIP(LEFT(Item))
  ADD(SELF.Items)
Iterator.Count               PROCEDURE()!,LONG
  CODE                                        
  RETURN RECORDS(SELF.Items)
  
Iterator.Get                 PROCEDURE()!,STRING  
  CODE
  RETURN SELF.Next()
Iterator.Next                PROCEDURE()!,STRING  
  CODE                       
  SELF.Position += 1
  GET(SELF.Items, SELF.Position)
  IF ERRORCODE() THEN RETURN '' END
  RETURN SELF.Items.Item
Iterator.Kill                PROCEDURE 
Cnt                          LONG
  CODE
  LOOP Cnt = 1 TO SELF.Count()
    GET(SELF.Items, Cnt)
    DISPOSE(SELF.Items.Item)
  END                
  FREE(SELF.Items)
  SELF.Position = 0
 
			
			
									
						Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса