Почему 1С потребляет ресурсы процессора в режиме бездействия и как это исправить

Программист 1С v8.3 (Управляемые формы)
← На главную

Ситуация, когда открытое окно 1С (например, справочник «Номенклатура» или специализированное рабочее место кладовщика) начинает потреблять значительные ресурсы процессора, пока пользователь отошел от компьютера, является классической проблемой для системных администраторов и разработчиков. Особенно остро это ощущается на RDP-серверах (удаленных рабочих столах), где десятки таких «брошенных» сеансов могут суммарно парализовать работу всей компании. Разберем подробно, почему так происходит, как диагностировать проблему «на горячую» и какие превентивные меры стоит предпринять.

Методика оперативной диагностики через Конфигуратор

Рассмотрим ситуацию: вы обнаружили в диспетчере задач процесс 1cv8.exe, который загружает ядро процессора на 15–25%, хотя пользователь в данный момент ничего не делает. Нам нужно понять, какой именно кусок кода или элемент интерфейса вызывает эту активность. Выполним следующие шаги:

  1. Определение сеанса. Первым делом сопоставим ID процесса в операционной системе с сеансом в консоли администрирования серверов 1С. Найдите пользователя и убедитесь, что его компьютер активен, но сам он не выполняет действий.
  2. Включение отладки. Чтобы подключиться к работающему сеансу, в нем должна быть разрешена отладка. Проанализируем настройки: если сеансы запускаются с параметром /debug, мы сможем подключиться сразу. Если нет, в современных версиях платформы отладку можно включить динамически через меню «Сервис» — «Параметры» — «Системные», установив флаг «Отладка в текущем сеансе разрешена».
  3. Подключение конфигуратора. Запустим Конфигуратор, перейдем в меню «Отладка» — «Подключение». В открывшемся списке найдем нужный сеанс и нажмем «Подключить».
  4. Замер производительности. Это самый важный этап. В Конфигураторе выберем «Отладка» — «Замер производительности». Подождем 1–2 минуты, пока «зависшее» окно продолжает нагружать процессор, а затем остановим замер.

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

Разбор технических причин: Динамические списки и автообновление

Выясним причину, связанную с объектом ДинамическийСписок. Это наиболее частый виновник «тихой» загрузки процессора. В формах списка (номенклатура, документы) часто включается свойство АвтоОбновление. Рассмотрим, как это работает:

Если интервал обновления установлен, например, в 60 секунд, каждые 60 секунд клиентское приложение отправляет запрос к базе данных. Если запрос динамического списка содержит сложные соединения, вложенные запросы или левые соединения с виртуальными таблицами остатков, сервер тратит ресурсы на выполнение, а клиент — на получение и перерисовку данных. Когда таких окон открыто много, сервер начинает «задыхаться» от постоянных микро-запросов.

Рекомендация: Проверьте все АРМ и основные справочники. Убедитесь, что АвтоОбновление включено только там, где это действительно необходимо (например, в мониторе заказов), и интервал не является слишком коротким.

Влияние условного оформления

Проанализируем ситуацию с визуальным оформлением. В 1С 8.3 управляемые формы позволяют раскрашивать строки динамических списков. Если в правилах УсловноеОформление используются сложные выражения или функции, вычисляемые на стороне сервера, то при каждом обновлении (в том числе автоматическом) система будет заново производить эти вычисления.

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


ВЫБРАТЬ
    СправочникНоменклатура.Ссылка,
    СправочникНоменклатура.Наименование,
    (ВЫРАЗИТЬ(ЕСТЬNULL(ВзаиморасчетыОстатки.СуммаОстаток, 0) КАК ЧИСЛО(15,2))) КАК ТекущийДолг
ИЗ
    Справочник.Номенклатура КАК СправочникНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Взаиморасчеты.Остатки КАК ВзаиморасчетыОстатки
    ПО СправочникНоменклатура.Ссылка = ВзаиморасчетыОстатки.Контрагент

Такой запрос при каждом обновлении будет пересчитывать остатки по всем видимым строкам. Если форма просто открыта и «висит», нагрузка будет генерироваться циклично.

