Имя: Пароль:
1C
1C 7.7
v7: АктивизироватьОбъект()
0 evgpinsk_
 
21.11.19
09:13
В форме справочника есть 5 процедур, которые чтото выполняют ссылаясь на ТекущийЭлемент()
Стоит задача выполнить сначала эти 5 процедур для 1й строки справочника, потом найти новую строку справочника, активировать её и опять выполнить эти 5 процедур.
Новая строка активируется через АктивизироватьОбъект(НоваястрокаСправочника)

Проблема в том, что в справочнике после выполнения АктивизироватьОбъект фокус на новый элемент не успевает переместиться и в процедурах, которые ссылаются на ТекущийЭлемент()
они ссылаются ещё на первую строчку справочника.

Есть ли способ выполнить до конца АктивизироватьОбъект () "модально" и только когда текущий элемент поменяется, уже тогда далее выполнять следующий код?
1 ДенисЧ
 
21.11.19
09:15
А зачем так тупо? И что такое "первая строка справочника"?
2 Kigo_Kigo
 
21.11.19
09:23
Что значит "потом найти новую строку справочника" и
Активизировать ее, и выполнить еще 5 процедур, что мешает, найти ее, выполнить 5 процедур а потом активизировать?
3 Kigo_Kigo
 
21.11.19
09:24
или по вашему мнению, без ее активизации нельзя выполнить 5 процедур над ней?
4 evgpinsk_
 
21.11.19
09:28
Я знаю как решить проблему более сложным способом. В большей степени интересно аткое поведение 1с.
Почему АктивизироватьОбъект () не просиходит "сразу" и следующий за этой строкой код не ссылается на новый ТекущийЭлемент()
5 evgpinsk_
 
21.11.19
09:31
(2) У меня 5 процедур /которые находятся в форме справочника/ используют в своем коде ТекущийЭлемент().
Чтобы эти процедуры не переделывать я меняю текущий элемент справочника через АктивизироватьОбъект(новыйЭлемент)
6 ДенисЧ
 
21.11.19
09:41
(4) Потому что ты не понимаешь, как работает программа. И пока ты этого не поймёшь, все твои потуги показать, насколько "крива" 1с, выглядят даже не смешно.
7 evgpinsk_
 
21.11.19
09:54
(6) И где ты увидел у меня упоминание про кривость 1с?
По-моему когда человек задаёт вопрос это и значит что он чего-то не знает или не понимает?
8 Builder
 
21.11.19
10:06
(7) Это видно по самому вопросу.
Вот например "В форме справочника есть 5 процедур"
Тут скорее всего имелась ввиду форма СПИСКА справочника. Не так ли?
9 evgpinsk_
 
21.11.19
10:10
(8) А при чём тут кривость 1с?
10 Builder
 
21.11.19
10:13
(9) Вы не любите кошек? Вы просто не умеете их готовить. (с)
Нет никакой кривости 1С.
Есть неправильно написанный код вызова процедур.
Если хочешь помощи - показывай код.
11 evgpinsk_
 
21.11.19
10:24
(10) Блин, да где Вы увидели в (1) про кривость 1с???
Есть простой вопрос, ниже процедура ЧтениеИмпорт находится в форме списка справочника:

Процедура ЧтениеИмпорт()
    Процедура1();    //В этих процедурах есть ссылка на ТекущийЭлемент()
    Процедура2();    
    Процедура3();    

    АктивизироватьОбъект(НовыйОбъектВСПравочнике);    

    Процедура1();    //Я предполагал что при начале выполнения кода Процедура1() новый элемент справочника уже будет активирован предыдущей командй
    Процедура2();    
    Процедура3();    
КонецПроцедуры //
12 evgpinsk_
 
21.11.19
10:26
Т.е. мне просто для двух разных элементов справочника нужно выполнить одну и туже процедуру ЧтениеИмпорт(). И вот заметил не понятное для меня поведения кода
13 Kigo_Kigo
 
21.11.19
10:31
(12) Если вы создали Новый Элемент справочника, то он автоматом ТекущийЭлемент() его не надо активизировать, и да, передавая его вы не забыли его записать? ну так на всякий
14 evgpinsk_
 
