Почему при создании документа на основании в 1С открывается другое окно и как это исправить

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

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

Анализ программного кода и использование отладчика

Первым делом нам необходимо исключить программное вмешательство в управление фокусом. Часто в доработанных конфигурациях (как в случае с Бухгалтерией для Украины 2.0) разработчики вносят изменения, которые косвенно влияют на поведение окон. Разберем по шагам, как локализовать проблему в коде:

  1. Выполним глобальный поиск по конфигурации (клавиши Ctrl + Shift + F) фразы Документы.НалоговаяНакладная.СоздатьДокумент. Если поиск не дал результатов, попробуем найти вызов команды через стандартные обработчики.
  2. Проанализируем модуль формы документа-основания (например, «Реализация товаров и услуг»). Нас интересуют процедуры, связанные с командой заполнения.
  3. Установим точки останова в процедурах ПриСозданииНаСервере и ПриОткрытии в модуле формы создаваемого документа (Налоговой накладной).
  4. Запустим отладку (F5) и пошагово пройдем по коду (F10, F11). Нам нужно поймать момент, когда после выполнения метода ОткрытьФорму() или аналогичного, управление передается стороннему объекту.

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

Влияние версии платформы и режима интерфейса

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

Проанализируем режим отображения окон. В 1С существует два основных режима: «Закладки» и «Отдельные окна». В режиме «Отдельные окна» платформа взаимодействует с диспетчером окон Windows напрямую, что часто приводит к конфликтам отрисовки. Рекомендуем переключить интерфейс в режим «Закладки» (Сервис — Параметры — Интерфейс). Если в режиме закладок проблема исчезает, значит, причина кроется в ошибке рендеринга слоев платформы.

Также стоит рассмотреть обновление платформы до более стабильных релизов (например, ветки 8.3.18 или выше), где механизмы взаимодействия с графической подсистемой Windows были переработаны.

Настройки масштабирования Windows (DPI)

Одной из самых неочевидных причин «прыжков» фокуса являются настройки экрана. При масштабировании Windows, отличном от 100% (например, 125% или 150% на 4K-мониторах), 1С может некорректно вычислять координаты появления нового окна. Система пытается отрисовать окно, «промахивается» мимо активной области, и фокус автоматически сбрасывается на предыдущее активное окно.

Посмотрим, как это исправить:

  1. Зайдем в настройки экрана Windows и установим масштаб 100% для проверки.
  2. Если менять масштаб всей системы неудобно, нажмем правой кнопкой мыши на ярлык 1С — Свойства — Совместимость — Изменить параметры высокого DPI.
  3. Установим галочку «Переопределите режим масштабирования...» и выберем в выпадающем списке пункт «Приложение» или «Система (расширенная)».

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

Очистка кэша и пользовательских настроек

Платформа 1С сохраняет состояние окон (размер, положение, активность) в локальных файлах профиля пользователя. Если в кэше записалось некорректное состояние для формы «Налоговая накладная», она может открываться в «невидимой» области или сразу уходить на задний план.

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

  1. Закроем все сеансы 1С.
  2. Перейдем в папку %AppData%\1C\1Cv8 и удалим все папки с буквенно-цифровыми именами (идентификаторы баз).
  3. Аналогичную операцию проведем в папке %LocalAppData%\1C\1Cv8.
  4. Удалим базу из списка и добавим её заново, чтобы сгенерировался новый ID кэша.

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

Конфликты с аппаратным ускорением и видеодрайверами

В современных версиях 1С активно используется аппаратное ускорение для отрисовки интерфейса «Такси». При использовании встроенных видеокарт (например, Intel HD Graphics) или устаревших драйверов, процесс отрисовки нового окна может занимать больше времени, чем системный тайм-аут ожидания фокуса.

Проанализируем возможность отключения аппаратного ускорения. Для этого можно запустить 1С с параметром командной строки /AppAutoSettingsDisable. Также попробуем обновить драйверы видеокарты с официального сайта производителя. В некоторых случаях помогает отключение эффектов прозрачности и анимации окон в настройках быстродействия Windows.

Программное решение: принудительная активация формы

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

Разберем пример кода, который можно внедрить в модуль формы создаваемого документа (в нашем случае — Налоговой накладной):


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Устанавливаем небольшую задержку, чтобы платформа успела завершить системные процессы
    ПодключитьОбработчикОжидания("ПринудительнаяАктивацияФормы", 0.1, Истина);
КонецПроцедуры

&НаКлиенте
Процедура ПринудительнаяАктивацияФормы()
    ЭтаФорма.Активировать();
КонецПроцедуры

Использование обработчика ожидания с минимальным интервалом (0.1 сек) позволяет форме «дождаться», пока все фоновые переключения окон завершатся, и гарантированно забрать фокус на себя. Этот метод является наиболее надежным «костылем» в условиях непредсказуемого поведения платформы.

Резюме

Мы рассмотрели комплекс причин, по которым окно 1С может «прыгать» при создании на основании. Подведем итог: начинать стоит с проверки режима «Закладки» и масштабирования DPI, затем переходить к очистке кэша и, в крайнем случае, использовать программный метод Активировать(). Подобный системный подход позволит вам быстро вернуть комфортную работу пользователям и избежать лишних трудозатрат на бесконечные тесты конфигурации.

← На главную