It's preferred to use a service. Communicating by using a parent controller breaks encapsulation not to mention it can be pretty buggy if you get someone who doesn't know about the limitations of primitives and scope inheritance etc. Angular's dependency injection works really well and your code will be more flexible in the long run if you do it that way.
Another advantage of a service is code readability. If Controller 1
references something in Controller Main
the person reading the code may not know where it came from. With a service you see it injected, you immediately know where to look for it.