Разработчики и администраторы крупных баз данных на платформе 1С:Предприятие 8.3 часто сталкиваются с ситуацией, когда стандартная форма подбора номенклатуры в документе начинает сильно «тормозить» при открытии. Время ожидания может составлять от 15 до 50 секунд даже при относительно небольшом объеме справочника (например, около 40 000 позиций без характеристик). При этом замер производительности показывает, что основное время уходит на метод ОткрытьФорму, а загрузка процессора сервера приложений и СУБД остается минимальной (5–10%).
Особенно загадочно выглядит ситуация, когда под одной учетной записью (например, с полными правами) форма подбора открывается за 2–4 секунды, а под рабочим пользователем процесс зависает почти на минуту. В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем технические нюансы работы динамических списков в управляемых формах и рассмотрим пошаговые инструкции по устранению задержек.
Для начала нам необходимо локализовать, где именно происходит задержка: на стороне сервера СУБД (выполнение SQL-запроса) или на стороне сервера приложений 1С (сериализация данных, передача контекста, обработка на клиенте). Для этого выполним несколько последовательных шагов. Для раздельного анализа этих этапов можно использовать отчет для замера времени выборки, передачи и вывода данных в УТ 11.
Воспользуемся встроенным инструментом платформы — Замером производительности. Если замер показывает, что строка с вызовом ОткрытьФорму занимает более 80% времени, а серверный вызов ПриСозданииНаСервере отрабатывает относительно быстро, это верный признак того, что задержка происходит на этапе компоновки и выполнения запросов динамических списков при выводе данных на экран.
Для точной диагностики снимем трассировку запросов на стороне SQL-сервера с помощью утилиты SQL Server Profiler (или механизма Extended Events). Нам необходимо зафиксировать запросы, которые отправляет платформа 1С при открытии формы подбора. Проанализируем показатели Duration (время выполнения) и Reads (количество чтений с диска/из памяти):
rphost. Старые процессоры с низкой тактовой частотой (например, архивные линейки Intel Xeon с частотой около 2.5–3.0 GHz старых поколений) физически не могут быстро переварить сложную структуру управляемой формы с несколькими динамическими списками.Это классическая причина колоссальной разницы в скорости работы под разными пользователями. В конфигурации «1С:Управление торговлей 11» активно используется механизм RLS (Row Level Security) для разграничения доступа к складам, контрагентам, организациям или группам номенклатуры.
Когда форму подбора открывает пользователь с полными правами, платформа генерирует «чистый» SQL-запрос к таблицам остатков и цен. Но когда форму открывает пользователь с ограниченными правами, платформа 1С на лету модифицирует исходный запрос динамического списка, внедряя в него тяжелые подзапросы со множеством соединений для проверки прав доступа.
В результате СУБД строит совершенно другой план запроса, который может приводить к полному сканированию таблиц (Index Scan или Table Scan) вместо использования эффективных индексов. Время выполнения запроса вырастает в десятки раз.
Для решения этой проблемы выполним следующие действия:
Платформа 1С сохраняет настройки списков (сортировки, группировки, отборы) отдельно для каждого пользователя. Очень часто пользователи неосознанно перенастраивают форму подбора «под себя», что приводит к критическому падению производительности.
Типичный пример: пользователь случайно кликнул по шапке колонки «Доступно», «Остаток» или «Цена», чтобы отсортировать товары. В форме подбора УТ 11 эти поля являются расчетными (виртуальными). Для вывода списка с такой сортировкой СУБД вынуждена рассчитать остатки и цены абсолютно по всем 40 000 позициям номенклатуры, отсортировать этот гигантский массив в оперативной памяти и только потом вернуть первые 30 строк на экран. В то же время у другого пользователя, у которого сортировка установлена по умолчанию (по коду или наименованию), СУБД мгновенно выдает первые строки благодаря индексам.
Для исправления этой ситуации выполним сброс настроек по шагам:
Форма подбора в УТ 11 не открывается «сама по себе» — она жестко привязана к контексту документа, из которого была вызвана. При инициализации формы в ее динамические списки передаются параметры: склад, соглашение, организация, валюта, дата документа.
Разберем, как эти параметры влияют на скорость работы:
Проанализируем документы, из которых пользователи вызывают подбор. Сравним параметры в документе у «быстрого» и «медленного» пользователей. Если они отличаются, протестируем открытие подбора из абсолютно идентичных документов с одинаковыми реквизитами шапки.
Иногда СУБД MS SQL Server некорректно кэширует планы выполнения для параметризованных запросов, генерируемых платформой 1С. Это явление называется Parameter Sniffing. При первом вызове динамического списка (например, под администратором с определенным набором параметров) SQL Server строит план, оптимизированный под эти конкретные параметры. В дальнейшем, когда обычный пользователь с другими параметрами открывает ту же форму, SQL Server пытается применить старый закэшированный план, который оказывается крайне неэффективным.
Для исправления этой ситуации выполним профилактическое обслуживание базы данных на уровне СУБД:
USE [Имя_Вашей_Базы_Данных];
EXEC sp_updatestats;
USE [Имя_Вашей_Базы_Данных];
DBCC FREEPROCCACHE;
FULLSCAN для критически важных таблиц регистров остатков и цен).Если все вышеперечисленные административные меры не принесли желаемого результата, а переходить на более мощное серверное оборудование (с высокой частотой процессора на одно ядро, например от 4.0 GHz) нет возможности, придется прибегнуть к оптимизации самого механизма подбора.
В типовой УТ 11 форма подбора содержит до 5 динамических списков, которые инициализируются и отправляют запросы одновременно при открытии формы. Мы можем пойти по пути разумного упрощения формы подбора через механизм расширений конфигурации (без изменения основной конфигурации, чтобы сохранить ее на поддержке):
ДинамическоеСчитываниеДанных в значение Истина и ограничим количество выбираемых записей на одну страницу (свойство ПорцияПриЗапросе). Это позволит СУБД отдавать данные небольшими порциями, существенно снижая время ожидания первой порции данных на клиенте.Применяя данные методики комплексно — от анализа технологического журнала и SQL-трассировки до сброса пользовательских настроек и оптимизации планов СУБД — мы сможем гарантированно вернуть скорость открытия формы подбора номенклатуры к комфортным 1–3 секундам, обеспечив стабильную и быструю работу пользователей в системе. Для регулярного выполнения профилактических работ, включая архивирование и тестирование баз по расписанию, можно использовать инструмент для автоматизации обслуживания 1С.