Как отследить событие «Изменить форму» и адаптировать интерфейс в управляемых формах 1С?

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

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

Ограничения платформы: почему нельзя отследить команду «Изменить форму»

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

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

Вариант 1. Программное управление компоновкой формы

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

Разберем реализацию по шагам:

  1. Объединяем две таблицы в одну общую группу элементов (например, ГруппаТаблицы).
  2. Добавляем на форму команду и кнопку ПереключитьОриентацию.
  3. В обработчике команды программно меняем свойство Группировка у родительской группы и синхронно обновляем пиктограмму кнопки переноса строк.

Посмотрим на пример клиентского кода:


&НаКлиенте
Процедура ПереключитьОриентацию(Команда)
    
    Группа = Элементы.ГруппаТаблицы;
    
    Если Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда Тогда
        Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.Вертикальная;
        Элементы.КнопкаПеренести.Картинка = БиблиотекаКартинок.СтрелкаВверх;
    Иначе
        Группа.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;
        Элементы.КнопкаПеренести.Картинка = БиблиотекаКартинок.СтрелкаВлево;
    КонецЕсли;
    
КонецПроцедуры

Такой подход полностью прозрачен, не зависит от скрытых действий пользователя в системных меню и мгновенно переключает оформление.

Вариант 2. Запрет изменения структуры формы

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

  1. В свойствах управляемой формы отключить флаг Разрешить изменение формы (свойство РазрешитьИзменениеФормы).
  2. Либо в свойствах конкретной группы элементов снять флаг Разрешить изменение состава, что не позволит пользователю менять группировку и перемещать дочерние таблицы.

Вариант 3. Нейтральное оформление и Drag-and-Drop

Если необходимо сохранить за пользователем свободу перенастройки интерфейса, рекомендуется отказаться от элементов, зависящих от ориентации в пространстве:

  1. Нейтральные кнопки: использовать текстовые заголовки кнопок («Перенести в приемник», «Добавить») или нейтральные пиктограммы, не указывающие жесткое направление движения.
  2. Перетаскивание мышью (Drag-and-Drop): настроить обработчики ПроверкаПеретаскивания и Перетаскивание у таблиц. Это позволит пользователю переносить строки между списками независимо от того, как именно они расположены на экране.
← На главную