Как исправить обрезку текста в окнах Вопрос и Предупреждение в 1С при масштабе экрана 125%

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

При переходе на новые релизы платформы 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 вторая строка «Действие необратимо!» исчезнет, а в конце первой строки может появиться символ подчеркивания или другие артефакты отрисовки.

Решение 1: Возврат к стандартному масштабированию Windows

Самый простой, но не всегда удобный способ — это установка масштаба экрана в настройках Windows на 100%. Проанализируем этот вариант: он полностью устраняет проблему, так как при единичном коэффициенте масштабирования ошибки округления координат в новой библиотеке 1С не возникают.

Для этого необходимо выполнить следующие действия:

  1. Нажать правой кнопкой мыши на рабочем столе и выбрать «Параметры экрана».
  2. В разделе «Масштаб и разметка» выбрать значение «100%».
  3. Перезапустить сеанс 1С:Предприятия.

Важно: этот метод часто неприемлем для пользователей современных ноутбуков с высоким разрешением экрана (Full HD и выше на 13-15 дюймах), так как элементы интерфейса становятся слишком мелкими.

Решение 2: Переопределение режима масштабирования DPI для приложения

Если нам нужно сохранить масштаб 125% в системе, но заставить 1С отображать окна корректно, мы можем изменить настройки совместимости исполняемого файла. Разберем по шагам, как это сделать:

  1. Найдем путь к исполняемому файлу вашей версии платформы (обычно это C:\Program Files\1cv8\номер_версии\bin\1cv8.exe).
  2. Нажмем на файл правой кнопкой мыши и выберем «Свойства».
  3. Перейдем на вкладку «Совместимость».
  4. Нажмем кнопку «Изменить параметры высокого DPI».
  5. Установим флажок «Переопределите режим масштабирования высокого разрешения».
  6. В выпадающем списке выберем вариант «Система» (System).

В этом режиме операционная система Windows будет сама масштабировать окно 1С (как картинку). Текст может стать чуть менее четким (слегка размытым), но зато все размеры окон Вопрос() и Предупреждение() будут рассчитаны правильно, и многострочный текст перестанет пропадать.

Решение 3: Программный «костыль» с добавлением отступов

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

Посмотрим на пример модифицированного кода:


// Добавляем пустую строку в конце и несколько пробелов
ТекстСообщения = "Строка 1" + Символы.ПС + "Строка 2" + Символы.ПС + "   ";
Предупреждение(ТекстСообщения);

Иногда это заставляет движок отрисовки выделить чуть больше места, и вторая значащая строка становится видимой. Однако этот метод не дает 100% гарантии на всех вариантах разрешений.

Решение 4: Создание собственной формы диалога

Наиболее профессиональный и стабильный способ решения задачи — отказ от стандартных модальных окон платформы в пользу собственных форм. Рассмотрим, как это реализовать:

  1. В конфигураторе создадим новую Общую форму.
  2. Разместим на ней декорацию (надпись) для вывода текста и кнопки (ОК, Отмена, Да, Нет).
  3. В модуле формы настроим возврат выбранного значения.
  4. Заменим вызовы Вопрос() в коде на открытие этой формы.

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

Решение 5: Использование окна сообщений

Если пользователю не нужно делать выбор (Да/Нет), а нужно лишь вывести информацию, проанализируем возможность замены функции Предупреждение() на метод Сообщить().


// Вместо Предупреждение("Текст")
Сообщить("Текст сообщения для пользователя");

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

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

← На главную