Имя: Пароль:
1C
1С v8
1С+OpenOffice. Ускорение записи в ячейку
0 IdoL2k
 
07.11.17
15:24
Есть обработка, которая заполняет шаблон в виде табличного документа определенными данными. Запись данных в ячейку выполняется с помощью методов SetString() и SetValue().

Document = Desktop.LoadComponentFromURL(УРЛ, "_blank", 0, Args);
Sheets = Document.getSheets();
Sheet = Sheets.getByIndex(0);
Для ш=1 из ТаблицаРезультата.Колонки Цикл
    Cell = Sheet.getCellByPosition(ш,0);
    Cell.setString("Колонка "+ш);
КонецЦикла;

В пустом шаблоне обработка работает достаточно быстро. Но если шаблон представляет из себя книгу, в которой имеются достаточно "тяжелые" листы, то выполнение метода SetString() начинает отнимать много времени и обработка начинает адово тормозить. Такое ощущение, что при заполнении значения выполняется пересчет значений в других ячейках, несмотря на то, что они не связаны с заполняемыми.
Пробовал отключить в настройках офиса автообновление данных - Сервис / Содержимое ячейки / Вычислять автоматически - ускорения нет.
Попробовал добавить отключение автообновления перед заполнением шаблона:

Document.lockControllers();
Document.addActionLock();
Document.enableAutomaticCalculation(False);

...заполнение шаблона...

Document.enableAutomaticCalculation(True);
Document.calculateAll();
Document.removeActionLock();
Document.unlockControllers();

Результат нулевой. Как еще можно оптимизировать заполнение ячеек в табличном документе? Или избежать тормозов при заполнении сложных документов можно только при использовании "пакетной" записи с помощью COMSafeArray?
1 mingw
 
07.11.17
15:31
Внутри "args" есть "'Hidden', not Visible"?
2 IdoL2k
 
07.11.17
15:33
(1) Инициализация документа выгляждит следующим образом

    Попытка
        ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
    Исключение
        Предупреждение(ОписаниеОшибки() + Символы.ПС + "программа OpenOffice не установлена на данном компьютере!");
        Возврат;
    КонецПопытки;
    Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
    Свойства = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
    Свойства.Name = "AsTemplate";
    Свойства.Value = Истина;
    Args = Новый COMSafeArray("VT_VARIANT", 3);
    Args.SetValue(0, Свойства);
    Свойства1 = ServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
    Свойства1.Name = "Hidden";
    Свойства1.Value = Истина;
    Args.SetValue(1, Свойства1);
    УРЛ = ПривестиФайлКУРЛ(ShablonOO);
    Document = Desktop.LoadComponentFromURL(УРЛ, "_blank", 0, Args);
3 IdoL2k
 
07.11.17
15:34
(1) Значение свойства Hidden - Истина
4 mingw
 
07.11.17
15:41
(3) Да понял

Выкинуть ActiveX|COM (писать сразу xlsx/ods чем другим) или комп шустрее
5 IdoL2k
 
07.11.17
15:45
(4) Какие есть альтернативные методы записи в ods? Где то можно пример глянуть?
6 vvp91
 
07.11.17
16:00
(5) ТабличныйДокумент.Записать("МойФайл.ods", ТипФайлаТабличногоДокумента.ODS);
7 IdoL2k
 
07.11.17
16:36
(6) просто сформировать табличный документ в 1С - не вариант. Шаблон представляет из себя достаточно сложную книгу с нарядными листами, формулами, расчетами.
Решением задачи по ускорению я вижу отключение расчетов при каждом изменении ячейки, выполнение расчетов только после заполнения всех ячеек.
Хотя, возможно, я ошибаюсь и долгая запись данных в ячейку связана с чем то другим, а не с пересчетом всей книги...
8 mingw
 
07.11.17
16:38
(7) Шаблон = формулы?
Загрузить/прочитать в 1С - выполнить формулы в 1С - записать готовое.

Убери Ёкселя из уравнения - легче жить!
9 Сияющий в темноте
 
07.11.17
20:34
если сложная книга с картинками,то учиться работать с пдф,так как опен немного странноват для этого
Независимо от того, куда вы едете — это в гору и против ветра!