При миграции баз данных 1С:Предприятие 7.7 с файлового режима (DBF) или устаревшего MS SQL Server 2000 на более современные версии (MS SQL Server 2008 / 2008 R2) многие разработчики сталкиваются с существенным падением производительности интерфейса. В частности, при навигации и скроллинге динамических списков (журналов документов, справочников), где применяется внешняя компонента FormEx для раскраски ячеек и строк, возникают сильнейшие задержки.
Разберем детально, почему одна и та же конфигурация на базе 1С 7.7 (например, «Торговля и Склад 9.2») с одной и той же версией FormEx работает быстро в файловом режиме (DBF), но начинает зависать на MS SQL Server 2008.
Проанализируем основные факторы, влияющие на скорость отрисовки:
Наиболее эффективный способ оптимизации отрисовки списков — использование механизма «План раскраски». Вместо того чтобы вызывать функцию раскраски отдельно для каждой ячейки каждой видимой строки, компонента считывает единый шаблон управляющих символов для всей строки целиком.
Рассмотрим пошагово, как перевести форму списка на план раскраски:
// Старый вариант вызова:
// Сервис.ВключитьРаскраскуТаблиц();
// Новый вариант вызова (включение плана раскраски):
Сервис.ИспользоватьПланРаскраски(1);
FormEx_ПланРаскраски.Выясним, какие методы компоненты FormEx позволяют снизить избыточную нагрузку при перемещении курсора по таблице.
Во-первых, вызовем метод отключения повторного фонового обновления таблицы при смещении курсора:
Сервис.ОтключитьОбновлениеПриРаскраске(1);
Во-вторых, проверим настройки компоненты на предмет отслеживания мыши. Если отслеживание положения мыши над ячейками не требуется, его следует отключить, чтобы предотвратить лишние фоновые события перерисовки.
Проанализируем сам код функции 1С, вычисляющей цвета строк и ячеек. Главное правило: внутри функции раскраски категорически запрещено выполнять тяжелые обращения к базе данных.
Недопустимо внутри функции раскраски:
ТекущийДокумент.Контрагент.ОсновнойДоговор.Цены).СоздатьОбъект("Справочник.Контрагенты")) и выполнять выборки.Посмотрим на пример организации кэширования цветов:
// Предварительно при открытии формы или при смене фильтра
// формируем СписокЗначений или ТаблицуЗначений с готовыми цветам строк.
Функция ПолучитьЦветСтроки()
// Минимальная логика: только считывание из заранее подготовленного кэша
ИдентификаторСтроки = ТекущийДокумент;
ЦветСтроки = мКэшЦветов.Получить(ИдентификаторСтроки);
Если ЦветСтроки = ПолучитьПустоеЗначение() Тогда
Возврат "";
КонецЕсли;
Возврат ЦветСтроки;
КонецФункции
Если штатными журналами и справочниками 1С 7.7 в SQL-режиме добиться высокой скорости не удается, альтернативным решением является переход на элемент управления Табличное поле из библиотеки 1С++.
При таком подходе выборка данных выполняется через прямые SQL-запросы к базе данных, а раскраска строк и ячеек осуществляется встроенными средствами самого «Табличного поля» без накладных расходов на вызов функций 1С платформы при отрисовке.
При переходе на MS SQL Server 2008 необходимо также провести регламентные процедуры на стороне СУБД:
sp_updatestats.