Каждый администратор и разработчик систем на базе 1С:Предприятие рано или поздно сталкивается с ситуацией, когда пользователи начинают жаловаться на периодическое зависание программы. Внешне это выглядит классически: окно 1С бледнеет, операционная система вешает на него статус "Не отвечает", а на экране появляется так называемый "белый экран". Особенно часто эта проблема проявляется при работе в терминальном режиме (RDP) в конфигурациях на обычных формах (например, УПП 1.3 или УТ 10.3) во время активного поиска или быстрой навигации по списку номенклатуры.
Давайте подробно разберем, почему возникает этот эффект, проанализируем цепочку событий от интерфейса до СУБД и найдем эффективные способы устранения этой проблемы.
Когда пользователь перемещается по списку номенклатуры или вводит первые буквы названия (например, "хлеб"), система пытается на лету показать ему актуальные остатки на складах. Часто для этого используется динамическое получение данных через фоновый запрос. Чтобы интерфейс не зависал при каждом движении стрелочки, разработчики используют обработчик ожидания.
Однако, если установить интервал обработчика ожидания слишком маленьким (например, 0.1 секунды), возникает опасный эффект "дребезга" (bounce). Клиентское приложение 1С:Предприятие 8.2 выполняет UI-процессы в одном потоке. Если очередной запрос к серверу СУБД не успевает выполниться за эти 0.1 секунды (из-за объема данных или микрозадержек сети), интерфейсный поток блокируется. Windows расценивает это как зависание программы и окрашивает окно в белый цвет.
Рассмотрим, как исправить эту логику и внедрить правильный механизм дебаунса (отсечки). Вместо мгновенного выполнения запроса при каждом изменении строки мы должны принудительно гасить предыдущий таймер и запускать его заново. Запрос уйдет на сервер только тогда, когда пользователь сделает паузу в наборе текста или прокрутке списка хотя бы на 0.5–1.0 секунды.
Посмотрим на пример неправильной реализации, которая часто приводит к «белому экрану»:
// НЕПРАВИЛЬНО: Запрос запускается слишком быстро или наслаивается
Процедура СписокПриАктивизацииСтроки(Элемент)
// Каждое движение вызывает серверный вызов напрямую или с микро-задержкой
ПодключитьОбработчикОжидания("ПолучитьОстаткиТовара", 0.1, Истина);
КонецПроцедуры
А теперь спроектируем правильную и стабильную архитектуру вызова. Разберем по шагам рабочий код:
Переменная ТекущийТоварДляЗапроса;
Процедура СписокПриАктивизацииСтроки(Элемент)
// 1. Первым делом отключаем ранее зарегистрированный обработчик!
// Это предотвращает накопление очереди невыполненных вызовов.
ОтключитьОбработчикОжидания("ВыполнитьЗапросОстатков");
// 2. Сохраняем текущую ссылку на номенклатуру во временную переменную
ТекущийТоварДляЗапроса = Элемент.ТекущаяСтрока;
// 3. Подключаем обработчик с безопасным интервалом (0.5 - 1.0 сек)
// Параметр "Однократно = Истина" обязателен
ПодключитьОбработчикОжидания("ВыполнитьЗапросОстатков", 0.5, Истина);
КонецПроцедуры
Процедура ВыполнитьЗапросОстатков()
Если НЕ ЗначениеЗаполнено(ТекущийТоварДляЗапроса) Тогда
Возврат;
КонецЕсли;
// Вызываем серверную функцию получения остатков
ОстатокНаСкладе = ПолучитьОстатокНаСервере(ТекущийТоварДляЗапроса);
// Отображаем данные на форме
ЭлементыФормы.НадписьОстаток.Значение = ОстатокНаСкладе;
КонецПроцедуры
Даже если код формы оптимизирован, запрос к остаткам может намертво встать в очередь блокировок на уровне СУБД (особенно если база данных SQL работает под высокой нагрузкой, а таблица остатков, например, регистр накопления ТоварыНаСкладах, имеет внушительный объем — от 30 ГБ и выше).
Когда другие пользователи проводят документы (поступления, реализации), MS SQL накладывает монопольные блокировки (Exclusive Locks) на таблицы и индексы регистра. Ваш легкий запрос на чтение остатков пытается наложить разделяемую блокировку (Shared Lock) и засыпает в ожидании освобождения ресурса. Клиент ждет ответа от сервера, а пользователь видит "белый экран".
Чтобы решить эту проблему на уровне базы данных, выполним следующие шаги:
ALTER DATABASE [Имя_Вашей_Базы_1С] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [Имя_Вашей_Базы_1С] SET READ_COMMITTED_SNAPSHOT ON;
ALTER DATABASE [Имя_Вашей_Базы_1С] SET MULTI_USER;
ГДЕ. Проанализируем разницу.Неоптимальный вариант (заставляет SQL Server сканировать весь индекс или таблицу):
ВЫБРАТЬ
ТоварыОстатки.Номенклатура,
ТоварыОстатки.ВНаличииОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Период) КАК ТоварыОстатки
ГДЕ
ТоварыОстатки.Номенклатура = &Номенклатура // Фильтрация происходит ПОСЛЕ выборки всех остатков!
Правильный и быстрый вариант (отрабатывает мгновенно по индексу):
ВЫБРАТЬ
ТоварыОстатки.Номенклатура,
ТоварыОстатки.ВНаличииОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Номенклатура = &Номенклатура) КАК ТоварыОстатки
Если зависание происходит исключительно у пользователей, работающих в терминальном режиме (RDP), велика вероятность того, что проблема кроется в сетевых настройках или логике отрисовки интерфейса Windows:
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services\Client] "fClientDisableUDP"=dword:00000001При вводе первых букв названия товара в поле поиска (например, "хлеб") платформа 1С:Предприятие может обращаться к механизмам полнотекстового поиска для быстрого позиционирования. Если файлы индексов полнотекстового поиска повреждены, забиты временными файлами или база давно не индексировалась, процесс rphost уходит в пиковую нагрузку, вызывая полное зависание сессии пользователя.
Проанализируем шаги по восстановлению стабильности поиска:
Иногда "белый экран" возникает у конкретного пользователя случайным образом, в то время как у его коллеги под той же учетной записью RDP все работает быстро. Это явный маркер повреждения локального кэша метаданных и настроек динамических списков 1С.
Рекомендуем выполнить полную очистку кэша для проблемного пользователя. Для этого необходимо удалить содержимое следующих каталогов в его профиле на RDP-сервере:
%userprofile%\AppData\Local\1C\1Cv82%userprofile%\AppData\Roaming\1C\1Cv82После удаления этих папок при первом запуске 1С заново считает конфигурацию с сервера приложений, восстановит настройки отображения списков по умолчанию, и интерфейсные тормоза исчезнут.
Системный и последовательный анализ описанных факторов позволит вам навсегда избавиться от проблемы "белого экрана" в 1С 8.2 и обеспечить пользователям комфортную и быструю работу со списком номенклатуры.