Каждый активный пользователь или администратор систем 1С рано или поздно сталкивается с ситуацией, когда программа полностью блокируется, при клике в любой части экрана раздается характерный системный звук («трыньканье»), а при попытке закрыть окно выдается сообщение: «Приложение не может быть закрыто, потому что активен модальный диалог. Закройте диалог и попробуйте снова». В большинстве случаев при этом на экране визуально нет никаких дополнительных окон или вопросов.
Проанализируем ситуацию и выясним причину такого поведения платформы. Данная ошибка — это классический симптом зависания интерфейса 1С. Платформа считает, что открыто диалоговое окно, требующее немедленного ответа пользователя (например, подтверждение проведения, предупреждение об ошибке, выбор принтера), но операционная система по какой-то причине скрыла его под основным окном программы или вовсе не смогла отрисовать. Разберем по шагам наиболее эффективные методы устранения этой неисправности.
Как показывает практика практикующих специалистов и обсуждения на форумах, некорректно записанные временные файлы платформы часто вызывают сбои при отрисовке интерфейсных окон. Очистка кэша помогает вернуть стандартное поведение диалогов.
Выполним очистку временных файлов по следующему алгоритму:
1cv8.exe и 1cv8c.exe через Диспетчер задач Windows.%AppData% и нажмите Enter. В открывшейся папке перейдите в каталог Roaming\1C\1Cv8.83f478a5-d52b-4e89...). В этих каталогах хранятся локальные настройки динамического обновления и кэша конфигурации.Local\1C\1Cv8 (путь %LocalAppData%\1C\1Cv8) и также удалите аналогичные папки с идентификаторами.Довольно часто скрытое модальное окно — это стандартный вопрос программы: «Подтверждаете закрытие программы?» или диалог сохранения настроек отчета. Если пользователь пытается закрыть 1С, но процесс зависает, платформа выдает ошибку модальности. Разберем, как отключить данное предупреждение.
Для этого выполним следующие действия в интерфейсе программы:
Если после этого ошибка перестала появляться, значит, проблема заключалась именно в невозможности корректно вывести на экран стандартный вопрос о выходе.
Если вы работаете с 1С на удаленном сервере через RemoteApp, операционная система Windows Server часто скрывает новые всплывающие окна под главным окном приложения. Пользователь физически не видит вопрос, а программа блокируется. Посмотрим на методы борьбы с этой проблемой, в том числе через применение RPA-платформы для автоматизации действий пользователя.
Вариант А. Быстрое извлечение скрытого окна с клавиатуры:
Вариант Б. Настройка реестра на сервере терминалов:
Чтобы операционная система не «прятала» диалоги, системному администратору необходимо изменить таймаут блокировки фокуса в реестре Windows Server:
regedit.HKEY_CURRENT_USER\Control Panel\Desktop.ForegroundLockTimeout. По умолчанию его значение в шестнадцатеричной системе равно 200000 (миллисекунд).0. Это принудительно заставит операционную систему выводить любые новые всплывающие окна на передний план.Зависание с ошибкой модального окна часто происходит при формировании тяжелых отчетов, таких как Карточка счета 26, оборотно-сальдовые ведомости за большой период или при обработке крупных банковских выписок. Рассмотрим подробнее физику этого процесса.
Если на рабочих местах используется 32-битная версия клиента платформы (процесс 1cv8.exe), операционная система выделяет ему максимум 2 ГБ оперативной памяти (в редких конфигурациях до 4 ГБ). В момент формирования отчета платформа исчерпывает этот лимит. Программа пытается выбросить стандартное системное сообщение об ошибке Недостаточно памяти (Out of memory), но так как свободная память отсутствует, графическая подсистема не может отрисовать само это окно. Процесс зависает, симулируя активный модальный режим.
Решение: Скачайте с портала технологической поддержки 1С и установите на рабочие станции пользователей 64-битный тонкий или толстый клиент 1С:Предприятия. Это полностью снимет архитектурные ограничения на использование оперативной памяти клиентским приложением.
Когда информационная база является файловой (файл 1Cv8.1CD расположен в сетевой папке), стабильность ее работы критически зависит от качества локальной сети и сетевых протоколов (в частности, Samba/SMB). Если у одного из пользователей на долю секунды пропадает связь с сервером, его сессия аварийно завершается. На файле базы данных при этом остаются незакрытые транзакционные блокировки (файлы с расширением *.1CL).
Когда другие пользователи пытаются провести документ или записать элемент справочника, их транзакция уходит в бесконечное ожидание снятия блокировки. Интерфейс программы «застывает». При попытке закрыть такое «зависшее» окно аварийно, платформа сообщает о модальном диалоге, так как процесс записи документа находится в незавершенной фазе.
Для исправления ситуации выполним следующие действия:
*.1CL (файлы блокировок) при отсутствии активных пользователей, удалите их вручную.chdbfl.exe (она находится в каталоге установки платформы, например: C:\Program Files\1cv8\номер_платформы\bin). Выберите файл базы и запустите исправление ошибок.Начиная с версии платформы 8.3, разработчики 1С взяли курс на отказ от модальности. В современных конфигурациях (включая Бухгалтерию предприятия 3.0) в свойствах конфигурации по умолчанию включен параметр Режим использования модальности: Не использовать. Для перехода на новые конфигурации с поддержкой немодальных вызовов предусмотрен раздел с решениями для переноса данных из 1С:УПП 1.3.
Если вы используете старую внешнюю обработку или стороннее расширение конфигурации, в коде которых программист применил классические синхронные вызовы (например, метод Вопрос() или ОткрытьМодально()), платформа выдаст критическую ошибку или зависнет.
Разработчикам конфигураций необходимо переписать небезопасный код на асинхронные методы. Посмотрим на пример изменения кода.
Было (устаревший модальный вызов):
Режим = РежимДиалогаВопрос.ДаНет;
Ответ = Вопрос("Вы уверены, что хотите выполнить операцию?", Режим, 0);
Если Ответ = КодВозвратаДиалога.Да Тогда
ВыполнитьДействие();
КонецЕсли;
Стало (современный асинхронный вызов через описание оповещения):
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораВопроса", ЭтотОбъект);
Режим = РежимДиалогаВопрос.ДаНет;
ПоказатьВопрос(ОписаниеОповещения, "Вы уверены, что хотите выполнить операцию?", Режим);
&НаКлиенте
Процедура ПослеВыбораВопроса(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ВыполнитьДействие();
КонецЕсли;
КонецПроцедуры
Использование немодальных асинхронных методов гарантирует, что интерфейс программы никогда не заблокируется в ожидании ответа пользователя, и веб-клиент или тонкий клиент продолжат стабильную работу в любых сценариях.