Bug 10868

Summary: Ошибка открытия документа | 1Сv77, wine 2.1.3
Product: WINE@Etersoft Reporter: Konstantin Artyushkin <akv>
Component: ОбщееAssignee: Konstantin Artyushkin <akv>
Status: CLOSED FIXED QA Contact: Konstantin Artyushkin <akv>
Severity: normal    
Priority: P4 CC: baraka, dtimoshkov, dtr, lav
Version: unspecified   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:
Заявки RT: 40375 Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 9358    
Attachments: Результат windows

Description Konstantin Artyushkin 2015-10-19 16:06:26 MSK
Created attachment 3276 [details]
Результат windows

Конфигурация Производство+Услуги+Бухгалтерия

пакеты wine:
 wine-etersoft-2.1.3-alt26
 wine-etersoft-gl-2.1.3-alt26
 wine-etersoft-sql-2.1.3-alt9.M70P.10

Бутылка swine rt/40375 

Воспроизведение :
  Запустить 1С в режиме "предприятия" под пользователем Голубева, без пароля
  Сервис-> Интернет поддержка пользователей 
  Получаем окошко "Ошибка открытия документа"

В windows появляется окошко в которой открывается страница (см. скриншот)
Comment 1 Dmitry Timoshkov 2015-10-20 14:08:02 MSK
1С пытается с помощью OleLoad() загрузить OLE документ, содержащий картинку,
созданную с помощью Microsoft PhotoEdit 3.0, и так как PhotoEdit не установлен,
то создание OLE объекта с указанным в документе UUID заврешается неудачей.
Тестирвание под Windows XP показало, что 1С без проблем загружает этот OLE
документ, при этом картинка (или просто сохраненное превью) показываются на
экране.

Пока исследование проблемы и поиск правильного решения не закончены, я создал
и отправил для включения в ветку eter-2.1 простой хак, позволяющий избежать
ошибки при загрузке OLE документа, но на месте картинки (в левом верхнем углу)
остается черный квадрат.

Константин, не могли бы Вы протестировать временное решение и подтвердить,
что оно работает?
Comment 2 Dmitry Timoshkov 2015-10-21 13:05:13 MSK
(Ответ Dmitry Timoshkov на комментарий1)
> 1С пытается с помощью OleLoad() загрузить OLE документ, содержащий картинку,
> созданную с помощью Microsoft PhotoEdit 3.0, и так как PhotoEdit не
> установлен,
> то создание OLE объекта с указанным в документе UUID заврешается неудачей.

Нашел в интернете пачку документов с описанием формата OLE structured storage,
надеюсь, что с помощью них получится выяснить, как правильно загружать файлы,
в которых для указанного uuid обработчик не установлен, и для которых поток
"CONTENTS" содержит ссылку на этот uuid, а не формат вроде CLSID_Picture_Dib.

> Тестирвание под Windows XP показало, что 1С без проблем загружает этот OLE
> документ, при этом картинка (или просто сохраненное превью) показываются на
> экране.

Стоит добавить, что Microsoft PhotoEdit конечно же не установлен в XP, но
тем не менее документ успешно загружается.
Comment 3 Dmitry Timoshkov 2015-10-22 13:18:27 MSK
(Ответ Dmitry Timoshkov на комментарий2)
> > 1С пытается с помощью OleLoad() загрузить OLE документ, содержащий картинку,
> > созданную с помощью Microsoft PhotoEdit 3.0, и так как PhotoEdit не
> > установлен,
> > то создание OLE объекта с указанным в документе UUID заврешается неудачей.
> 
> Нашел в интернете пачку документов с описанием формата OLE structured
> storage,
> надеюсь, что с помощью них получится выяснить, как правильно загружать файлы,
> в которых для указанного uuid обработчик не установлен, и для которых поток
> "CONTENTS" содержит ссылку на этот uuid, а не формат вроде CLSID_Picture_Dib.

Какого-либо внятного описания формата потока "CONTENTS" я не нашел, даже в
документации MSDN, посвященной описанию OLE Structured Storage, есть только
какой-то странный пример дампа потока "CONTENTS", формат которого совершенно
не похож на поток, загружаемый 1С.

