Имя: Пароль:
1C
1С v8
Вызов метода модуля объекта из управляемой формы
0 Feunoir
 
14.02.13
14:21
Есть процедура, которую нужно вызывать и из формы, и из модуля объекта. Насколько идеологически верным будет такой код?


&НаКлиенте
Процедура Заполнить(Команда)
   
   ЗаполнитьСервер();
   
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСервер()

   ДокОбъект = РеквизитФормыВЗначение("Объект");
   ДокОбъект.ЗаполнитьДокумент();
   ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
   
КонецПроцедуры


То есть работать-то оно работает, но вот меня смущает преобразование туда-сюда.
1 Stim
 
14.02.13
14:25
нехорошо это получать целый объект и гонять его взад-вперед.
Лучше перенести процедуру в модуль менеджера и вызывать оттуда
2 Infsams654
 
14.02.13
14:31
(1) а в процедуру модуля менеджера ты как объект передавать собрался ?
3 Feunoir
 
14.02.13
14:31
(1) Была такая мысль, но разве в этом случае объект гонять не придется?
4 Поросенок Петр
 
14.02.13
14:35
(2) Там блевотно копаются в коллекции формы делая вид что это объект, периодически проверяя разного рода типы.
5 Defender aka LINN
 
14.02.13
14:35
(2) Про параметры процедур когда-нибудь слышали?
(3) О да. В (0) ты его, конечно, не гоняешь...
6 Infsams654
 
14.02.13
14:40
(5) это ты так прикалываешся, или всеръез не въезжаешь ?
7 Defender aka LINN
 
14.02.13
14:43
(6) Ты спрашиваешь, въезжаю ли я в проблему, которой нет?
Лично мне, например, никакая религия не мешает передавать в процедуру параметр.
8 lefthander
 
14.02.13
14:54
(0)

Синтаксис:

РеквизитФормыВЗначение(<ИмяРеквизита>, <Тип>)
Параметры:

<ИмяРеквизита> (обязательный)

Тип: Строка.
Имя реквизита формы, который необходимо преобразовать.
Может быть указан реквизит данных формы (см. описание параметра <Объект> метода ДанныеФормыВЗначение).
<Тип> (необязательный)

Имя реквизита формы не есть весь объект, который вы собираетесь "гонять" туда/сюда
9 Infsams654
 
14.02.13
14:55
(7) суть в том, что по (0) объект уже есть на сервере. Вызов из модуля менеджера (т.н. статические методы) с передачей в параметре ссылки поднимает объект, если объекта по этой ссылке еще нет, т.е. (1) тут не прав - ничего гонять не надо, т.к. все дела не сервере происходят
10 Defender aka LINN
 
14.02.13
14:55
(8) Вообще-то, это и есть "весь объект"
11 Defender aka LINN
 
14.02.13
14:55
(9) Ты накурился?
12 lefthander
 
14.02.13
15:00
(10) под "весь объект" понимается форма со всеми реквизитами? или конкретный реквизит формы?
13 regniws
 
14.02.13
15:01
(12) под "весь объект" понимается объект. Причем тут вообще форма-то..
14 lefthander
 
14.02.13
15:04
(13) Ну как бы в (0) вопрос был про форму, и не просто, а управляемую форму. Или нет? Да и методы использованные в коде именно для преобразования реквизитов формы в объект на сервере, и обратно.
15 lefthander
 
14.02.13
15:07
Возможно надо было другие методы использовать, например ДанныеФормыВЗначение(<Объект>, <Тип>) и ЗначениеВДанныеФормы(<Значение>, <Объект>)
Как то так.
16 Infsams654
 
14.02.13
15:08
(13) см. описание параметра <Объект> метода ДанныеФормыВЗначение

Описание:

Структура данных для моделирования данных, редактируемых в управляемой форме. Моделирует объект с набором свойств.

&НаСервере
Процедура ЗаполнитьСервер()

   ДокОбъект = РеквизитФормыВЗначение("Объект");

выполняется на сервере, зачем (1) предлагает в модуль менеджера передавать вызов с параметром существующего объекта ?

(15) все это одно и то же
17 lefthander
 
14.02.13
15:14
(16) Я бы не был так категоричен, утверждая что все это одно и то же. Все таки они разные, методы. и для разных целей. В этом вся прелесть УФ.
18 Infsams654
 
14.02.13
15:22
(17) в общем смысле, а так то да
19 Infsams654
 
14.02.13
15:26
(16) "...В этом вся прелесть УФ" и состоит в том, что это nowhow 1С - держать формы на сервере, что не очень то соответствует общепринятой 3-хзвенной архитектуре
20 Defender aka LINN
 
14.02.13
15:32
(16) То есть, создать никому ни в пень не впившийся экземпляр объекта только чтобы вызвать там процедуру - это нормально?
А если процедура меняет данные объекта, то его потом надо возвращать обратно, перезаполнять вычисляемые поля - красота ведь.
Ну и не говоря о том, что

   ДокОбъект = РеквизитФормыВЗначение("Объект");
   ДокОбъект.ЗаполнитьДокумент();
   ЗначениеВРеквизитФормы(ДокОбъект, "Объект");

выглядит в разы солиднее, чем

   Документы.ИмяДокумента.ЗаполнитьДокумент(Объект);
21 lefthander
 
14.02.13
15:37
(20) Ну так бы сразу и сказали :)  Не умеете вы готовить УФ и всеми фибрами души против.
Насчет этого:
ДокОбъект = РеквизитФормыВЗначение("Объект");
   ДокОбъект.ЗаполнитьДокумент();
   ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
