gifts2017

Способ передачи данных между групповыми контекстами форм или как забыть про "глРасшифровка" и "глФлагРасшифровки"

Опубликовал Михаил Семенов (Shaman100M) в раздел Программирование - Практика программирования

Используем штатные возможности, - объект "Форма" имеет их в своем арсенале.
С посылкой данных от вызывающего контекста формы открываемому проблем никаких нет, -  используем передаваемый параметр процедуры ОткрытьФорму(). А обратно?

Во многих стандартных конфигурациях в качестве двустороннего способа передачи данных между групповыми контекстами форм используются глобальные переменные (например, упомянутые в теме "глРасшифровка" и "глФлагРасшифровки") с инициализированной структурой данных - список или таблица значений. Одна форма меняет содержимое списка значений, другая видит эти изменения, т.к. переменная со списком глобальна, доступна во всех модулях.

Между тем, объект "Форма" имеет в своем составе ту же структуру - список значений, правда, используется он для закладок... Ну ладно, закладки чуть-чуть "подвинем". Их можно использовать как "натурально", так и для хранения других списков значений, создавать как в текущей форме, так и в "чужой":
// вызывающая форма:
ОткрытьФорму("ЧтоОткрываемСмСинтаксис",Контекст);
ПолученныйСписок = Форма.Закладки.ПолучитьЗначение(1);
Если Форма.Закладки.РазмерСписка() = 1 Тогда
     // на форме не было закладок, удаляем их
     Форма.ИспользоватьЗакладки(0);
Иначе
     // были закладки, удаляем только первую
     Форма.Закладки.УдалитьЗначение(1,1);
КонецЕсли;
// Используем ПолученныйСписок!


// Открываемая форма
// ПриОткрытии()
Если ТипЗначенияСтр(Форма.Параметр) = "ГрупповойКонтекст" Тогда
    Если Форма.Параметр.Форма.ИспользоватьЗакладки() = 0 Тогда
        Форма.Параметр.Форма.ИспользоватьЗакладки(1);
    КонецЕсли;
    СписокДляПередачи = СоздатьОбъект("СписокЗначений");
    // заполняем его
    Форма.Параметр.Форма.Закладки.ВставитьЗначение(1,СписокДляПередачи,"",1);
КонецЕсли;
// Сделали "закладку" в независимой от здешних событий вызывающей форме.

Чем еще хорош это метод по сравнению с глобальными переменными, - не нужно отслеживать предыдущее состояние структур данных для обмена, - закладки для каждой формы - свои.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. ssp_ (ssp_) 09.11.07 10:23
Согласен, что использование глобальных переменных оправдано далеко не всегда.
Но почему именно закладки? Можно же в вызывающем модуле создать список значений и передать его в качестве параметра.
2. Михаил Семенов (Shaman100M) 09.11.07 10:42
(1) Туда - да. А обратно?
Код
   Список1   = СоздатьОбъект("СписокЗначений");
   ОткрытьФорму("Обработка.Новый1",Список1);
   Сообщить(ТипЗначенияСтр(Список1)); 
Показать полностью

вернет "ГрупповойКонтекст". Или имелось ввиду что-то другое?
3. Tarasenkov (tarasenkov) 09.11.07 19:45
А обратно тоже вернет списко значений или что там передали, если использовать ОткрытьФормуМодально
4. Михаил Семенов (Shaman100M) 12.11.07 08:36
(3) Ну, значит, эта статья подойдет для случаев, когда необходим немодальный режим.
5. Михаил Семенов (Shaman100M) 12.11.07 08:49
+ (4) И по идее, если передать список контекстов форм, в каждую из них благодаря этому механизму можно что-то передать, а не только вызывающей форме. И даже для модального режима значение передается "до закрытия" модальной формы (правда, как это использовать, непонятно)
6. ssp_ (ssp_) 12.11.07 08:50
А если так:
Код
Список1   = СоздатьОбъект("СписокЗначений");
Передать=Список1;
ОткрытьФорму("Обработка.Новый1",Передать);
// теперь Передать=Контекст открытой формы
//            Список1 остался списком
Показать полностью

а главное, что вызванная форма может добавлять значения в Список1 не только в ПриОткрытии(), а в любом другом месте, например в ПриЗакрытии(). И вызвавшая форма все это увидит при желании.
tarasenkov; Shaman100M; +2 Ответить
7. Михаил Семенов (Shaman100M) 12.11.07 09:05
работает. Кто ищет, тот всегда найдет. ;)
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа