Имя: Пароль:
1C
1C 7.7
v7: ВыполнитьПроцедуру()
0 Eeakie
 
16.07.13
12:39
Добрый день.
При закрытии одного документа начинается поиск кое-какого подчиненного. В этом подчиненном надо выполнить процедуру, записать и провести. Делаю так:
подчДок // уже найден
Конт = "";
ОткрытьФорму(подчДок, Конт);
Сервис = СоздатьОбъект("Сервис");
Сервис.ВыполнитьПроцедуру(Конт, "Распределить"); // всё отлично выполняется

Как этот документ теперь записать и провести?
1 Eeakie
 
16.07.13
12:59
Да ладно... ап!
2 povar
 
16.07.13
13:01
выполни процедуру записать и провести
3 Ёпрст
 
16.07.13
13:01
Вот подрастешь и поймешь, что открывать форму это моветон для таких задач
4 Eeakie
 
16.07.13
13:03
(3) тогда как мне получить контекст найденного документа чтобы "ВыполнитьПроцедуру()"?
5 Eeakie
 
16.07.13
13:03
(2) звучит очень просто. Конт.Записать() и Конт.Провести() ругается.
6 povar
 
16.07.13
13:04
(5) не так
7 Eeakie
 
16.07.13
13:05
(6) собственно, к этому сабж. Как?
8 Галахад
 
гуру
16.07.13
13:07
подчДок.Записать(). Не?
9 Eeakie
 
16.07.13
13:08
(8) "Объект заблокирован".
10 Eeakie
 
16.07.13
13:16
Ладно. Давайте больше не будем про записать/провести.
При создании документа программно как "ВыполнитьПроцедуру(парам1,парам2)" из него? Что передавать в первый параметр?
11 Eeakie
 
16.07.13
13:26
Док.Новый();
... // заполнение
Док.Записать();

С.ВыполнитьПроцедуру(???, "..."); // что здесь должно быть чтобы выполнилась процедура из модуля этого "нового" документа?
12 Ёпрст
 
16.07.13
14:06
(11) там должен быть вызов глобальной экспортной функции заполнения документа.
13 Chum
 
16.07.13
14:16
Объект Сервис это же из 1cpp.dll или formex.dll?
14 Eeakie
 
16.07.13
14:21
(12) не понял... в первый параметр же надо передавать контекст?
(13) Формекс.
15 Eeakie
 
16.07.13
14:25
(12) + а зачем мне заполнение через глобальную функцию? Это больше походит на намёк, типа: "хватит страдать ***нёй, всё гораздо проще".
16 Ёпрст
 
16.07.13
14:56
(15) какой догадливый
17 Ёпрст
 
16.07.13
14:57
для программного создания доков вовсе не обязательно открывать их форму.
18 Ёпрст
 
16.07.13
14:57
и выполнять какие-либо процедуры в открытой форме.
19 Eeakie
 
16.07.13
14:58
(18) само собой. У меня документ уже создан, программно, без открытия формы. Просто надо выполнить процедуру из его модуля.
20 Eeakie
 
16.07.13
15:01
(18) + форму документа открывал только лишь для того чтобы получить контекст, потому что в "ВыполнитьПроцедуру()" первый параметр как раз он и есть...
21 1Сергей
 
16.07.13
15:03
(20) контекст есть только у открытой формы, выполнить код формы можно только в открытой форме. А это очень долго, жрёт много памяти и вообще не спортивно
22 Eeakie
 
16.07.13
15:05
(21) тогда хотелось бы услышать альтернативное предложение...

Всё что нужно: после проведения документа (1) создать подчиненный ему (2), заполнить его всякой ботвой из (1), выполнить процедурку в модуле (2), записать и провести.
23 Eeakie
 
16.07.13
15:06
Да и нафига тогда нужен метод "ВыполнитьПроцедуру()", если он такой "нехороший"...
24 Eeakie
 
16.07.13
15:07
(22) * ... выполнить процедуру из модуля (2).
25 Ёпрст
 
16.07.13
15:09
баловство это всё.
26 Eeakie
 
16.07.13
15:09
Да, хотелось бы не открывать форму подчиненного документа, но как через созданный объект Док можно будет обратиться к процедур из его модуля...
27 Eeakie
 