21.11.19
10:36
(13) Я не создаю новый. Я просто открыл справочник. Мышкой активировал нужную строку в списке справочника. Нажимаю кнопку и по ней выполняется ЧтениеИмпорт().
И далее мне нужно выполнить эту же процедуру для другого элемента справочника. И вот я добавил в процедуру код : АктивизироватьОбъект(НовыйОбъектВСПравочнике);
но он работает не так как я думал
15 Builder
 
21.11.19
10:39
(14) А не проще передать в процедуру нужный элемент справочника?
Процедура1(ВыбЭлемент);
Процедура2(ВыбЭлемент);
16 Builder
 
21.11.19
10:40
И активизировать ничего не надо.
17 evgpinsk_
 
21.11.19
10:43
(15) Это как минимум в десяти строчках кода внести изменения, не так ли  :)
Проще как раз было сделать так как сделал я, и что /по логике/ должно было сработать.
но оно не сработало. меня это заинтересовало и я задал вопрос.
Кто знает почему не сработало?
18 АЛьФ
 
21.11.19
10:43
2(0) Можно отказаться от использования АктивизироватьОбъект() и попробовать слать "стрелка вниз" с помощью "sendkey".
19 АЛьФ
 
21.11.19
10:45
2(17) Скорее всего, АктивизироватьОбъект() работает так же, как Форма.Закрыть(), т.е. не выполняется сразу, а дает задание выполнить смену активного элемента. Собственно смена выполняется после окончания работы текущего кода.
20 Builder
 
21.11.19
10:49
(17) Да, 10 строчек кода - это слишком!
На мисте тему создать гораздо быстрее :)
21 ikea
 
21.11.19
10:51
(0) Когда тебя уже уволят?
22 evgpinsk_
 
21.11.19
10:52
(18) Там не вниз. У текущего элемента есть ссылка на какойто другой.
(20) Вопрос показался интересным - вот и задал
23 trad
 
21.11.19
10:53
(19) да,  АктивизироватьОбъект() работает "через" очередь сообщений окна, т.е. после отработки кода.
То как хочет сделать автор - так делать нельзя. Абсолютно. В (18) потворствуешь злу ))
Автору нужно действовать через СоздатьОбъект("Справочник.Вид")
24 Kigo_Kigo
 
21.11.19
10:53
Вопрос в том, а активизируется ли объект ?
25 evgpinsk_
 
21.11.19
10:55
(24) Да. в конце кода я его вижу активированным
26 АЛьФ
 
21.11.19
10:56
2(22) Тогда через псевдозакрытие можно попробовать сделать.
2(23) Да я сам - воплощение зла :)
27 evgpinsk_
 
21.11.19
10:56
(23) Ну почемуже нельзя. Если бы работало, не вижу проблем. Просто не работает, значит придётся меняться код
28 ikea
 
21.11.19
10:58
(26) Вот зачем на блюдечке ему все? (0) - сейчас скажет положили в рот, теперь и прожуйте)
29 trad
 
21.11.19
10:58
(25)
Делаешь СоздатьОбъект
Организуешь выборку элементов, такую же как в форме списка
Над каждым полученным элементом колдуешь свой ЧтениеИмпорт

Да, переписать придется код. Но говнокод нужно переписывать.
30 АЛьФ
 
21.11.19
11:00
2(28) Да ладно тебе. Не сработает же мой совет.
31 trad
 
21.11.19
11:07
(27) офф
что, кстати, в чтениии екселя у тебя победило ADO или Application+Range ?
32 evgpinsk_
 
21.11.19
11:19
(31) Победил Йоксель - в разы быстрее чем Адо
33 evgpinsk_
 
21.11.19
11:21
(29) Т.е. Вы своём коде никогда не используете ТекущийЭлемент() а всегда создаёте новый объект, потому-что ТекущийЭлемент() это говнокод? )
34 АЛьФ
 
21.11.19
11:43
Кстати, переписывать-то код очень легко. Сделать автозамену по тексту ТекущийЭлемент() на ПолучитьТекущийЭлемент(). Потом в функции ПолучитьТекущийЭлемент() рулить уже нужным элементом. Минуты две на "переписывание".
35 trad
 
21.11.19
12:24
(33) ТекущийЭлемент(), разумеется, использую
ТекущийЭлемент() - это не говнокод
36 trad
 
