Hi there Hedgehog,
What you want to do is very much possible, and indeed it's possible in a myriad of different ways and techniques.
The simplest (for me) would be to use a List object.
1) Place the List object outside your frame, then set it up with no scroll bar and with the "Hide on start" property switched on, so it doesn't take up your resources and doesn't show up on the screen. Note that you can decide whether the List should be 0-based (start with 0) or 1-based (start with 1) in the properties.
2) Populate the List with 15 lines, each containing the ID number of one of your items (I'm assuming 1, 2, 3 etc. all up to 15). Best way to do that would be to use a fast loop: run a fast loop (Action: Special conditions > Fast loops > Start loop) 15 times at the start of your frame and add a new line to the List on each loop (Condition: Special conditions > On loop, then Action: List > Add a line): set it up so that the new line added contains your fast loop's index (Expression: Special conditions > Fast loops > Get loop index), with 1 added to it (we add +1 due to fast loops being 0-based -- and we want our first line to be "1").
3) Once you have 15 lines in your List, you can use it as a number pool for your items: when you create one of those three items, assign it a number from the List (choose a line at random - Expression: List > Get Line), then remove that line from the List. Once assigned, the chosen number is removed from the pool, making sure you won't draw it again during this store visit.
Also, remember that when you're choosing the next number (after you already assigned one or two), you should do so with a smaller random pool (as there will now be 14 or 13 numbers in the List) - simply subtract the number of items already assigned from your random pool, storing said number in some value, perhaps the alterable of the List or another object.
When using a list you'll always have a way to make sure all your items are unique - and you can even store this List to make sure same items don't pop up two times in a row, during two separate store visits (in that case you would simply clear the list and repopulate it on the 2nd or 3rd time that the player enters the store, instead of doing it on every visit).
Now, as I mentioned, this would be my prefered method, but it's far from the only one. If you'd like to compare the ID numbers between your objects, you can "brute force it" (reroll numbers until they're unique) by scoping your objects with ForEach loops and comparing the alterable value containing your randomized item ID. You can take the basic "number pool" idea and pair it with an Array, if you'd like, or reverse it and use an Array to store the numbers you've already drawn, which would be compared with loops and assigned to the objects once the comparisons and redraws are complete.
Finally, a quirky, silly little solution if you're adamant you don't want to use a random pool: the bamboozle. You can divide your 15 item IDs into three little piles of 5, assign each pile to one object (so, one can only draw from 1-5, the other from 5-10, the third from 10-15) and then, after they've drawn their numbers... switch them around at random, instantly swapping their positions between them. Players will never know. I won't tell either.
One more thing: performance considerations. The List object is "heavier" than most data storage options, but I'm sure that unless you're squeezing out everything from your engine and fighting for scraps of performance by juggling groups activations to lock down each and every fastloop... you won't even notice. If your application is Windows-only, you might want to consider the Internal List object, which is faster, but Windows-exclusive (while the standard List can be used across multiple platforms).
Edit: Volnaiskra explained the pool idea above while I was still typing this out