Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Программная установка картинки заголовка страницы панели на УФ

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

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

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

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

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


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

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

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

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

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

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

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

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


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

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



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

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


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


Всё.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.