helpf.pro
Регистрация
 0 
Распечатать

Выгрузка табличного документа в Google таблицу

Надумал когда-то задачу себе: выгрузить содержимое табличного документа в Google Document. Одним из вариантов использования данного функционала может быть выгрузка состояния заказов пользователей из базы в 1с в google spreadsheet. Если клиент знает адрес данного документа, то они могут ознакомиться с состоянием дел не звоня менеджеру. Может кто еще придумает варианты использования – пишите в комментарии, буду рад.
Последовательность выгрузки документа такова: сначала получаем список таблиц, которые есть у пользователя в системе Google Document. Затем после определения таблицы выгрузки пользователю предлагаем выбрать лист, в который будет выгружаться содержимое. Во время выбора всех этих параметров так же предоставляется возможность создания новых элементов (таблиц, листов). Уже после определения листа выгрузки обходим все ячейки документа и их содержимое переносим в таблицу на соответствующее место. Вопрос сохранения форматирования табличного документа в данной задаче не рассматривался.

Для написания функционала использовалась информация про google document API. Для того чтобы получить доступ к данным необходимо чтобы 1с сначала прошла аутентификацию. Про аутентификацию приложений можно почитать в соответствующем документе. Для того чтобы пройти аутентификацию мы должны сначала получить маркер, затем этот маркер прописывать каждый раз при обращении к серверу.

Функция получения маркера следующая:
Код 1C v 8.х
 Функция ПолучитьМаркер(ВидСервиса,Пользователь = Неопределено) Экспорт
ПараметрыПользователя = ПолучитьПараметрыПользователя();

Если ПараметрыПользователя = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;

АдресКлиентЛогин = "https://www.google.com/accounts/ClientLogin";
Если ВидСервиса = "Таблица" Тогда
Сервис = "wise";
ИначеЕсли ВидСервиса = "Документ" Тогда
Сервис = "writely";
КонецЕсли;

