Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Выгрузка табличного документа в Google таблицу          
Vofka Подменю пользователя
сообщение 14.07.11, 17:29
Сообщение #1

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4519 раз
Рейтинг: 3641.2

Надумал когда-то задачу себе: выгрузить содержимое табличного документа в 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);
        Возврат Ложь;
    КонецЕсли;
КонецФункции




[необходимо зарегистрироваться для просмотра ссылки]

Спасибо сказали: yur,

DanilaDru Подменю пользователя
сообщение 20.07.11, 15:13
Сообщение #2

Молчаливый
*
Группа: Пользователи
Сообщений: 2
Спасибо сказали: 0 раз
Рейтинг: 0

Спасибо. Даже видео мое разместили. Приятно smile.gif

Vofka Подменю пользователя
сообщение 20.07.11, 15:49
Сообщение #3

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13955
Из: Киев
Спасибо сказали: 4519 раз
Рейтинг: 3641.2

Вам спасибо за статью smile.gif

SV71 Подменю пользователя
сообщение 04.02.20, 11:55
Сообщение #4

Говорящий
***
Группа: Пользователи
Сообщений: 80
Спасибо сказали: 3 раз
Рейтинг: 0

Скопировал в 1С код
Цитата(Vofka @ 14.07.11, 19:29) *
Функция ПолучитьМаркер(ВидСервиса,Пользователь = Неопределено) Экспорт
ПараметрыПользователя = ПолучитьПараметрыПользователя();


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


Подскажите чего не хватает?

andr_andrey Подменю пользователя
сообщение 05.02.20, 10:49
Сообщение #5

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 626
Спасибо сказали: 166 раз
Рейтинг: 130.8

Цитата(SV71 @ 04.02.20, 11:55) *
Подскажите чего не хватает?

Вы думаете, за 9 лет у гугл ничего не изменилось? 32541510.gif


Signature
#define private public
enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 16.04.24, 6:46
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!