16.07.13
15:09
(25) почему баловство?
28 Ёпрст
 
16.07.13
15:10
всё можно и штатно сделать при желании, и без правки модуля формы документа
29 Ёпрст
 
16.07.13
15:11
(27) см (21)
30 Ёпрст
 
16.07.13
15:11
процедуры модуля формы документа есть только в его открытой форме.
31 Ёпрст
 
16.07.13
15:12
Если надо делать быстро и универсально, то нужный функционал выносится в глобальник и привет.

Пример, глЗаполнитьШапку во всех типовых.
32 Eeakie
 
16.07.13
15:13
(30) предположим, открывать форму не буду, тогда что? Сделать нужную мне процедуру глобальной и вызывать оттуда?
33 Eeakie
 
16.07.13
15:14
(31) ну, собственно, так и подумал...
34 Eeakie
 
16.07.13
15:22
(31) просто дело в том, что эта процедура используется только в одном случае (кнопка в документе). Не хотелось бы забивать глобальный такими, ммм, "неважными" процедурами...
35 Ёпрст
 
16.07.13
15:44
(34) перенеси её код в свою поделку, делов то
36 Eeakie
 
16.07.13
15:45
(35) там процедура на 378 строк... уже в глобальный запихнул. Всё работает. Остался лишь вопрос о рациональности...
37 Eeakie
 
16.07.13
15:47
+ (35) даже на 382 ;) Про рациональность в плане правильности сего решения.
38 Mikeware
 
16.07.13
15:48
(36) создай другой глобальник. создай класс-обертку документа. Делай через ВыполнитьМодуль, в конце концов...
39 uno-group
 
16.07.13
16:17
Блин глянул бы как быстрая печать реализованна.
Конт="Распределить"
ОткрытьФормуМодально(подчДок,"Распределить");

В документе в приоткрытии()
Если Форма.Параметр="Распределить" Тогда
Распределить();
Записать();
СтатусВозврата(0);
Возврат;
КонецЕсли;
40 Eeakie
 
16.07.13
16:19
(39) нафига после СтатусВозврата() еще Возврат()? В ходе обсуждения понял, что без открытия формы действительно лучший вариант.
41 Eeakie
 
16.07.13
16:20
(38) еще маленький для такого ;) но, как вариант, было бы, конечно, классно. Когда-нибудь сяду и попробую.
42 Eeakie
 
16.07.13
16:22
(39) хотя, это тоже выход ;)
43 Ёпрст
 
16.07.13
16:26
(42) в этом случае, форма всё равно открывается, хотя и подавляется статусом возврата, + тебе придётся править модуль формы.
44 uno-group
 
16.07.13
16:28
2(40) Статус возврата 0 в при открытии сразу закрывает документ после выполнения процедуры при открытии до конца.
Не растягивать же условие если на всю процедура.
В типовых от 1с быстрая печать так реализована и некого не парит. только ты не путай открыть форму и открыть форму модально в первом случае выполнение модуля продолжается во время открытия формы во втором останавливается до закрытия формы. многие наступали на грабли когда сразу паралельно печатается например 40 доков и 1с виснит и сходит с ума или какие глобальные переменные одновременно меняются несколькими документами.
45 uno-group
 
16.07.13
16:35
(43) Там править в документе всего пару строк. эт если надо что по быстрому сворганить во внешнем отчете чтобы юзеров не выгонять догда да. а так лучше документ подправить и быть увереным что оно работает одинаково. А не вспоминать как нибуть через год при изменение в документе процедуры распределить() что есть еще нацать оброботок где она продублированна и ее тоже надо подправить. Потом народ иногда неделями баг пытается отловить. уж тогда выносить процедуру в глобальник.
46 Ёпрст
 
16.07.13
16:37
(45) есть турбомд для этого.
А менять модуль формы для того что в (0) - баловство
47 Eeakie
 
16.07.13
16:42
В итоге мне так никто и не сказал зачем вообще нужен метод "ВыполнитьПроцедуру()". Вроде бы такой удобный...
48 Ёпрст
 
16.07.13
16:53
(47) У АЛьФ -а спроси, это его метод.
49 ADirks
 
17.07.13
06:51
(47) В основном для вызова процедур, имя которых заранее неизвестно. Например, вяческие callback'и.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший