Ошибка при вызове метода контекста loadcomponentfromurl 1с
Работа через COM с файлами MS Excel, используя OpenOffice/LibreOffice.
Плюс даже не пробуя, ибо некогда сталкивался с ООо и представляю, сколько времени может сэкономить статья.
+1 всем - совершенно согласен
добавлю, что ОО не использовал - для тех, у кого не было офиса, использовал ADO. Оч. удобно и, главное, огромные эксели "засасывает" как реактивный пылесос ))
В общем да. гуд. добавлю в защиту 1С-овцев и плюс к статье, что кое-какие ф-ции по работе с ОО ими написаны в модуле УправлениеПечатьюOOWriterКлиент (БСП)
Большой жирный плюс. Использую OpenOffice (в последнее время LibreOffice) уже 4 года - мне очень пригодится. Да и другим, думаю, тоже
Это получение последней колонки и строки, которые вообще заполнены в таблице.
В каждой из приведенных вами статей есть упоминание слова OpenOffice, хотя общего между ними немного. Они все баяны? Вы хоть просмотрели бы их чтоли.
Отличная статья!
Вкралась небольшая ошибочка в пример
локТабЗнач.Колонки.Добавить(НовИмяКол,ОписаниеТиповСтрока);
а должно быть локТабЗнач.Колонки.Добавить(ИмяКол,ОписаниеТиповСтрока);
Вкралась небольшая ошибочка в пример
локТабЗнач.Колонки.Добавить(НовИмяКол,ОписаниеТиповСтрока);
а должно быть локТабЗнач.Колонки.Добавить(ИмяКол,ОписаниеТиповСтрока);
Методы:
endCol = Sheet . Data . GetLength ( 6 ) - 1 ;
endRow = Sheet . Data . GetLength () - 1 ;
Не корректно работают для больших файлов.
Для проверки можно ручками создать файл вида:
В результате получим:
endCol = - 1 ;
endRow = 0 ;
Вариант до 001000 - работает отлично.
Для применения с LibreOffice необходимо маленькая поправка. Я долго искал ответ, почему именно так, но не нашел. Методом "тыка" нашел работающее решение.
Значение в скобках (10) - найдено экспериментально. Я так понимаю - это значение массива, где хранится максимальная занятая на данный момент колонка таблицы. С OpenOffice не проверял. Проверено на LibreOffice 3.4
возникает вопрос - что это за зверь такой?
в какой момент он как сработает неизвестно, поэтому его нужно либо перепроверять либо вообще не пользоватся дабы он не подвел в самый неподходящий момент, как получилось у меня после сдачи работы это все всплыло как г-но в проруби
Придется все таки пользоватя медленным, но надежным старым считываением:
PS: тестил на OpenOffice 4.1.1 + 1С:Предприятие 8.2 (8.2.19.90)
(44) CaSH_2004, У меня подобные глюки при работе с сохраненными файлами из древних версий MS Excel. Я рекомендую все же использовать LibreOffice.
(45) А я вот наоборот не рекомендую пока им пользоваться , и вот почему:
в первый и последний раз я увидел LibreOffice пол года назад у одного клиента которому его тоже какой-то сисадмин расхвалил и поставил вместо проверенного OpenOffice.
Потом мне потребовалось сделать выгрузку прайса с картинками, так после долгих извращений и мучений (что-то не корректно шло оформление) LibreOffice перестал открывать и создавать файлы (я его сильно мучил, честно) - после этого я его снес и пользуюсь проверенным OpenOffice.
(46) CaSH_2004, Вы не закрывали com объект и он завис. Завершили бы процесс и все работало. А насчет LibreOffice vs OpenOffice, так работа в Libre идет конскими шагами, причем попутно избавляясь от Java в коде, да и по функционалу он впереди, хотя для 90% пользователей это непринципиально.
Я его даже не открывал. Я говорил про то что LibreOffice под любым пользователем перестал открываться - просто вылетал с какой то ошибкой системной.
Вот это верно на 100% - зачем ставить новое если с головой хватает старого? Новый функционал никто не использует т.к. все борются с новыми глюками!
ИМХО:
Как видим даже старый функционал никто толком не знает (судя по этой статье), а это как раз из-за того что постоянно выходит все новое, в надежде избавится от проблем старого, но естественно этого не происходит, зато к старым проблемам прибавляются новые, и из-за того что приходится бросать все силы на исправление ошибок, соответственно не хватает времени не то что на развитие и изучение нового,но даже на себя :(
Это как раз случай "придумываем себе трудности чтобы их потом героически преодолевать".
(48) Вот одна из причин из-за чего нет смысла в LibreOffice несмотря на ее "конский шаг"
Open Calc Report System - смотрим комменты 15-16
Буду благодарен если и вы скините мне что то в защиту своей позиции.
+(44) Собственно чтобы обойти указанный глюк достаточно заменить получение последней колонки/строки автора на вариант (44), но вот более подробно:
в (19) коллега не учел что работать это будет только если у него заполнение листа идет с самой первой строки и колонки, т.к. это не просто количество строк и колонок всего, а именно ЗАПОЛНЕННЫХ, т.е. по сути:
Кстати для информации колонок предусмотрено 1024, а строк 1024*1024 = 1 048 576, во всяком случае Cursor.Columns/Rows.Count именно это возвращают пока не выполнишь позиционирование Cursor.GoTo.
(0) в добавок ко всему непонятно зачем тут
автор в переменную МассивКом помещают SafeArray, а потом затирают так и не используя. Я убрал это и все продолжает работать. Может автор или кто-то подскажет для чего это нужно?
PS: в результате разбирания и выкидывания мусора весь пример сократился в 2-3 раза! Там реально много лишнего, коллеги проверяйте выкладываемый код что-ли, а то мусор лопатой выкидываешь
Обнаружил, что максимальное число строк, которых понимает OpenOffice, при чтении xls файлов: 2^15 - 1 = 32767. Если хоть на одну больше - алгоритм не работает.
Спасибо огромное, то что надо, кто отходит от пиратки или не имеет официального МСО.
Попробовал использовать в своей конфигурации и не могу понять, откуда возникает переменная в функции загрузки
Это пример вызова функции в которой в Переменной "ФайлКартотеки" передается Виндовый путь к файлу полностью, типа: D:\\Мои Документы\файл.xls
Плюсанул с огромным удовольствием. Статья стоит того. Я бы хотел единственное попросить автора привести пример. Как одновременно прочитать данные с файла ods и тут же отредатировать читаемый файл (например в одной колонке в определенной строке найти Артикул и в той же строке отредактировать ячейку другого столбца претаоложим это будет количество).
Спасибо за внимание.
Задача не совсем корректна, однако попробую предположить.
1. Если Вы хотите сформировать новый файл, то сформируйте его средствами 1С и сохраните в формате XLS.
2. Вы имеете некий "сводный" файл, куда каждое подразделение вносит свои поправки?
Из данного примера мне пригодилось именно "чтение" файла для импорта в 1С всяких "табличек". Остальные задачи либо "прихоти" неграмотных руководителей, не желающих изучать 1С, либо неправильно поставленный процесс обмена информацией.
LibreOffice прекрасно открывает и читает формат XLS, так почему-же не выгружать из 1С информацию в этом формате?
З.Ы. Даю намек по п.2 - используете из данного примера создание COM-объекта, загружаете информацию из файла в таблицу значений, редактируете ее как Вам угодно и синхронизируете все свои действия средствами COM c открытым файлом. Потом корректно закрываете его, и все. Примеры на сайте OpenOffice имеются. Если это действительно необходимо - изучайте вопрос и плюс Вам в публикацию.
З.Ы. З.Ы. Можно не выгружать в ТЗ, а в фоновом режиме (обработкой) сделать изменения через COM.
Добрый день! Заранее прошу прощения за возможно детские вопросы.
У меня стоит задача заполнения документа в open office из формы документа 1с. Я создала кнопку "Печать", после чего начала описывать процедуру.
ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
Desktop = ServiceManager.OleFunction("createInstance", "com.sun.star.frame.Desktop");
Ой ошибку не дописала, вот она:"Метод объекта не обнаружен (OleFunction)
Desktop = ServiceManager.OleFunction("createInstance", "com.sun.star.frame.Desktop");"
Щас, автор выдаст - "Сама я не по 1С, да и не программист вообще, даже не программистка. А всего лишь системный администратор" :)
. Без фото, солнечный офис не будет работать.
(7)в ссылке написано "OpenOffice.org базируется на компонентной модели UNO",а не на сом!Поэтому подозреваю,что после строк ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager"); вы получаете в переменной ServiceManager не совсем то,что хотите.
То есть ошибка получается в
ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager");
Неправильно определила ServiceManager?
Глупый вопрос, знаю, фото на каком моменте программы нужно(еще раз повторюсь, я еще маленький программист))
Конфигурация Библиотека стандартных подсистем
ОбщийМодуль.УправлениеПечатьюOOWriterКлиент - там найдешь многие ответы на свои вопросы.
Проверила, действительно неправильно определила переменную док,переписала.
Док=Desktop.LoadComponentFromURL("C:\\dvstmp\\qqqq.odt", "_blank", 0,Параметры);
Но теперь он пишет:
": Ошибка при вызове метода контекста (LoadComponentFromURL)
Док=Desktop.LoadComponentFromURL("C:\\advastmp\\qqqq.odt", "_blank", 0,Параметры);
по причине:
Произошла исключительная ситуация ([automation bridge] ): [automation bridge] UnoConversionUtilities::dispatchExObject2Sequence
Conversion of dispatch object to Sequence failed!
Произошла исключительная ситуация ([automation bridge] ): [automation bridge] UnoConversionUtilities::dispatchExObject2Sequence
Conversion of dispatch object to Sequence failed!"
и вот это я уже, честно говоря в ступоре, сначала я не указывала параметры, и он жаловался на не совпадение типов, пока пытаюсь в режиме отладки, но безуспешно.
Посидела еще немного, посмотрела, в моем случае я в переменную FilePath передаю ссылку на уже существующий файл,то есть мне надо будет обрабатывать ее с помощью функции ConvertToUrl, но что-то мне подсказывает что я ушла далеко в сторону, плюс еще я не стала передавать вид массива, опять же не уверена, что это правильно.
Гружу файл. Просмотрел как грузятся проблемные места все нормально.
Находятся элементы и прописываются.
Отлавливаю проблему.
Когда функция просто не отрабатывает, поиска по наименованию (((
Хотя так же все нормально передается туда для поиска.
(26) Ну так найдена была бы пустая ссылка, но не ошибка.
То работает то нет. Так же строка передается!
Глупый вопрос: зачем тогда для каждой строки делать поиск для справочника?
Сделай соответствие символьного представления и ссылки
(24) все же сомнения терзают, там не пробел будет, а нечитаемый неправильный вызывающий ошибку символ, который СОКРЛП не отловит и СТРЗаменить
(44) Сейчас отлаживаю эту процедуру, по нажатию кнопке. Ошибки в ней.
Вот. Все работает. Но иногда идет эта ошибка и все, на таких же данны!
(48) я так и останавливаюсь на строке 2000 с лишним
(51)(52) Да можно многого добавить, но я же смотрю в отладчике, в функцию передаются верные данные, а идет ошибка.
Добавлю конечно проверки.
(55) не знаю. у меня правило, если происходит неведомая херня, нужно сначала делать это, а потом только лезть за бубном
Кэш почищу сейчас догрузится.
Стоит галка останавливаться по ошибке.
Ошибка видимо возникает при записи элемента.
Я смотрю что там в нем, вижу проблему в единицах измерения и родителе.
Но из за чего не пойму.
Или ошибка заполнения обязательных на уровне платформы полей: наименование, владелец (если справочник подчинённый) и тд
(71) У меня же нет попытки исключения?
Да ранее я вижу что в родителе и единицах измерения.
Но туда идут нормальные данные. Буду разбираться.
Видимо энергия ушла.
сейчас вот с этим буду бороться что это пока не знаю
(83) в общем пройдись по справочнику номенклатуры где-то есть одинаковое наименование у элемента и группы. Или если самому лень, посади за проверку девочку-восьмиклассницу, пусть проштудирует справочник от и до.
(81) Не должно такого быть.
(84) Гружу структуру из другой базы. Я пока не могу записать ни одного элемента. Так как грузится в транзакции.
Мне не лень. Я пытаюсь разобраться. Но такого не могло в принципе быть. Надеюсь докапаться до проблемы.
(84) смотрю в файле не нахожу.
Поставил останавливаться по ошибке.
Остановка же будет на проблемном элементе?
Ну вот, пока я в отладчеке не увидел там проблемы.
(90) Ошибку нужно отловить. Мне нужно что бы все хорошо грузилось. Пока первичные данные.
Потом остальное ещё цеплять.
И так долго грузится. Без транзакции ещё дольше будет.
Я же отлаживаю.
ошибка из за ошибки что выдает функция, а она должна либо находить элемент или возвращать пустую ссылку
(97) а полностью ошибка вероятно звучит так
Ошибка при вызове метода контекста (НайтиПоНаименованию): В данной транзакции уже происходили ошибки!
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс, 1996 г.
Как в любом языке программирования, в платформе 1С есть предопределенные методы, которые облегчают жизнь разработчикам. Но выполнение этих команд требует правильного соблюдения синтаксиса языка программирования.
Самые распространенные ошибки при вызове типовых методов:
- Записать
- Создать
- Подключиться
- Connect
- ПроверитьВывод
- PreviewFile1C
- Прочитать
- Выполнить
- ВыполнитьПакет
- ПрочитатьИзменения
Рассмотрим пример. Мы программно создали запрос (справочник по запросам), передав в параметры «текст» вот такой фрагмент:
: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
<(13, 4)>: Синтаксическая ошибка
И >
Рассмотрим еще один пример:
Получите понятные самоучители по 1С бесплатно:
Перенесем ошибочный код в обработчик «ПередЗаписью» справочника «Версии программ» и попробуем записать справочник программно. Видим ошибку:
: Ошибка при вызове метода контекста (Записать)
Выборка.ПолучитьОбъект().Записать();
по причине:
Ошибка при выполнении обработчика — ‘ПередЗаписью’
по причине:
: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
<(13, 4)>: Синтаксическая ошибка
И >
Несмотря на то, что ошибка заключается в выполнения метода «Выполнить», система ругается и на строчку кода, где вызывается программная запись объекта.
Решение проблемы
Для решения проблемы достаточно понять, в чем именно заключается ошибка. В 99% случаев проблема решается банальным чтением справки и анализом проблемы.
Для того чтобы узнать, как пользоваться тем или иным методом, достаточно установить курсор на интересующей Вас функции и нажать «Ctrl + F1». Платформа 1С выдаст Вам контекстную подсказку по требуемому методу:
Проверьте параметры, передаваемые в функцию, и правильность её использования.
Другие статьи по 1С:
Исправляем ситуацию
Рис.1 Запускаем на исполнение нижеприведенный кусок кода с запросом, в котором забыли дописать условие отбора
Но ошибки могут быть не только в текстах запросов. Допустим, мы хотим выбрать всю номенклатуру и узнать, входит ли она в определенную группу. Проверка происходит с помощью метода «ПринадлежитЭлементу» и его параметра, который должен быть типа СправочникСсылка. Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной.
Рис.2 Мы опять допускаем ошибку и вместо ссылки в параметр метода помещаем строку, содержащую имя переменной
Рис.3 Синтакс-помощник
Рис.4 Сверив пример с нашим кодом, приходит понимание, что кавычки не нужны и без них все работает
Чаще всего причиной подобных ошибок выступают следующие факторы:
- Невнимательность;
- Отсутствие опыта или знаний;
- Несогласованность действий разработчиков друг с другом;
- Изменения в методах контекста в новых версиях платформы.
Читайте также: