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

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

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

В процессе реализации подобных задач возникают две классические проблемы:

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

В этой статье мы подробно разберем причины возникновения этих ошибок и рассмотрим надежные, проверенные на практике способы их решения.

Часть 1. Программное переключение страниц (свойство ТекущаяСтраница)

Давайте проанализируем ситуацию: на форме есть группа элементов с типом Страницы (назовем ее Группа12). Внутри этой группы находятся подчиненные элементы с типом Группа - Страница (например, МужскойВес и ЖенскийВес). Нам требуется, чтобы при нажатии на определенную декорацию (или кнопку) автоматически активировалась нужная страница.

Часто начинающие разработчики совершают ошибку, пытаясь присвоить свойству ТекущаяСтраница строковое имя элемента или ссылку на саму группу страниц:


// ОШИБКА 1: Попытка присвоить строку с именем страницы
Элементы.Группа12.ТекущаяСтраница = "МужскойВес";

// ОШИБКА 2: Попытка присвоить группу страниц самой себе
Элементы.Группа12.ТекущаяСтраница = Элементы.Группа12;

Оба этих варианта приведут к аварийному завершению работы кода с ошибкой «Недопустимое значение». Платформа 1С строго требует, чтобы свойству ТекущаяСтраница присваивался непосредственно сам объект управления формы, соответствующий конкретной странице.

Рассмотрим правильный вариант программного переключения:


&НаКлиенте
Процедура Декорация2Нажатие(Элемент)
    
    // Сначала убедимся, что целевая группа видима и доступна на форме
    Если Элементы.Группа12.Видимость Тогда
        
        Элементы.Группа12.Доступность = Истина;
        
        // ПРАВИЛЬНО: Присваиваем элемент управления "Страница", который входит в эту группу
        Элементы.Группа12.ТекущаяСтраница = Элементы.МужскойВес;
        
    КонецЕсли;
    
КонецПроцедуры

Важный нюанс при сложной иерархии (вложенные группы):

Если ваша целевая Группа12 находится внутри другой родительской группы страниц (например, Группа11), простого изменения свойства ТекущаяСтраница для внутренней группы может оказаться недостаточно — визуального перехода на экране не произойдет, если родительская вкладка неактивна. В таких случаях необходимо осуществлять переход последовательно, двигаясь по иерархии снизу вверх:


// Сначала делаем активной родительскую группу страниц
Элементы.Группа11.ТекущаяСтраница = Элементы.Группа12;

// Затем активируем конкретную страницу во внутренней группе
Элементы.Группа12.ТекущаяСтраница = Элементы.МужскойВес;

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

Часть 2. Обход ограничения «Только чтение» для расширенных подсказок

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


// ОШИБКА: Поле объекта недоступно для записи
Элементы.Пол.РасширеннаяПодсказка.Видимость = Ложь;

Платформа возвращает ошибку. Обратившись к синтакс-помощнику, мы увидим, что свойство РасширеннаяПодсказка у элементов управляемой формы имеет статус Только чтение. Объект подсказки создается платформой автоматически и напрямую управлять его свойствами в коде (такими как видимость, цвет, шрифт) после инициализации формы нельзя.

Выясним, как обойти это ограничение. Существует два эффективных решения.

Решение 1. Динамическое управление свойством ОтображениеПодсказки

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


// Полностью скрываем встроенную расширенную подсказку у элемента "Пол"
Элементы.Пол.ОтображениеПодсказки = ОтображениеПодсказки.Нет;

// Если потребуется вернуть подсказку обратно (например, в виде всплывающей кнопки)
Элементы.Пол.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка;

Решение 2. Использование независимой декорации-надписи

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

  1. В конструкторе формы добавьте обычный элемент типа Декорация - Надпись. Позиционируйте его на форме сразу под нужным элементом управления.
  2. Задайте декорации понятное имя, например, ДекорацияПодсказкаПола.
  3. Управляйте видимостью этой декорации напрямую в коде без каких-либо ограничений:

// Скрываем самодельную подсказку
Элементы.ДекорацияПодсказкаПола.Видимость = Ложь;

// Показываем подсказку при необходимости
Элементы.ДекорацияПодсказкаПола.Видимость = Истина;

Часть 3. Реализация всплывающих подсказок при наведении курсора

В процессе обсуждения часто возникает вопрос: как заставить подсказку появляться строго в момент наведения курсора мыши на определенную область и мгновенно исчезать при уходе курсора?

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

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

  1. Найдите свойство Подсказка у нужного элемента и введите туда текст подсказки.
  2. Установите свойство ОтображениеПодсказки в значение Всплывающая или Авто.

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

Если же вам требуется максимально кастомизированный веб-интерфейс с реакцией на движение мыши, единственным решением будет внедрение элемента формы типа Поле HTML-документа. Внутри него, используя HTML-разметку, стили CSS и JavaScript-события onmouseover / onmouseout, вы сможете настроить абсолютно любые интерактивные эффекты, передавая информацию обратно в 1С через вызов обработчиков.

Часть 4. Интерактивная обработка кликов и расшифровка в табличных документах

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

Рассмотрим по шагам процесс настройки интерактивного клика по ячейке табличного документа:

Шаг 1. Настройка табличного документа на форме

Чтобы двойной щелчок по ячейке не открывал ее для обычного редактирования текста, табличный документ должен быть переведен в режим просмотра:


// Устанавливаем режим просмотра для табличного документа на форме
Элементы.РезультатыИМТ.ТолькоПросмотр = Истина;

Шаг 2. Заполнение параметра расшифровки при выводе макета

При формировании печатной формы или отчета в коде модуля необходимо связать конкретную ячейку с передаваемым значением (это может быть ссылка на справочник, документ или структура данных):


ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаДанных");

// Заполняем отображаемый текст в ячейке
ОбластьСтрока.Параметры.ФизЛицо = Выборка.ФизЛицоНаименование;

// Заполняем скрытый параметр расшифровки этой же ячейки (передаем ссылку на объект)
ОбластьСтрока.Параметры.ФизЛицоРасшифровка = Выборка.СсылкаНаФизЛицо;

ТабДок.Вывести(ОбластьСтрока);

Шаг 3. Обработка клика на клиенте

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


&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
    // Отменяем стандартное открытие карточки объекта платформой
    СтандартнаяОбработка = Ложь;
    
    // Проверяем, что в расшифровке переданы корректные данные
    Если ЗначениеЗаполнено(Расшифровка) Тогда
        
        // Пример 1: Если передана ссылка, можем открыть ее форму
        // ПараметрыОткрытия = Новый Структура("Ключ", Расшифровка);
        // ОткрытьФорму("Справочник.ФизическиеЛица.ФормаОбъекта", ПараметрыОткрытия);
        
        // Пример 2: Переключаем страницу формы в зависимости от результата в расшифровке
        Если Расшифровка = "ПоказатьМужскойВес" Тогда
            Элементы.Группа12.ТекущаяСтраница = Элементы.МужскойВес;
        ИначеЕсли Расшифровка = "ПоказатьЖенскийВес" Тогда
            Элементы.Группа12.ТекущаяСтраница = Элементы.ЖенскийВес;
        КонецЕсли;
        
    КонецЕсли;
    
КонецПроцедуры

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

← На главную