При работе в терминальном сервере (RDP) на базе Windows Server пользователи часто сталкиваются с ситуацией, когда внешняя обработка или отчет в 1С 7.7 выполняется значительно дольше, чем при локальном запуске. На первый взгляд может казаться, что проблема кроется в настройках RDP-клиента или операционной системы на клиентской машине. Однако детальный анализ показывает, что разница в скорости выполнения операций чаще всего связана с особенностями работы с внешними COM-объектами, такими как MS Excel.
Разберем по шагам, как локализовать узкое место с помощью встроенных инструментов 1С 7.7, проанализируем физические причины замедления и рассмотрим проверенные способы ускорения выгрузки данных.
Прежде чем менять настройки сервера или переписывать код, необходимо измерить точное время выполнения каждого участка обработки. В платформе 1С 7.7 для этого предусмотрен специальный режим работы.
Выполним диагностику алгоритма:
Проанализируем полученный отчет замера: если более 80–90% времени выполнения уходит на строки взаимодействия с OLE-объектом Excel.Application (заполнение ячеек, форматирование, создание листов), значит, причина задержки лежит именно во взаимодействии 1С с процессом Excel через COM-интерфейс.
Выясним, почему поочередное заполнение ячеек Excel из 1С 7.7 тормозит в терминальной сессии:
Эксель.Cells(Стр, Кол).Value = Значение — это отдельный синхронный запрос к внешнему процессу EXCEL.EXE. Если ячеек тысячи, платформа совершает тысячи межпроцессных обращений.EXCEL.EXE, потребляющие ресурсы памяти и CPU.Если отказаться от использования COM-объекта Excel невозможно, существенно ускорить работу обработки поможет отключение визуальных и вычислительных функций Excel на время заполнения таблицы.
Рассмотрим пример правильной настройки объекта Excel перед началом выгрузки данных:
// Создаем OLE-объект
Попытка
Эксель = СоздатьОбъект("Excel.Application");
Исключение
Предупреждение("Не удалось создать объект MS Excel!");
Возврат;
КонецПопытки;
// Отключаем обновление экрана и автоматический пересчет формул
Эксель.Visible = 0;
Эксель.ScreenUpdating = 0;
Эксель.DisplayAlerts = 0;
Эксель.Calculation = -4135; // xlCalculationManual (-4135)
// Открываем или создаем рабочую книгу
Книга = Эксель.Workbooks.Open("D:\Templates\Blank.xls");
Лист = Книга.Worksheets(1);
// Выполняем заполнение ячеек в цикле...
// ...
// Возвращаем настройки в исходное состояние
Эксель.Calculation = -4105; // xlCalculationAutomatic (-4105)
Эксель.ScreenUpdating = 1;
// Сохраняем и корректно завершаем работу
Книга.SaveAs("D:\Reports\Result.xls");
Книга.Close(0);
Эксель.Quit();
// Освобождаем переменную
Эксель = ПолучитьПустоеЗначение();
Важно: Вызовы ScreenUpdating = 0 и Calculation = -4135 способны сократить время формирования печатной формы в 3–5 раз, так как Excel прекращает перерисовку графики и расчет формул до полного завершения передачи данных.
Для кардинального решения проблемы скорости рекомендуется полностью отказаться от поочередного заполнения ячеек через OLE-автоматизацию. Рассмотрим более эффективные подходы.
Наиболее простой и быстрый метод — сформировать документ через стандартную печатную форму 1С 7.7 (объект Таблица) и затем сохранить ее в формате Excel.
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Макет");
// Заполняем секции макета
Пока Выборка.ПолучитьЭлемент() = 1 Цикл
Таб.ВывестиСекцию("Строка");
КонецЦикла;
// Сохраняем в файл Excel напрямую
Таб.Записать("D:\Reports\Result.xls", "XLS");
Обратите внимание: чтобы строки в итоговом файле Excel не съезжали и именовались корректно, в макете печатной формы 1С рекомендуется задавать фиксированную высоту строк и избегать пересечения объединений ячеек.
Для создания сложных отчетов Excel с точным форматированием, границами и цветам без использования самого MS Excel применяется бесплатная внешняя компонента Yoksel (Ёксель).
Преимущества использования Yoksel:
.xls непосредственно в оперативной памяти платформы.Для исключения задержек со стороны операционной системы Windows Server проверим следующие настройки серверной среды:
EXCEL.EXE от завершенных пользователей.Подводя итог: если обработка в 1С 7.7 долго формирует файл Excel в RDP, следует оценить время работы кода через отладчик, отключить обновление экрана OLE-объекта ScreenUpdating = 0 и предусмотреть обязательное закрытие книги методом Quit(), либо перевести формирование отчетов на использование штатной таблицы 1С или внешних компонент типа Yoksel.