При активной работе пользователей в «1С:Предприятии 8.2» (особенно в конфигурациях с большим количеством сложных обычных форм, специализированных АРМ или при интенсивной печати документов) возникает крайне неприятная проблема. Через некоторое время (от 10 минут до нескольких часов) в интерфейсе программы полностью исчезают графические элементы: иконки на кнопках, значки сворачивания, разворачивания и закрытия окон, а сами элементы управления становятся пустыми или белыми. При этом никаких явных ошибок платформа не выдает, а перезапуск программы временно решает проблему.
В рамках этой статьи мы подробно разберем, почему возникает этот сбой, как провести его точную диагностику и какие существуют методы устранения проблемы — от быстрых системных настроек до оптимизации кода и обновления платформы.
Для отрисовки элементов интерфейса (кнопок, шрифтов, иконок, рамок окон, меню) операционная система Windows выделяет специальные системные ресурсы, которые называются дескрипторами графических объектов — GDI (Graphics Device Interface) и USER-объектами.
Для обеспечения стабильности операционной системы Windows накладывает жесткий лимит на количество таких объектов. По умолчанию для одного процесса (в нашем случае это исполняемый файл 1cv8.exe) установлено ограничение в 10 000 GDI-объектов и 10 000 USER-объектов.
Проанализируем ситуацию с платформой «1С:Предприятие 8.2». В ее графической подсистеме (особенно при работе с обычными формами) присутствует архитектурный недостаток: при динамическом создании, открытии или закрытии сложных форм, табличных документов и ActiveX-компонентов платформа захватывает системные хэндлы (дескрипторы), но не освобождает их обратно в ОС после закрытия окон. Происходит классическая утечка ресурсов. Как только счетчик GDI-объектов процесса 1cv8.exe приближается к критической отметке в 10 000, Windows физически не может выделить новые ресурсы для прорисовки графики. В этот момент и начинают «отваливаться» иконки, крестики закрытия окон и другие элементы интерфейса.
Прежде чем вносить изменения в систему, нам необходимо точно локализовать проблему и убедиться, что дело именно в переполнении лимитов GDI. Разберем по шагам, как провести диагностику с помощью стандартного инструментария Windows:
Ctrl + Shift + Esc).1cv8.exe и зафиксируйте начальное количество графических объектов.Если в процессе работы показатели «Объекты GDI» непрерывно растут и не возвращаются к исходным значениям при закрытии форм, а при достижении отметки около 9 900 – 10 000 элементов интерфейс 1С начинает «сыпаться» — диагноз подтвержден. Мы имеем дело с утечкой ресурсов графического интерфейса.
Если у вас нет возможности оперативно изменить код конфигурации или обновить платформу 1С, можно применить «костыль» на уровне операционной системы. Мы увеличим размер пула доступных GDI и USER объектов для процессов в Windows. Это не устранит саму утечку, но расширит «резервуар», позволяя пользователям работать без перезапуска программы в несколько раз дольше.
Рассмотрим подробнее процедуру внесения изменений в системный реестр:
Win + R, введите команду regedit и нажмите Enter для запуска Редактора реестра.HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
GDIProcessHandleQuota. По умолчанию его десятичное значение составляет 10 000. Дважды кликните по нему, переключите систему исчисления в «Десятичную» и установите новое значение — например, 16384 или максимально возможное 32768 (абсолютный лимит Windows для этого параметра равен 65536, но поднимать его до максимума не рекомендуется из-за риска нестабильности ОС).USERProcessHandleQuota. Установите для него новое десятичное значение в диапазоне от 10 000 до 18000 (это максимальный системный предел для USER-дескрипторов).После этой настройки лимит объектов увеличится, и визуальные дефекты начнут проявляться значительно позже, что позволит сотрудникам комфортно завершить рабочий день без аварийных перезапусков.
Для полного и правильного решения проблемы необходимо доработать конфигурацию 1С, устранив условия, при которых объекты «застревают» в памяти компьютера. Проанализируем основные зоны риска в коде и методы работы с ними:
1. Использование внешних ActiveX и COM-объектов. Если на ваших формах используются библиотеки для работы со сканерами штрихкодов, весами, платежными терминалами или другими внешними компонентами, они могут удерживать графические дескрипторы окон. При закрытии формы их необходимо принудительно уничтожать.
Посмотрим на пример правильного освобождения ресурсов в модуле формы:
Процедура ПриЗакрытии()
// Принудительно очищаем ссылки на внешние компоненты и COM-объекты
Если ЭлементыФормы.Найти("ДрайверСканера") <> Неопределено Тогда
ЭлементыФормы.ДрайверСканера.Очистить();
КонецЕсли;
КомОбъект = Неопределено;
КонецПроцедуры
2. Табличные документы с картинками и штрихкодами. Если в вашем АРМ выводятся печатные формы с логотипами, картинками номенклатуры или штрихкодами, генерируемыми через старые компоненты (например, ActiveBarcode), 1С 8.2 может некорректно удалять временные графические подложки. Постарайтесь минимизировать количество выводимых картинок в динамических списках или используйте встроенные программные генераторы штрихкодов без привлечения внешних элементов управления.
3. Рециклинг (повторное использование) тяжелых форм. Вместо того чтобы при каждом действии пользователя заново создавать, инициализировать и уничтожать вспомогательные формы (что лавинообразно плодит GDI-объекты), перепроектируйте архитектуру АРМ. Создайте одну постоянную форму, которая будет открыта всегда, а при необходимости отображения новых данных просто меняйте видимость ее панелей и очищайте содержимое табличных частей.
Описанная утечка ресурсов является известным багом платформы 1С 8.2, который был полностью устранен разработчиками только в ветке 1С 8.3. В новых версиях платформы существенно оптимизирован механизм работы с графическим контекстом устройств (Device Context), и проблема переполнения дескрипторов GDI больше не возникает.
Если у вас крупная инфраструктура (например, холдинг на 250+ рабочих мест), разовый переход может показаться сложным, однако его можно выполнить поэтапно и безопасно:
Сочетание временного расширения лимитов в реестре (для быстрого снятия остроты проблемы у пользователей) и последующего планомерного обновления платформы до актуальной версии 8.3 позволит вам навсегда избавиться от дефектов прорисовки интерфейса в 1С.