Я не думаю что это правильно, хотя и работает. Методы использованы другие.
Чуть выше (15) - это правильней.
22 Defender aka LINN
 
14.02.13
15:43
(21) В (15) точно такая же куита, вид сбоку.
Про мое неумение работать с УФ - это забавно даже, посмеялся.

Оставьте в покое объект, его надо просто передавать в процедуру и не ипать никому моск. Как на парадоксально, но платформе без разницы, чем является "Объект" в конструкции вида "Объект.Реквизит = Значение"
23 lefthander
 
14.02.13
15:54
(22) Уговорили, я тоже посмеялся :)
24 Feunoir
 
14.02.13
15:59
Отвлекся на час, называется...

(22) Мне кажется, я понял идею. Процедура в модуле менеджера будет работать с объектом, если процедуру вызвали из модуля объекта. И с коллекцией данных формы, если вызвали из модуля формы. И результат, по идее, должен быть аналогичным в обоих случаях.

Правильно?
25 Defender aka LINN
 
14.02.13
16:00
(24) Аминь.
26 Infsams654
 
15.02.13
08:14
(24) конечно аналогично, только вы разберитесь в разнице между статическими методами и методами объекта. Статические (модуля менеджера) нужны, к примеру для печати или проведения документов из формы списка, т.е. когда объекты не подняты. Из (0) "Есть процедура, которую нужно вызывать и из формы, и из модуля объекта" следует, что объект открыт - зачем делать масло масляным ?
27 НЕА123
 
15.02.13
08:51
хорошая ветка. в общем понятно.
но все-таки ответа на сабж нет.

&НаКлиенте
Процедура Заполнить(Команда)
   
   ЗаполнитьСервер();
   
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьСервер()

   ДокОбъект = РеквизитФормыВЗначение("Объект");
   ДокОбъект.Заполнить(); // здесь вызываем ОбработкаЗаполнения
   ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
   
КонецПроцедуры
есть или нет других вариантов?
28 Defender aka LINN
 
15.02.13
08:52
(27) ... Ну это ППЦ, товарищи...
29 НЕА123
 
15.02.13
08:54
(28)
ну не хочу я тело процедуры ОбработкаЗаполнения куда-то вытаскивать.
30 Feunoir
 
15.02.13
13:35
(29) Ну если не хочешь, тогда без вариантов :)

У меня тут заполнялась только табличная часть, поэтому не напрягало нисколько. В результате получилось так:

в форме

&НаКлиенте
Процедура Заполнить(Команда)
   ...
   ЗаполнитьСервер();
КонецПроцедуры

////////////////////////////////////////////////////////////////////////////////
&НаСервере
Процедура ЗаполнитьСервер()
   Документы.гт_ВыполнениеРабот.ЗаполнитьДокумент(Объект);
   Модифицированность = Истина;
КонецПроцедуры // ЗаполнитьСервер()


в модуле объекта

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

   ...    
   Документы.гт_ВыполнениеРабот.ЗаполнитьДокумент(ЭтотОбъект);
   
КонецПроцедуры


и в модуле менеджера

Процедура ЗаполнитьДокумент(Объект) Экспорт

...    

КонецПроцедуры
31 Infsams654
 
15.02.13
13:59
(30) ну если через ж...пу, то так. Еще раз "разберитесь в разнице между статическими методами и методами объекта."
32 Feunoir
 
15.02.13
14:12
(31) Давай не будем тащить в 1С парадигму ООП, ок? Ибо оно вообще тогда работать невозможно будет.

По существу возражения есть?
33 Infsams654
 
15.02.13
14:51
(32) по существу: в (0) кода меньше, чем в (30) и в меньших количествах модулей. А на счет ООП - нафига 1С тогда модуль менеджера создавало, как раз, чтоб под ООП подтянуться.
34 Feunoir
 
15.02.13
15:00
(33) Кода в целом столько-же, но в меньшем количестве модулей - согласен. В (0) меня больше напрягало ненужное создание объекта. Тут просто надо определиться, что важнее: соответствие ООП или меньшая нагрузка на сервер.
35 Infsams654
 
15.02.13
15:10
(34) ну сам посуди - все и так работает на сервере, в (30) то же самое, только нужно еще проверить наличие объекта, если его нет, то поднимай, если есть, то работай с готовым
36 А теперь Горбатый
 
15.02.13
15:13
(29) "ну не хочу я тело процедуры ОбработкаЗаполнения куда-то вытаскивать."
надо, федя, надо. покури, как в типовых сделано
37 Infsams654
 
15.02.13
15:25
(36) ну смотря в каких - БГУ vs БП. Например, в отчетах БП 3.0 почти все через модуль менеджера сделано, хотя известно, что такой отчет, ты во внешний не выгрузишь...
38 Feunoir
 
15.02.13
15:49
(35) Нене. Ничего проверять не нужно. Если процедура вызывается из модуля объекта, то она работает с объектом. Если из модуля формы - то со структурой данных формы. То есть объект во втором случае не создается.
39 Infsams654
 
15.02.13
16:53
(38) в 1С открытая форма уже означает наличие объекта, или поспоришь ?
Тогда и весь спор решается - если есть объект, тогда нафиг обращаться к менеджеру ?
40 Feunoir
 
15.02.13
21:02
(39) Поспорю!

Открытая управляемая форма вообще ни разу не означает наличие объекта. И даже не означает наличие соединения с сервером. И обращение к серверу не означает наличие объекта. Ну и так далее.
41 Infsams654
 
26.02.13
14:02
(40) +-\х*
Основная теорема систематики: Новые системы плодят новые проблемы.