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

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

В процессе администрирования и поддержки баз данных 1С можно столкнуться с нетипичной ситуацией: при попытке провести или перепровести документ система намертво зависает на несколько минут. При этом зависание воспроизводится только у одной связки учетной записи Windows и пользователя информационной базы, тогда как под другими учетными записями те же документы проводятся мгновенно. Локальная чистка кэша на клиентской машине или терминальном сервере в таких ситуациях часто не дает результатов. Разберем детально механизм возникновения этой неполадки и способы ее устранения.

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

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

Если пользователь ранее установил в списке документов поиск в режиме по части строки (по подстроке), СУБД формирует SQL-запрос с конструкцией LIKE '%образец%'. Выделим основные технические факторы, приводящие к падению производительности:

  1. Невозможность использования B-Tree индексов: Наличие ведущего символа процента (%) исключает применение стандартных индексов СУБД. Серверу баз данных приходится выполнять полное сканирование таблицы (Table Scan или Clustered Index Scan). В базах с миллионами записей такой запрос требует колоссальных ресурсов дисковой подсистемы и процессора.
  2. Блокировки и конкуренция транзакций: При обновлении списка тяжелый запрос на чтение конкурирует за блокировки с транзакцией проведения, что приводит к длительным ожиданиям на блокировках (Lock Waits).
  3. Сохранение пользовательских настроек в базе данных: Платформа сохраняет фильтры, строки поиска и положение курсора в системных таблицах базы данных (хранилищах настроек). Именно поэтому удаление локального кэша файлов с диска не решает проблему — при входе пользователя система восстанавливает зависший отбор прямо из информационной базы.

Способ 1. Отключение поиска в интерфейсе пользователя

Простейшим и самым быстрым решением является отключение активного отбора непосредственно в интерфейсе пользователя:

  1. Откроем форму списка документов, с которой работает пользователь.
  2. Проверим поле поиска: если в нем введен текст или установлен режим содержит / по части строки, нажмем кнопку отмены поиска (крестик) или сбросим строку поиска клавишей Esc.
  3. Закроем форму списка и проверим проведение документа заново.

Способ 2. Очистка настроек пользователя через интерфейс программы

Если открыть форму списка затруднительно из-за постоянных зависаний, сбросим пользовательские настройки административными средствами конфигурации (в конфигурациях на базе БСП):

  1. Перейдем в раздел Администрирование — Настройки пользователей и прав — Персональные настройки пользователей — Очистка настроек.
  2. В открывшемся окне выберем нужного пользователя.
  3. Найдем в списке проблемную форму (журнал или форму списка документов) и выполним команду Очистить.
  4. Если точная форма неизвестна, выполним полную очистку настроек динамических списков для данного пользователя.

Способ 3. Программная очистка системных хранилищ настроек

Для гарантированного сброса некорректных фильтров и сохраненных состояний списков на уровне встроенного языка 1С воспользуемся методами работы с системными хранилищами. Напишем код для внешней обработки:


// Очистка сохраненных настроек динамических списков конкретного пользователя
ИмяПользователяДляОчистки = "ИвановИИ";

// 1. Очистка настроек динамических списков
ХранилищеПользовательскихНастроекДинамическихСписков.Удалить(
    Неопределено, 
    Неопределено, 
    ИмяПользователяДляОчистки
);

// 2. Очистка системных настроек форм и интерфейса
ХранилищеСистемныхНастроек.Удалить(
    Неопределено, 
    Неопределено, 
    ИмяПользователяДляОчистки
);

// 3. Очистка общих настроек
ХранилищеОбщихНастроек.Удалить(
    Неопределено, 
    Неопределено, 
    ИмяПользователяДляОчистки
);

Сообщить("Настройки пользователя " + ИмяПользователяДляОчистки + " успешно очищены.");

Метод Удалить() с переданными параметрами Неопределено очищает все ключи объектов и настроек для указанного имени пользователя информационной базы, возвращая интерфейс к исходному состоянию.

Рекомендации разработчикам и администраторам по предотвращению проблемы

Чтобы исключить подобные зависания в будущем, применим следующие системные и конфигурационные меры:

  1. Проверка свойства «Основная таблица» динамического списка: В свойствах каждого динамического списка обязательно должна быть указана основная таблица. Это позволяет платформе оптимизировать считывание данных порциями и обновлять только измененные строки при записи объектов.
  2. Включение версионирования строк в СУБД (RCSI): Для баз данных на MS SQL Server рекомендуется включать механизм Read Committed Snapshot Isolation. Это исключает конфликты блокировок между операциями чтения динамических списков и транзакциями проведения документов.
  3. Использование полнотекстового поиска: Настроим регламентные задания обновления и слияния индекса полнотекстового поиска (ОбновлениеИндексаППД, СлияниеИндексовППД). Полнотекстовый поиск по полям списка работает существенно быстрее, чем поиск по шаблону LIKE '%...%'.
← На главную