Проблема при выводе из 1С в Excel #373691


#0 by mixqn
Добрый день! Предыстория: необходимо было сделать так, чтобы из 1С формировался отчет Excel на нескольких листах с сохранением форматирования (главным образом, группировок) табличного документа. Стандартный метод Записать табличного документа создает файл с 1 листом. Поэтому было сделано так: сначала командой Записать создавался файл Excel с необходимым листом, потом лист переносился в нужную книгу: ПостроительОтчета.Вывести(ТабДок); И это дело прекрасно работает до тех пор пока не появляется еще один процесс Excel: либо запущенный интерактивно, либо в случае одновременного формирования из 2-х сеансов 1С на одном компьютере отчетов в Excel. Собственно проблема: при наличии 2-ух одновременно запущенных экселей стока Ексель.Workbooks(ИмяКнигиБуфера).Sheets(ИмяЛистаБуфера).Copy(Ексель.Workbooks(ИмяКнигиОтчета).Sheets(ТекущееИмяЛистаШаблонаЭксель)); не выполняется, выводится ошибка: Ошибка при вызове метода контекста (Workbooks): Произошла исключительная ситуация (0x8002000b) Подскажите, что можно сделать
#1 by ТелепатБот
#2 by mixqn
Есть правда другой вариант сохранения данных вместе с форматированием (группировками) - выделить все и скопировать. Но данный вариант реализовать не удалось - бала другая ошибка "Ошибка при вызове метода контекста (Select): Произошла исключительная ситуация (Microsoft Office Excel): Метод Select из класса Range завершен неверно" (подробнее могу описать при необходимости). Поэтому был применен метод копирования листа целиком. А собственно суть задачи сводится к следующему: необходимо иметь возможность выводить из 1С многостраничные отчеты Excel с группировками, при том, делать это параллельно, чтобы можно было одновременно формировать 2 и более отчетов.
#3 by v_rtex
а зачем в эксель? если уже есть в 1с..
#4 by mixqn
Для рассылки удаленным пользователям, не имеющим 1С. Хотя это не имеет никакого значения для решения проблемы.
#5 by v_rtex
отсылайте удаленным пользователям файлы 1С.. пусть смотрят в 1С..
#6 by mixqn
Нет. Это урезание функционала. Данный вариант руководством не рассматривается. Нужны многостраничные отчеты с сводными таблицами и прочими прелестями экселя. К тому же эксель есть у всех, а для просмотра mxl надо еще и программку поставить.
#7 by DancingShadow
#8 by mixqn
Задачу необходимо реализовать именно в том виде, как она стоит: выводить из 1С многостраничные отчеты Excel с группировками, при том, делать это параллельно, чтобы можно было одновременно формировать 2 и более отчетов.
#9 by dk
Как объект Ексель создается? Поди через ПолучитьCOMОбъект? :)
#10 by v_rtex
в v8 тоже есть сводные таблицы -)
#11 by mixqn
v_rtex, огромная просьба, не предлагать обходные пути. Они все давно рассмотрены. Я повторяю, мне нужно решить задачу именно в том виде, как она стоит. Если Вы не знаете, как это сделать, прошу вас не писать ничего. Это только отвлекает
#12 by vde69
могу предложить только формировать по 1 ячейки для затравки
#14 by mixqn
по одной ячейке не пойдет. Слишком долго. Уж лучше отаказаться от параллельности и формировать отчеты последовательно.
#15 by v_rtex
формировать отчеты не параллельно.. а последовательно -)
#16 by mixqn
Именно. Последовательное формирование реализовано и работает. И до определенного момента это было нормально. Но количество отчетов увеличилось, поэтому необходимо более оперативно их формировать и рассылать
#17 by v_rtex
закрывать Эксель (процесс) перед формированием следующего отчета..
#18 by mixqn
Спасибо, посмотрел, но того что мне нужно там нет. Нужен не сам факт копирования листа (это рабоатет!!! ), нужно сделать так, чтобы не было ошибки: "Ошибка при вызове метода контекста (Workbooks): Произошла исключительная ситуация (0x8002000b)", которая возникает при 2-ух одновременно открытых экселях (при формировании 2-ух отчетов параллельно).
#19 by mixqn
тут сразу 2 проблемы: 1) как поймать этот момент? запускаются сразу 2 сеанса 1С, 2 процесса 1Cv8 и 2 Excel, 2 разных переменных "Ексель=Новый ComОбъект("Excel.Application");" . Как их связать друг с другом? и проблема 2) в этом случае первый отчет не сформируется до конца и мы вообще не получим ни одного отчета (при последовательном формировании все получается, но хочется быстрее)
#20 by mixqn
Ну так что, господа программисты, никто не сталкивался что ли с такой ошибкой???
#21 by vde69
если ты не будешь использовать "COPY" то количество екселей в памяти тебе будет пофигу, как вариант создавай новые листы из шаблонов
#22 by mixqn
извините, не понял. Можно поподробнее?
#23 by vde69
или ваще класная идея: сделать очередь и обрабатывать ее регламентной обработкой на сервере (будет однопоточная единая очередь, типа как принтер)
#24 by mixqn
Мне не нужда однопоточная единая очередь, как же вы понять не можете. Фактически, она и реализована. И функционирует. Мне нужно, повторяю в 3-ий раз: выводить из 1С многостраничные отчеты Excel с группировками, при том, делать это параллельно, чтобы можно было одновременно формировать 2 и более отчетов. Из 2-ух и более одновременно запущенных приложений (1Cv8).
#25 by mixqn
В формулировке задачи главные слова - ПАРАЛЛЕЛЬНО, из ОДНОВРЕМЕННО ЗАПУЩЕННЫХ приложений 1С
#26 by vde69
тебе не это нужно, а нужно запаралелить обработку 1с, а вывод в excel занимает максимум 1 минуту (если клиент старый). Вероятно что-то у тебя не правильно! Скорее всего ты не отключаешься от екселя!!! Существует куча мест куда можно посмотреть, например между началом сеанса и оклончанием сократить время до сборки страниц, потом сохранить готовый файл и открыть его через КомандаСистемы... можно на одном обьекте екселя открывать несколько книг да идей как это сделать куча, только я пока не понимаю твоих заморочек
#27 by vde69
работай через ADO там вообще в памяти ексель не нужен
#28 by Torquader
Если пользователь интерактивно работает с Excel, то все процессы Excel работают в единой очереди сообщений, и пока ячейка Excel находится в стадии редактирования выполнить какие-то действия в другом файле Excel нельзя в принципе! Поэтому, можно или дожидаться, когда пользователь освободит ячейку, или использовать методы, не требующие запущенного Excel, так как при запущенном Excel все методы отработают точно также. Чтобы избежать такой проблемы, можно сложить на диск файлы с данными для формирования отчётов, а потом открыть файл с исполняемым макросом, который по этим файлам соберёт нужные документы, в этом случае у пользователя не будет возможности работать с Excel, так как макрос будет выполняться в её пространстве.
#30 by mixqn
Не удалось воспроизвести данную ситуацию: интерактивно открыл 2 экселя, вошел в редактирование ячейки (оставил там курсор), при этом без проблем можно войти и редактировать в ячейку другого экселя - это раз и два: 2 экселя без проблем работают и из 1С - те же самые отчеты, которые я описывал выше (та же система), но только вывод без группировок, в плоские таблицы через буфер (текст модуля написан через если - если с оформлением, копируем листы, если без оформления - копируем только данные)
#31 by mixqn
В общем тема пока открыта, решение не найдено, так что жду еще советов и рекомендаций
#32 by mixqn
Кстати, о втором способе - выделять все. Никто не пробовал в созданном 1С эксельном файле программно выделить все? У меня именно этот момент не получился в свое время, почему и пришлось прибегнуть к копированию листов. Может кто-то подскажет, как сделать Ctrl+A программно??? ЗЫ: пробовал вот так: Текст ошибки не помню, но ругался уже на первую строку до "Selection.Copy" не доходил.
#33 by mixqn
А, вспомнил примерный текст ошибки: что-то типа "Метод Select класса Range завершен неверно"...
#34 by vde69
что то вроде Ексель.Workbooks(ИмяКнигиБуфера).ActiveSheet.Cells("T")
#35 by vde69
короче полный диапазон называеться "T"
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С