Попытка
ХМЛХТТП = ПолучитьCOMОбъект("", "Microsoft.XMLHTTP");
ХМЛХТТП.Open("POST", АдресКлиентЛогин, Ложь);
ХМЛХТТП.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
ХМЛХТТП.Send("Email=" + ПараметрыПользователя.Логин + "&Passwd=" + ПараметрыПользователя.Пароль + "&service=" + Сервис + "&source=Gulp-CalGulp-1.05");
Исключение
Сообщить("Ошибка:" + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;

Если ХМЛХТТП.Status = 200 Тогда
Маркер = ХМЛХТТП.ResponseText;
Маркер = Прав(Маркер, СтрДлина(Маркер) - СтрДлина("Auth=") - Найти(Маркер, "Auth=") + 1);
Возврат Маркер;
Иначе
Сообщить("Ошибка:" + ХМЛХТТП.Status + "-" + ХМЛХТТП.ResponseText);
Возврат Неопределено;
КонецЕсли;
КонецФункции

Функция получения маркера в качестве входного параметра получает вид службы, для которой будет проходить аутентификация. Это очень важный момент. Например, полученный маркер для Календаря не даст возможности работать с документами.

Для получения списка таблиц отправляется GET запрос по адресу «https://spreadsheets.google.com/feeds/spreadsheets/private/full». В запросе параметр «Authorization» определяется значением полученного маркера аутентификации. В результате выполнения запроса в ResponseText мы получаем xml, который для удобство дальнейшего разбора перегоняется в ДеревоЗначений.Функция получения списка таблиц имеет следующий вид:
Код 1C v 8.х
 &НаСервере
Функция ПолучитьСписокТаблиц(Пользователь = Неопределено) Экспорт

ПараметрыПользователя = ПолучитьПараметрыПользователя();
Если ПараметрыПользователя = Неопределено Тогда
Возврат Ложь;
КонецЕсли;

Маркер = ПолучитьМаркер("Таблица");
Если Маркер = Неопределено Тогда
Возврат Ложь;
КонецЕсли;

Адрес = "https://spreadsheets.google.com/feeds/spreadsheets/private/full";
ХМЛХТТП = ПолучитьCOMОбъект("", "Microsoft.XMLHTTP");
ХМЛХТТП.Open("GET", Адрес, Ложь);
ХМЛХТТП.SetRequestHeader("Content-Type", "application/atom+xml");
ХМЛХТТП.SetRequestHeader("Authorization", "GoogleLogin auth=" +Маркер);
ХМЛХТТП.Send(Null);

Если ХМЛХТТП.Status = 200 Тогда
ОтветСервера = ХМЛХТТП.ResponseText;
ДеревоXML = ПрочитатьResponseTextXML(ОтветСервера);
СписокТаблиц = Новый СписокЗначений;
ТаблицаСсылка = "";
НазваниеТаблицы = "";

Для Каждого Строка Из ДеревоXML.Строки[0].Строки Цикл
Если Строка.ИмяXMLЭлементаДанных = "entry" Тогда
Для Каждого ТекАтрибут Из Строка.Строки Цикл
Если ТекАтрибут.ИмяXMLЭлементаДанных = "link" Тогда
ТекРел = ТекАтрибут.СписокАтрибутов.НайтиПоЗначению("rel");
Если ТекРел.представление = "http://schemas.google.com/spreadsheets/2006#worksheetsfeed" Тогда
ТекСсылка = ТекАтрибут.СписокАтрибутов.НайтиПоЗначению("href");
ТаблицаСсылка = ТекСсылка.Представление;
ТаблицаСсылка = СтрЗаменить(ТаблицаСсылка,"https://","http://");
КонецЕсли;
КонецЕсли;

Если ТекАтрибут.ИмяXMLЭлементаДанных = "title" Тогда
НазваниеТаблицы = ТекАтрибут.ЗначениеXMLЭлементаДанных;
КонецЕсли;
КонецЦикла;
Если ЗначениеЗаполнено(ТаблицаСсылка) И ЗначениеЗаполнено(НазваниеТаблицы) Тогда
СписокТаблиц.Добавить(ТаблицаСсылка,НазваниеТаблицы);
КонецЕсли;
КонецЕсли;
КонецЦикла;

Возврат СписокТаблиц;
Иначе
Сообщить("Ошибка:" + ХМЛХТТП.Status + "-" + ХМЛХТТП.ResponseText);
Возврат Неопределено;
КонецЕсли;
КонецФункции

Теперь остановимся на самой выгрузке значения в ячейку google таблицы. Для определения значения в ячейке выполняется POST запрос по адресу листа таблицы, который пользователь определил до этого. Успешность выполнения обновления контролируется по значению Status, в случае удачного обновления он должен быть равен 201. Функция обновления значения ячейки на листе Google таблицы имеет следующий вид:
Код 1C v 8.х
 &НаСервере
Функция ОбновитьЯчейкуЛистаГугл(Маркер,ИДЛиста,Строка,Колонка,Значение)
ТекстСоздания = "
| " + ИДЛиста + "/R" + Строка(Строка) + "C" + Строка(Колонка)+"
| + ИДЛиста + "/R"+ Строка(Строка) + "C" + Строка(Колонка)+"""/>
| + Строка(Строка) + """ col=""" + Строка(Колонка)+ """ inputValue=""" + Значение+"""/>
| ";
ХМЛХТТП = ПолучитьCOMОбъект("", "Microsoft.XMLHTTP");
ХМЛХТТП.Open("POST", ИДЛиста, Ложь);
ХМЛХТТП.SetRequestHeader("Content-Type", "application/atom+xml;type=feed");
ХМЛХТТП.SetRequestHeader("X-If-No-Redirect", "true");
ХМЛХТТП.SetRequestHeader("Authorization", "GoogleLogin auth=" + Маркер);
ХМЛХТТП.Send(ТекстСоздания);
Если ХМЛХТТП.Status = 201 Тогда
Возврат Истина;
Иначе
Сообщить("Ошибка:" + ХМЛХТТП.Status + "-" + ХМЛХТТП.ResponseText);
Возврат Ложь;
КонецЕсли;
КонецФункции

Источник
Разместил:   Версии: | 8.x |  Дата:   Прочитано: 18649
 0 
Распечатать
Возможно, вас также заинтересует
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 50
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ
1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш
1С 8.x : Как убрать лидирующие нули в номере Документа (вариант2) 0
Скопировать строку с номером, с лидирующими нулями, в числовом поле (с форматом без групп, без группировки), и вернуть(скопировать) обратно в строковом поле с номером. Возвращает без нулей.
Google maps : вывод точек на карту и режим панорамы 9
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора
Посмотреть все результаты поиска похожих
Комментарии
E_Migachev
30.04.2014 18:52Комментарий: 4
E_Migachev
Fobus,
Код 1C v 8.х
 
Процедура ЗагрузитьРекурсивно(XMLДокумент, СтрокаДерева)
Пока XMLДокумент.Прочитать() Цикл
Если XMLДокумент.ТипУзла = ТипУзлаXML.ИнструкцияОбработки Тогда
НоваяСрокаДерева = СтрокаДерева.Добавить();
НоваяСрокаДерева.ТипУзла = XMLДокумент.ТипУзла;
НоваяСрокаДерева.ИмяXMLЭлементаДанных = XMLДокумент.Имя;
НоваяСрокаДерева.ЗначениеXMLЭлементаДанных = XMLДокумент.Значение;
ИначеЕсли XMLДокумент.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
НоваяСрокаДерева = СтрокаДерева.Добавить();
НоваяСрокаДерева.ТипУзла = XMLДокумент.ТипУзла;
НоваяСрокаДерева.ИмяXMLЭлементаДанных = XMLДокумент.Имя;
НоваяСрокаДерева.ЗначениеXMLЭлементаДанных = XMLДокумент.Значение;
Пока XMLДокумент.ПрочитатьАтрибут() Цикл
НоваяСрокаДерева.СписокАтрибутов.Добавить(XMLДокумент.Имя, XMLДокумент.Значение);
КонецЦикла;
ЗагрузитьРекурсивно(XMLДокумент, НоваяСрокаДерева.Строки);
ИначеЕсли XMLДокумент.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Возврат; Прервать;
ИначеЕсли XMLДокумент.ТипУзла = ТипУзлаXML.Ничего Тогда
Возврат; Прервать;
ИначеЕсли XMLДокумент.ТипУзла = ТипУзлаXML.Текст Тогда
Если СтрокаДерева.Количество() = 0 И СтрокаДерева.Родитель <> Неопределено Тогда
СтрокаДерева.Родитель.ЗначениеXMLЭлементаДанных = XMLДокумент.Значение;
Иначе
НоваяСрокаДерева = СтрокаДерева.Добавить();
НоваяСрокаДерева.ТипУзла = XMLДокумент.ТипУзла;
НоваяСрокаДерева.ИмяXMLЭлементаДанных = XMLДокумент.Имя;
НоваяСрокаДерева.ЗначениеXMLЭлементаДанных = XMLДокумент.Значение;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Fobus
30.04.2014 15:30Комментарий: 3
Fobus
спасибо E_Migachev, если бы еще за одно и процедуру ЗагрузитьРекурсивно(), было бы вообще супер.
E_Migachev
28.04.2014 21:17Комментарий: 2
E_Migachev
Fobus, вот
Код 1C v 8.х
 Функция ПрочитатьResponseTextXML(ResponseText) 
XMLДокумент = Новый ЧтениеXML;
XMLДокумент.УстановитьСтроку(ResponseText);

ДеревоXMLДокумента = Новый ДеревоЗначений;
ОписаниеСписокАтрибутов = Новый ОписаниеТипов("СписокЗначений");

ДеревоXMLДокумента.Колонки.Очистить();
ДеревоXMLДокумента.Колонки.Добавить("ТипУзла");
ДеревоXMLДокумента.Колонки.Добавить("ИмяXMLЭлементаДанных");
ДеревоXMLДокумента.Колонки.Добавить("ЗначениеXMLЭлементаДанных");
ДеревоXMLДокумента.Колонки.Добавить("СписокАтрибутов", ОписаниеСписокАтрибутов);
ЗагрузитьРекурсивно(XMLДокумент, ДеревоXMLДокумента.Строки);

Возврат ДеревоXMLДокумента;

КонецФункции
Fobus
28.04.2014 20:48Комментарий: 1
Fobus
а где можно взять код ПрочитатьResponseTextXML ? подскажите пожалуйста
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.