Вставил на форму ActiveX-компонент и при заполнении поля ActiveXGUID Вышло сообщение "Интерфейс не поддерживается", затем поменял значение поля ActiveXGUID на GUID другого ActiveX, сохранил, закрыл окно, при этом также вышло сообщение,что Интерфейс не поддерживается.
Теперь при попытке открыть эту форму (wnd_InvoicesWorkspace) поисходит та же ошибка.
Думал сохранить это окно в xlm и в блокноте удалить этот злополучный ActiveX-компонент, но при попытке сделать это ситуация повторяется. При использовании утилиты TSMergeServices выгружаются все сервисы кроме этого.
Нашел в БД в tbl_Service данные этого окна, сохранил их в файл, но они в сжатом виде.
Подскажите пожалуйста каким образом можно это Окно открыть, выгрузить или распаковать то , что я смог выгрузить из таблицы tbl_Service.

Версия TSXRM+Press 3.3.2.103

Нравится

16 комментариев

Попробуйте использовать TSMergeServices с указанием параметра usimask:

TSMergeServices.exe /cfg=... /usr=... /pwd=... /usimask="*\wnd_InvoicesWorkspace" ...

"Лабьяк Олег Игоревич" написал:Попробуйте использовать TSMergeServices с указанием параметра usimask:

Не получилось!

Information: Extracting service 'wnd_InvoicesWorkspace'
Information: Error processing service 'Invoices\General\Main Grid\wnd_InvoicesWorkspace', type YES to continue and else for cancel operation:

Information: Operation canceled
Information: 0 services successfully extracted.
Press Enter to exit...

Скините пожалуйста исходники на Delphi ActiveX компонент, у которого интерфейс будет поддерживаться, я его зарегистрирую с тем же GUID и у меня откроется окно или расшифруйте пожалуйста скрипт, который я выдергнул из БД и я в XML удалю этот компонент из окна.

Решил проблему!!!
Создал в Delphi Active Form до компиляции поменял GUID, зарегистрировал и форма открылась!!!

Возникло 2 пожелание и идея:
1. Сделать невозможным сохранение форма с некорректным ActiveX компонентом или сделать возможным открытие формы несммотря на эту ошибку.
2. Добавить в TSMergeServices параметр, который бужет выгружать сервисы, не контролируя наличие ошибок в них.

3. Сделать триггер на таблицу tbl_Service которвый сохраняет историю ее изменений. Это позволит сделать откат изменений сервиса, в случае, если он рухнул.

Можно еще сделать так
1. Создаете собственное SQ_ServicrTemp на tbl_Service в котором прописываете поля ID, Code, XMLData и филтр по полю Code.
2. Создаете скрипт и добавляете строки

function Main (){
	var ServiceCode = 'wnd_AccountEdit';
	var PathToSave = 'c:\\Temp\\';
	var sq_ServiceTemp = Services.GetNewItemByUSI('sq_ServiceTemp');
	ApplySelectQueryFilter (sq_ServiceTemp,'Code',ServiceCode, true);
	var ds = sq_ServiceTemp.Open()
	if (ds.IsEOF) return;
	ds.DataFields.ItemsByName('XMLData').SaveToFile(PathToSave);
	ds.Close();
}

3. Меняете значения переменных ServiceCode и PathToSave и добавляете связь со скриптом scr_DB.
4. Запускаете по F9.
5. Возможный но не обязательный пункт. Могут быть ошибки в скрипте :)
Нужный Вам сервис будет в папке PathToSave.

Да, есть еще более простой способ.
Попытайтесь просто "отрегистрировать" вашу библиотеку "regsvr32 -u MyLib.dll"
При открытии форма поругается но откроется.
Предыдущий вариант как резервный

"Евгений Либин" написал:Да, есть еще более простой способ.
Попытайтесь просто "отрегистрировать" вашу библиотеку "regsvr32 -u MyLib.dll"
При открытии форма поругается но откроется.
Предыдущий вариант как резервный

Спасибо конечно, но после "отрегистрации" форма ругалась и также не открывалась

"Евгений Либин" написал:Можно еще сделать так
1. Создаете собственное SQ_ServicrTemp на tbl_Service в котором прописываете поля ID, Code, XMLData и филтр по полю Code....

Данные из скрипта действительно сохраняются, но в сжатом виде (у нас версия 3.3.2.103).
Я практически сразу их нашел и вытащил при помощи Delphi.

Спасибо за участие.

Вы уверены что ds.DataFields.ItemsByName('XMLData').SaveToFile(PathToSave);
выгружает в зжатом виде?
Я нет, т.к. таким способом выгружаю и загружаю сервисы при инсталляции почтового клиента.