Для дальнейшего исследования я сохранил на диске дамп загружаемого 1С OLE
документа и написал тестовую программу, повторяющую по шагам все, что делает
1С для его загрузки и отображения. Это должно значительно упростить дальнейшее
исследование проблемы. Как и ожидалось, под Windows моя тестовая программа
успешно загружает документ с помощью OleLoad() и так же успешно рисует его
содержимое на экране с помощью OleDraw: в результате на экране я вижу именно
ту картинку, которая отображается под Windows XP и отсутствует в Wine (при
использовании моего хака для OleLoad()).
Comment 4 Dmitry Timoshkov 2015-10-22 13:19:54 MSK
(Ответ Dmitry Timoshkov на комментарий1)
> Пока исследование проблемы и поиск правильного решения не закончены, я создал
> и отправил для включения в ветку eter-2.1 простой хак, позволяющий избежать
> ошибки при загрузке OLE документа, но на месте картинки (в левом верхнем
> углу) остается черный квадрат.
> 
> Константин, не могли бы Вы протестировать временное решение и подтвердить,
> что оно работает?

Константин? (мой хак уже принят в ветку eter-2.1, поэтому ничего прикладывать
руками не нужно)
Comment 5 Dmitry Timoshkov 2015-10-23 13:44:26 MSK
(Ответ Dmitry Timoshkov на комментарий3)
> Какого-либо внятного описания формата потока "CONTENTS" я не нашел, даже в
> документации MSDN, посвященной описанию OLE Structured Storage, есть только
> какой-то странный пример дампа потока "CONTENTS", формат которого совершенно
> не похож на поток, загружаемый 1С.
> 
> Для дальнейшего исследования я сохранил на диске дамп загружаемого 1С OLE
> документа и написал тестовую программу, повторяющую по шагам все, что делает
> 1С для его загрузки и отображения. Это должно значительно упростить
> дальнейшее
> исследование проблемы. Как и ожидалось, под Windows моя тестовая программа
> успешно загружает документ с помощью OleLoad() и так же успешно рисует его
> содержимое на экране с помощью OleDraw: в результате на экране я вижу именно
> ту картинку, которая отображается под Windows XP и отсутствует в Wine (при
> использовании моего хака для OleLoad()).

Дальнейшее исследование с помощью моей тестовой программы показало, что под
Windows содержимое потока "CONTENTS" так же не может быть загружено. Перебор
всех потоков в документе и печать их содержимого из моей тестовой программы
показало, что поток "OlePres000" этого документа содержит картинку в формате
метафайла. Но ole32 в wine эту картинку не распознает из-за тог, что источником
для нее указан TYMED_FILE, а wine ожидает увидеть TYMED_MFPICT.

После исправлений в коде wine, загружающем OLE документы, 1С успешно загружает
и рисует на экране документ со всеми картинками.

Патчи с исправлениями выявленных проблем отправлены в wine-patches.
Comment 6 Dmitry Timoshkov 2015-10-26 14:58:14 MSK
(Ответ Dmitry Timoshkov на комментарий5)
> > Какого-либо внятного описания формата потока "CONTENTS" я не нашел, даже в
> > документации MSDN, посвященной описанию OLE Structured Storage, есть только
> > какой-то странный пример дампа потока "CONTENTS", формат которого совершенно
> > не похож на поток, загружаемый 1С.
> > 
> > Для дальнейшего исследования я сохранил на диске дамп загружаемого 1С OLE
> > документа и написал тестовую программу, повторяющую по шагам все, что делает
> > 1С для его загрузки и отображения. Это должно значительно упростить
> > дальнейшее
> > исследование проблемы. Как и ожидалось, под Windows моя тестовая программа
> > успешно загружает документ с помощью OleLoad() и так же успешно рисует его
> > содержимое на экране с помощью OleDraw: в результате на экране я вижу именно
> > ту картинку, которая отображается под Windows XP и отсутствует в Wine (при
> > использовании моего хака для OleLoad()).
> 
> Дальнейшее исследование с помощью моей тестовой программы показало, что под
> Windows содержимое потока "CONTENTS" так же не может быть загружено. Перебор
> всех потоков в документе и печать их содержимого из моей тестовой программы
> показало, что поток "OlePres000" этого документа содержит картинку в формате
> метафайла. Но ole32 в wine эту картинку не распознает из-за тог, что
> источником
> для нее указан TYMED_FILE, а wine ожидает увидеть TYMED_MFPICT.
> 
> После исправлений в коде wine, загружающем OLE документы, 1С успешно
> загружает
> и рисует на экране документ со всеми картинками.
> 
> Патчи с исправлениями выявленных проблем отправлены в wine-patches.

