При переходе на новые релизы платформы 1С:Предприятие (начиная с 8.3.15 и 8.3.16) многие разработчики и пользователи столкнулись с неприятным визуальным багом. В конфигурациях, использующих обычные формы, стандартные функции вывода диалоговых сообщений, такие как Вопрос() и Предупреждение(), начинают вести себя некорректно. Текст, который раньше выводился в несколько строк, внезапно обрезается, вторая строка исчезает, а первая может искажаться странными символами. Проанализируем, почему это происходит и какие существуют методы решения этой проблемы.
Рассмотрим ситуацию глубже. В версии 8.3.15 компания «1С» провела масштабную техническую реновацию: произошел переход на новую кроссплатформенную графическую библиотеку отрисовки (предположительно на базе Skia и HarfBuzz). Это было сделано для того, чтобы интерфейс программы выглядел одинаково на Windows, Linux и macOS.
Однако этот переход создал конфликт со старыми механизмами «Обычного приложения». Старый движок отрисовки обычных форм тесно полагался на системные API Windows (GDI/GDI+). Новая библиотека иначе рассчитывает метрики шрифтов и размеры экранных элементов. Особенно остро это проявляется при нестандартном DPI (масштаб экрана 125%, 150% и выше). В таких условиях алгоритм расчета высоты модального окна ошибается на несколько пикселей, из-за чего нижняя часть текстового блока просто не влезает в отведенное пространство и скрывается под границей окна или кнопками.
Посмотрим на классический пример кода, который вызывает проблему:
ТекстСообщения = "Вы уверены, что хотите выполнить операцию?" + Символы.ПС + "Действие необратимо!";
Ответ = Вопрос(ТекстСообщения, РежимДиалога.ДаНет);
При масштабе 100% пользователь увидит обе строки. При масштабе 125% в 8.3.16 вторая строка «Действие необратимо!» исчезнет, а в конце первой строки может появиться символ подчеркивания или другие артефакты отрисовки.
Самый простой, но не всегда удобный способ — это установка масштаба экрана в настройках Windows на 100%. Проанализируем этот вариант: он полностью устраняет проблему, так как при единичном коэффициенте масштабирования ошибки округления координат в новой библиотеке 1С не возникают.
Для этого необходимо выполнить следующие действия:
Важно: этот метод часто неприемлем для пользователей современных ноутбуков с высоким разрешением экрана (Full HD и выше на 13-15 дюймах), так как элементы интерфейса становятся слишком мелкими.
Если нам нужно сохранить масштаб 125% в системе, но заставить 1С отображать окна корректно, мы можем изменить настройки совместимости исполняемого файла. Разберем по шагам, как это сделать:
C:\Program Files\1cv8\номер_версии\bin\1cv8.exe).В этом режиме операционная система Windows будет сама масштабировать окно 1С (как картинку). Текст может стать чуть менее четким (слегка размытым), но зато все размеры окон Вопрос() и Предупреждение() будут рассчитаны правильно, и многострочный текст перестанет пропадать.
Если мы не можем менять настройки на компьютерах всех пользователей, попробуем решить проблему программно. Проанализируем поведение функции: она обрезает текст снизу. Следовательно, мы можем принудительно увеличить высоту контейнера, добавив пустые строки или пробелы.
Посмотрим на пример модифицированного кода:
// Добавляем пустую строку в конце и несколько пробелов
ТекстСообщения = "Строка 1" + Символы.ПС + "Строка 2" + Символы.ПС + " ";
Предупреждение(ТекстСообщения);
Иногда это заставляет движок отрисовки выделить чуть больше места, и вторая значащая строка становится видимой. Однако этот метод не дает 100% гарантии на всех вариантах разрешений.
Наиболее профессиональный и стабильный способ решения задачи — отказ от стандартных модальных окон платформы в пользу собственных форм. Рассмотрим, как это реализовать:
Вопрос() в коде на открытие этой формы.Преимущество этого метода в том, что в управляемых формах (даже если они вызываются из обычного приложения в режиме толстого клиента) механизмы масштабирования работают значительно лучше. Платформа 1С в первую очередь оптимизирует именно управляемый интерфейс, а обычные формы считаются устаревшими, и баги в них исправляются крайне неохотно.
Если пользователю не нужно делать выбор (Да/Нет), а нужно лишь вывести информацию, проанализируем возможность замены функции Предупреждение() на метод Сообщить().
// Вместо Предупреждение("Текст")
Сообщить("Текст сообщения для пользователя");
Окно сообщений является частью статического интерфейса основного окна программы. Оно гораздо устойчивее к искажениям DPI, чем всплывающие модальные окна, и текст в нем гарантированно будет доступен для чтения, хотя это и менее заметно для пользователя, чем всплывающее окно.
Подводя итог, можно сказать, что данная проблема является следствием технологического разрыва между старым кодом обычных форм и новым графическим ядром платформы. Оптимальным долгосрочным решением будет постепенный переход на управляемые формы или использование настроек совместимости DPI в Windows.