Работая с платформой 1С:Предприятие 8.3 на обычных формах, разработчики и системные администраторы иногда сталкиваются со странным поведением программы: формы документов начинают «прозрачневеть», кнопки перестают нажиматься, меню исчезают, а интерфейс «залипает». Часто эта проблема проявляется при интенсивной работе в журналах документов или при открытии большого количества форм подряд. Рассмотрим природу этого явления, выясним причины и разберем по шагам методы решения.
Проблема, описанная в теме, напрямую связана с архитектурой операционной системы Windows и тем, как 1С взаимодействует с графической подсистемой GDI (Graphics Device Interface). Каждый элемент интерфейса (кнопка, иконка, шрифт, окно) требует создания так называемого дескриптора (handle). В Windows существует жесткий лимит: по умолчанию один процесс не может использовать более 10 000 GDI-объектов.
Когда приложение (в нашем случае 1cv8.exe) приближается к этому порогу (обычно глюки начинаются на отметке 9 900 объектов), операционная система просто отказывает в отрисовке новых элементов. Именно поэтому мы видим пустые формы, отсутствие текста или «черные экраны» при попытке сделать скриншот. Проанализируем ситуацию: если в типовой конфигурации проблема не воспроизводится, а в кастомизированной — да, значит, внесенные изменения вызывают «утечку» или избыточное потребление этих дескрипторов.
Прежде чем менять код, мы должны убедиться, что причина именно в GDI. Для этого выполним следующие действия:
Если счетчик в колонке Объекты GDI стремительно растет и замирает на отметке около 10 000 — диагноз подтвержден.
Разберем, какие именно доработки чаще всего приводят к исчерпанию лимитов. Как выяснилось в ходе обсуждения, основной причиной может стать перегруженный полный интерфейс. Если на панели инструментов вынесено огромное количество кнопок с уникальными пиктограммами, каждая из них потребляет ресурсы GDI.
Проанализируем другие типичные причины:
Новый Шрифт или Новый Цвет внутри обработчиков списков.Рассмотрим самое эффективное решение, которое помогло автору темы: группировка кнопок в подменю. Вместо того чтобы выводить 50 иконок на панель инструментов, которые система вынуждена держать в памяти постоянно, мы можем сгруппировать их по смыслу.
Когда кнопки спрятаны в подменю, графические ресурсы для отрисовки их иконок задействуются только в момент раскрытия этого меню. Это позволяет снизить количество активных GDI-объектов в несколько раз.
Очень часто программисты совершают ошибку в обработчиках ПриВыводеСтроки или ПриПолученииДанных. Посмотрим на пример кода, который убивает интерфейс:
Процедура ТабличноеПолеПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// ТАК ДЕЛАТЬ НЕЛЬЗЯ:
ОформлениеСтроки.Ячейки.Статус.Шрифт = Новый Шрифт("Arial", 10, Истина);
ОформлениеСтроки.Ячейки.Статус.ЦветФона = Новый Цвет(255, 0, 0);
КонецПроцедуры
В данном примере при прокрутке списка для каждой строки будет создаваться новый объект шрифта и цвета в памяти GDI. Лимит в 10 000 будет достигнут очень быстро. Выясним, как сделать правильно. Необходимо кэшировать такие объекты:
// В начале модуля формы или в переменные модуля
Перем МойЖирныйШрифт, МойЦветФона;
Процедура ПриОткрытии()
МойЖирныйШрифт = Новый Шрифт("Arial", 10, Истина);
МойЦветФона = Новый Цвет(255, 0, 0);
КонецПроцедуры
Процедура ТабличноеПолеПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// ПРАВИЛЬНЫЙ ВАРИАНТ:
Если ДанныеСтроки.Статус = Перечисления.Статусы.Ошибка Тогда
ОформлениеСтроки.Ячейки.Статус.Шрифт = МойЖирныйШрифт;
ОформлениеСтроки.Ячейки.Статус.ЦветФона = МойЦветФона;
КонецЕсли;
КонецПроцедуры
Ситуация часто обостряется при работе в терминальных сессиях. Протокол RDP более чувствителен к графическим операциям. Проанализируем ситуацию: на сервере может быть установлено ограничение на количество ресурсов для одной сессии. Если ваша база на обычных формах активно использует ПолеHTMLДокумента или встроенные ActiveX компоненты, они могут потреблять GDI-объекты еще агрессивнее, чем стандартные кнопки.
В таких случаях рекомендуется:
GDIProcessHandleQuota в ветке HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows теоретически позволяет увеличить лимит до 16 384, но это лишь «костыль», который не лечит саму причину утечки.Мы выяснили, что «залипание» форм в 1С — это не мистика, а конкретное ограничение операционной системы Windows. Для предотвращения этой проблемы в будущем придерживайтесь следующих правил:
ЭлементыФормы.Добавить(...)), убеждайтесь, что они не дублируются и удаляются при закрытии.Соблюдение этих простых архитектурных принципов позволит сделать работу пользователей комфортной, а интерфейс — стабильным и отзывчивым. Для корректной реализации такой логики можно использовать пример динамического добавления и удаления элементов формы.