0
Отвечен

Почему Excel-вские процессы, запущенные из КЗ не всегда выгружается из памяти?

Игорь Шалдин 2 года назад в Прочее обновлен Вячеслав Шинкарев (менеджер разработки) 2 года назад 6

Здравствуйте.

Давно заметил, что после формирования печатных форм в КЗ, в памяти "зависают" Excel-евские процессы. Наконец-то дошли руки задать этот вопрос. 

Пример. Сегодня делал клиенту Excel-евскую форму справки. В процессе неоднократно выводил её на печать. После этого в диспетчере задач такая картинка (все окна Excel при этом закрыты):

Image 6344

Работаю через RDP на нашем сервере. Как я понимаю, он достаточно мощный и проблем не возникает. А у пользователей на "слабых" компах в какой-то момент при попытке сформировать очередную форму КЗ просто вылетает.

С чем такое поведение Excel м.б. связано?


На рассмотрении

Добрый день.

Сегодня делал клиенту Excel-евскую форму справки

Видимо не доделали..

Поставочные формы выгружают excel

В процессе печати сообщений с ошибками не было?

Выложите свой скрипт..

Как уже было сказано. 
1) либо форма написана без завершения работы Excel и без показа ее на экране пользователю. Кажется это маловероятно.
2) либо при печати эксель происходит ошибка, которую форма печати (скрипт) не ловит и как следствие не завершает работу эксель с показом результата пользователю.

Чтобы не допускать этого, блок, начиная с tCreateXlsObjects и tOpenXlsObjects, заключается в try после которого следует catch, в котором делается завершение Excel с показом пользователю.

При отладке в процессе печати сообщения об ошибках были. Видимо именно эти процессы остались висеть.

Теперь ошибок нет. Почистил Excel-евские процессы, попробовал печатать - всё выгружается.

Ранее делал скрипт print_chib.s. На нем у клиента КЗ периодически вылетает.

+1
При отладке в процессе печати сообщения об ошибках были

Этот код должен был сделать процесс Excel видимым, если код был с самого начала...

  catch(...)
{
xls.Visible = true;
throw;
}


На нем у клиента КЗ периодически вылетает.

1)Поменьше пользуйтесь глобальными переменными

2)Проверьте, что у вас во всех массивах char хватает длины под хранение строки..

3)Попробуйте распечатать в режиме отладки.. (ctrl+alt+shift+f1)

Советую вам перейти на работу с функциями "обертками" - они более удобны + печать будет работать и для Excel и для OpenOffice/

Доступные функции перечислены в \Script\ofis_com.S

Пример использования:

Было:

SetupExcel()
{
  xls = CreateObject("Excel.Application");
//  GetCurrentDirectory(len,Dir);
  GetCommonZPL(Dir,len);
  nm = "tablbank\\CHIBSUM.xls";
  WorkDir = Dir + "\\";
  xls.Caption = OemToAnsi("Реестр");
  xls.Workbooks.Add(WorkDir+nm);
  wb = xls.Workbooks(1);
  wsh = wb.Worksheets.Item(1);

  return 0;
}

Стало:

SetupExcel()
{ char Dir[256]; GetCommonZPL(Dir,255); string nm =Dir+"\\tablbank\\CHIBSUM.xls";
tPrepereOfficeForWork();
tOpenXlsObjects(nm ,OemToAnsi("Реестр"));
tGetWshByIndex(1);
tWshSelect();
}

Было:

WriteToCell("BB61",ItogWsh);

Стало:

tWriteStringToCell("BB61",ItogWsh);

Было:

  wsh.Cells(1,1).Select();
cwsh = wb.Worksheets.Count();
wb.Worksheets.Item(cwsh).Visible = false;
wb.Worksheets.Item(1).Select();
wb.Worksheets.Item(1).Range("A1").Select();
xls.Visible = true;

Стало:

cwsh=tGetWshCount();
tGetWshByIndex(cwsh);
tWshVisible(false);
tGetWshByIndex(1);
tWshCellSelect(1,1);
tEndXlsWork(1);

Сервис поддержки клиентов работает на платформе UserEcho