Первый из пачки патчей принят.
Comment 7 Dmitry Timoshkov 2015-10-29 14:44:28 MSK
(Ответ Dmitry Timoshkov на комментарий6)
> > > Какого-либо внятного описания формата потока "CONTENTS" я не нашел, даже в
> > > документации MSDN, посвященной описанию OLE Structured Storage, есть только
> > > какой-то странный пример дампа потока "CONTENTS", формат которого совершенно
> > > не похож на поток, загружаемый 1С.
> > > 
> > > Для дальнейшего исследования я сохранил на диске дамп загружаемого 1С OLE
> > > документа и написал тестовую программу, повторяющую по шагам все, что делает
> > > 1С для его загрузки и отображения. Это должно значительно упростить
> > > дальнейшее
> > > исследование проблемы. Как и ожидалось, под Windows моя тестовая программа
> > > успешно загружает документ с помощью OleLoad() и так же успешно рисует его
> > > содержимое на экране с помощью OleDraw: в результате на экране я вижу именно
> > > ту картинку, которая отображается под Windows XP и отсутствует в Wine (при
> > > использовании моего хака для OleLoad()).
> > 
> > Дальнейшее исследование с помощью моей тестовой программы показало, что под
> > Windows содержимое потока "CONTENTS" так же не может быть загружено. Перебор
> > всех потоков в документе и печать их содержимого из моей тестовой программы
> > показало, что поток "OlePres000" этого документа содержит картинку в формате
> > метафайла. Но ole32 в wine эту картинку не распознает из-за тог, что
> > источником
> > для нее указан TYMED_FILE, а wine ожидает увидеть TYMED_MFPICT.
> > 
> > После исправлений в коде wine, загружающем OLE документы, 1С успешно
> > загружает
> > и рисует на экране документ со всеми картинками.
> > 
> > Патчи с исправлениями выявленных проблем отправлены в wine-patches.
> 
> Первый из пачки патчей принят.

Хью просит добавить тест для подтверждения того, что TYMED_FILE может быть использован наравне с TYMED_MFPICT.
Comment 8 Dmitry Timoshkov 2015-10-30 13:53:37 MSK
(Ответ Dmitry Timoshkov на комментарий7)
> Хью просит добавить тест для подтверждения того, что TYMED_FILE может быть
> использован наравне с TYMED_MFPICT.

С тестом оказалось не все так просто. Все перепробованные мной способы,
предназначенные для указания формата FORMATETC/STGMEDIUM отказываются
работать TYMED_FILE: IOleCache2::Cache/::SetData и IDataObject::SetData
возвращают ошибку. Каким чудесным образом в 1С создавался документ с
таким форматом остается для меня полной загадкой. Провозившись и убив
кучу времени на чтение документации, экспериментов и гугленье, написал
Хью письмо с результатами своих безрезультатных попыток и вопросом о
возможных идеях и способоах решения этой проблемы, так как я пока ничего,
кроме как патчения вручную данных потоков придумать не смог.
Comment 9 Dmitry Timoshkov 2015-11-02 17:35:38 MSK
(Ответ Dmitry Timoshkov на комментарий8)
> С тестом оказалось не все так просто. Все перепробованные мной способы,
> предназначенные для указания формата FORMATETC/STGMEDIUM отказываются
> работать TYMED_FILE: IOleCache2::Cache/::SetData и IDataObject::SetData
> возвращают ошибку. Каким чудесным образом в 1С создавался документ с
> таким форматом остается для меня полной загадкой. Провозившись и убив
> кучу времени на чтение документации, экспериментов и гугленье, написал
> Хью письмо с результатами своих безрезультатных попыток и вопросом о
> возможных идеях и способоах решения этой проблемы, так как я пока ничего,
> кроме как патчения вручную данных потоков придумать не смог.

