Почему «залипает» интерфейс и исчезают элементы форм в 1С на обычных формах и как это исправить?

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

Работая с платформой 1С:Предприятие 8.3 на обычных формах, разработчики и системные администраторы иногда сталкиваются со странным поведением программы: формы документов начинают «прозрачневеть», кнопки перестают нажиматься, меню исчезают, а интерфейс «залипает». Часто эта проблема проявляется при интенсивной работе в журналах документов или при открытии большого количества форм подряд. Рассмотрим природу этого явления, выясним причины и разберем по шагам методы решения.

Суть проблемы: лимиты графической подсистемы Windows

Проблема, описанная в теме, напрямую связана с архитектурой операционной системы Windows и тем, как 1С взаимодействует с графической подсистемой GDI (Graphics Device Interface). Каждый элемент интерфейса (кнопка, иконка, шрифт, окно) требует создания так называемого дескриптора (handle). В Windows существует жесткий лимит: по умолчанию один процесс не может использовать более 10 000 GDI-объектов.

Когда приложение (в нашем случае 1cv8.exe) приближается к этому порогу (обычно глюки начинаются на отметке 9 900 объектов), операционная система просто отказывает в отрисовке новых элементов. Именно поэтому мы видим пустые формы, отсутствие текста или «черные экраны» при попытке сделать скриншот. Проанализируем ситуацию: если в типовой конфигурации проблема не воспроизводится, а в кастомизированной — да, значит, внесенные изменения вызывают «утечку» или избыточное потребление этих дескрипторов.

Шаг 1. Диагностика через Диспетчер задач

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

  1. Откроем Диспетчер задач Windows.
  2. Перейдем на вкладку Подробности (Details).
  3. Нажмем правой кнопкой мыши на заголовки колонок и выберем пункт Выбрать столбцы.
  4. В появившемся списке найдем и отметим галочкой Объекты GDI.
  5. Теперь запустим 1С и начнем выполнять действия, приводящие к зависанию (открывать журналы, формы документов).

Если счетчик в колонке Объекты GDI стремительно растет и замирает на отметке около 10 000 — диагноз подтвержден.

Шаг 2. Выявление «пожирателей» ресурсов в интерфейсе

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

Проанализируем другие типичные причины:

Шаг 3. Оптимизация командных панелей

Рассмотрим самое эффективное решение, которое помогло автору темы: группировка кнопок в подменю. Вместо того чтобы выводить 50 иконок на панель инструментов, которые система вынуждена держать в памяти постоянно, мы можем сгруппировать их по смыслу.

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

Шаг 4. Правильная работа с оформлением в коде

Очень часто программисты совершают ошибку в обработчиках ПриВыводеСтроки или ПриПолученииДанных. Посмотрим на пример кода, который убивает интерфейс:


Процедура ТабличноеПолеПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    // ТАК ДЕЛАТЬ НЕЛЬЗЯ:
    ОформлениеСтроки.Ячейки.Статус.Шрифт = Новый Шрифт("Arial", 10, Истина);
    ОформлениеСтроки.Ячейки.Статус.ЦветФона = Новый Цвет(255, 0, 0);
КонецПроцедуры

В данном примере при прокрутке списка для каждой строки будет создаваться новый объект шрифта и цвета в памяти GDI. Лимит в 10 000 будет достигнут очень быстро. Выясним, как сделать правильно. Необходимо кэшировать такие объекты:


// В начале модуля формы или в переменные модуля
Перем МойЖирныйШрифт, МойЦветФона;

Процедура ПриОткрытии()
    МойЖирныйШрифт = Новый Шрифт("Arial", 10, Истина);
    МойЦветФона = Новый Цвет(255, 0, 0);
КонецПроцедуры

Процедура ТабличноеПолеПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    // ПРАВИЛЬНЫЙ ВАРИАНТ:
    Если ДанныеСтроки.Статус = Перечисления.Статусы.Ошибка Тогда
        ОформлениеСтроки.Ячейки.Статус.Шрифт = МойЖирныйШрифт;
        ОформлениеСтроки.Ячейки.Статус.ЦветФона = МойЦветФона;
    КонецЕсли;
КонецПроцедуры

Шаг 5. Особенности работы через RDP (терминальный сервер)

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

В таких случаях рекомендуется:

  1. Минимизировать использование прозрачности и сложных градиентов в оформлении.
  2. Проверить настройки реестра на сервере. Параметр GDIProcessHandleQuota в ветке HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows теоретически позволяет увеличить лимит до 16 384, но это лишь «костыль», который не лечит саму причину утечки.
  3. Использовать специализированные утилиты типа GDIView для точного определения, какой тип объекта «течет» (Bitmap, Font или Pen).

Итоги и рекомендации

Мы выяснили, что «залипание» форм в 1С — это не мистика, а конкретное ограничение операционной системы Windows. Для предотвращения этой проблемы в будущем придерживайтесь следующих правил:

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

← На главную