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