При разработке интерфейсов на управляемых формах в 1С:Предприятии 8.3 программисты часто сталкиваются с необходимостью динамического изменения элементов экрана в зависимости от действий пользователя или результатов вычислений. Типичный пример — интерактивные калькуляторы (например, калькулятор индекса массы тела — ИМТ), пошаговые мастера настройки или переключение видимости блоков в зависимости от выбранного пола, роли или режима работы.
В процессе реализации подобных задач возникают две классические проблемы:
ТекущаяСтраница).В этой статье мы подробно разберем причины возникновения этих ошибок и рассмотрим надежные, проверенные на практике способы их решения.
Давайте проанализируем ситуацию: на форме есть группа элементов с типом Страницы (назовем ее Группа12). Внутри этой группы находятся подчиненные элементы с типом Группа - Страница (например, МужскойВес и ЖенскийВес). Нам требуется, чтобы при нажатии на определенную декорацию (или кнопку) автоматически активировалась нужная страница.
Часто начинающие разработчики совершают ошибку, пытаясь присвоить свойству ТекущаяСтраница строковое имя элемента или ссылку на саму группу страниц:
// ОШИБКА 1: Попытка присвоить строку с именем страницы
Элементы.Группа12.ТекущаяСтраница = "МужскойВес";
// ОШИБКА 2: Попытка присвоить группу страниц самой себе
Элементы.Группа12.ТекущаяСтраница = Элементы.Группа12;
Оба этих варианта приведут к аварийному завершению работы кода с ошибкой «Недопустимое значение». Платформа 1С строго требует, чтобы свойству ТекущаяСтраница присваивался непосредственно сам объект управления формы, соответствующий конкретной странице.
Рассмотрим правильный вариант программного переключения:
&НаКлиенте
Процедура Декорация2Нажатие(Элемент)
// Сначала убедимся, что целевая группа видима и доступна на форме
Если Элементы.Группа12.Видимость Тогда
Элементы.Группа12.Доступность = Истина;
// ПРАВИЛЬНО: Присваиваем элемент управления "Страница", который входит в эту группу
Элементы.Группа12.ТекущаяСтраница = Элементы.МужскойВес;
КонецЕсли;
КонецПроцедуры
Важный нюанс при сложной иерархии (вложенные группы):
Если ваша целевая Группа12 находится внутри другой родительской группы страниц (например, Группа11), простого изменения свойства ТекущаяСтраница для внутренней группы может оказаться недостаточно — визуального перехода на экране не произойдет, если родительская вкладка неактивна. В таких случаях необходимо осуществлять переход последовательно, двигаясь по иерархии снизу вверх:
// Сначала делаем активной родительскую группу страниц
Элементы.Группа11.ТекущаяСтраница = Элементы.Группа12;
// Затем активируем конкретную страницу во внутренней группе
Элементы.Группа12.ТекущаяСтраница = Элементы.МужскойВес;
Перед программным переключением страниц обязательно проверяйте свойства Видимость и Доступность как самой группы страниц, так и целевой страницы. Если элемент скрыт, его активация программным путем будет проигнорирована платформой или вызовет ошибку.
Перейдем ко второй проблеме. Разработчик хочет скрыть расширенную подсказку элемента формы (например, группы Пол) после выполнения действия. При попытке выполнить следующий код:
// ОШИБКА: Поле объекта недоступно для записи
Элементы.Пол.РасширеннаяПодсказка.Видимость = Ложь;
Платформа возвращает ошибку. Обратившись к синтакс-помощнику, мы увидим, что свойство РасширеннаяПодсказка у элементов управляемой формы имеет статус Только чтение. Объект подсказки создается платформой автоматически и напрямую управлять его свойствами в коде (такими как видимость, цвет, шрифт) после инициализации формы нельзя.
Выясним, как обойти это ограничение. Существует два эффективных решения.
Вместо того чтобы обращаться к свойствам самой декорации подсказки, мы можем управлять способом ее отображения у родительского элемента. Для этого используется свойство ОтображениеПодсказки и системное перечисление ОтображениеПодсказки:
// Полностью скрываем встроенную расширенную подсказку у элемента "Пол"
Элементы.Пол.ОтображениеПодсказки = ОтображениеПодсказки.Нет;
// Если потребуется вернуть подсказку обратно (например, в виде всплывающей кнопки)
Элементы.Пол.ОтображениеПодсказки = ОтображениеПодсказки.Кнопка;
Если вам требуется сложная логика поведения подсказки (изменение текста на лету, динамическое скрытие, форматирование), лучшим решением будет полный отказ от встроенной расширенной подсказки элемента. Сделайте следующее:
ДекорацияПодсказкаПола.
// Скрываем самодельную подсказку
Элементы.ДекорацияПодсказкаПола.Видимость = Ложь;
// Показываем подсказку при необходимости
Элементы.ДекорацияПодсказкаПола.Видимость = Истина;
В процессе обсуждения часто возникает вопрос: как заставить подсказку появляться строго в момент наведения курсора мыши на определенную область и мгновенно исчезать при уходе курсора?
Ограничение управляемого приложения: в управляемом интерфейсе 1С отсутствуют штатные клиентские события наведения мыши (такие как OnMouseOver и OnMouseLeave) для стандартных элементов формы. Платформа берет управление поведением курсора на себя из соображений кроссплатформенности и производительности в веб-клиенте.
Чтобы реализовать лаконичное поведение всплывающих подсказок штатными средствами, выполните следующие настройки в свойствах элемента в конфигураторе:
Подсказка у нужного элемента и введите туда текст подсказки.ОтображениеПодсказки в значение Всплывающая или Авто.После этого платформа 1С автоматически, без написания единой строчки кода, будет отображать аккуратное всплывающее окно при наведении курсора мыши на элемент и скрывать его, когда пользователь уводит мышь.
Если же вам требуется максимально кастомизированный веб-интерфейс с реакцией на движение мыши, единственным решением будет внедрение элемента формы типа Поле HTML-документа. Внутри него, используя HTML-разметку, стили CSS и JavaScript-события onmouseover / onmouseout, вы сможете настроить абсолютно любые интерактивные эффекты, передавая информацию обратно в 1С через вызов обработчиков.
Для создания по-настоящему удобных интерфейсов (например, при отображении результатов расчетов или аналитических отчетов) часто требуется возможность кликнуть по ячейке таблицы и сразу же открыть связанный объект или перейти на нужную страницу формы. Разберем, как правильно реализовать этот механизм с помощью параметров расшифровки.
Рассмотрим по шагам процесс настройки интерактивного клика по ячейке табличного документа:
Шаг 1. Настройка табличного документа на форме
Чтобы двойной щелчок по ячейке не открывал ее для обычного редактирования текста, табличный документ должен быть переведен в режим просмотра:
// Устанавливаем режим просмотра для табличного документа на форме
Элементы.РезультатыИМТ.ТолькоПросмотр = Истина;
Шаг 2. Заполнение параметра расшифровки при выводе макета
При формировании печатной формы или отчета в коде модуля необходимо связать конкретную ячейку с передаваемым значением (это может быть ссылка на справочник, документ или структура данных):
ОбластьСтрока = Макет.ПолучитьОбласть("СтрокаДанных");
// Заполняем отображаемый текст в ячейке
ОбластьСтрока.Параметры.ФизЛицо = Выборка.ФизЛицоНаименование;
// Заполняем скрытый параметр расшифровки этой же ячейки (передаем ссылку на объект)
ОбластьСтрока.Параметры.ФизЛицоРасшифровка = Выборка.СсылкаНаФизЛицо;
ТабДок.Вывести(ОбластьСтрока);
Шаг 3. Обработка клика на клиенте
В свойствах поля табличного документа на форме необходимо создать обработчик события ОбработкаРасшифровки. Внутри него мы перехватываем стандартное поведение платформы и описываем свою логику (например, переход на нужную нам страницу формы в зависимости от переданного значения):
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
// Отменяем стандартное открытие карточки объекта платформой
СтандартнаяОбработка = Ложь;
// Проверяем, что в расшифровке переданы корректные данные
Если ЗначениеЗаполнено(Расшифровка) Тогда
// Пример 1: Если передана ссылка, можем открыть ее форму
// ПараметрыОткрытия = Новый Структура("Ключ", Расшифровка);
// ОткрытьФорму("Справочник.ФизическиеЛица.ФормаОбъекта", ПараметрыОткрытия);
// Пример 2: Переключаем страницу формы в зависимости от результата в расшифровке
Если Расшифровка = "ПоказатьМужскойВес" Тогда
Элементы.Группа12.ТекущаяСтраница = Элементы.МужскойВес;
ИначеЕсли Расшифровка = "ПоказатьЖенскийВес" Тогда
Элементы.Группа12.ТекущаяСтраница = Элементы.ЖенскийВес;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Используя комбинацию из правильного программного переключения страниц, создания независимых декораций для подсказок и интерактивной обработки расшифровки в табличных документах, вы сможете создавать действительно качественные, отзывчивые и интуитивно понятные интерфейсы для пользователей ваших конфигураций 1С.