Рассмотрим пример кода:
ТаблицаТоваров = ВыбратьТоварыАвтоматически(Склад);
В указанном примере функция "ВыбратьТоварыАвтоматически" выполняется синхронно. Т.е. пока работает функция, код далее не выполняется. Если функция работает долго, то мы должны будем ждать, пока она не закончит свою работу. Выполнять другие действия или прервать работу функции мы не можем.
Для того, чтобы обойти это ограничение, нужно выполнить функцию асинхронно:
&НаКлиенте
Процедура ВыбратьТовары(Команда)
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораТоваров", ЭтаФорма);
ВыбратьТоварыАвтоматически(ОписаниеОповещения, Склад);
КонецПроцедуры
&НаКлиенте
Процедура ПослеВыбораТоваров(ТаблицаТоваров) Экспорт
КонецПроцедуры
Приведенный пример будет работать так:
- Начать выполнять "Выбрать товары"
(при этом дальнейшее выполнение кода не блокируется и наша система может работать дальше). - Когда функция "Выбрать товары" завершит свою работу, будет вызвана процедура "ПослеВыбораТоваров"
Функция "ВыбратьТоварыАвтоматически" выполняет какие-то вычисления и возвращает результат. Но что, если для получения результата необходимы действия пользователя. В этом случае необходимо разработать окно, в котором пользователь сможет "поработать" и вернуть результат.
Ниже приведено сравнение описания функции и окна:
В обоих случаях соблюдаются правила:
- Описываются параметры и результат.
- Вызывающая сторона не знает, как устроена функция (окно), которое вызывается.
- Функция (окно) не знают, кто их вызывает и как будет использован результат.
Теперь можно написать код, который будет выполнять выбор товаров с использованием окна "ВыборТоваров" вместо функции "ВыборТоваров".
Кратко и понятно, но, к сожалению, работать не будет.
Дело в том, что открыть окно и передать из одного окна в другое результат можно только на клиенте.
Таблица товаров - это таблица значений и она не может существовать на клиенте (тонкий клиент и веб-клиент не поддерживают таблицы значений).
Для того, чтобы обойти это ограничение, необходимо передавать не поддерживаемые на клиенте значения через временное хранилище. Ниже приведен код, реализующий передачу результата через временное хранилище. При необходимости передать параметры, не поддерживаемые на клиенте, надо применить этот же подход.
Теперь можно еще немного усложнить задачу. Пусть необходимо из процедуры "ВыбратьТовары" в процедуру "ПослеВыбораТоваров" передать какие-то значения. Например, передадим признак необходимости очистить табличную часть перед добавлением выбранных товаров.
Вот и все.
Итого:
- Вызов одного окна из другого можно рассматривать как вызов функции.
При разработке окна можно руководствоваться теми же принципами, что и при разработке функции: единственная цель, понятные параметры и результат и т.д. - При необходимости передавать между окнами значения, которые не поддерживаются на клиенте, надо использовать временное хранилище.
- При необходимости предать параметры из процедуры открытия окна в процедуру обработки результата требуется использовать дополнительные параметры.