Как всегда, я бы не озадачился чем-то интересным, если бы не понадобилось. И вот этот день настал. Я проснулся и понял, что страсть как хочу прямо в окне 1С смотреть на Word-овский документ. Я не хочу думать какая у меня операционная система, тонкий или веб-клиент. Все что я хочу, это выбрать файл и посмотреть его в окне 1С, разве это так много??? Ну ладно, прочь шуточки. Теперь все по порядку.
Вот вам небольшая подборка на тему "Просмотр Word и тому подобное"
- Предпросмотр PDF, JPG, PNG, TIFF, Word, Excel
- Просмотр файлов PDF, но с учетом перехода платформы на Webkit читать лучше сразу тут
- Просмотр файлов всех основных форматов средствами 1С + PDF24
- Просмотр файлов разных форматов в управляемой форме 1С
Среди типовых предпросмотр есть в 1С:Документооборот версии 3.0. Там он реализован путем сохранения офисных документов в HTML и хранением этих данных в отдельном регистре. Использует ComОбъект и требует наличие офисного пакета (ну или по крайней мере его части, отвечающей за работу com-объектов Application). Кстати, кому интересно, подробно про работу с Word через COM можно почитать тут.
Мне не нравилось по разным причинам ни одно из решений. А значит настало время создавать "нетленку".
Требования были такие:
- не важно какая операционная система
- желательно без внешних компонент, регистрации, смс и других танцев с бубном
- чтобы "кушало" разные форматы (хотя мне нужен был в общем то только *.docx)
- идеально чтобы не хранило ни в каком виде копию файла
То есть сразу отпали игры с COM, сохранение в HTML (в конфигурации или вне ее), внешние конверторы (вроде pdf24). Ну и вообще получалось так, что решения в общем то и не было какое-то время. Пока я случайно не наткнулся на Google Docs Viewer. О нем сейчас нет информации на сайте Google, но есть неплохая статья на Хабр. Кроме того, аналогичный сервис есть и у Мелкомягких, но он съедает чуть меньшее число форматов. Ну и забегая вперед, его полноценно использовать не получилось.
Google Docs Viewer
Самое главное что надо, для просмотра документа, это HTML поле в 1С и файл размещенный где-то, куда Google может легко достучаться (также без паролей, регистраций и смс). Ну и представим что у нас уже есть такой файл и лежит он где-нибудь, например "СВЕДЕНИЯ ПО ИСТОРИИ РУСИ XIII в. В САГЕ О КОРОЛЕ ХАКОНЕ". Достаточно ссылку на данный файл вставить внутрь конструкции
https://docs.google.com/viewer?url=[АдресСсылки]&embedded=true
И мы можем эту ссылку скормить полю HTML в 1С и вуаля, немного подождали и читаем очень увлекательный документ.
Собственно дело в шляпе, если бы не одно "но". Файлы то у нас в базе или в файловой системе. В общем не лежат они в облаке. А значит нам надо его куда-то "пульнуть", потом получить ссылку на него, открыть, ну и неплохо было бы удалить его после. То есть нам нужен, сервис временного хранения файлов, имеющий на борту REST API, выдающий "публичные" ссылки на файлы. Ну и как всегда, без дополнительных танцев в виде регистраций, платных доступов и т.д. После некоторого времени поиска такой сервис был найден.
file.io
Важная информация (март 2024)
Сервис file.io после продажи не поддерживает временную загрузку файлов. И поэтому данная разработка актуальная в части до данного блока. Если у кого-то есть идеи, какой сервис можно использовать для временного хранения файлов - пишите в комментарии, буду признателен
Подробнее о данном сервисе вы можете почитать у них на сайте. Изучив немного, копнув чуток и ткнув "палкой" в виде клиента для теста REST API, выяснилось - а он подходит. По заверению авторов файл удаляется, данные не хранятся, авторизации и регистрации не требуется, HTTPS есть. Кажется пора сесть и написать код отправки файла.
Собственно тут нам не понадобится ничего сверх "тяжелого". HTTPСоединение, HTTPЗапрос и немного навыка с отправкой тела запроса в виде "multipart/form-data".
А вот и сам код отправки и получения временной ссылки
Разделитель = СтрЗаменить(Новый УникальныйИдентификатор, "-", "");
СтрокаИмяФайла = СтрШаблон("filename=""%1""", ИмяФайла);
ТелоЗапроса = Новый ПотокВПамяти;
ЗаписьДанных = Новый ЗаписьДанных(ТелоЗапроса,,, Символы.ВК + Символы.ПС, "");
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""file""; " + СтрокаИмяФайла);
ЗаписьДанных.ЗаписатьСтроку("Content-Type: " + ПолучитьContentTypeПоРасширению(РасширениеФайла));
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.Записать(ДвоичныеДанные);
ЗаписьДанных.ЗаписатьСтроку("");
ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");
ЗаписьДанных.Закрыть();
ДанныеТела = ТелоЗапроса.ЗакрытьИПолучитьДвоичныеДанные();
ЗапросHTTP = Новый HTTPЗапрос;
ЗапросHTTP.Заголовки.Вставить("content-type" , "multipart/form-data; boundary=" + Разделитель);
ЗапросHTTP.Заголовки.Вставить("content-length" , Формат(ДанныеТела.Размер(), "ЧН=0; ЧГ="));
ЗапросHTTP.УстановитьТелоИзДвоичныхДанных(ДанныеТела);
СоединениеHTTP = Новый HTTPСоединение("file.io",,,,,, Новый ЗащищенноеСоединениеOpenSSL);
ОтветHTTP = СоединениеHTTP.ОтправитьДляОбработки(ЗапросHTTP);
Если ОтветHTTP.КодСостояния <> 200 Тогда
ДанныеОшибки = ОбработатьОшибкуЗапроса(ОтветHTTP);
ЗаполнитьЗначенияСвойств(Результат, ДанныеОшибки);
Возврат Результат;
КонецЕсли;
ТелоОтвета = ОтветHTTP.ПолучитьТелоКакСтроку();
СтруктураОтвета = ЗначениеИзСтрокиJSON(ТелоОтвета, Истина);
АдресСсылки = СтруктураОтвета.Получить("link");
Это немного "полуфабрикат", я думаю разобрать его на запчасти труда не составит. Собственно "АдресСсылки" и есть требуемый нам путь к файлу. В общем то, на этом статью можно и закончить, наверное...
Хотя нет, секундочку. Помните я упомянул что у мелкомягких тоже есть свой вьюер. Так вот, с ним не завелось поскольку, по неведомой мне причине, он считывал документ из ссылки дважды, а после первого запроса ссылка уничтожалась (как надеюсь и файл ))) ). Так что, что-то тут не вышло. Впрочем, не сильно то и расстроился.
Что в обработке?
Собственно красиво оформленный код (ну или почти красиво). С описанием для пользователя, ну и обработкой некоторых ситуаций. Например, при смене ссылки, иногда поле HTML не обновлялось. Для web-клиента недоступна работа с объектами для REST запросов. Ну и по мелочи.
Я сознательно не прикручивал это к просмотру присоединенных файлов. Вроде хотелось, но по хорошему это бы делать расширением. В общем тут я думаю каждый сам взвесит насколько ему интересно данное решение и прикрутит. Ну, и если что в комментариях оставляйте ссылки на свои решения "на базе".
Код открыт, пользуйтесь на здоровье.
Поддерживаемые форматы:
- Документ Word (*.doc)
- Документ Word2007-... (*.docx)
- Документ OpenDocument Text (*.odt)
- Документ PDF (*.pdf)
- Лист Excel (*.xls)
- Лист Excel2007-... (*.xlsx)
- Презентация PowerPoint (*.ppt)
- Презентация PowerPoint2007-... (*.pptx)
Это не полный перечень, в статье на Хабр информация раскрыта несколько серьезнее
Немного о разном
- минус: требуется доступ к интернет
- минус: жрет трафик (файл отправляется в сеть, а потом данные просмотра загружаются из сети)
- Google может прикрыть лавочку. Но с 2015 не закрывает, просто убрал официальную инфу об этом, но есть расширение для браузера, так что это маловероятно (я считаю)
- хочется такой функционал прямо в платформе
- можно конечно файлы держать и в облаке и перманентно открывать доступ для просмотра, не заморачивался
Я нормально отношусь к критике, так что пишите и предлагайте какие-то более интересные варианты "около".
Послесловие, после публикации
А Яндекс 360 тоже может. Спасибо JohnyDeath за идею. Формат ссылки там таков:
https://docs.yandex.ru/docs/view?url=[АдресСсылки]&name=[ИмяФайла]
Но можно обойтись и без имени файла. А благодаря товарищу ixijixi мы знаем что ему можно "скормить" word, excel, картинки (jpg как минимум), pdf, txt, zip, csv. Что очень не плохо.
Я доработал обработку и добавил возможность выбора сервиса (Google, Яндекс), но по какой-то причине яндекс показывает все вокруг, а сам документ не показывает, "думает". Желающие копнуть обработку, но не имеющие возможности скачать, пишите в личку, я отправлю, расскажете что получится.
Проверено на следующих конфигурациях и релизах:
- Бухгалтерия предприятия, редакция 3.0, релизы 3.0.171.23