Имя: Пароль:
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 было рефакторить большой модуль
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn