При обновлении платформы 1С:Предприятие с версии 8.3.16.хххх на 8.3.19.хххх (и выше) многие разработчики сталкиваются с неприятным визуальным эффектом в элементе формы Планировщик. Колонки измерений (например, список бригад, сотрудников или ресурсов) внезапно сужаются, а текст внутри них начинает переноситься по словам. Это приводит к тому, что высота строк планировщика увеличивается вдвое, а читаемость интерфейса резко падает. Пользователи жалуются на неудобство, а стандартные методы интерактивного изменения ширины колонки мышкой часто оказываются недоступны.
В рамках данной статьи мы разберем причины такого поведения платформы и рассмотрим несколько эффективных способов решения проблемы, начиная от простых визуальных «хаков» и заканчивая программной настройкой свойств элемента.
Для начала проанализируем ситуацию и поймем, что именно изменилось в «движке» отрисовки 1С. Начиная с версии 8.3.18, компания 1С существенно переработала механизмы отображения графических элементов для обеспечения корректной работы HighDPI (масштабирования экрана на мониторах с высоким разрешением).
Ранее планировщик мог более гибко рассчитывать ширину области заголовков. В новых же релизах алгоритм стал ориентироваться на «минимально необходимую ширину», основываясь на самом длинном отдельном слове в строке. Если в названии вашей бригады или ресурса есть пробел (например, «Бригада №1»), платформа считает, что строку можно разорвать, и схлопывает колонку до ширины слова «Бригада», перенося «№1» на следующую строку. Это и вызывает лавинообразное увеличение высоты всей таблицы планировщика.
Проанализировав поведение элемента, можно прийти к интересному выводу: планировщик переносит текст только в местах обычных пробелов. Если мы программно заменим все стандартные пробелы в наименованиях на неразрывные пробелы, алгоритм отрисовки будет воспринимать всю строку как одно длинное слово и будет вынужден расширить колонку, чтобы она вместила текст целиком.
Рассмотрим пример кода, который необходимо применить при заполнении измерений планировщика. Допустим, мы получаем данные из запроса или справочника:
// Пример замены обычного пробела на неразрывный при формировании измерений
ТекстНаименования = Выборка.Наименование;
// Символы.НПП — это спецсимвол неразрывного пробела в 1С
ТекстБезПереносов = СтрЗаменить(ТекстНаименования, " ", Символы.НПП);
НовоеИзмерение = Планировщик.Измерения.Найти("Ресурсы");
ЭлементИзмерения = НовоеИзмерение.Элементы.Добавить(Выборка.Ссылка);
ЭлементИзмерения.Текст = ТекстБезПереносов;
Этот метод хорош тем, что он «обманывает» механизм автоподбора ширины, заставляя его растягивать колонку под полную длину строки без реального изменения логики работы интерфейса.
В объекте ЭлементИзмеренияПланировщика существует свойство Ширина. В старых релизах платформы оно часто игнорировалось, но в версии 8.3.19 и выше оно стало играть более значимую роль. Если автоматический расчет подводит, мы можем задать ширину явно.
Разберем по шагам, как это сделать в процедуре ПриСозданииНаСервере или там, где вы динамически строите планировщик:
Планировщик.Измерения.
Для Каждого Измерение Из Планировщик.Измерения Цикл
// Устанавливаем фиксированную ширину для заголовков (в единицах платформы)
Измерение.ШиринаЗаголовка = 20;
КонецЦикла;
Важно: Учтите, что при использовании масштабирования в Windows (DPI 125% или 150%) установленная ширина может «срезаться». Рекомендуется закладывать запас в 2-3 символа больше расчетного.
Посмотрим на ситуацию под другим углом. В свойствах планировщика есть настройка РасположениеЗаголовковИзмерений. Если ресурсы (бригады) расположены вертикально (слева), проблема переноса проявляется наиболее остро.
Если бизнес-логика вашего приложения позволяет, попробуйте переключить расположение измерений на Горизонтальное. В этом случае ресурсы будут отображаться в «шапке» планировщика. Как показывает практика работы с релизом 8.3.19, алгоритм расчета ширины колонок в горизонтальном режиме работает более стабильно и реже прибегает к принудительному переносу слов.
Проблема часто кроется не только в коде, но и в системных настройках. Проанализируем влияние интерфейса «Такси»:
Если замена на неразрывные пробелы по каким-то причинам не подходит, разработчики используют еще один метод — добавление в конец строки последовательности «невидимых» символов или просто длинного хвоста из неразрывных пробелов. Это заставляет движок считать, что строка очень длинная, и выделять под нее максимально возможное место в области заголовков.
Подводя итог, можно сказать, что наиболее надежным и «чистым» решением является сочетание Решения №1 (неразрывные пробелы) и Решения №2 (явное указание ширины). Это гарантирует, что даже при обновлении платформы до следующих минорных релизов, ваш интерфейс останется стабильным, а «народ не будет пищать», требуя вернуть все как было.