Почему зависает окно при использовании метода ПоказатьВыборЭлемента в 1С 8.3.15 и как это исправить?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки и сопровождения конфигураций на платформе 1С:Предприятие 8.3.15 программисты часто сталкиваются с неприятным поведением интерфейса: при вызове метода ПоказатьВыборЭлемента окно выбора из списка зависает. Оно может перестать реагировать на действия пользователя, его невозможно закрыть стандартными средствами, и вся работа в системе блокируется. Проанализируем ситуацию и разберем причины возникновения этой ошибки, а также способы ее «лечения».

Выясним причину зависания

Проблема носит платформенный характер и тесно связана с эволюцией графического интерфейса 1С. В версии 8.3.15 разработчики платформы внесли существенные изменения в механизмы отрисовки окон и управления фокусом ввода. Как выяснилось в ходе обсуждений и официальных отчетов об ошибках, баг проявляется не везде. Основная зона риска — это использование управляемых форм в режиме «Формы в закладках» (старый интерфейс, предшествовавший «Такси»).

Рассмотрим подробнее механизм возникновения сбоя. Асинхронные методы, такие как ПоказатьВыборЭлемента, ПоказатьВопрос или ПоказатьВводЗначения, работают по принципу неблокирующего вызова. В норме платформа должна создать всплывающее окно, передать ему фокус и ожидать возврата управления через процедуру-оповещение. Однако в режиме закладок на релизах 8.3.15 происходит конфликт потоков: основное окно формы блокируется, ожидая завершения асинхронной операции, но само дочернее окно выбора либо не отрисовывается корректно, либо теряет связь с родительской формой. В результате пользователь видит «застывшее» изображение, которое невозможно закрыть.

Проанализируем влияние интерфейса «Такси»

Практика показывает, что переход на современный интерфейс «Такси» полностью нивелирует данную проблему. Это связано с тем, что архитектура «Такси» изначально проектировалась под асинхронную модель работы и использует другие механизмы рендеринга окон. Если в вашей конфигурации до сих пор используется режим «в закладках», это верный знак того, что пора переходить на актуальные стандарты интерфейса.

Чтобы изменить режим интерфейса, выполним следующие шаги:

  1. Откроем конфигуратор.
  2. Перейдем в свойства корневого узла конфигурации.
  3. Найдем параметр Основной стиль или Режим использования интерфейса.
  4. Установим значение Такси.

Разберем альтернативные способы решения проблемы

Если по каким-то причинам (например, из-за специфики самописной конфигурации или требований заказчика) переход на «Такси» невозможен, разберем другие варианты стабилизации системы.

1. Обновление платформы до исправленных релизов

Поскольку это признанный баг 1С, наиболее правильным решением будет установка патчей или переход на более свежую версию. Ошибка была зафиксирована в ранних сборках 8.3.15 (например, 1489 или 1534). Стабильная работа асинхронных методов в режиме закладок была возвращена в поздних релизах ветки 8.3.15 (начиная с 1747 и выше) и окончательно закреплена в 8.3.16 и 8.3.17. Мы настоятельно рекомендуем использовать версию 8.3.15.2107 или переходить на актуальные ветки 8.3.2x.

2. Использование синхронных методов (как временная мера)

Посмотрим на пример кода, который вызывает зависание:


&НаКлиенте
Процедура ВыбратьЗначение(Команда)
    Список = Новый СписокЗначений;
    Список.Добавить("Вариант 1");
    Список.Добавить("Вариант 2");
    
    Оповещение = Новый ОписаниеОповещения("ВыбратьЗначениеЗавершение", ЭтаФорма);
    ПоказатьВыборЭлемента(Оповещение, Список);
КонецПроцедуры

Если обновление платформы недоступно, можно временно вернуться к синхронному методу ВыбратьИзСписка. Однако помните, что это потребует включения модальности в свойствах конфигурации, что не рекомендуется для современных систем и совершенно не работает в веб-клиенте.

Посмотрим на пример замены:


&НаКлиенте
Процедура ВыбратьЗначениеСинхронно(Команда)
    Список = Новый СписокЗначений;
    Список.Добавить("Вариант 1");
    
    // Внимание: метод блокирует выполнение кода до выбора
    ВыбранныйЭлемент = ВыбратьИзСписка(Список, Элементы.ПолеВвода1);
    
    Если ВыбранныйЭлемент <> Неопределено Тогда
        // Обработка результата
    КонецЕсли;
КонецПроцедуры

3. Изменение события вызова

Замечено, что вероятность зависания выше, если метод вызывается напрямую из события НачалоВыбора поля ввода. Попробуем изменить логику: создадим на форме кнопку или гиперссылку, которая будет инициировать выбор. Иногда изменение контекста вызова позволяет платформе корректно обработать фокус окна.

Проанализируем технические нюансы отрисовки

В некоторых случаях на ситуацию влияет аппаратное ускорение видеокарты. Если окна продолжают «глючить» даже после частичных правок, попробуем отключить аппаратное ускорение в настройках операционной системы Windows или в параметрах запуска 1С (через дополнительные параметры запуска /gpudisable). Это редко используемый, но иногда спасительный метод для специфических конфигураций «железа».

Также стоит проверить свойство конфигурации Режим использования модальности. Если установлено Использовать с ограничениями, платформа более строго следит за вызовами окон. Попробуйте временно изменить этот параметр на Использовать для проверки гипотезы о блокировке интерфейса, но помните, что долгосрочная цель — полное избавление от модальности и переход на асинхронные вызовы ОписаниеОповещения.

Подведем итоги

Мы выяснили, что зависание окна ПоказатьВыборЭлемента — это специфический дефект платформы 8.3.15 при работе в устаревшем интерфейсе. Для решения задачи мы рекомендуем придерживаться следующего алгоритма:

  1. Приоритет №1: Обновить платформу до актуального релиза (8.3.16+ или финальные сборки 8.3.15).
  2. Приоритет №2: Перевести конфигурацию на интерфейс «Такси». Это не только исправит баг, но и улучшит общую производительность и юзабилити.
  3. Приоритет №3: Если первые два пункта невыполнимы, использовать обходные пути с изменением событий вызова или временным возвратом к синхронным методам.

Совместная работа над кодом и понимание внутренних механизмов платформы позволяют обходить даже такие сложные ошибки отрисовки интерфейса. Надеемся, что данные рекомендации помогут вам восстановить стабильную работу ваших решений на базе 1С.

← На главную