21.11.19
12:25
тот способ который ты избрал для перебора элементов - это говнокод
37 Ёпрст
 
21.11.19
13:03
(0) все можно сделать, даже "псевдо распараллелить" и  посчитать количество активных (видимых) элементов в любом списке справочника (штатно, без вк ) ..токма, оно надо ?
38 Ёпрст
 
21.11.19
13:03
вот, склоняюсь к (36)
39 evgpinsk_
 
21.11.19
13:06
(36) Уверен? для начала - я элементы НЕ ПЕРЕБИРАЮ, а всего-лишь для связанного элемента справочника хотел выполнить теже процедуры, которые были уже написаны для текущего элемента.
и был выбран правильный способ - использовать АктивизироватьОбъект(), если бы он "правильно" отрабатывал то что требовалось
40 evgpinsk_
 
21.11.19
13:08
(37) вот именно. любую задачу можно решать разными способами. способ (0) позвалял решить поставленную задачу с минимальными трудозатратами, да не вышло, поэтому придётся кода переписать чуток больше
41 Builder
 
21.11.19
13:11
(39) использовать АктивизироватьОбъект() - ни разу не правильный способ.
Это называется "Дай ка попробую, авось прокатит".
Есть ссылки на 2 элемента, передать их последовательно и все. Зачем что-то активировать и думать что 1с отработает как хочется автору?
42 trad
 
21.11.19
13:12
(39) уверен - перебираешь, просто не понимаешь этого.
сначала взять один элемент, потом другой - это и есть перебор
43 evgpinsk_
 
21.11.19
13:17
(41) Затем что второй способ в 7 раз больше кода заставляет переделать. Помимо ТекущийЭлемент() в процедурах может использоваться прямой доступ к имени реквизита справочника.
Это всё придётся переделывать.
Поэтому способ был выбран правильный, даже если я /как и многие из вас кстате :) / изначально не знал бы как именно отрабатывает АктивизироватьОбъект()
намного проще тупо скопипастить добавить в код :

    АктивизироватьОбъект(НовыйОбъектВСПравочнике);    
    Процедура1();
    Процедура2();    
    Процедура3();    
    Процедура4();    
    Процедура5();    

чем ИЗМЕНЯЯТЬ работающий код в пяти процедурах, где есть ссылки на реквизиты элемента
44 evgpinsk_
 
21.11.19
13:18
(42) Всё я прекрасно понимаю. Одно дело когда перебор из двух элементов и совсем другое когда из 100
45 Kigo_Kigo
 
21.11.19
13:18
есть затычка для этого способа, открывать модально форму обработки, там активизировать нужный объек, но там тоже надо писать и это будет действительно затычка
46 evgpinsk_
 
21.11.19
13:21
(41) Если бы всё делать изначально, тогда да. Но изначальная задача была другая, над текущим элементом справочника чтото сделать. И у него не был связанного элемента.
Поэтому в процедурах и использовалось прямое обращение к реквизитам справочника.
Я не уверен, что можно безапеляционно заявлять, что такой метод однозначно является говнокодом
47 evgpinsk_
 
21.11.19
13:22
(45) Нет, конечно так делать не буду. Раз не сработал АктивизироватьОбъект(), то всё исправил через СоздатьОбъект()
48 Злопчинский
 
21.11.19
17:35
АктивизироватьОбъект - обтрабатывает после исполнения всего кода процедуры.
Поэтому - активизируй обьект, вруби обработку ожидания (формексовскую можно) с задержкой - в обработке ожидания выполни "5 процедур"
49 evgpinsk_
 
21.11.19
17:43
(48) да, это вариант как-бы, но скорость выполнения важна, поэтому через СоздатьОбъект() переделал
50 victuan1
 
25.11.19
07:25
Всё ждал, когда предложат ОбработкуОжидания ;)
51 Arbuz
 
25.11.19
11:59
хотя это конечно изврат для даной задачи и надо было сделать (34),но у меня и не такое есть, например необязательный параметр у пары функций меняющий их поведение (разбивая на этапы), просто потому, что schweinehund было рефакторить большой модуль
Независимо от того, куда вы едете — это в гору и против ветра!