Имя: Пароль:
1C
1С v8
Программная установка картинки заголовка страницы панели на УФ
0 SpellKeeper
 
24.07.19
12:18
Пытаюсь программно установить картинку на странице.
Делается это в процедуре события ПриАктивизацииСтроки таблицы на форме.
Код простейший.

    Если ВыбКартинка = 4 Тогда
        Элементы.СтраницаОписаниеДетали.Картинка = БиблиотекаКартинок.ВосклицательныйЗнакКрасный;
    ИначеЕсли ВыбКартинка = 3 Тогда
        Элементы.СтраницаОписаниеДетали.Картинка = БиблиотекаКартинок.Остановить12;
    ИначеЕсли ВыбКартинка = 2 Тогда
        Элементы.СтраницаОписаниеДетали.Картинка = БиблиотекаКартинок.Внимание16;
    КонецЕсли;

Однако, при использовании этого кода программа впадает в бесконечный цикл.
По всей видимости, значение Картинка устанавливается на сервере, после чего происходит возврат на клиента, и при обновлении отображения снова вызов события ПриАктивизацииСтроки.

Собственно вопрос. Как это обойти?
1 lucbak
 
24.07.19
12:45
Обходится точно так же и любая другая подобная фича - вызываешь
"ПодключитьОбработчикОжидания("МояПроцедура", 0.1, Истина);
2 SpellKeeper
 
24.07.19
12:53
Спасибо.
То-то я смотрю этого 12345... напихано в конфах по самое не балуйся.. Все никак понять не мог зачем этот изврат.
3 SpellKeeper
 
24.07.19
12:58
Все равно есть непонятной момент.
Дело в том, что до вызова этого куска кода я делаю вызов

Элементы.СтраницаОписаниеДетали.Картинка = Новый Картинка;

Эта строка идет самой первой в процедуре без условий. Т.е. отрабатывает всегда.
И на этой строке она не циклится. Циклится она конкретно на куску указанном в сабже.
А это почему? Какая ей разница когда устанавливать картинку?
4 dka80
 
24.07.19
13:08
(3) потому, что при установке новой картинки вызывается процерура ПриАктивизации строки
5 SpellKeeper
 
24.07.19
13:15
(4). Так я про то и говорю. Указанная строка отрабатывает в процедуре ПриАктивизацииСтроки и бесконечного цикла не вызывает. А другие строки, делающие то же самое, только с другим значением, вызывают.


Кстати по (1). НЕ РАБОТАЕТ. Бесконечный цикл все равно появляется. Правда, здесь форма получается доступна, т.к. из процедуры ПриАктивизацииСтроки она все-таки выходит. Но 90% времени висит ожидание.
Собственно, все логично. При установке картинки она все равно уходит на сервер, потом возвращается и снова вызывает Активизацию строки. А потом эта процедура снова вызывает обработчик ожидания. И так до бесконечности.
6 dka80
 
24.07.19
13:31
Не рекомендуется в обработчике "ПриАктивизацииСтроки" обращаться на сервер. Если без этого нельзя обойтись, то следует помнить, что если в серверном вызове были изменены свойства элементов, которые влияют на внешний вид формы, то на клиент вернётся новое описание формы, и будет заново вызван обработчик "ПриАктивизацииСтроки".

Вероятно, другие значения вызывают обращение к серверу.
7 SpellKeeper
 
24.07.19
13:34
(6) Вот я и не понимаю, почему строка

Элементы.СтраницаОписаниеДетали.Картинка = Новый Картинка;

НЕ вызывает сервер, а строка

Элементы.СтраницаОписаниеДетали.Картинка = МояКартинка;

вызывает.
8 SpellKeeper
 
24.07.19
14:44
Я её победил!
Изврат, но простой.
Делается общая переменная, глобальная для модуля.
Куда пишем Истина, если процедуру уже вызывали, и Ложь, если вызова еще не было.

В начале процедуры ПриАктивизацииСтроки нужно проверить ее на значение Истина, и если это значение установлено, то из процедуры выйти. Так мы отсекаем повторный вызовы этой процедуры.
Дальше нужные нам обработки, в том числе и установки картинок.
А в конце процедуры в эту переменную записываем Истина.
И в этой же процедуре разово вызываем обработчик ожидания, который должен сбросить нашу глобальную переменную в Ложь.
Примерно так:

&НаКлиенте
Перем КартинкаУстановлена;


&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
    Если КартинкаУстановлена = Истина Тогда
        Возврат;
    КонецЕсли;

// Код процедуры


    Если КартинкаУстановлена <> Истина Тогда
        Если ВыбКартинка = 4 Тогда
            Элементы.СтраницаОписаниеДетали.Картинка = КартинкаВосклЗнак;
        ИначеЕсли ВыбКартинка = 3 Тогда
            Элементы.СтраницаОписаниеДетали.Картинка = КартинкаОстановить;
        ИначеЕсли ВыбКартинка = 2 Тогда
            Элементы.СтраницаОписаниеДетали.Картинка = КартинкаВнимание;
        Иначе
            Элементы.СтраницаОписаниеДетали.Картинка = Новый Картинка;
        КонецЕсли;
        КартинкаУстановлена = Истина;
        ПодключитьОбработчикОжидания("УстановитьКартинкуСтраницыОписания", 0.1, Истина)
    КонецЕсли;

КонецПроцедуры


&НаКлиенте
Процедура УстановитьКартинкуСтраницыОписания()
    КартинкаУстановлена = Ложь;
КонецПроцедуры


Всё.