С выходом релиза платформы 1С:Предприятие 8.3.26 разработчики получили в руки мощнейшие инструменты для глубокой оптимизации производительности систем. В этой статье мы подробно разберем, как работают новые механизмы настройки индексов, выясним, что такое «покрывающие» и «условные» индексы, и проанализируем долгожданную технологию вызова клиента с сервера. Эти изменения позволяют не просто ускорить запросы, но и в корне изменить подход к проектированию высоконагруженных систем.
Рассмотрим одну из самых значимых функций — возможность добавления дополнительных полей в индекс. В классической архитектуре 1С до версии 8.3.26 любой индекс состоял только из ключевых полей, по которым осуществляется поиск. Если ваш запрос выбирал поля, не входящие в этот индекс, СУБД приходилось выполнять операцию Key Lookup или Bookmark Lookup, то есть обращаться к основной таблице данных, чтобы «добрать» недостающую информацию. Это создавало лишнюю нагрузку на дисковую подсистему.
Теперь мы можем использовать механизм покрывающих индексов (в терминах SQL — INCLUDE). Проанализируем, как это работает по шагам:
Поставщик и Валюта), и добавляем в «Дополнительные поля» те данные, которые мы просто хотим прочитать (например, Склад).Склад. Обращения к таблице (Clustered Index) не происходит. Это называется Index-Only Scan.Выясним, в каких случаях это максимально эффективно. В первую очередь это Регистры бухгалтерии и тяжелые Регистры сведений. Если вы часто выбираете конкретный ресурс или реквизит по определенному набору измерений, добавление этого ресурса в «Дополнительные поля» индекса может ускорить выборку в десятки раз.
Разберем еще одно революционное новшество — условные индексы. Часто в огромных таблицах (например, миллионы записей в журнале документов) нам нужно быстро искать данные только по «актуальным» записям. Раньше индекс строился по всей таблице, занимая место и замедляя запись.
Проанализируем преимущества настройки фильтра в индексе:
Проведен = Истина. Записи по непроведенным документам просто не попадут в индексную таблицу.Ситуация, знакомая каждому внедренцу: в типовой конфигурации (например, 1С:ERP) не хватает индекса для специфического отчета. Раньше приходилось снимать объект с поддержки, что усложняло дальнейшие обновления. Рассмотрим, как 8.3.26 решает эту проблему.
Теперь мы можем добавлять и настраивать индексы напрямую в расширении. Это позволяет оптимизировать запросы в тиражных решениях, сохраняя «чистоту» основной конфигурации. Платформа самостоятельно сформирует команды CREATE INDEX на уровне СУБД при применении расширения.
Перейдем к технической части взаимодействия систем. Долгое время 1С работала по принципу «клиент всегда инициатор». Чтобы узнать, завершилось ли фоновое задание на сервере, нам приходилось использовать ПодключитьОбработчикОжидания, который каждые несколько секунд «дергал» сервер запросами.
В релизе 8.3.26 реализован полноценный вызов клиента с сервера. Посмотрим, как это устроено:
Для реализации этого механизма используется протокол WebSocket (для веб-клиента) и прямой TCP-канал для тонкого клиента. Теперь сервер может отправить уведомление конкретному пользователю или группе пользователей мгновенно.
Рассмотрим пример сценария использования:
ОповеститьКлиента().Проанализируем синтаксис (схематично), который становится доступен разработчику:
// Пример на стороне сервера в фоновом задании
Процедура ЗавершитьДлительнуюОперацию(Параметры) Экспорт
// Выполняем расчеты...
ДанныеОповещения = Новый Структура("Статус, Сообщение", "Успех", "Расчет завершен успешно");
ОповеститьКлиента("СобытиеЗавершенияРасчета", ДанныеОповещения, Параметры.ИдентификаторКлиента);
КонецПроцедуры
Для тех, кто использует PostgreSQL, версия 8.3.26 приносит значительные улучшения в работе с текстовым поиском. Рассмотрим использование оператора ПОДОБНО. Теперь платформа более эффективно задействует возможности индексов gin_trgm_ops, что делает поиск по подстроке в справочниках с миллионами записей практически мгновенным.
Также разберем работу с JSON. Современные учетные системы всё чаще хранят неструктурированные данные в полях типа «Строка неограниченной длины» в формате JSON. В новом релизе реализована поддержка функциональных индексов по полям JSON. Это означает, что СУБД может индексировать конкретное значение внутри JSON-строки, не десериализуя весь объект при каждом запросе.
Важно помнить предостережение, прозвучавшее в обсуждении: «балбесы индексов наколбасят». Большое количество индексов существенно замедляет операции записи (INSERT, UPDATE, DELETE), так как СУБД вынуждена обновлять каждое дерево индексов.
Проанализируем, как платформа помогает избежать ошибок:
Поле1 + Поле2 + Поле3, то отдельный индекс по Поле1 + Поле2 чаще всего будет избыточным.Подводя итог, разберем алгоритм действий для перехода на новые рельсы оптимизации:
Дополнительные поля индекса в 1С.Актуально = Истина), создайте условный индекс.ОповеститьКлиента(), чтобы снизить паразитную нагрузку на сервер и улучшить UX пользователей.Эти возможности делают 1С:Предприятие 8.3.26 одной из самых технологичных версий платформы, приближая инструменты разработчика 1С к возможностям профессиональных администраторов баз данных. Рассмотрим эти инструменты не как усложнение, а как способ вывести производительность ваших решений на принципиально новый уровень.