При разработке интерфейсов в 1С:Предприятие 8.3 программисты часто сталкиваются с тем, что стандартное поведение графических элементов не всегда соответствует требованиям заказчика. Одним из таких эффектов является автоматическое "всплывание" или увеличение сегмента круговой диаграммы при наведении курсора мыши. Несмотря на то, что это выглядит современно, в некоторых отчетах или дашбордах такой интерактив может мешать восприятию данных или перекрывать соседние элементы.
В этой статье мы подробно разберем, почему стандартные настройки анимации не всегда помогают, и рассмотрим все доступные способы решения этой задачи — от простых переключателей в свойствах до программных методов обхода ограничений платформы.
Первое, что пробует большинство разработчиков, — это использование системного перечисления АнимацияДиаграммы. Рассмотрим, почему этот метод часто оказывается неэффективным в контексте нашего вопроса. Как правило, в коде это выглядит так:
// Попытка отключить эффекты через свойство Анимация
Объект.Диаграмма.Анимация = АнимацияДиаграммы.НеИспользовать;
Проанализируем ситуацию: данное свойство в 1С управляет прежде всего процессом появления диаграммы на экране (например, плавным "вырастанием" столбцов или отрисовкой круга) при открытии формы или обновлении данных. Оно практически не влияет на интерактивный отклик движка отрисовки при взаимодействии пользователя с уже построенным графиком. Таким образом, если вы хотите убрать именно реакцию на мышь, нам придется задействовать другие механизмы.
Самый быстрый и радикальный способ избавиться от любых визуальных изменений при наведении — это отключение интерактивности элемента формы. Рассмотрим, как это работает. У каждого элемента типа "Поле диаграммы" на управляемой форме есть флаг Интерактивность.
Если мы снимем этот флаг в конфигураторе или установим его программно:
Элементы.ДекорацияДиаграмма.Интерактивность = Ложь;
Мы получим следующие результаты:
Выбор не будет генерироваться).Этот метод идеально подходит для статических отчетов, где диаграмма служит лишь иллюстрацией, а данные продублированы в таблице рядом.
Если нам нужно сохранить подсказки, но убрать эффект "выпрыгивания" сектора, стоит обратить внимание на режим выделения. В современных версиях платформы 1С v8.3 взаимодействие с графиками сильно зависит от того, как настроена работа с точками данных. Посмотрим на программную настройку:
// Установка режима, при котором выделение точек невозможно
Диаграмма = Элементы.Диаграмма;
Диаграмма.РежимВыделения = РежимВыделенияДиаграммы.НеИспользовать;
В некоторых сборках платформы (особенно начиная с 8.3.18) это свойство позволяет блокировать визуальную трансформацию сектора, так как платформа понимает, что "акцентировать" внимание на конкретной точке не требуется. Разберем по шагам: система продолжает отслеживать положение курсора для вывода текста подсказки, но игнорирует команду на изменение геометрии объекта.
Иногда эффект увеличения срабатывает не только при наведении, но и "залипает" после случайного клика пользователя. Чтобы вернуть сектор на место, мы можем использовать событие ПриНажатии или ПриАктивизации. Суть метода заключается в том, чтобы мгновенно очистить массив выбранных точек.
Рассмотрим пример кода для модуля формы:
&НаКлиенте
Процедура ДиаграммаПриНажатии(Элемент, Точка, Серия, ДополнительныеДанные)
// Как только пользователь нажал на сектор, мы принудительно снимаем выделение
Элемент.УстановитьВыбранныеТочки(Новый Массив);
КонецПроцедуры
Этот подход позволяет оставить диаграмму "живой", но минимизировать время, в течение которого сектор находится в увеличенном состоянии.
Выясним причину, почему иногда стандартные свойства не срабатывают: в новых версиях платформы используется HTML-движок для отрисовки графиков, и некоторые стили оформления жестко "зашиты" в CSS-темы. Если программно отключить эффект не удается, применим хитрость с наложением слоев.
Разберем алгоритм действий:
Декорация (вид — "Картинка").В результате прозрачная декорация будет перехватывать все события мыши. Пользователь будет видеть красивый график, но "дотянуться" курсором до секторов не сможет, а значит, и эффект увеличения не сработает.
Если ваша задача — вывести диаграмму в сложной печатной форме или на дашборде, где данные меняются редко, проанализируем ситуацию с использованием метода ПолучитьКартинку(). Это самый надежный способ гарантировать отсутствие любой анимации.
Посмотрим на пример реализации:
// Формируем диаграмму программно
ДиаграммаОбъект = Новый Диаграмма;
ДиаграммаОбъект.ТипДиаграммы = ТипДиаграммы.Круговая;
// ... заполнение данными ...
// Получаем статичное изображение
КартинкаГрафика = ДиаграммаОбъект.ПолучитьКартинку();
// Отображаем в поле картинки на форме
Элементы.ПолеКартинкиДиаграмма.Картинка = КартинкаГрафика;
Преимущество этого метода в том, что картинка потребляет меньше ресурсов клиентского приложения и абсолютно лишена интерактивных эффектов "всплывания".
Важно помнить, что поведение диаграмм в 1С изменилось в версиях 8.3.20 и выше. В современных стилях оформления (например, "Такси") интерактивный отклик является частью дизайна. Попробуйте изменить свойство СтильОформления диаграммы на "Классический" или "Версия 8".
Рассмотрим, что это дает: старые стили используют более простую модель отрисовки, в которой эффекты трансформации объектов при наведении либо отсутствуют, либо выражены гораздо слабее. Это может быть самым элегантным решением, не требующим написания сложного кода.
Подводя итог, можно сказать, что хотя прямой кнопки "Отключить увеличение сектора" в 1С не существует, комбинация свойств РежимВыделения, Интерактивность и правильный выбор стиля оформления позволяют добиться нужного результата в большинстве конфигураций.