|
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 было рефакторить большой модуль
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |