Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выгрузка табличного документа в Google таблицу
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > База знаний > Не наши статьи > 1С:Предприятие 8.2
Vofka
Надумал когда-то задачу себе: выгрузить содержимое табличного документа в Google Document. Одним из вариантов использования данного функционала может быть выгрузка состояния заказов пользователей из базы в 1с в google spreadsheet. Если клиент знает адрес данного документа, то они могут ознакомиться с состоянием дел не звоня менеджеру. Может кто еще придумает варианты использования – пишите в комментарии, буду рад.

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

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

Функция получения маркера следующая:

Функция ПолучитьМаркер(ВидСервиса,Пользователь = Неопределено) Экспорт
    ПараметрыПользователя = ПолучитьПараметрыПользователя();

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

    АдресКлиентЛогин = "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, который для удобство дальнейшего разбора перегоняется в ДеревоЗначений.Функция получения списка таблиц имеет следующий вид:

&НаСервере
Функция ПолучитьСписокТаблиц(Пользователь = Неопределено) Экспорт

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

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

    Адрес = "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 таблицы имеет следующий вид:

&НаСервере
Функция ОбновитьЯчейкуЛистаГугл(Маркер,ИДЛиста,Строка,Колонка,Значение)
    ТекстСоздания = "
    | " + ИДЛиста + "/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);
        Возврат Ложь;
    КонецЕсли;
КонецФункции




необходимо зарегистрироваться для просмотра ссылки
DanilaDru
Спасибо. Даже видео мое разместили. Приятно smile.gif
Vofka
Вам спасибо за статью smile.gif
SV71
Скопировал в 1С код
Цитата(Vofka @ 14.07.11, 19:29) необходимо зарегистрироваться для просмотра ссылки
Функция ПолучитьМаркер(ВидСервиса,Пользователь = Неопределено) Экспорт
ПараметрыПользователя = ПолучитьПараметрыПользователя();


Выдает ошибку:
Цитата
{ОбщийМодуль.ПродедурыГугл.Модуль(7,29)}: Процедура или функция с указанным именем не определена (ПолучитьПараметрыПользователя)
ПараметрыПользователя = <<?>>ПолучитьПараметрыПользователя(); (Проверка: Сервер)


Подскажите чего не хватает?
andr_andrey
Цитата(SV71 @ 04.02.20, 11:55) необходимо зарегистрироваться для просмотра ссылки
Подскажите чего не хватает?

Вы думаете, за 9 лет у гугл ничего не изменилось? 32541510.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.