В процессе длительной эксплуатации информационных баз 1С многие сталкиваются с ситуацией, когда программа при входе зависает на десятки минут. При этом сама база имеет небольшой размер (менее одного гигабайта), тестирование и исправление (ТиИ) и утилита chdbfl.exe не выявляют физических повреждений, а после завершения запуска конфигурация работает с нормальной скоростью. Перенос базы на быстрый локальный SSD-диск или другой компьютер не дает ощутимого прироста скорости. Разберем по шагам, почему возникает такое поведение и как локализовать и устранить причину деградации запуска.
Когда база одинаково долго открывается локально и по сети, исключив влияние антивируса и сетевого окружения, необходимо проанализировать программный код, выполняемый при входе пользователя. В файловом режиме платформа 1С выполняет код клиентских обработчиков и серверных вызовов в едином потоке, последовательно обращаясь к таблицам файла 1cv8.1cd.
Выполним диагностику в конфигураторе следующим образом:
ПередНачаломРаботыСистемы или ПриНачалеРаботыСистемы.F5 и дождемся полной отрисовки пользовательского интерфейса.Как показывает практика, в подобных ситуациях практически 99% времени занимает не запуск движка платформы, а конкретный тяжелый запрос или цикл, отрабатывающий при инициализации форм начальной страницы (рабочего стола), списка текущих дел, задач или монитора руководителя.
Часто в конфигурациях (в том числе отраслевых решениях на базе «1С:Управление нашей фирмой») разработчики добавляют в стартовые формы динамические списки или выборки текущих задач. Пока база новая, запрос выполняется за доли секунды. Однако по прошествии нескольких лет накопление документов и движений в регистрах приводит к лавинообразному падению скорости. Выясним главные технические причины этого эффекта:
ИЛИ, подзапросов в условиях соединения файловый движок переходит к полному сканированию таблиц (Table Scan), блокируя процесс на десятки минут.ОсновнаяТаблица, платформа не может применить постраничную подгрузку (динамическое считывание). В результате при каждом открытии страницы на клиентскую машину считывается весь массив данных.Если пользователи не используют виджеты текущих дел, мониторы показателей или специализированные рабочие столы, проблему можно решить мгновенно без вмешательства в программный код и снятия конфигурации с поддержки:
Если замедление вызвано нетиповой доработкой (например, в отраслевых конфигурациях от сторонних разработчиков), найдем место формирования текста запроса в модуле формы начальной страницы или общем модуле заполнения рабочих столов. Проанализируем типичный фрагмент кода, объединяющий типовые задачи с тяжелой выборкой:
// Фрагмент формирования запроса задач начальной страницы
ТекстЗапроса = "ВЫБРАТЬ
| Задачи.Ссылка КАК Задача,
| Задачи.СрокИсполнения КАК Срок
|ИЗ
| Задача.ЗадачиПользователя КАК Задачи
|ГДЕ
| Задачи.Выполнена = ЛОЖЬ";
// Если отраслевой блок не требуется, исключаем его добавление:
// ТекстЗапроса = ТекстЗапроса + " ОБЪЕДИНИТЬ ВСЕ " + НетиповойТекстЗапросаРарус();
Закомментировав вызов тяжелой нетиповой части запроса, мы исключаем сканирование накопленных за годы таблиц, и база начинает открываться за несколько секунд.
Если отображение данных на начальной странице необходимо для бизнес-процесса компании, переработаем логику запроса. Рассмотрим правила оптимизации:
Запрос.Текст = "ВЫБРАТЬ
| Документы.Ссылка КАК Документ,
| Документы.Дата КАК Дата
|ИЗ
| Документ.ЗаказНаряд КАК Документы
|ГДЕ
| Документы.Дата >= &ГраницаПериода
| И Документы.Проведен = ИСТИНА";
Запрос.УстановитьПараметр("ГраницаПериода", НачалоМесяца(ТекущаяДатаСеанса()));
МенеджерВременныхТаблиц и обязательно используем конструкцию ИНДЕКСИРОВАТЬ ПО для полей связи. Это снизит нагрузку на файловый процессор базы данных.ГДЕ или в условиях соединения, имеют свойство Индексировать (или Индексирование с дополнительным упорядочиванием).ПодключитьОбработчикОжидания. Это позволит интерфейсу открыться мгновенно, а вспомогательные списки подгрузятся в фоновом режиме через несколько секунд после старта.Если запрос обращается к остаткам или оборотам регистров накопления, обязательно выполним пересчет итогов. Для этого перейдем в режим конфигуратора, откроем меню Администрирование — Тестирование и исправление..., отметим пункт Пересчет итогов и запустим обработку. В пользовательском режиме также проверим обработку «Управление итогами» и сдвинем период рассчитанных итогов на текущий месяц. Это избавит платформу от необходимости вычислять остатки от старых периодов.