Продолжение темы
Новые счет-фактура и его друзья - Постановление от 26 декабря 2011 г. N 1137
Цитата:
Сообщение от
Logger
Можно подробнее ?
Не понял вашу мысль.
Насчет ComDispFunction - я уже писал, что с помощью этого класса вызовы методов COM-классов происходят без ошибок. По-моему, при этом применяется раннее связывание
Насчет ООП - вспоните, что класс Com в аксапте это точно такой же класс, как и любой другой и что от него можно создавать наследников.
Так же вспоните, что у этого класса есть замечательный метод attach(), позволяющий подключить к созданному экземпляру класса уже существующий COM-класс
Еще вспомните про то, что можно перекрывать методы и создавать в них собственный код.
В общем, идея была такая - необходимо создать иерархию классов, наследующих от класса Com и соотвествующую иерархии вызываемых COM-объектов.
В метод new() классов иерархии передавать ссылку на созданный COM-объект и с помощью вызова метода attach() создавать привязку
Перекрыть вызываемые методы COM-объекта. Внутри этих методов делать вызов с помощью класса ComDispFunction
Если вызываемый метод возвращает ссылку на другой COM-объект, то возвращать ссылку на экземпляра класса иерархии, в вызов new() которого передавать COM-объект
В результате, для корректной работы, требется изменить вызов первоначального создания COM-объекта в Аксапте на создание соответствующей класса из иерархии с передачей в него COM-объекта
Для Excel это будет выглядеть примерно так
X++:
COM excel;
;
excel = new DEV_ExcelApplication(new Com('Excel.Application'));
И отследить прямое создание COM-объектов в коде. Такие как, например, в методе SysExcelCells.Item()
X++:
public SysExcelCell item(int _row, int _column)
{
return SysExcelCell::construct(version,cells.item(_row,_column));
// return SysExcelCell::construct(version,COM::createFromVariant(cells.item(_row,_column)));
}
Если не перекрывать какие-либо методы из вызываемого COM-объекта, то ничего страшного не случится. При вызове будет ипользоваться позднее связывание - с ненулевой вероятностью напороться на ошибку при вызове
Ну и в качестве иллюстрации - во вложении пример иерарихии из нескольких классов, реализующий вышеизложенный подход для Excel (в чисто иллюстративных целях
).
Замечу, что с помощью подобной иерархии и небольших изменения в классе COMExcelDocument_RU делается выгрузка в Excel на терминальном сервере под 2008R2, на котором тусуется под сотню пользователей, а загрузка процессоров редко опускается ниже 70%, а зачастую составляет все сто
Кстати, ко всему прочему, вызовы методов еще и быстрее выполняются