Проблема «прыгающих» или «теряющихся» окон в среде 1С:Предприятие 8.3 — это ситуация, которая ставит в тупик даже опытных разработчиков. Представьте: пользователь нажимает кнопку «Создать на основании», ожидая увидеть новую «Налоговую накладную», но вместо этого фокус перескакивает на список реализаций, окно сообщений или вовсе на другое открытое приложение. В этой статье мы подробно разберем, почему это происходит и как вернуть фокус управления в нужное русло.
Первым делом нам необходимо исключить программное вмешательство в управление фокусом. Часто в доработанных конфигурациях (как в случае с Бухгалтерией для Украины 2.0) разработчики вносят изменения, которые косвенно влияют на поведение окон. Разберем по шагам, как локализовать проблему в коде:
Ctrl + Shift + F) фразы Документы.НалоговаяНакладная.СоздатьДокумент. Если поиск не дал результатов, попробуем найти вызов команды через стандартные обработчики.ПриСозданииНаСервере и ПриОткрытии в модуле формы создаваемого документа (Налоговой накладной).F5) и пошагово пройдем по коду (F10, F11). Нам нужно поймать момент, когда после выполнения метода ОткрытьФорму() или аналогичного, управление передается стороннему объекту.Иногда фокус «крадет» процедура, вызываемая в обработчике ожидания. Проверим, нет ли в родительской форме вызова ПодключитьОбработчикОжидания, который может срабатывать в момент открытия нового окна и возвращать фокус на себя.
Если трассировка кода показала, что программных команд на переключение окон нет, значит, мы столкнулись с системной ошибкой платформы. Рассмотрим ситуацию на примере платформы 8.3.15.1489. Данная ветка релизов имела ряд специфических багов управления фокусом в интерфейсе «Такси».
Проанализируем режим отображения окон. В 1С существует два основных режима: «Закладки» и «Отдельные окна». В режиме «Отдельные окна» платформа взаимодействует с диспетчером окон Windows напрямую, что часто приводит к конфликтам отрисовки. Рекомендуем переключить интерфейс в режим «Закладки» (Сервис — Параметры — Интерфейс). Если в режиме закладок проблема исчезает, значит, причина кроется в ошибке рендеринга слоев платформы.
Также стоит рассмотреть обновление платформы до более стабильных релизов (например, ветки 8.3.18 или выше), где механизмы взаимодействия с графической подсистемой Windows были переработаны.
Одной из самых неочевидных причин «прыжков» фокуса являются настройки экрана. При масштабировании Windows, отличном от 100% (например, 125% или 150% на 4K-мониторах), 1С может некорректно вычислять координаты появления нового окна. Система пытается отрисовать окно, «промахивается» мимо активной области, и фокус автоматически сбрасывается на предыдущее активное окно.
Посмотрим, как это исправить:
После этих манипуляций расчет координат окон станет более предсказуемым для движка платформы.
Платформа 1С сохраняет состояние окон (размер, положение, активность) в локальных файлах профиля пользователя. Если в кэше записалось некорректное состояние для формы «Налоговая накладная», она может открываться в «невидимой» области или сразу уходить на задний план.
Выясним причину через полную очистку. Важно помнить, что простое удаление временных файлов через настройки базы не всегда помогает. Проделаем следующее:
%AppData%\1C\1Cv8 и удалим все папки с буквенно-цифровыми именами (идентификаторы баз).%LocalAppData%\1C\1Cv8.Если проблема сохраняется даже у нового пользователя с полными правами и чистым кэшем, значит, настройки сохранены в системном хранилище конфигурации (таблица SystemSettingsStorage). В этом случае поможет программная очистка настроек конкретной формы через «Управление настройками пользователей» в самой программе.
В современных версиях 1С активно используется аппаратное ускорение для отрисовки интерфейса «Такси». При использовании встроенных видеокарт (например, Intel HD Graphics) или устаревших драйверов, процесс отрисовки нового окна может занимать больше времени, чем системный тайм-аут ожидания фокуса.
Проанализируем возможность отключения аппаратного ускорения. Для этого можно запустить 1С с параметром командной строки /AppAutoSettingsDisable. Также попробуем обновить драйверы видеокарты с официального сайта производителя. В некоторых случаях помогает отключение эффектов прозрачности и анимации окон в настройках быстродействия Windows.
Если ни один из вышеперечисленных методов не помог, а копаться в багах платформы нет времени, применим «силовой» метод программного возврата фокуса. Мы можем принудительно активировать форму документа сразу после её открытия.
Разберем пример кода, который можно внедрить в модуль формы создаваемого документа (в нашем случае — Налоговой накладной):
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Устанавливаем небольшую задержку, чтобы платформа успела завершить системные процессы
ПодключитьОбработчикОжидания("ПринудительнаяАктивацияФормы", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ПринудительнаяАктивацияФормы()
ЭтаФорма.Активировать();
КонецПроцедуры
Использование обработчика ожидания с минимальным интервалом (0.1 сек) позволяет форме «дождаться», пока все фоновые переключения окон завершатся, и гарантированно забрать фокус на себя. Этот метод является наиболее надежным «костылем» в условиях непредсказуемого поведения платформы.
Мы рассмотрели комплекс причин, по которым окно 1С может «прыгать» при создании на основании. Подведем итог: начинать стоит с проверки режима «Закладки» и масштабирования DPI, затем переходить к очистке кэша и, в крайнем случае, использовать программный метод Активировать(). Подобный системный подход позволит вам быстро вернуть комфортную работу пользователям и избежать лишних трудозатрат на бесконечные тесты конфигурации.