В практике работы с современными конфигурациями на платформе 1С:Предприятие 8.3 (такими как УТ 11, ERP 2 или КА) специалисты часто сталкиваются со специфической проблемой: при попытке закрыть форму обработки (например, подбора товаров в документ) клиентское приложение полностью зависает. При этом стандартная отладка показывает, что программный код в процедуре ПередЗакрытием выполняется успешно, но до события ПриЗакрытии управление так и не доходит. Рассмотрим подробно причины этого поведения и способы решения проблемы.
Ситуация, как правило, выглядит следующим образом: пользователь открывает форму подбора товаров, выполняет какие-либо действия (или даже просто открывает и закрывает форму), нажимает на кнопку закрытия, и программа «умирает». Помогает только принудительное завершение процесса через диспетчер задач. Важно отметить следующие детали:
Разберем основные методы устранения этой неисправности по шагам.
Как показывает практика и опыт участников обсуждения, основной причиной зависания является некорректное сохранение или чтение системных данных формы. В 1С существует разделение на пользовательские настройки (фильтры, отборы, значения по умолчанию) и системные настройки (расположение окон, ширина колонок, состояние дерева групп, активность строк в динамическом списке).
Часто программисты пытаются сбросить только настройки конкретной обработки, но это не помогает. Решением является полная очистка настроек пользователя в информационной базе. Рассмотрим, как это сделать:
Важно: Это действие сбросит все персональные доработки интерфейса (ширину колонок, скрытые поля), которые пользователь делал «под себя», но в 90% случаев это единственный способ вернуть работоспособность учетной записи без создания нового пользователя.
Проанализируем техническую сторону вопроса. Почему чистка настроек помогает? В момент закрытия формы платформа пытается сериализовать (записать в базу данных) текущее состояние формы. Если в базе данных в таблице SystemSettingsStorage накопились поврежденные данные или структура настроек вошла в конфликт с программным кодом, процесс записи зацикливается.
Особое внимание стоит уделить версии платформы. Релизы ветки 8.3.13 (в частности, 8.3.13.1513) имели зафиксированные ошибки, связанные с утечкой памяти и зависанием при работе с динамическими списками. Если вы столкнулись с подобным поведением, рекомендуется выполнить одно из следующих действий:
Если очистка настроек помогла лишь временно, нужно обратить внимание на код. Рассмотрим стандартную процедуру ПередЗакрытием в типовых формах подбора:
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если ЗавершениеРаботы И Объект.Корзина.Количество > 0 Тогда
Отказ = Истина;
ТекстПредупреждения = НСтр("ru = 'Данные были изменены. Все изменения будут потеряны.'");
Возврат;
КонецЕсли;
// Вызов общего модуля, который может содержать асинхронные обработчики
ПодборТоваровКлиент.ПередЗакрытиемФормыПодбораТоваров(ЭтаФорма, Объект, Отказ);
КонецПроцедуры
Внутри метода ПодборТоваровКлиент.ПередЗакрытиемФормыПодбораТоваров часто вызывается ОписаниеОповещения с последующим выводом вопроса пользователю. Если в этот момент платформа пытается одновременно закрыть форму и обработать асинхронный вызов, может возникнуть конфликт потоков. Проанализируем вызываемый код:
Процедура ПередЗакрытиемФормыПодбораТоваров(Форма, Объект, Отказ) Экспорт
Если Форма.ПеренестиВДокумент ИЛИ Форма.ВыполняетсяЗакрытие Тогда
Возврат;
КонецЕсли;
Если Объект.Корзина.Количество = 0 Тогда
Возврат; // Здесь управление возвращается в форму
КонецЕсли;
Отказ = Истина;
ПоказатьВопрос(Новый ОписаниеОповещения("ПередЗакрытиемФормыПодбораТоваровЗавершение", ЭтотОбъект,
Новый Структура("Форма", Форма)),
НСтр("ru = 'Подобранные товары не перенесены в документ. Перенести?'"),
РежимДиалогаВопрос.ДаНетОтмена);
КонецПроцедуры
Если зависание происходит даже при пустой корзине, значит, проблема кроется в деструкторах данных формы. При закрытии 1С зачищает ВременноеХранилище и удаляет временные файлы. Если связь с сервером нестабильна или на сервере скопилось огромное количество сеансовых данных этого пользователя, процесс очистки может «подвесить» клиент.
Интересный нюанс: иногда зависание пропадает, если изменить режим просмотра списка товаров. Если у пользователя включен режим «Дерево» или «Иерархический список», платформа сохраняет состояние развернутых узлов. При огромном справочнике «Номенклатура» объем сохраняемых данных о «развернутости» веток может стать критическим.
Попробуйте выполнить следующие действия для диагностики:
Если в режиме обычного списка форма закрывается без проблем, значит, причина в механизме сохранения иерархии. В этом случае поможет только радикальная очистка системных настроек (Решение 1).
Для окончательной проверки гипотезы о настройках, вы можете временно изменить свойство формы в Конфигураторе. Найдите форму подбора и установите свойство Автоматическое сохранение данных в настройках в значение Не использовать. Если после этого зависания прекратятся — вы нашли корень проблемы. Однако для постоянного решения лучше использовать очистку хранилища настроек, чтобы не лишать пользователей полезного функционала запоминания их предпочтений.
Подводя итог, можно сказать, что «зависание при закрытии» — это классический симптом повреждения системного кэша настроек пользователя в базе данных или баг конкретной сборки платформы при работе с объектами ManagedForm. Последовательная очистка всех настроек пользователя и контроль версии платформы гарантированно решают данную задачу.