Хью посоветовал вручную создавать содержимое потока для теста. Пришлось
изрядно повозиться, тем не менее написать тест, работающий для всех типов
изображений в потоке не получилось, так как оказалось, что правильный формат
потока известен только для метафайлов, для битмапов же формат, который
используется внутри вайновского oleaut32, просто не работает под Windows.
Убив кучу времени на бузуспешные попытки понять, что именно писать в поток
для битмапов, было решено плюнуть и ограничиться только тестом для метафайлов,
так как меня (вернее 1С) интересует только поддержка этого формата. патчи с
тестами и исправлением отправлены в wine-patches.
Comment 10 Dmitry Timoshkov 2015-11-03 13:26:22 MSK
(Ответ Dmitry Timoshkov на комментарий9)
> > С тестом оказалось не все так просто. Все перепробованные мной способы,
> > предназначенные для указания формата FORMATETC/STGMEDIUM отказываются
> > работать TYMED_FILE: IOleCache2::Cache/::SetData и IDataObject::SetData
> > возвращают ошибку. Каким чудесным образом в 1С создавался документ с
> > таким форматом остается для меня полной загадкой. Провозившись и убив
> > кучу времени на чтение документации, экспериментов и гугленье, написал
> > Хью письмо с результатами своих безрезультатных попыток и вопросом о
> > возможных идеях и способоах решения этой проблемы, так как я пока ничего,
> > кроме как патчения вручную данных потоков придумать не смог.
> 
> Хью посоветовал вручную создавать содержимое потока для теста. Пришлось
> изрядно повозиться, тем не менее написать тест, работающий для всех типов
> изображений в потоке не получилось, так как оказалось, что правильный формат
> потока известен только для метафайлов, для битмапов же формат, который
> используется внутри вайновского oleaut32, просто не работает под Windows.
> Убив кучу времени на бузуспешные попытки понять, что именно писать в поток
> для битмапов, было решено плюнуть и ограничиться только тестом для
> метафайлов,
> так как меня (вернее 1С) интересует только поддержка этого формата. патчи с
> тестами и исправлением отправлены в wine-patches.

Пока комментариев на эти патчи нет.
Comment 11 Dmitry Timoshkov 2015-11-05 09:41:54 MSK
(Ответ Dmitry Timoshkov на комментарий10)
> > > С тестом оказалось не все так просто. Все перепробованные мной способы,
> > > предназначенные для указания формата FORMATETC/STGMEDIUM отказываются
> > > работать TYMED_FILE: IOleCache2::Cache/::SetData и IDataObject::SetData
> > > возвращают ошибку. Каким чудесным образом в 1С создавался документ с
> > > таким форматом остается для меня полной загадкой. Провозившись и убив
> > > кучу времени на чтение документации, экспериментов и гугленье, написал
> > > Хью письмо с результатами своих безрезультатных попыток и вопросом о
> > > возможных идеях и способоах решения этой проблемы, так как я пока ничего,
> > > кроме как патчения вручную данных потоков придумать не смог.
> > 
> > Хью посоветовал вручную создавать содержимое потока для теста. Пришлось
> > изрядно повозиться, тем не менее написать тест, работающий для всех типов
> > изображений в потоке не получилось, так как оказалось, что правильный формат
> > потока известен только для метафайлов, для битмапов же формат, который
> > используется внутри вайновского oleaut32, просто не работает под Windows.
> > Убив кучу времени на бузуспешные попытки понять, что именно писать в поток
> > для битмапов, было решено плюнуть и ограничиться только тестом для
> > метафайлов,
> > так как меня (вернее 1С) интересует только поддержка этого формата. патчи с
> > тестами и исправлением отправлены в wine-patches.
> 
> Пока комментариев на эти патчи нет.

Все патчи приняты, портированы и отправлены для принятия в ветку eter-2.1.
Константин, пожалуйста протестируйте исправление.
Comment 12 Konstantin Artyushkin 2015-11-05 13:47:07 MSK
Проверил в бутылке swine 2.1 rt/40375 

Проблема не воспроизводится : Сервис-> Интернет поддержка пользователей открывает страницу без ошибки.

wine-etersoft-2.1.3-alt31

Закрываю.