"Евгений Либин" написал:Вы уверены что ds.DataFields.ItemsByName('XMLData').SaveToFile(PathToSave);
выгружает в зжатом виде?
Я нет, т.к. таким способом выгружаю и загружаю сервисы при инсталляции почтового клиента.

У Вас какая версия TS CRM?

Вся линейка, начиная от 3.0.4 и до 3.3.2.

Прошу меня простить за некорректно поставленный вопрос, не знал, что Вы разработчик :)
Однако в том, что данные выгрузились криво я убедился очно, причем дважды (не поленился и попробовал Ваш способ,хотя проблема уже решена) и о сжатии данных для линейки 3.3.2 я узнал
из сообщения Александра Кравчука

Прочитал вашу ссылку.
Вы чуть-чуть запутались.
Да, действительно, начиная с версии 3.3.2 сервис скриптов ТЕКСТ СКРИПТА хранит в незжатов виде. Это означает что открыв полученный xml файл через редактор (или любой вьювер, например IE) вы сможете увидеть текст скрипта. Ранее текст скрипта бы в бинарнов сиде. Но это касается только скриптов, остальные же сервисы храняться в виде обычного xml. Да могли поменяться названия атрибутов или порядок элементов, но они доступнф для просмотра и редактирования.

Касательно работы предложенного скрипта. Прямо сейчас у меня нет возможности его посмотреть, но чуть позже посмотрю и отпишусь. Возможно он (результат) меня удивит

Простите препутал ссылку вот необходимая: "Александр Кравчук пишет: Действительно, для 3.3.2 так не получится. В tbl_Service в поле XMLData теперь данные хранятся в сжатом виде."

Да Валерий, действительно. Век живи .....
Но я обнаружил в этом кое-что интересное. По сути в базе лежит ZIP (или ему подобный)архив. Т.е если выгрузить сервис описанным выше способом но в файл с расширением ZIP то в архиве мы увидим интересующий нас XML сервис.
О как.

Только это, судя по свему, не zip(при переименовании в zip и windows, и 7Zip отказались его открывать). Открыл при помощи 7zip увидел там одноименный файл с пустым расширением и он действительно открылся! Тип файла GZip.

Будем иметь ввиду на будущее.
Спасибо!

Показать все комментарии

Доброго времени суток.
Вопрос не совсем по террасофту, но в моем случае с ним связан.
Собственно, собрал простенькую Actve Form на Delphi, на ней OleContainer.
Вставляю в террасофтный ActiveXControl и создаю OleObject из файла Екселя (OleContainer.CreateObjectFromFile). В результате в OleContainer создается объект Excel.Sheet.12. И все бы хорошо, но я не могу сохранить изменения, ну и в принципе выполнить команду из главного меню(хотя у нужного CommandBar и его элементов управления Enabled = true).
Перерыл много интернетов, но не нашел ответа.
Возможно, кто-то сталкивался с подобным.
Заранее спасибо за ответ.

Нравится

6 комментариев

А какая цель ставилась? Если просто работа с Екселем в Террасофте, то можно посмотреть здесь, как обходной вариант.

Попробовал.
Да, действительно лист екселя виден, но не видно управляющих элементов, а свойство ActiveXControl.ActiveXObject.Document.CommandBars == null... я что-то делаю не так?

Странно. Когда я через навигейт делал - у меня все менюшки были доступны. Может протестируйте на другом компьютере с "чистым" офисом.

"Славянский Евгений" написал:После выполнения Navigate получаете доступ к объекту ActiveXControl.ActiveXObject.Document (можете установить видимость панелей для MS Word, подписаться на события и многое другое)

Записала макросом отображение панели "Защита"
Application.CommandBars("Protection").Visible = True. Таким образом после Navigate, попробуйте показать нужные панели.

Сам Document у меня типа _WorkBook у него CommandBars == null.
Если командую Document.Application.CommandBars('Protection').Visible = true, то он и стает true, но визуально никаких изменений. висит один лист и все.

К слову, вот у меня в файле используется сводная таблица, toolbar со списком полей не вижу. Нажимаю в самом екселе "показать список полей" - ничего не происходит, если программно включаю Document.ToolBars(2).Visible = true - то же самое.

Попробуйте создать кнопочку на окне с контейнером и на обработчике написать

Document.Application.CommandBars('Protection').Visible = true

У меня были проблемы именно с тем, в какое время инициализировать панели. Получается инициализировать только после того как отработал метод Prepare() окна с ActiveX контейнером.

Показать все комментарии