Часто программисты 1С сталкиваются с ситуацией, когда идентичный код в копии базы и на «боевом» сервере показывает кардинально разную производительность. В нашей задаче рассмотрим случай, когда чтение файла Excel объемом 28 тысяч строк на сервере занимает критически долгое время. Разберем по шагам, как выявить причину и оптимизировать работу системы.
Прежде чем менять код, необходимо понять, где именно «застревает» процесс. Многие ошибочно полагают, что проблема кроется в передаче данных или медленном соединении. Чтобы исключить догадки, используем инструмент Замер производительности.
ТабличныйДокумент.Прочитать(), значит, проблема в ресурсах сервера или блокировках файловой системы.Одной из частых причин тормозов является избыточная передача данных формы. Когда мы вызываем процедуру НаСервере, платформа автоматически сериализует и передает на сервер все данные текущей формы, что при большом объеме переменных создает лишнюю нагрузку. Оптимизируем этот процесс, используя вызов НаСервереБезКонтекста.
Посмотрим на пример правильной организации функции:
&НаСервереБезКонтекста
Функция EXCELВТаблицуЗначенийБП666(ЗНАЧ ДвоичныеДанные, Расширение)
ФайлEXCELНаСервере = ПолучитьИмяВременногоФайла(Расширение);
ДвоичныеДанные.Записать(ФайлEXCELНаСервере);
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать(ФайлEXCELНаСервере);
// Обработка данных
Возврат ТаблицаДанных;
КонецФункции
Использование ЗНАЧ при передаче двоичных данных позволяет избежать передачи ссылок на объекты, которые не нужны для выполнения серверной функции.
Для работы с файлами на сервере рекомендуется использовать механизм ВременноеХранилище. Вместо передачи больших объемов данных напрямую между клиентом и сервером, поместите файл во временное хранилище на клиенте, а на сервере получите его по адресу.
Это позволит платформе самостоятельно управлять потоками данных, что значительно быстрее, чем передача через параметры процедур.
Если код оптимизирован, но «боевая» база все равно работает медленно, обратим внимание на среду выполнения:
Excel может ожидать своей очереди.srvinfo) может быть необходимым шагом при странном поведении базы.ТабличныйДокумент, особенно если данные читаются в контексте текущего пользователя с активным RLS.Очень важно убедиться, что вы работаете в одинаковых условиях. Мы рекомендуем создать нового пользователя с полными правами в боевой базе и проверить выполнение обработки под ним. Это позволит исключить влияние личных настроек, прав доступа и истории кэша конкретного пользователя.
Также сравните настройки СУБД (SQL Server). В боевой базе статистика по таблицам может быть устаревшей, что замедляет работу ПостроительЗапроса. Выполните обновление статистики и проверьте план выполнения запросов, если чтение данных идет из базы данных, а не только из файла.
Подведем итог: для решения проблемы медленного перехода между процедурами в первую очередь устраните «тяжелые» вызовы с контекстом, перенесите работу с файлами в фоновые или серверные методы без контекста и обязательно исключите влияние внешних процессов (антивирусов и регламентных заданий) на диск сервера.