При разработке сложных интерфейсов на управляемых формах иногда возникает задача динамического изменения элементов (например, смена направления стрелок между таблицами) в зависимости от того, как пользователь расположил группы через команду «Еще — Изменить форму». Разберем особенности работы платформы «1С:Предприятие 8.3» в данном сценарии и выясним, как правильно решить эту задачу.
Проанализируем архитектуру клиентского приложения 1С. Стандартное окно настройки формы работает исключительно на уровне интерфейсного слоя клиента платформы. В объектной модели управляемой формы отсутствует событие (как на стороне клиента, так и на сервере), которое срабатывало бы в момент открытия, применения или закрытия диалога «Изменить форму».
По этой причине перехватить момент изменения взаиморасположения таблиц и программно поменять оформление штатным обработчиком невозможно. Попытки использовать фоновые обработчики ожидания для постоянного анализа структуры формы не рекомендуются, так как они создают избыточную нагрузку на клиентское приложение. Рассмотрим правильные альтернативные подходы к реализации такого поведения.
Если пользователю действительно необходима возможность переключать взаимное расположение таблиц (горизонтально или вертикально), лучше реализовать эту возможность явно через собственную команду на форме.
Разберем реализацию по шагам:
ГруппаТаблицы).ПереключитьОриентацию.Группировка у родительской группы и синхронно обновляем пиктограмму кнопки переноса строк.Посмотрим на пример клиентского кода:
&НаКлиенте
Процедура ПереключитьОриентацию(Команда)
Группа = Элементы.ГруппаТаблицы;
Если Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда Тогда
Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
Элементы.КнопкаПеренести.Картинка = БиблиотекаКартинок.СтрелкаВверх;
Иначе
Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
Элементы.КнопкаПеренести.Картинка = БиблиотекаКартинок.СтрелкаВлево;
КонецЕсли;
КонецПроцедуры
Такой подход полностью прозрачен, не зависит от скрытых действий пользователя в системных меню и мгновенно переключает оформление.
Если жесткое позиционирование элементов критично для визуальной целостности интерфейса, логичнее ограничить права пользователя на кастомизацию конкретных групп или всей формы:
РазрешитьИзменениеФормы).Если необходимо сохранить за пользователем свободу перенастройки интерфейса, рекомендуется отказаться от элементов, зависящих от ориентации в пространстве:
ПроверкаПеретаскивания и Перетаскивание у таблиц. Это позволит пользователю переносить строки между списками независимо от того, как именно они расположены на экране.