Почему не переключаются страницы управляемой формы в тонком клиенте 1С и как это исправить

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

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

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

Выясняем причину: почему сбрасывается активная страница

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

Когда пользователь совершает двойной клик на строке таблицы, запускается следующая цепочка событий:

  1. Платформа вызывает обработчик события Выбор на клиенте.
  2. Выполняется ваш программный код, в котором свойству ТекущаяСтраница группы страниц присваивается целевая страница (например, Страница 2). Страница визуально меняется.
  3. Процедура-обработчик завершает свою работу.
  4. Платформа приступает к выполнению стандартной обработки события выбора. По умолчанию стандартное действие для таблицы — это попытка открыть форму объекта (если в ячейке ссылка) или перевод строки в режим редактирования непосредственно в таблице.
  5. Для выполнения стандартного действия платформа принудительно возвращает фокус ввода на активную ячейку таблицы.
  6. Так как таблица физически осталась на первой странице (которая в этот момент уже скрыта), возврат фокуса на ее элемент заставляет платформу автоматически переключить активную вкладку назад на первую страницу, чтобы показать элемент, получивший фокус.

В результате для пользователя это выглядит как мгновенное мерцание экрана или полное отсутствие реакции интерфейса на двойной клик.

Разница поведения: Тонкий клиент vs Веб-клиент и Отладчик

Разработчиков часто сбивает с толку тот факт, что в режиме веб-клиента или при включенной отладке код работает нормально. Разберем, почему так происходит:

Решение 1. Отмена стандартной обработки (рекомендуемый способ)

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

Для этого в обработчике события достаточно установить параметр СтандартнаяОбработка в значение Ложь. Посмотрим на пример реализации:


&НаКлиенте
Процедура ПредставленияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    // Получаем текущие данные строки таблицы
    ТекущиеДанные = Элементы.Представления.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда 
        Возврат;
    КонецЕсли; 
    
    // ОТМЕНЯЕМ стандартное поведение платформы
    СтандартнаяОбработка = Ложь;
    
    // Программно переключаем страницу
    Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаСтраницаРедактор;
    
КонецПроцедуры

Обратите внимание на синтаксис обращения к странице в коде. Не используйте свойство ПодчиненныеЭлементы для поиска страницы без крайней необходимости. Обращаться к элементам формы (включая группы и страницы) следует напрямую через коллекцию Элементы: Элементы.ГруппаСтраницаРедактор.

Решение 2. Использование обработчика ожидания (когда нельзя отменять стандартную обработку)

Рассмотрим ситуацию, когда вам необходимо сохранить стандартное действие платформы (например, открыть форму карточки элемента), но при этом параллельно переключить страницу на основной форме. Решение с СтандартнаяОбработка = Ложь в данном случае не подходит, так как оно заблокирует открытие карточки.

Для решения этой задачи применим обходной путь с разрывом контекста выполнения через однократный обработчик ожидания:

  1. В событии Выбор мы регистрируем одноразовый вызов процедуры с минимальной задержкой.
  2. Процедура события успешно завершается, платформа штатно отрабатывает свое стандартное действие и возвращает фокус.
  3. Спустя сотые доли секунды срабатывает наш обработчик ожидания, который уже в безопасном контексте (когда все стандартные действия завершены) переключает страницу формы.

Разберем программную реализацию этого метода по шагам:


&НаКлиенте
Процедура ПредставленияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    ТекущиеДанные = Элементы.Представления.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда 
        Возврат;
    КонецЕсли; 
    
    // Оставляем СтандартнаяОбработка = Истина, чтобы открылась форма карточки
    
    // Подключаем однократный обработчик ожидания (интервал 0.1 сек)
    ПодключитьОбработчикОжидания("Подключаемый_ПереключитьСтраницу", 0.1, Истина);
    
КонецПроцедуры

&НаКлиенте
Процедура Подключаемый_ПереключитьСтраницу()
    
    // Данный код выполнится сразу после того, как платформа завершит обработку выбора
    Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаСтраницаРедактор;
    
КонецПроцедуры

Важная рекомендация по управлению фокусом

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

Для явной установки фокуса используйте свойство управляемой формы ТекущийЭлемент. Дополним наше первое решение этим правилом:


&НаКлиенте
Процедура ПредставленияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    
    ТекущиеДанные = Элементы.Представления.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда 
        Возврат;
    КонецЕсли; 
    
    СтандартнаяОбработка = Ложь;
    
    // Переключаем вкладку
    Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ГруппаСтраницаРедактор;
    
    // Явно переносим фокус ввода на поле ввода, расположенное на новой странице
    ЭтаФорма.ТекущийЭлемент = Элементы.РеквизитРедактораНаименование;
    
КонецПроцедуры

Использование этого несложного правила гарантирует стабильное и предсказуемое поведение интерфейса вашей управляемой формы в любых типах клиентов платформы «1С:Предприятие 8».

← На главную