Img/xRom.gif Главная О сайте Новости Документация Программы OLAP Ссылки
на сайте на Народ.Ру на Яндексе


Ответ на вопрос по использованию функции Шаблон()

Вопрос:
Можно ли вызвать функцию (например Контроль()) находящуюся в модуле формы документа1 из модуля формы документа2 ? Если можно то как? Т.е. я в документе2 создаю (открываю) документ1 и вызываю его функцию. Не обязательно чтоб она что-нибудь вернула, главное чтобы выполнилась.
...Делал так:
ОткрытьФорму( "Документ.Счет", Конт, "");
_ВычислитьОбъект("Конт.Контроль()"); // ни чего
_ВычислитьОбъект("Конт.ЛокальнаяПерем"); // тоже ни чего
...

Ответ:
ИМХО проблема заключается в том, что видимость локального модуля в глобальном с помощью функции Шаблон(), будет достигнута только в случае, если из открытой локальной формы передано управление в гл. модуль. В данном случае все ровно наоборот, из гл. модуля открывается локальная форма. Таким образом, в процедуре ПриОткрытии () локальной форме придется вернуть управление в гл. модуль, что не очень удобно.

На мой взгляд, гораздо эффективнее и универсальнее будет поступить следующим образом...
Вот краткий пример реализации для подобных случаев:


Глобальный модуль или модуль формы любого другого объекта (для конкретного вопроса это может быть например Документ2):
В том месте, из которого мы открываем другую форму создаем объект типа "СписокЗначений". В него передаем список действий, которые должны выполниться в открываемой форме а также устанавливаем флаг служебного открытия. В этот список, если нужно, мы можем записать результат выполнения лок. функций.
...
СЗ=СоздатьОбъект("СписокЗначений");
СЗ. Установить ("СлужебноеОткрытие",1 ); // флаг
СЗ. ДобавитьЗначение ("Контроль()"); // действие
СЗ .ДобавитьЗначение ("Контроль2()"); // действие2
СЗ. ДобавитьЗначение ("КонтрольN()"); // действиеN
СЗ. ДобавитьЗначение ("КакаяТоЛокПеременная"); // действие
ОткрытьФорму("Документ.Счет" ,СЗ );
// а здесь нам уже доступен результат выполнения функций и значения переменных
; // остается только получить их
...


В локальном модуле открываемого объекта (в данном случае это "Счет") анализируем переданный параметр и выполняем нужные действия:

Процедура ПриОткрытии ()
     Параметр =Форма .Параметр ;
     Если ТипЗначенияСтр( Параметр)="СписокЗначений" Тогда
          Если Параметр .Получить ("СлужебноеОткрытие")=1 Тогда
               Для Индекс =2 По Параметр. РазмерСписка() Цикл
                    Действие= Параметр. ПолучитьЗначение( Индекс);
                    Параметр. УстановитьЗначение( Индекс, _ВычислитьОбъект( Действие));
               КонецЦикла;
          КонецЕсли;
     КонецЕсли;
// ...а дальше остальное тело процедуры
КонецПроцедуры





1C:TOP-100 КЛУБ ПРОФЕССИОНАЛОВ 1С
Hosted by uCoz