Опасные обработчики ожидания

Разберем использование метода ПодключитьОбработчикОжидания. Разработчики АРМ (например, для кладовщиков) часто используют его для проверки поступления новых задач. Если в коде обработчика не предусмотрена проверка на то, что предыдущее действие еще не завершено, или если обработчик вызывает тяжелые серверные процедуры слишком часто (раз в 1-2 секунды), это приведет к росту нагрузки.

Пример правильной реализации обработчика:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Подключаем проверку раз в 30 секунд
    ПодключитьОбработчикОжидания("ПроверитьНовыеЗадания", 30, Ложь);
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьНовыеЗадания()
    // Отключаем, чтобы повторные вызовы не накладывались
    ОтключитьОбработчикОжидания("ПроверитьНовыеЗадания");
    
    Результат = ПроверитьНаСервере();
    
    // Включаем обратно после завершения работы
    ПодключитьОбработчикОжидания("ПроверитьНовыеЗадания", 30, Ложь);
КонецПроцедуры

Если же флаг Однократно (третий параметр) установлен в Ложь, а внутри процедуры происходит длительная задержка, вызовы могут начать «наслаиваться» друг на друга, забивая очередь исполнения.

Особенности отрисовки через RDP

Иногда причина кроется не в коде, а в протоколе доставки интерфейса. Рассмотрим влияние графических элементов. Современная платформа 1С использует сглаживание шрифтов и различные анимации. При работе через RDP, если у пользователя включены параметры «Visual Styles» и «Menu animation», клиент 1С может постоянно пытаться перерисовать курсор, фокус в поле ввода или анимированные баннеры (например, рекламные сообщения от 1С). Это заставляет процесс 1cv8.exe постоянно обращаться к библиотекам отрисовки (gdiplus.dll), что нагружает CPU.

Что сделать: Попробуйте в настройках RDP-подключения на вкладке «Performance» (Взаимодействие) выбрать профиль «Low-speed connection», который отключает большинство визуальных эффектов. Часто это мгновенно снижает нагрузку на процессор сервера.

Использование Технологического журнала для глубокого анализа

Если замер производительности не дает ответа (например, когда нагрузка кратковременная, но частая), воспользуемся Технологическим журналом. Создадим файл logcfg.xml в папке conf на сервере (или локально на ПК менеджера) со следующим содержанием:


<config xmlns="http://v8.1c.ru/7.4/config/logcfg">
  <log location="C:\LOGS\1C_CPU" history="2">
    <event>
      <eq property="Name" value="CALL"/>
      <gt property="Duration" value="500000"/>
    </event>
    <event>
      <eq property="Name" value="SCALL"/>
      <gt property="Duration" value="500000"/>
    </event>
    <property name="All"/>
  </log>
</config>

Этот конфиг будет фиксировать все серверные вызовы (CALL) и обращения к СУБД (SCALL), которые длятся более 500 миллисекунд. Это позволит точно определить, какая форма «спамит» запросами к серверу в моменты простоя.

Итоговые рекомендации по оптимизации

Посмотрим на проблему комплексно и подведем итоги:

  1. Обновите платформу. В последних релизах 1С (8.3.18+) реализован «Режим экономии ресурсов». Если окно программы неактивно или свернуто, платформа автоматически снижает интенсивность фоновых обновлений и отрисовки.
  2. Настройте тайм-ауты. На уровне сервера 1С или в настройках RDP-сессий установите автоматическое завершение сеанса при бездействии более 2–4 часов. Это «варварский», но эффективный метод борьбы с забытыми окнами.
  3. Оптимизируйте АРМ. Используйте ПроверитьВыполнениеОбработкиОжидания, чтобы не запускать новые тяжелые операции, если старые еще не завершились.
  4. Проверьте регламентные задания. Убедитесь, что индексация полнотекстового поиска или другие регламентные задачи не запускаются в контексте клиентского сеанса (в файловых версиях или при определенных настройках клиент-сервера).

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

← На главную