Почему загрузка Excel на «боевой» базе работает медленнее, чем в копии, и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Часто программисты 1С сталкиваются с ситуацией, когда идентичный код в копии базы и на «боевом» сервере показывает кардинально разную производительность. В нашей задаче рассмотрим случай, когда чтение файла Excel объемом 28 тысяч строк на сервере занимает критически долгое время. Разберем по шагам, как выявить причину и оптимизировать работу системы.

Шаг 1: Локализация проблемы с помощью замера производительности

Прежде чем менять код, необходимо понять, где именно «застревает» процесс. Многие ошибочно полагают, что проблема кроется в передаче данных или медленном соединении. Чтобы исключить догадки, используем инструмент Замер производительности.

  1. Откройте Конфигуратор на сервере.
  2. Запустите режим отладки для нужного сеанса.
  3. Запустите замер производительности до начала операции и остановите его сразу после завершения.
  4. Проанализируйте отчет: если основное время уходит на метод ТабличныйДокумент.Прочитать(), значит, проблема в ресурсах сервера или блокировках файловой системы.

Шаг 2: Перенос логики в серверный вызов без контекста

Одной из частых причин тормозов является избыточная передача данных формы. Когда мы вызываем процедуру НаСервере, платформа автоматически сериализует и передает на сервер все данные текущей формы, что при большом объеме переменных создает лишнюю нагрузку. Оптимизируем этот процесс, используя вызов НаСервереБезКонтекста.

Посмотрим на пример правильной организации функции:


&НаСервереБезКонтекста
Функция EXCELВТаблицуЗначенийБП666(ЗНАЧ ДвоичныеДанные, Расширение)  
    ФайлEXCELНаСервере = ПолучитьИмяВременногоФайла(Расширение);
    ДвоичныеДанные.Записать(ФайлEXCELНаСервере);    
    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.Прочитать(ФайлEXCELНаСервере);
    // Обработка данных
    Возврат ТаблицаДанных;
КонецФункции

Использование ЗНАЧ при передаче двоичных данных позволяет избежать передачи ссылок на объекты, которые не нужны для выполнения серверной функции.

Шаг 3: Оптимизация работы с временным хранилищем

Для работы с файлами на сервере рекомендуется использовать механизм ВременноеХранилище. Вместо передачи больших объемов данных напрямую между клиентом и сервером, поместите файл во временное хранилище на клиенте, а на сервере получите его по адресу.

Это позволит платформе самостоятельно управлять потоками данных, что значительно быстрее, чем передача через параметры процедур.

Шаг 4: Анализ внешних факторов и ресурсов сервера

Если код оптимизирован, но «боевая» база все равно работает медленно, обратим внимание на среду выполнения:

Шаг 5: Проверка чистоты эксперимента

Очень важно убедиться, что вы работаете в одинаковых условиях. Мы рекомендуем создать нового пользователя с полными правами в боевой базе и проверить выполнение обработки под ним. Это позволит исключить влияние личных настроек, прав доступа и истории кэша конкретного пользователя.

Также сравните настройки СУБД (SQL Server). В боевой базе статистика по таблицам может быть устаревшей, что замедляет работу ПостроительЗапроса. Выполните обновление статистики и проверьте план выполнения запросов, если чтение данных идет из базы данных, а не только из файла.

Подведем итог: для решения проблемы медленного перехода между процедурами в первую очередь устраните «тяжелые» вызовы с контекстом, перенесите работу с файлами в фоновые или серверные методы без контекста и обязательно исключите влияние внешних процессов (антивирусов и регламентных заданий) на диск сервера.

← На главную