1С+Excelпроблема с выводом большого отчета
Автор dmatsynin, 04.01.2005, 13:50
#1
Отправлено 04.01.2005, 13:50:00
Проблема - открыт эксель создается новая workbooks, в нее начинается вывод. Если пользователь ткнет мышкой в другой эксель.... то вывод начинается туда...
Если скрывать Excel.Visible = "false" оно конечно все нормально будет, но тетки пугаются, что их Эксели вдруг пропадают.
как бороться?
Если скрывать Excel.Visible = "false" оно конечно все нормально будет, но тетки пугаются, что их Эксели вдруг пропадают.
как бороться?
#7
Отправлено 20.01.2005, 18:21:41
Ну попробовал я указывать шит! Теперь спокойно могу тыкать на разные окна экселя - вывод не остановится. Пока не ткнеш на любой другой шит - все, приехали!После небольшой онлайновой беседы с dmatsynin стало примерно понятно, что у него за проблема. Он делает вывод инфы через Олю и не делает уточнения, в какой именно шит какой книги! Поэтому вывод происходит просто в текущий открытый шит.
#9
Отправлено 25.01.2005, 14:26:19
Сделай таким образом: после создания объекта (Эхель), добавления новой книги ".Visible = 0". Выгружай данные.
Как выгрузил (до момента уничтожения объекта) ".Visible = 1". Все путем, ткнуть на другой "Щит" нет возможности (Ексель еще не виден).
По эксперементировал сам: выгружал справочник товаров (наименование) 9200 элементов. По времени: чуть больше 2 минут. При этом паралленьно открыл Эксель (новую книгу) изгалялся в ней.
Окно 1С-овой книги из менюхи не видно (пока обработка идет). Появится оно только после окончания работы обработки. Напортачить не возможно.
Единственное неудобство - если до запуска обработки работать в экселе - после запуска оно скрывается с таск бара до окончания работы обработки (из-за ".Visible = 0"). Предполагаю что у юзера будет паника
Обойти это методами экселя (так как ты хочешь) не получится. Перерыл методы и свойства приложения, книги, окна - ничего подходящего не нашел.
Максимум что можно сделать - принудительно перед записью в ячейку активируй нужный лист нужной книги. Я поигрался, но криво это все:
1. Скорость вывода замедляется (прорисовка, фокус, Авто-сохранение)
2. Между выполнениями процедур активации и записи в ячейку пауза большая. Т.е. тыкаясь между книгами можно поймать момент и вывод перенаправится, либо валится обработка (в попытке писал в ячейку)...
ЗЫ: Сделай ч\з видимость, дрессируй юзеров.
Как выгрузил (до момента уничтожения объекта) ".Visible = 1". Все путем, ткнуть на другой "Щит" нет возможности (Ексель еще не виден).
По эксперементировал сам: выгружал справочник товаров (наименование) 9200 элементов. По времени: чуть больше 2 минут. При этом паралленьно открыл Эксель (новую книгу) изгалялся в ней.
Окно 1С-овой книги из менюхи не видно (пока обработка идет). Появится оно только после окончания работы обработки. Напортачить не возможно.
Единственное неудобство - если до запуска обработки работать в экселе - после запуска оно скрывается с таск бара до окончания работы обработки (из-за ".Visible = 0"). Предполагаю что у юзера будет паника
Обойти это методами экселя (так как ты хочешь) не получится. Перерыл методы и свойства приложения, книги, окна - ничего подходящего не нашел.
Максимум что можно сделать - принудительно перед записью в ячейку активируй нужный лист нужной книги. Я поигрался, но криво это все:
1. Скорость вывода замедляется (прорисовка, фокус, Авто-сохранение)
2. Между выполнениями процедур активации и записи в ячейку пауза большая. Т.е. тыкаясь между книгами можно поймать момент и вывод перенаправится, либо валится обработка (в попытке писал в ячейку)...
ЗЫ: Сделай ч\з видимость, дрессируй юзеров.
Сообщение отредактировал Fobos: 25.01.2005, 15:22:55
#10
Отправлено 27.01.2005, 17:42:33
Всем спасибо. Все решилось другим способом, спасибо конференции Т1С!
Пример правильно работающего кода:
Процедура Сформировать()
Эксель = СоздатьОбъект("Excel.Application");
РабочиеКниги = Эксель.workbooks;
РабочаяКнига = РабочиеКниги.Add();
РабочаяКнига.Title = "Лажа";
РабочаяКнига.Subject = "Sales";
Лист = РабочаяКнига.WorkSheets.Add();
Лист.Name = "Отчет"+ТекущаяДата();
НомерСтроки = 0;
НомерСтолбца = 0;
Эксель.Visible = 1;
Сообщить(ТекущаяДата());
Для НомерСтроки=1 По 50 Цикл
Для НомерСтолбца=1 По 20 Цикл
флаг = 1;
Пока флаг=1 Цикл
Попытка
Лист.Cells(НомерСтроки,НомерСтолбца).Value = "Нстр "+НомерСтроки+" Нстл "+НомерСтолбца;
флаг=0;
Исключение
КонецПопытки;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Пример правильно работающего кода:
Процедура Сформировать()
Эксель = СоздатьОбъект("Excel.Application");
РабочиеКниги = Эксель.workbooks;
РабочаяКнига = РабочиеКниги.Add();
РабочаяКнига.Title = "Лажа";
РабочаяКнига.Subject = "Sales";
Лист = РабочаяКнига.WorkSheets.Add();
Лист.Name = "Отчет"+ТекущаяДата();
НомерСтроки = 0;
НомерСтолбца = 0;
Эксель.Visible = 1;
Сообщить(ТекущаяДата());
Для НомерСтроки=1 По 50 Цикл
Для НомерСтолбца=1 По 20 Цикл
флаг = 1;
Пока флаг=1 Цикл
Попытка
Лист.Cells(НомерСтроки,НомерСтолбца).Value = "Нстр "+НомерСтроки+" Нстл "+НомерСтолбца;
флаг=0;
Исключение
КонецПопытки;
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Количество пользователей, читающих эту тему: 1
пользователей: 0, неизвестных прохожих: 1, скрытых пользователей: 0