В процессе администрирования и поддержки баз данных 1С можно столкнуться с нетипичной ситуацией: при попытке провести или перепровести документ система намертво зависает на несколько минут. При этом зависание воспроизводится только у одной связки учетной записи Windows и пользователя информационной базы, тогда как под другими учетными записями те же документы проводятся мгновенно. Локальная чистка кэша на клиентской машине или терминальном сервере в таких ситуациях часто не дает результатов. Разберем детально механизм возникновения этой неполадки и способы ее устранения.
Рассмотрим, что происходит в платформе 1С в момент проведения документа. Когда транзакция записи и проведения успешно завершается, платформа отправляет оповещение всем открытым динамическим спискам (спискам документов, журналов) о том, что данные изменились. В ответ на это оповещение форма списка инициирует автоматическое обновление отображаемых строк.
Если пользователь ранее установил в списке документов поиск в режиме по части строки (по подстроке), СУБД формирует SQL-запрос с конструкцией LIKE '%образец%'. Выделим основные технические факторы, приводящие к падению производительности:
%) исключает применение стандартных индексов СУБД. Серверу баз данных приходится выполнять полное сканирование таблицы (Table Scan или Clustered Index Scan). В базах с миллионами записей такой запрос требует колоссальных ресурсов дисковой подсистемы и процессора.Lock Waits).Простейшим и самым быстрым решением является отключение активного отбора непосредственно в интерфейсе пользователя:
Esc.Если открыть форму списка затруднительно из-за постоянных зависаний, сбросим пользовательские настройки административными средствами конфигурации (в конфигурациях на базе БСП):
Для гарантированного сброса некорректных фильтров и сохраненных состояний списков на уровне встроенного языка 1С воспользуемся методами работы с системными хранилищами. Напишем код для внешней обработки:
// Очистка сохраненных настроек динамических списков конкретного пользователя
ИмяПользователяДляОчистки = "ИвановИИ";
// 1. Очистка настроек динамических списков
ХранилищеПользовательскихНастроекДинамическихСписков.Удалить(
Неопределено,
Неопределено,
ИмяПользователяДляОчистки
);
// 2. Очистка системных настроек форм и интерфейса
ХранилищеСистемныхНастроек.Удалить(
Неопределено,
Неопределено,
ИмяПользователяДляОчистки
);
// 3. Очистка общих настроек
ХранилищеОбщихНастроек.Удалить(
Неопределено,
Неопределено,
ИмяПользователяДляОчистки
);
Сообщить("Настройки пользователя " + ИмяПользователяДляОчистки + " успешно очищены.");
Метод Удалить() с переданными параметрами Неопределено очищает все ключи объектов и настроек для указанного имени пользователя информационной базы, возвращая интерфейс к исходному состоянию.
Чтобы исключить подобные зависания в будущем, применим следующие системные и конфигурационные меры:
Read Committed Snapshot Isolation. Это исключает конфликты блокировок между операциями чтения динамических списков и транзакциями проведения документов.ОбновлениеИндексаППД, СлияниеИндексовППД). Полнотекстовый поиск по полям списка работает существенно быстрее, чем поиск по шаблону LIKE '%...%'.