|
|
|
Проблема при выводе из 1С в Excel | ☑ | ||
|---|---|---|---|---|
|
0
mixqn
17.11.08
✎
16:09
|
Добрый день!
Предыстория: необходимо было сделать так, чтобы из 1С формировался отчет Excel на нескольких листах с сохранением форматирования (главным образом, группировок) табличного документа. Стандартный метод Записать табличного документа создает файл с 1 листом. Поэтому было сделано так: сначала командой Записать создавался файл Excel с необходимым листом, потом лист переносился в нужную книгу: ПостроительОтчета.Вывести(ТабДок); ТабДок.Записать(ИмяВременныхФайлов, ТипФайлаТабличногоДокумента.XLS97); Ексель.Workbooks(ИмяКнигиБуфера).Sheets(ИмяЛистаБуфера).Copy(Ексель.Workbooks(ИмяКнигиОтчета).Sheets(ТекущееИмяЛистаШаблонаЭксель)); И это дело прекрасно работает до тех пор пока не появляется еще один процесс Excel: либо запущенный интерактивно, либо в случае одновременного формирования из 2-х сеансов 1С на одном компьютере отчетов в Excel. Собственно проблема: при наличии 2-ух одновременно запущенных экселей стока Ексель.Workbooks(ИмяКнигиБуфера).Sheets(ИмяЛистаБуфера).Copy(Ексель.Workbooks(ИмяКнигиОтчета).Sheets(ТекущееИмяЛистаШаблонаЭксель)); не выполняется, выводится ошибка: Ошибка при вызове метода контекста (Workbooks): Произошла исключительная ситуация (0x8002000b) Подскажите, что можно сделать |
|||
|
1
ТелепатБот
гуру
17.11.08
✎
16:09
|
||||
|
2
mixqn
17.11.08
✎
16:15
|
Есть правда другой вариант сохранения данных вместе с форматированием (группировками) - выделить все и скопировать. Но данный вариант реализовать не удалось - бала другая ошибка "Ошибка при вызове метода контекста (Select): Произошла исключительная ситуация (Microsoft Office Excel): Метод Select из класса Range завершен неверно" (подробнее могу описать при необходимости). Поэтому был применен метод копирования листа целиком.
А собственно суть задачи сводится к следующему: необходимо иметь возможность выводить из 1С многостраничные отчеты Excel с группировками, при том, делать это параллельно, чтобы можно было одновременно формировать 2 и более отчетов. |
|||
|
3
v_rtex
17.11.08
✎
16:17
|
а зачем в эксель? если уже есть в 1с..
|
|||
|
4
mixqn
17.11.08
✎
16:19
|
Для рассылки удаленным пользователям, не имеющим 1С.
Хотя это не имеет никакого значения для решения проблемы. |
|||
|
5
v_rtex
17.11.08
✎
16:19
|
отсылайте удаленным пользователям файлы 1С..
пусть смотрят в 1С.. |
|||
|
6
mixqn
17.11.08
✎
16:20
|
Нет. Это урезание функционала. Данный вариант руководством не рассматривается. Нужны многостраничные отчеты с сводными таблицами и прочими прелестями экселя. К тому же эксель есть у всех, а для просмотра mxl надо еще и программку поставить.
|
|||
|
7
DancingShadow
17.11.08
✎
16:21
|
посмотри здесь
http://itland.ru/forum//index.php?showtopic=17797 |
|||
|
8
mixqn
17.11.08
✎
16:21
|
Задачу необходимо реализовать именно в том виде, как она стоит: выводить из 1С многостраничные отчеты Excel с группировками, при том, делать это параллельно, чтобы можно было одновременно формировать 2 и более отчетов.
|
|||
|
9
dk
17.11.08
✎
16:22
|
Как объект Ексель создается?
Поди через ПолучитьCOMОбъект? :) |
|||
|
10
v_rtex
17.11.08
✎
16:22
|
в v8 тоже есть сводные таблицы -)
|
|||
|
11
mixqn
17.11.08
✎
16:24
|
v_rtex, огромная просьба, не предлагать обходные пути. Они все давно рассмотрены. Я повторяю, мне нужно решить задачу именно в том виде, как она стоит. Если Вы не знаете, как это сделать, прошу вас не писать ничего. Это только отвлекает
|
|||
|
12
vde69
17.11.08
✎
16:24
|
могу предложить только формировать по 1 ячейки
для затравки http://www.infostart.ru/blogs/718/ |
|||
|
13
mixqn
17.11.08
✎
16:25
|
(9)
Ексель=Новый ComОбъект("Excel.Application"); |
|||
|
14
mixqn
17.11.08
✎
16:26
|
(12) по одной ячейке не пойдет. Слишком долго. Уж лучше отаказаться от параллельности и формировать отчеты последовательно.
|
|||
|
15
v_rtex
17.11.08
✎
16:26
|
формировать отчеты не параллельно.. а последовательно -)
|
|||
|
16
mixqn
17.11.08
✎
16:29
|
(15) Именно. Последовательное формирование реализовано и работает. И до определенного момента это было нормально. Но количество отчетов увеличилось, поэтому необходимо более оперативно их формировать и рассылать
|
|||
|
17
v_rtex
17.11.08
✎
16:30
|
закрывать Эксель (процесс) перед формированием следующего отчета..
|
|||
|
18
mixqn
17.11.08
✎
16:33
|
(7) Спасибо, посмотрел, но того что мне нужно там нет. Нужен не сам факт копирования листа (это рабоатет!!! (16)), нужно сделать так, чтобы не было ошибки: "Ошибка при вызове метода контекста (Workbooks): Произошла исключительная ситуация (0x8002000b)", которая возникает при 2-ух одновременно открытых экселях (при формировании 2-ух отчетов параллельно).
|
|||
|
19
mixqn
17.11.08
✎
16:36
|
(17) тут сразу 2 проблемы: 1) как поймать этот момент? запускаются сразу 2 сеанса 1С, 2 процесса 1Cv8 и 2 Excel, 2 разных переменных "Ексель=Новый ComОбъект("Excel.Application");" . Как их связать друг с другом?
и проблема 2) в этом случае первый отчет не сформируется до конца и мы вообще не получим ни одного отчета (при последовательном формировании все получается, но хочется быстрее) |
|||
|
20
mixqn
17.11.08
✎
16:52
|
Ну так что, господа программисты, никто не сталкивался что ли с такой ошибкой???
|
|||
|
21
vde69
17.11.08
✎
16:52
|
(19) если ты не будешь использовать "COPY" то количество екселей в памяти тебе будет пофигу, как вариант создавай новые листы из шаблонов
|
|||
|
22
mixqn
17.11.08
✎
16:56
|
(21) извините, не понял. Можно поподробнее?
|
|||
|
23
vde69
17.11.08
✎
17:01
|
(22) v8: Как из 1С работать с шаблоном Excel
или ваще класная идея: сделать очередь и обрабатывать ее регламентной обработкой на сервере (будет однопоточная единая очередь, типа как принтер) |
|||
|
24
mixqn
17.11.08
✎
17:25
|
Мне не нужда однопоточная единая очередь, как же вы понять не можете. Фактически, она и реализована. И функционирует. Мне нужно, повторяю в 3-ий раз:
выводить из 1С многостраничные отчеты Excel с группировками, при том, делать это параллельно, чтобы можно было одновременно формировать 2 и более отчетов. Из 2-ух и более одновременно запущенных приложений (1Cv8). |
|||
|
25
mixqn
17.11.08
✎
17:28
|
В формулировке задачи главные слова - ПАРАЛЛЕЛЬНО, из ОДНОВРЕМЕННО ЗАПУЩЕННЫХ приложений 1С
|
|||
|
26
vde69
17.11.08
✎
17:32
|
(24) тебе не это нужно, а нужно запаралелить обработку 1с, а вывод в excel занимает максимум 1 минуту (если клиент старый).
Вероятно что-то у тебя не правильно! Скорее всего ты не отключаешься от екселя!!! Существует куча мест куда можно посмотреть, например между началом сеанса и оклончанием сократить время до сборки страниц, потом сохранить готовый файл и открыть его через КомандаСистемы... можно на одном обьекте екселя открывать несколько книг BaseOLE = Новый COMОбъект("Excel.Application"); ExcelФайл1 = BaseOLE.WorkBooks.Open (ИмяФайла); ExcelФайл2 = BaseOLE.WorkBooks.Open (ИмяФайла); да идей как это сделать куча, только я пока не понимаю твоих заморочек |
|||
|
27
vde69
17.11.08
✎
17:33
|
(25) работай через ADO там вообще в памяти ексель не нужен
|
|||
|
28
Torquader
17.11.08
✎
19:46
|
Если пользователь интерактивно работает с Excel, то все процессы Excel работают в единой очереди сообщений, и пока ячейка Excel находится в стадии редактирования выполнить какие-то действия в другом файле Excel нельзя в принципе!
Поэтому, можно или дожидаться, когда пользователь освободит ячейку, или использовать методы, не требующие запущенного Excel, так как при запущенном Excel все методы отработают точно также. Чтобы избежать такой проблемы, можно сложить на диск файлы с данными для формирования отчётов, а потом открыть файл с исполняемым макросом, который по этим файлам соберёт нужные документы, в этом случае у пользователя не будет возможности работать с Excel, так как макрос будет выполняться в её пространстве. |
|||
|
30
mixqn
18.11.08
✎
18:03
|
(28) Не удалось воспроизвести данную ситуацию: интерактивно открыл 2 экселя, вошел в редактирование ячейки (оставил там курсор), при этом без проблем можно войти и редактировать в ячейку другого экселя - это раз и два: 2 экселя без проблем работают и из 1С - те же самые отчеты, которые я описывал выше (та же система), но только вывод без группировок, в плоские таблицы через буфер (текст модуля написан через если - если с оформлением, копируем листы, если без оформления - копируем только данные)
|
|||
|
31
mixqn
18.11.08
✎
18:04
|
В общем тема пока открыта, решение не найдено, так что жду еще советов и рекомендаций
|
|||
|
32
mixqn
18.11.08
✎
18:09
|
(2) Кстати, о втором способе - выделять все. Никто не пробовал в созданном 1С эксельном файле программно выделить все? У меня именно этот момент не получился в свое время, почему и пришлось прибегнуть к копированию листов. Может кто-то подскажет, как сделать Ctrl+A программно???
ЗЫ: пробовал вот так: Ексель.Workbooks(ИмяКнигиБуфера).ActiveSheet.Cells.Select(); Ексель.Selection.Copy(); Текст ошибки не помню, но ругался уже на первую строку до "Selection.Copy" не доходил. |
|||
|
33
mixqn
18.11.08
✎
18:14
|
А, вспомнил примерный текст ошибки: что-то типа "Метод Select класса Range завершен неверно"...
|
|||
|
34
vde69
18.11.08
✎
18:15
|
что то вроде
Ексель.Workbooks(ИмяКнигиБуфера).ActiveSheet.Cells("T") |
|||
|
35
vde69
18.11.08
✎
18:17
|
(34) короче полный диапазон называеться "T"
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |