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

Программист 1С v8.3 (Управляемые формы) Управленческий учет Торговля и дистрибуция
← На главную

В практике работы с современными конфигурациями на платформе 1С:Предприятие 8.3 (такими как УТ 11, ERP 2 или КА) специалисты часто сталкиваются со специфической проблемой: при попытке закрыть форму обработки (например, подбора товаров в документ) клиентское приложение полностью зависает. При этом стандартная отладка показывает, что программный код в процедуре ПередЗакрытием выполняется успешно, но до события ПриЗакрытии управление так и не доходит. Рассмотрим подробно причины этого поведения и способы решения проблемы.

Проанализируем симптомы и контекст проблемы

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

  1. Проблема часто носит индивидуальный характер — воспроизводится только у конкретного пользователя.
  2. Ошибка «переезжает» вместе с пользователем на другой компьютер, что сразу исключает проблемы с локальным кешем на диске.
  3. Зависание происходит в «мертвой зоне» между серверным и клиентским событием закрытия формы.

Разберем основные методы устранения этой неисправности по шагам.

Решение 1: Полная очистка пользовательских настроек

Как показывает практика и опыт участников обсуждения, основной причиной зависания является некорректное сохранение или чтение системных данных формы. В 1С существует разделение на пользовательские настройки (фильтры, отборы, значения по умолчанию) и системные настройки (расположение окон, ширина колонок, состояние дерева групп, активность строк в динамическом списке).

Часто программисты пытаются сбросить только настройки конкретной обработки, но это не помогает. Решением является полная очистка настроек пользователя в информационной базе. Рассмотрим, как это сделать:

  1. Перейдем в раздел Администрирование — Настройки пользователей и прав.
  2. Выберем нужного пользователя и перейдем по ссылке Настройки.
  3. На вкладке «Внешний вид» или через общее меню очистки выберем Все настройки и удалим их.

Важно: Это действие сбросит все персональные доработки интерфейса (ширину колонок, скрытые поля), которые пользователь делал «под себя», но в 90% случаев это единственный способ вернуть работоспособность учетной записи без создания нового пользователя.

Решение 2: Проблема релиза платформы и системного хранилища

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

Особое внимание стоит уделить версии платформы. Релизы ветки 8.3.13 (в частности, 8.3.13.1513) имели зафиксированные ошибки, связанные с утечкой памяти и зависанием при работе с динамическими списками. Если вы столкнулись с подобным поведением, рекомендуется выполнить одно из следующих действий:

Решение 3: Исследование асинхронных вызовов и деструкторов

Если очистка настроек помогла лишь временно, нужно обратить внимание на код. Рассмотрим стандартную процедуру ПередЗакрытием в типовых формах подбора:


&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    Если ЗавершениеРаботы И Объект.Корзина.Количество > 0 Тогда
        Отказ = Истина;
        ТекстПредупреждения = НСтр("ru = 'Данные были изменены. Все изменения будут потеряны.'");
        Возврат;
    КонецЕсли;
    
    // Вызов общего модуля, который может содержать асинхронные обработчики
    ПодборТоваровКлиент.ПередЗакрытиемФормыПодбораТоваров(ЭтаФорма, Объект, Отказ);
КонецПроцедуры

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


Процедура ПередЗакрытиемФормыПодбораТоваров(Форма, Объект, Отказ) Экспорт
    Если Форма.ПеренестиВДокумент ИЛИ Форма.ВыполняетсяЗакрытие Тогда
        Возврат;
    КонецЕсли;
    
    Если Объект.Корзина.Количество = 0 Тогда
        Возврат; // Здесь управление возвращается в форму
    КонецЕсли;

    Отказ = Истина;
    ПоказатьВопрос(Новый ОписаниеОповещения("ПередЗакрытиемФормыПодбораТоваровЗавершение", ЭтотОбъект, 
        Новый Структура("Форма", Форма)), 
        НСтр("ru = 'Подобранные товары не перенесены в документ. Перенести?'"), 
        РежимДиалогаВопрос.ДаНетОтмена);
КонецПроцедуры

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

Решение 4: Режим отображения динамического списка

Интересный нюанс: иногда зависание пропадает, если изменить режим просмотра списка товаров. Если у пользователя включен режим «Дерево» или «Иерархический список», платформа сохраняет состояние развернутых узлов. При огромном справочнике «Номенклатура» объем сохраняемых данных о «развернутости» веток может стать критическим.

Попробуйте выполнить следующие действия для диагностики:

  1. Зайти под проблемным пользователем.
  2. В форме подбора через меню «Еще» — «Установить режим просмотра» выбрать «Список».
  3. Попробовать закрыть форму.

Если в режиме обычного списка форма закрывается без проблем, значит, причина в механизме сохранения иерархии. В этом случае поможет только радикальная очистка системных настроек (Решение 1).

Выясним причину через программное отключение сохранения

Для окончательной проверки гипотезы о настройках, вы можете временно изменить свойство формы в Конфигураторе. Найдите форму подбора и установите свойство Автоматическое сохранение данных в настройках в значение Не использовать. Если после этого зависания прекратятся — вы нашли корень проблемы. Однако для постоянного решения лучше использовать очистку хранилища настроек, чтобы не лишать пользователей полезного функционала запоминания их предпочтений.

Подводя итог, можно сказать, что «зависание при закрытии» — это классический симптом повреждения системного кэша настроек пользователя в базе данных или баг конкретной сборки платформы при работе с объектами ManagedForm. Последовательная очистка всех настроек пользователя и контроль версии платформы гарантированно решают данную задачу.

← На главную