В практике администраторов и разработчиков 1С иногда встречаются ситуации, которые на первый взгляд кажутся мистическими. Представьте: база данных работает исправно, сервер не перегружен, у большинства пользователей нет никаких нареканий. Однако на одном или нескольких конкретных рабочих местах при попытке открыть карточку контрагента или любой другой справочник программа «мертво» зависает, а диспетчер задач показывает 100% загрузку одного или нескольких ядер процессора. При этом очистка кэша, переустановка платформы и даже тестирование и исправление базы не приносят результата.
В данной статье мы разберем природу этого «барабашки», выясним, почему стандартные методы диагностики пасуют, и найдем эффективные способы решения проблемы, связанные с графической подсистемой Windows и особенностями рендеринга управляемых форм 1С.
Рассмотрим типичный сценарий: информационная база опубликована на веб-сервере (IIS или Apache), пользователи подключаются через тонкий клиент по протоколу HTTP/HTTPS. Проблема локализована на конкретных компьютерах. Проанализируем поведение системы в момент зависания. Если мы запустим отладчик, то увидим странную картину: выполнение программного кода в процедуре ПриСозданииНаСервере и ПриОткрытии проходит успешно. Зависание происходит в самый последний момент — после выполнения КонецПроцедуры последнего клиентского события открытия, но до того, как форма фактически отобразится на экране.
Это верный признак того, что проблема кроется не в программном коде или данных, а в механизме компоновки и отрисовки интерфейса. Платформа 1С:Предприятие 8.3 использует сложный алгоритм динамического расчета координат элементов (рефлоу). Если в этом алгоритме происходит сбой, программа попадает в бесконечный цикл вычислений, что и вызывает 100% нагрузку на ЦП.
Разберем подробнее, что происходит «под капотом». Когда форма открывается, движок отрисовки пытается вычислить размеры кнопок, полей ввода и групп. В некоторых случаях, особенно при использовании специфических разрешений экрана (например, 1600х900) или нестандартного масштабирования Windows (125%, 150%), возникает математическая ошибка округления.
Процесс выглядит так:
Ситуация усугубляется, если в 1С используется режим «закрепления» окон или сложные вложенные группы в управляемой форме. Как показывает практика, именно сочетание разрешения 1600х900 и определенных настроек интерфейса чаще всего провоцирует этот баг.
Самый быстрый и простой способ проверить нашу гипотезу и восстановить работоспособность — изменить параметры экрана. Проанализируем, как это сделать:
Как правило, после смены разрешения на более «стандартное» с точки зрения пропорций пикселей, бесконечный цикл пересчета прекращается, и форма открывается мгновенно.
Если изменять разрешение экрана неудобно (например, текст становится слишком мелким), мы можем принудительно изменить логику работы 1С с масштабированием Windows. Это позволит платформе игнорировать системные настройки DPI, которые сводят её с ума.
Выполним следующие шаги:
1cv8c.exe (обычно находится в C:\Program Files\1cv8\номер_версии\bin\).Этот метод заставляет Windows отдавать отрисовку интерфейса полностью на откуп платформе 1С, без предварительных геометрических преобразований со стороны ОС, что часто устраняет Layout Loop.
Если проблема сохраняется, нам необходимо точно убедиться, что зависание происходит в момент запроса компоновки формы. Для этого проанализируем настройки Технологического Журнала (ТЖ). На стороне клиента создадим файл logcfg.xml со следующим содержимым:
<config xmlns="http://v8.1c.ru/7.4/config/logcfg">
<log location="C:\1C_Logs" history="24">
<event>
<eq property="Name" value="VRSREQUEST"/>
</event>
<property name="All"/>
</log>
</config>
В момент зависания в логах будет зафиксировано событие VRSREQUEST с URI вида /e1cib/logForm?cmd=queryLayouter. Это подтверждает, что клиент бесконечно запрашивает у сервера или внутренней подсистемы параметры размещения (Layouter). Если вы видите сотни таких записей в секунду — вы столкнулись именно с графическим багом компоновщика.
Если вы являетесь разработчиком этой конфигурации, вы можете попытаться «помочь» платформе правильно рассчитать форму. Выясним, какие свойства элементов могут провоцировать ошибку:
Нет.Иногда достаточно немного изменить иерархию элементов в дереве формы (например, обернуть проблемную группу в еще одну группу без заголовка), чтобы алгоритм рендеринга начал работать корректно на всех разрешениях.
Рассмотрим еще несколько важных моментов, которые стоит проверить:
Подводя итог, можно сказать, что 100% загрузка процессора при открытии формы в 1С — это чаще всего вопрос геометрии, а не кода. Понимание принципов работы компоновщика «Такси» и умение настраивать параметры DPI позволят вам быстро справляться с такими «мистическими» проблемами.