diff --git a/ru/OInt/core/Modules/OPI_Airtable.os b/ru/OInt/core/Modules/OPI_Airtable.os
index 30abde603a..5562675c6e 100644
--- a/ru/OInt/core/Modules/OPI_Airtable.os
+++ b/ru/OInt/core/Modules/OPI_Airtable.os
@@ -1,681 +1,681 @@
-// Расположение OS: ./OInt/core/Modules/OPI_Airtable.os
-// Библиотека: Airtable
-// Команда CLI: airtable
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:IncorrectLineBreak-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область РаботаСБазами
-
-// Получить список баз
-// Получает список доступных баз
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Отступ - Строка - Идентификатор следующей страницы списка баз из перыдудщего запроса - offset
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция ПолучитьСписокБаз(Знач Токен, Знач Отступ = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Отступ);
-
- URL = "https://api.airtable.com/v0/meta/bases";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
- Параметры = Новый Структура;
-
- OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить таблицы базы
-// Получает схему таблиц базы
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// База - Строка - Идентификатор базы - base
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция ПолучитьТаблицыБазы(Знач Токен, Знач База) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-
- URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Ответ = OPI_Инструменты.Get(URL, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Создать базу
-// Создает новую базу данных
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// РабочееПространство - Строка - Идентификатор рабочего пространства - ws
-// Наименование - Строка - Наименование новой базы - title
-// КоллекцияТаблиц - Соответствие Из КлючИЗначение - Описание таблиц: Ключ > имя, Значение > массив полей - tablesdata
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция СоздатьБазу(Знач Токен, Знач РабочееПространство, Знач Наименование, Знач КоллекцияТаблиц) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(КоллекцияТаблиц);
-
- Если Не ТипЗнч(КоллекцияТаблиц) = Тип("Структура")
- И Не ТипЗнч(КоллекцияТаблиц) = Тип("Соответствие") Тогда
-
- ВызватьИсключение "Ошибка в данных коллекции таблиц";
-
- КонецЕсли;
-
- URL = "https://api.airtable.com/v0/meta/bases";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
- МассивТаблиц = Новый Массив;
-
- Для Каждого Таблица Из КоллекцияТаблиц Цикл
-
- Описание = СформироватьОписаниеТаблицы(Таблица.Ключ, Таблица.Значение);
- МассивТаблиц.Добавить(Описание);
-
- КонецЦикла;
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("name" , Наименование , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("tables" , МассивТаблиц , "Массив", Параметры);
- OPI_Инструменты.ДобавитьПоле("workspaceId", РабочееПространство, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСТаблицами
-
-// Создать таблицу
-// Создает новую таблицу в базе
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// База - Строка - Идентификатор базы - base
-// Наименование - Строка - Наименование новой таблицы - title
-// МассивПолей - Массив Из Структура - Массив описаний полей - fieldsdata
-// Описание - Строка - Описание таблицы - description
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция СоздатьТаблицу(Знач Токен, Знач База, Знач Наименование, Знач МассивПолей, Знач Описание = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-
- URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
- Параметры = СформироватьОписаниеТаблицы(Наименование, МассивПолей, Описание);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Изменить таблицу
-// Изменяет наименование и|или описание базы
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// База - Строка - Идентификатор базы - base
-// Таблица - Строка - Идентификатор таблицы - table
-// Наименование - Строка - Новое наименование - title
-// Описание - Строка - Новое описание - description
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция ИзменитьТаблицу(Знач Токен, Знач База, Знач Таблица, Знач Наименование = "", Знач Описание = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
-
- URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица;
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
- Параметры = Новый Структура;
-
- OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("description", Описание , "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСПолями
-
-// Создать поле
-// Создет новое поле в таблице
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// База - Строка - Идентификатор базы - base
-// Таблица - Строка - Идентификатор таблицы - table
-// СтруктураПоля - Структура Из КлючИЗначение - Описание нового поля - fielddata
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция СоздатьПоле(Знач Токен, Знач База, Знач Таблица, Знач СтруктураПоля) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СтруктураПоля);
-
- Если Не ТипЗнч(СтруктураПоля) = Тип("Структура")
- И Не ТипЗнч(СтруктураПоля) = Тип("Соответствие") Тогда
-
- ВызватьИсключение "Ошибка в данных описания поля";
-
- КонецЕсли;
-
- URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица + "/fields";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Ответ = OPI_Инструменты.Post(URL, СтруктураПоля, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Изменить поле
-// Изменяет имя и|или описание существующего поля таблицы
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// База - Строка - Идентификатор базы База - base
-// Таблица - Строка - Идентификатор таблицы - table
-// Поле - Строка - Идентификатор поля - field
-// Наименование - Строка - Новое наименование - title
-// Описание - Строка - Новое описание - description
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция ИзменитьПоле(Знач Токен, Знач База, Знач Таблица, Знач Поле, Знач Наименование = "", Знач Описание = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Поле);
-
- URL = "https://api.airtable.com/v0/meta/bases/"
- + База
- + "/tables/"
- + Таблица
- + "/fields/"
- + Поле;
-
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура();
- OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("description", Описание , "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить поле (строковое)
-// Получает описание поля строкового типа
-//
-// Параметры:
-// Наименование - Строка - Наименование нового поля - title
-//
-// Возвращаемое значение:
-// Структура - Описание поля
-Функция ПолучитьПолеСтроковое(Знач Наименование) Экспорт
- Возврат ОписаниеПримитивногоПоля(Наименование, "richText");
-КонецФункции
-
-// Получить поле (числовое)
-// Получает описание поля числового типа
-//
-// Параметры:
-// Наименование - Строка - Наименование нового поля - title
-// Точность - Число,Строка - Число знаков после запятой - precision
-//
-// Возвращаемое значение:
-// Структура - Описание поля
-Функция ПолучитьПолеНомера(Знач Наименование, Знач Точность = 0) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьЧисло(Точность);
-
- СтруктураОпций = Новый Структура("precision", Точность);
- Возврат ОписаниеПримитивногоПоля(Наименование, "number", СтруктураОпций);
-
-КонецФункции
-
-// Получить поле (файл)
-// Получает описание поля файлового типа
-//
-// Параметры:
-// Наименование - Строка - Наименование поля - title
-//
-// Возвращаемое значение:
-// Структура - Описание поля
-Функция ПолучитьПолеВложения(Знач Наименование) Экспорт
- Возврат ОписаниеПримитивногоПоля(Наименование, "multipleAttachments");
-КонецФункции
-
-// Получить поле (флажок)
-// Получает описание поля типа булево
-//
-// Параметры:
-// Наименование - Строка - Наименование поля - title
-//
-// Возвращаемое значение:
-// Структура - Описание поля
-Функция ПолучитьПолеФлажка(Знач Наименование) Экспорт
-
- СтруктураОпций = Новый Структура("icon,color", "check", "yellowBright");
- Возврат ОписаниеПримитивногоПоля(Наименование, "checkbox", СтруктураОпций);
-
-КонецФункции
-
-// Получить поле (дата)
-// Получает описание поля типа дата
-//
-// Параметры:
-// Наименование - Строка - Наименование поля - title
-//
-// Возвращаемое значение:
-// Структура - Описание поля
-Функция ПолучитьПолеДаты(Знач Наименование) Экспорт
-
- СтруктураФормата = Новый Структура("format,name", "YYYY-MM-DD", "iso");
- СтруктураОпций = Новый Структура("dateFormat", СтруктураФормата);
-
- Возврат ОписаниеПримитивногоПоля(Наименование, "date", СтруктураОпций);
-
-КонецФункции
-
-// Получить поле (email)
-// Получает описание поля с электронной почтой
-//
-// Параметры:
-// Наименование - Строка - Наименование поля - title
-//
-// Возвращаемое значение:
-// Структура - Описание поля
-Функция ПолучитьПолеПочты(Знач Наименование) Экспорт
- Возврат ОписаниеПримитивногоПоля(Наименование, "email");
-КонецФункции
-
-// Получить поле (телефон)
-// Получает описание поля с номером телефона
-//
-// Параметры:
-// Наименование - Строка - Наименование поля - title
-//
-// Возвращаемое значение:
-// Структура - Описание поля
-Функция ПолучитьПолеТелефона(Знач Наименование) Экспорт
- Возврат ОписаниеПримитивногоПоля(Наименование, "phoneNumber");
-КонецФункции
-
-// Получить поле (url)
-// Получает описание поля с URL
-//
-// Параметры:
-// Наименование - Строка - Наименование поля - title
-//
-// Возвращаемое значение:
-// Структура - Описание поля
-Функция ПолучитьПолеСсылки(Знач Наименование) Экспорт
- Возврат ОписаниеПримитивногоПоля(Наименование, "url");
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСЗаписями
-
-// Получить список записей
-// Получает список записей выбранной таблицы
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// База - Строка - Идентификатор базы данных - base
-// Таблица - Строка - Идентификатор таблицы - table
-// Отступ - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция ПолучитьСписокЗаписей(Знач Токен, Знач База, Знач Таблица, Знач Отступ = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
-
- URL = "https://api.airtable.com/v0/" + База + "/" + Таблица;
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура();
- OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить запись
-// Получает данные строки таблицы по идентификатору
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// База - Строка - Идентификатор базы данных - base
-// Таблица - Строка - Идентификатор таблицы - table
-// Запись - Строка - Идентификатор записи в таблице - record
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция ПолучитьЗапись(Знач Токен, Знач База, Знач Таблица, Знач Запись) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
-
- URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись;
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Ответ = OPI_Инструменты.Get(URL, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Создать записи
-// Создает одну или массив записей по описанию или массиву описаний значений полей
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// База - Строка - Идентификатор базы данных - base
-// Таблица - Строка - Идентификатор таблицы - table
-// Данные - Структура, Массив из Структура - Набор или массив наборов пар Ключ : Значение > Поле : Показатель - data
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция СоздатьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Данные) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные);
-
- Параметры = Новый Структура();
- ДобавитьОписаниеДанных(Данные, Параметры);
-
- URL = "https://api.airtable.com/v0/" + База + "/" + Таблица;
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить записи
-// Удаляет одну или массив записей по идентификаторам
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// База - Строка - Идентификатор базы данных - base
-// Таблица - Строка - Идентификатор таблицы - table
-// Записи - Строка, Массив из Строка - Идентификатор или массив индентификаторов записей - records
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция УдалитьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Записи) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
- OPI_ПреобразованиеТипов.ПолучитьМассив(Записи);
-
- СтрокаЗаписей = "";
-
- Для Каждого Запись Из Записи Цикл
- СтрокаЗаписей = СтрокаЗаписей
- + ?(ЗначениеЗаполнено(СтрокаЗаписей), "&", "?")
- + "records[]="
- + OPI_Инструменты.ЧислоВСтроку(Запись);
- КонецЦикла;
-
- URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + СтрокаЗаписей;
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСКомментариями
-
-// Получить комментарии
-// Получает список комментариев к записи в таблице
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// База - Строка - Идентификатор базы данных - base
-// Таблица - Строка - Идентификатор таблицы - table
-// Запись - Строка - Идентификатор записи в таблице - record
-// Отступ - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция ПолучитьКомментарии(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Отступ = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
-
- URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура();
- OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Создать комментарий
-// Создает комментарий к записи в таблице
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// База - Строка - Идентификатор базы данных - base
-// Таблица - Строка - Идентификатор таблицы - table
-// Запись - Строка - Идентификатор записи в таблице - record
-// Текст - Строка - Текст комментария - text
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция СоздатьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Текст) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
-
- URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура();
- OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Изменить комментарий
-// Изменяет текст существующего комментария
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// База - Строка - Идентификатор базы данных - base
-// Таблица - Строка - Идентификатор таблицы - table
-// Запись - Строка - Идентификатор записи в таблице - record
-// Комментарий - Строка - Идентификатор комментария - comment
-// Текст - Строка - Новый текст комментария - text
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция ИзменитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий, Знач Текст) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий);
-
- URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий;
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура();
- OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить комментарий
-// Удаляет комментарий к записи таблицы
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// База - Строка - Идентификатор базы данных - base
-// Таблица - Строка - Идентификатор таблицы - table
-// Запись - Строка - Идентификатор записи в таблице - record
-// Комментарий - Строка - Идентификатор комментария - comment
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
-Функция УдалитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий);
-
- URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий;
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ПолучитьЗаголовокАвторизации(Знач Токен)
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- Заголовки = Новый Соответствие;
- Заголовки.Вставить("Authorization", "Bearer " + Токен);
-
- Возврат Заголовки;
-
-КонецФункции
-
-Функция СформироватьОписаниеТаблицы(Знач Наименование, Знач МассивПолей, Знач Описание = "")
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПолей);
-
- ОписаниеТаблицы = Новый Структура("name,fields", Наименование, МассивПолей);
-
- OPI_Инструменты.ДобавитьПоле("description", Описание, "Строка", ОписаниеТаблицы);
-
- Возврат ОписаниеТаблицы;
-
-КонецФункции
-
-Функция ОписаниеПримитивногоПоля(Знач Наименование, Знач Тип, Знач Опции = "")
-
- СтруктураПоля = Новый Структура();
- OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка" , СтруктураПоля);
- OPI_Инструменты.ДобавитьПоле("type" , Тип , "Строка" , СтруктураПоля);
- OPI_Инструменты.ДобавитьПоле("options", Опции , "Коллекция", СтруктураПоля);
-
- Возврат СтруктураПоля;
-
-КонецФункции
-
-Процедура ДобавитьОписаниеДанных(Знач Данные, Параметры)
-
- Если ТипЗнч(Данные) = Тип("Массив") Тогда
-
- МассивОтправки = Новый Массив;
-
- Для Каждого ОписаниеЗаписи Из Данные Цикл
- МассивОтправки.Добавить(Новый Структура("fields", ОписаниеЗаписи));
- КонецЦикла;
-
- OPI_Инструменты.ДобавитьПоле("records", МассивОтправки, "Массив", Параметры);
-
- Иначе
-
- OPI_Инструменты.ДобавитьПоле("fields", Данные, "Коллекция", Параметры);
-
- КонецЕсли;
-
-КонецПроцедуры
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_Airtable.os
+// Библиотека: Airtable
+// Команда CLI: airtable
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:IncorrectLineBreak-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область РаботаСБазами
+
+// Получить список баз
+// Получает список доступных баз
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Отступ - Строка - Идентификатор следующей страницы списка баз из перыдудщего запроса - offset
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция ПолучитьСписокБаз(Знач Токен, Знач Отступ = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Отступ);
+
+ URL = "https://api.airtable.com/v0/meta/bases";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+ Параметры = Новый Структура;
+
+ OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить таблицы базы
+// Получает схему таблиц базы
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// База - Строка - Идентификатор базы - base
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция ПолучитьТаблицыБазы(Знач Токен, Знач База) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+
+ URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Ответ = OPI_Инструменты.Get(URL, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Создать базу
+// Создает новую базу данных
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// РабочееПространство - Строка - Идентификатор рабочего пространства - ws
+// Наименование - Строка - Наименование новой базы - title
+// КоллекцияТаблиц - Соответствие Из КлючИЗначение - Описание таблиц: Ключ > имя, Значение > массив полей - tablesdata
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция СоздатьБазу(Знач Токен, Знач РабочееПространство, Знач Наименование, Знач КоллекцияТаблиц) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(КоллекцияТаблиц);
+
+ Если Не ТипЗнч(КоллекцияТаблиц) = Тип("Структура")
+ И Не ТипЗнч(КоллекцияТаблиц) = Тип("Соответствие") Тогда
+
+ ВызватьИсключение "Ошибка в данных коллекции таблиц";
+
+ КонецЕсли;
+
+ URL = "https://api.airtable.com/v0/meta/bases";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+ МассивТаблиц = Новый Массив;
+
+ Для Каждого Таблица Из КоллекцияТаблиц Цикл
+
+ Описание = СформироватьОписаниеТаблицы(Таблица.Ключ, Таблица.Значение);
+ МассивТаблиц.Добавить(Описание);
+
+ КонецЦикла;
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("name" , Наименование , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("tables" , МассивТаблиц , "Массив", Параметры);
+ OPI_Инструменты.ДобавитьПоле("workspaceId", РабочееПространство, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСТаблицами
+
+// Создать таблицу
+// Создает новую таблицу в базе
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// База - Строка - Идентификатор базы - base
+// Наименование - Строка - Наименование новой таблицы - title
+// МассивПолей - Массив Из Структура - Массив описаний полей - fieldsdata
+// Описание - Строка - Описание таблицы - description
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция СоздатьТаблицу(Знач Токен, Знач База, Знач Наименование, Знач МассивПолей, Знач Описание = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+
+ URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+ Параметры = СформироватьОписаниеТаблицы(Наименование, МассивПолей, Описание);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Изменить таблицу
+// Изменяет наименование и|или описание базы
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// База - Строка - Идентификатор базы - base
+// Таблица - Строка - Идентификатор таблицы - table
+// Наименование - Строка - Новое наименование - title
+// Описание - Строка - Новое описание - description
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция ИзменитьТаблицу(Знач Токен, Знач База, Знач Таблица, Знач Наименование = "", Знач Описание = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+
+ URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица;
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+ Параметры = Новый Структура;
+
+ OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("description", Описание , "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСПолями
+
+// Создать поле
+// Создет новое поле в таблице
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// База - Строка - Идентификатор базы - base
+// Таблица - Строка - Идентификатор таблицы - table
+// СтруктураПоля - Структура Из КлючИЗначение - Описание нового поля - fielddata
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция СоздатьПоле(Знач Токен, Знач База, Знач Таблица, Знач СтруктураПоля) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СтруктураПоля);
+
+ Если Не ТипЗнч(СтруктураПоля) = Тип("Структура")
+ И Не ТипЗнч(СтруктураПоля) = Тип("Соответствие") Тогда
+
+ ВызватьИсключение "Ошибка в данных описания поля";
+
+ КонецЕсли;
+
+ URL = "https://api.airtable.com/v0/meta/bases/" + База + "/tables/" + Таблица + "/fields";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Ответ = OPI_Инструменты.Post(URL, СтруктураПоля, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Изменить поле
+// Изменяет имя и|или описание существующего поля таблицы
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// База - Строка - Идентификатор базы База - base
+// Таблица - Строка - Идентификатор таблицы - table
+// Поле - Строка - Идентификатор поля - field
+// Наименование - Строка - Новое наименование - title
+// Описание - Строка - Новое описание - description
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция ИзменитьПоле(Знач Токен, Знач База, Знач Таблица, Знач Поле, Знач Наименование = "", Знач Описание = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Поле);
+
+ URL = "https://api.airtable.com/v0/meta/bases/"
+ + База
+ + "/tables/"
+ + Таблица
+ + "/fields/"
+ + Поле;
+
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура();
+ OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("description", Описание , "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить поле (строковое)
+// Получает описание поля строкового типа
+//
+// Параметры:
+// Наименование - Строка - Наименование нового поля - title
+//
+// Возвращаемое значение:
+// Структура - Описание поля
+Функция ПолучитьПолеСтроковое(Знач Наименование) Экспорт
+ Возврат ОписаниеПримитивногоПоля(Наименование, "richText");
+КонецФункции
+
+// Получить поле (числовое)
+// Получает описание поля числового типа
+//
+// Параметры:
+// Наименование - Строка - Наименование нового поля - title
+// Точность - Число,Строка - Число знаков после запятой - precision
+//
+// Возвращаемое значение:
+// Структура - Описание поля
+Функция ПолучитьПолеНомера(Знач Наименование, Знач Точность = 0) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьЧисло(Точность);
+
+ СтруктураОпций = Новый Структура("precision", Точность);
+ Возврат ОписаниеПримитивногоПоля(Наименование, "number", СтруктураОпций);
+
+КонецФункции
+
+// Получить поле (файл)
+// Получает описание поля файлового типа
+//
+// Параметры:
+// Наименование - Строка - Наименование поля - title
+//
+// Возвращаемое значение:
+// Структура - Описание поля
+Функция ПолучитьПолеВложения(Знач Наименование) Экспорт
+ Возврат ОписаниеПримитивногоПоля(Наименование, "multipleAttachments");
+КонецФункции
+
+// Получить поле (флажок)
+// Получает описание поля типа булево
+//
+// Параметры:
+// Наименование - Строка - Наименование поля - title
+//
+// Возвращаемое значение:
+// Структура - Описание поля
+Функция ПолучитьПолеФлажка(Знач Наименование) Экспорт
+
+ СтруктураОпций = Новый Структура("icon,color", "check", "yellowBright");
+ Возврат ОписаниеПримитивногоПоля(Наименование, "checkbox", СтруктураОпций);
+
+КонецФункции
+
+// Получить поле (дата)
+// Получает описание поля типа дата
+//
+// Параметры:
+// Наименование - Строка - Наименование поля - title
+//
+// Возвращаемое значение:
+// Структура - Описание поля
+Функция ПолучитьПолеДаты(Знач Наименование) Экспорт
+
+ СтруктураФормата = Новый Структура("format,name", "YYYY-MM-DD", "iso");
+ СтруктураОпций = Новый Структура("dateFormat", СтруктураФормата);
+
+ Возврат ОписаниеПримитивногоПоля(Наименование, "date", СтруктураОпций);
+
+КонецФункции
+
+// Получить поле (email)
+// Получает описание поля с электронной почтой
+//
+// Параметры:
+// Наименование - Строка - Наименование поля - title
+//
+// Возвращаемое значение:
+// Структура - Описание поля
+Функция ПолучитьПолеПочты(Знач Наименование) Экспорт
+ Возврат ОписаниеПримитивногоПоля(Наименование, "email");
+КонецФункции
+
+// Получить поле (телефон)
+// Получает описание поля с номером телефона
+//
+// Параметры:
+// Наименование - Строка - Наименование поля - title
+//
+// Возвращаемое значение:
+// Структура - Описание поля
+Функция ПолучитьПолеТелефона(Знач Наименование) Экспорт
+ Возврат ОписаниеПримитивногоПоля(Наименование, "phoneNumber");
+КонецФункции
+
+// Получить поле (url)
+// Получает описание поля с URL
+//
+// Параметры:
+// Наименование - Строка - Наименование поля - title
+//
+// Возвращаемое значение:
+// Структура - Описание поля
+Функция ПолучитьПолеСсылки(Знач Наименование) Экспорт
+ Возврат ОписаниеПримитивногоПоля(Наименование, "url");
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСЗаписями
+
+// Получить список записей
+// Получает список записей выбранной таблицы
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// База - Строка - Идентификатор базы данных - base
+// Таблица - Строка - Идентификатор таблицы - table
+// Отступ - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция ПолучитьСписокЗаписей(Знач Токен, Знач База, Знач Таблица, Знач Отступ = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+
+ URL = "https://api.airtable.com/v0/" + База + "/" + Таблица;
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура();
+ OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить запись
+// Получает данные строки таблицы по идентификатору
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// База - Строка - Идентификатор базы данных - base
+// Таблица - Строка - Идентификатор таблицы - table
+// Запись - Строка - Идентификатор записи в таблице - record
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция ПолучитьЗапись(Знач Токен, Знач База, Знач Таблица, Знач Запись) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
+
+ URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись;
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Ответ = OPI_Инструменты.Get(URL, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Создать записи
+// Создает одну или массив записей по описанию или массиву описаний значений полей
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// База - Строка - Идентификатор базы данных - base
+// Таблица - Строка - Идентификатор таблицы - table
+// Данные - Структура, Массив из Структура - Набор или массив наборов пар Ключ : Значение > Поле : Показатель - data
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция СоздатьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Данные) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные);
+
+ Параметры = Новый Структура();
+ ДобавитьОписаниеДанных(Данные, Параметры);
+
+ URL = "https://api.airtable.com/v0/" + База + "/" + Таблица;
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить записи
+// Удаляет одну или массив записей по идентификаторам
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// База - Строка - Идентификатор базы данных - base
+// Таблица - Строка - Идентификатор таблицы - table
+// Записи - Строка, Массив из Строка - Идентификатор или массив индентификаторов записей - records
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция УдалитьЗаписи(Знач Токен, Знач База, Знач Таблица, Знач Записи) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+ OPI_ПреобразованиеТипов.ПолучитьМассив(Записи);
+
+ СтрокаЗаписей = "";
+
+ Для Каждого Запись Из Записи Цикл
+ СтрокаЗаписей = СтрокаЗаписей
+ + ?(ЗначениеЗаполнено(СтрокаЗаписей), "&", "?")
+ + "records[]="
+ + OPI_Инструменты.ЧислоВСтроку(Запись);
+ КонецЦикла;
+
+ URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + СтрокаЗаписей;
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСКомментариями
+
+// Получить комментарии
+// Получает список комментариев к записи в таблице
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// База - Строка - Идентификатор базы данных - base
+// Таблица - Строка - Идентификатор таблицы - table
+// Запись - Строка - Идентификатор записи в таблице - record
+// Отступ - Строка - Иднтификатор следующей страницы данных из предыдущего запроса - offset
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция ПолучитьКомментарии(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Отступ = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
+
+ URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура();
+ OPI_Инструменты.ДобавитьПоле("offset", Отступ, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Создать комментарий
+// Создает комментарий к записи в таблице
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// База - Строка - Идентификатор базы данных - base
+// Таблица - Строка - Идентификатор таблицы - table
+// Запись - Строка - Идентификатор записи в таблице - record
+// Текст - Строка - Текст комментария - text
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция СоздатьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Текст) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
+
+ URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура();
+ OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Изменить комментарий
+// Изменяет текст существующего комментария
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// База - Строка - Идентификатор базы данных - base
+// Таблица - Строка - Идентификатор таблицы - table
+// Запись - Строка - Идентификатор записи в таблице - record
+// Комментарий - Строка - Идентификатор комментария - comment
+// Текст - Строка - Новый текст комментария - text
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция ИзменитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий, Знач Текст) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий);
+
+ URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий;
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура();
+ OPI_Инструменты.ДобавитьПоле("text", Текст, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить комментарий
+// Удаляет комментарий к записи таблицы
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// База - Строка - Идентификатор базы данных - base
+// Таблица - Строка - Идентификатор таблицы - table
+// Запись - Строка - Идентификатор записи в таблице - record
+// Комментарий - Строка - Идентификатор комментария - comment
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Airtable
+Функция УдалитьКомментарий(Знач Токен, Знач База, Знач Таблица, Знач Запись, Знач Комментарий) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Таблица);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Запись);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий);
+
+ URL = "https://api.airtable.com/v0/" + База + "/" + Таблица + "/" + Запись + "/comments/" + Комментарий;
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ПолучитьЗаголовокАвторизации(Знач Токен)
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ Заголовки = Новый Соответствие;
+ Заголовки.Вставить("Authorization", "Bearer " + Токен);
+
+ Возврат Заголовки;
+
+КонецФункции
+
+Функция СформироватьОписаниеТаблицы(Знач Наименование, Знач МассивПолей, Знач Описание = "")
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПолей);
+
+ ОписаниеТаблицы = Новый Структура("name,fields", Наименование, МассивПолей);
+
+ OPI_Инструменты.ДобавитьПоле("description", Описание, "Строка", ОписаниеТаблицы);
+
+ Возврат ОписаниеТаблицы;
+
+КонецФункции
+
+Функция ОписаниеПримитивногоПоля(Знач Наименование, Знач Тип, Знач Опции = "")
+
+ СтруктураПоля = Новый Структура();
+ OPI_Инструменты.ДобавитьПоле("name" , Наименование, "Строка" , СтруктураПоля);
+ OPI_Инструменты.ДобавитьПоле("type" , Тип , "Строка" , СтруктураПоля);
+ OPI_Инструменты.ДобавитьПоле("options", Опции , "Коллекция", СтруктураПоля);
+
+ Возврат СтруктураПоля;
+
+КонецФункции
+
+Процедура ДобавитьОписаниеДанных(Знач Данные, Параметры)
+
+ Если ТипЗнч(Данные) = Тип("Массив") Тогда
+
+ МассивОтправки = Новый Массив;
+
+ Для Каждого ОписаниеЗаписи Из Данные Цикл
+ МассивОтправки.Добавить(Новый Структура("fields", ОписаниеЗаписи));
+ КонецЦикла;
+
+ OPI_Инструменты.ДобавитьПоле("records", МассивОтправки, "Массив", Параметры);
+
+ Иначе
+
+ OPI_Инструменты.ДобавитьПоле("fields", Данные, "Коллекция", Параметры);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_Dropbox.os b/ru/OInt/core/Modules/OPI_Dropbox.os
index 86abd31dc9..ec50f865c9 100644
--- a/ru/OInt/core/Modules/OPI_Dropbox.os
+++ b/ru/OInt/core/Modules/OPI_Dropbox.os
@@ -1,961 +1,961 @@
-// Расположение OS: ./OInt/core/Modules/OPI_Dropbox.os
-// Библиотека: Dropbox
-// Команда CLI: dropbox
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:IncorrectLineBreak-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область АккаунтИАвторизация
-
-// Получить ссылку авторизации
-// Генерирует ссылку авторизации для перехода в браузере
-//
-// Параметры:
-// КлючПриложения - Строка - Ключ приложения - appkey
-//
-// Возвращаемое значение:
-// Строка - URL для перехода в браузере
-Функция ПолучитьСсылкуАвторизации(Знач КлючПриложения) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(КлючПриложения);
- Возврат "https://www.dropbox.com/oauth2/authorize?client_id="
- + КлючПриложения
- + "&response_type=code&token_access_type=offline";
-
-КонецФункции
-
-// Получить токен
-// Полеучает токен на основе кода со страницы ПолучитьСсылкуАвторизации
-//
-// Параметры:
-// КлючПриложения - Строка - Ключ приложения - appkey
-// СекретПриложения - Строка - Секрет приложения - appsecret
-// Код - Строка - Код со страницы авторизации - code
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ПолучитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач Код) Экспорт
-
- URL = "https://api.dropbox.com/oauth2/token";
- ТипДанных = "application/x-www-form-urlencoded; charset=utf-8";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("code" , Код , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("grant_type", "authorization_code", "Строка", Параметры);
-
- СтруктураURL = OPI_Инструменты.РазбитьURL(URL);
- Сервер = СтруктураURL["Сервер"];
- Адрес = СтруктураURL["Адрес"];
-
- Запрос = OPI_Инструменты.СоздатьЗапрос(Адрес, , ТипДанных);
- Соединение = OPI_Инструменты.СоздатьСоединение(Сервер, КлючПриложения, СекретПриложения);
-
- СтрокаПараметров = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
- Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
-
- Запрос.УстановитьТелоИзСтроки(Данные);
-
- Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
- OPI_Инструменты.ОбработатьОтвет(Ответ);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Обновить токен
-// Получает новый токен на основе рефреш токена
-//
-// Параметры:
-// КлючПриложения - Строка - Ключ приложения - appkey
-// СекретПриложения - Строка - Секрет приложения - appsecret
-// РефрешТокен - Строка - Рефреш токен - refresh
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ОбновитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач РефрешТокен) Экспорт
-
- Строка_ = "Строка";
- URL = "https://api.dropbox.com/oauth2/token";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("refresh_token", РефрешТокен , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("grant_type" , "refresh_token" , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("client_id" , КлючПриложения , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("client_secret", СекретПриложения, Строка_, Параметры);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, , Ложь);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить информацию об аккаунте
-// Получает информацию об аккаунте
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Аккаунт - Строка - ID аккаунта. Текущий аккаунт токена, если не заполнено - account
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ПолучитьИнформациюОбАккаунте(Знач Токен, Знач Аккаунт = "") Экспорт
-
- Если ЗначениеЗаполнено(Аккаунт) Тогда
- Результат = ПолучитьАккаунт(Токен, Аккаунт);
- Иначе
- Результат = ПолучитьСвойАккаунт(Токен);
- КонецЕсли;
-
- Возврат Результат;
-
-КонецФункции
-
-// Получить данные использования пространства
-// Получает информацию о количестве использованного дискового пространства
-//
-// Параметры:
-// Токен - Строка - Токен - token
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ПолучитьДанныеИспользованияПространства(Знач Токен) Экспорт
-
- URL = "https://api.dropboxapi.com/2/users/get_space_usage";
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
- Ответ = OPI_Инструменты.PostBinary(URL
- , ПолучитьДвоичныеДанныеИзСтроки("null")
- , Заголовки
- ,
- , "text/plain; charset=dropbox-cors-hack");
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСФайламиИКаталогами
-
-// Получить информацию об объекте
-// Получает информацию о файле или каталоге
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь к объекту - path
-// Подробно - Булево - Добавляет дополнительные поля информации для медиафайлов - detail
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Путь, Знач Подробно = Ложь) Экспорт
-
- URL = "https://api.dropboxapi.com/2/files/get_metadata";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("include_media_info", Подробно, "Булево", Параметры);
-
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить список файлов папки
-// Получает список первых файлов каталога или продолжает получение следующих при указании курсора
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь к каталогу. Необязателен, если указан курсор - path
-// Подробно - Булево - Добавляет дополнительные поля информации для медиафайлов - detail
-// Курсор - Строка - Курсор из предыдущего запроса для получения следующего набора файлов - cursor
-//
-// Возвращаемое значение:
-// HTTPОтвет - Получить список файлов папки
-Функция ПолучитьСписокФайловПапки(Знач Токен, Знач Путь = "", Знач Подробно = Ложь, Знач Курсор = "") Экспорт
-
- Если Не ЗначениеЗаполнено(Курсор) Тогда
-
- URL = "https://api.dropboxapi.com/2/files/list_folder";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("include_media_info", Подробно , "Булево", Параметры);
-
- Иначе
-
- URL = "https://api.dropboxapi.com/2/files/list_folder/continue";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("cursor", Курсор, "Строка", Параметры);
-
- КонецЕсли;
-
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить превью
-// Получает PDF или HTML превью объекта (только для токументов)
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь к объекту - path
-//
-// Возвращаемое значение:
-// ДвоичныеДанные - превью документа
-Функция ПолучитьПревью(Знач Токен, Знач Путь) Экспорт
-
- URL = "https://content.dropboxapi.com/2/files/get_preview";
- Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Загрузить файл
-// Загружает файл на облачный диск
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Файл - Строка, ДвоичныеДанные - Данные файл для загрузки - file
-// Путь - Строка - Путь сохранения на Dropbox - path
-// Перезаписывать - Булево - Перезаписывать файл при конфликте путей - overwrite
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Путь, Знач Перезаписывать = Ложь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
- OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
-
- Режим = ?(Перезаписывать, "overwrite", "add");
- Размер = Файл.Размер();
- Граница = 100000000;
-
- Если Размер > Граница Тогда
- Ответ = ЗагрузитьБольшойФайл(Токен, Файл, Путь, Режим);
- Иначе
- Ответ = ЗагрузитьМалыйФайл(Токен, Файл, Путь, Режим);
- КонецЕсли;
-
- Возврат Ответ;
-
-КонецФункции
-
-// Загрузить файл по URL
-// Загружает файл на облачный диск, получая его по указанному URL
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// URLФайла - Строка - URL источник файла - url
-// Путь - Строка - Путь сохранения на Dropbox - path
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ЗагрузитьФайлПоURL(Знач Токен, Знач URLФайла, Знач Путь) Экспорт
-
- URL = "https://api.dropboxapi.com/2/files/save_url";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("path", Путь , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("url" , URLФайла , "Строка", Параметры);
-
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить статус загрузки по URL
-// Получает статус загрузки файла по URL
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDРаботы - Строка - ID асинхронной работы из ответа ЗагрузитьФайлПоURL - job
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ПолучитьСтатусЗагрузкиПоURL(Знач Токен, Знач IDРаботы) Экспорт
-
- URL = "https://api.dropboxapi.com/2/files/save_url/check_job_status";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("async_job_id", IDРаботы, "Строка", Параметры);
-
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить объект
-// Удаляет объект с облачного диска
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь к объекту удаления - path
-// БезВозвратно - Строка - Удалить объект без возможности востановления - permanently
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция УдалитьОбъект(Знач Токен, Знач Путь, Знач Безвозвратно = Ложь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьБулево(Безвозвратно);
-
- Если Безвозвратно Тогда
- URL = "https://api.dropboxapi.com/2/files/permanently_delete";
- Иначе
- URL = "https://api.dropboxapi.com/2/files/delete_v2";
- КонецЕсли;
-
- Ответ = ОбработатьОбъект(Токен, URL, Путь);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Копировать объект
-// Копирует файл или каталог по выбранному пути
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Откуда - Строка - Путь к объекту оригинала - form
-// Куда - Строка - Целевой путь для нового объекта - to
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция КопироватьОбъект(Знач Токен, Знач Откуда, Знач Куда) Экспорт
-
- URL = "https://api.dropboxapi.com/2/files/copy_v2";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("from_path", Откуда, "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("to_path" , Куда , "Строка", Параметры);
-
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Переместить объект
-// Перемещает объект по выбранному пути
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Откуда - Строка - Путь к объекту оригинала - form
-// Куда - Строка - Целевой путь для нового объекта - to
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ПереместитьОбъект(Знач Токен, Знач Откуда, Знач Куда) Экспорт
-
- URL = "https://api.dropboxapi.com/2/files/move_v2";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("from_path", Откуда, "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("to_path" , Куда , "Строка", Параметры);
-
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Создать папку
-// Создает пустой каталог по выбранному пути
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Целевой путь создания каталога - path
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция СоздатьПапку(Знач Токен, Знач Путь) Экспорт
-
- URL = "https://api.dropboxapi.com/2/files/create_folder_v2";
- Ответ = ОбработатьОбъект(Токен, URL, Путь);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Скачать файл
-// Скачивает файл по указанному пути или ID
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь или ID файла - path
-//
-// Возвращаемое значение:
-// ДвоичныеДанные - двоичные данные файла
-Функция СкачатьФайл(Знач Токен, Знач Путь) Экспорт
-
- URL = "https://content.dropboxapi.com/2/files/download";
- Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Скачать папку
-// Скачивает zip архив с содержимым указанного каталога
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь или ID каталога - path
-//
-// Возвращаемое значение:
-// ДвоичныеДанные - двоичные данные zip архива с содержимым каталога
-Функция СкачатьПапку(Знач Токен, Знач Путь) Экспорт
-
- URL = "https://content.dropboxapi.com/2/files/download_zip";
- Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить список версий объекта
-// Получает список версий (ревизий) объекта
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь к объекту - path
-// Количество - Строка, Число - Число последних версий объекта для отображения - amount
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ПолучитьСписокВерсийОбъекта(Знач Токен, Знач Путь, Знач Количество = 10) Экспорт
-
- URL = "https://api.dropboxapi.com/2/files/list_revisions";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("limit", Количество, "Число" , Параметры);
-
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Восстановить объект к версии
-// Восстанавливает состояние объекта к необходимой версии (ревизии)
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь к объекту - path
-// Версия - Строка - ID версии (ревизии) для востановления - rev
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ВосстановитьОбъектКВерсии(Знач Токен, Знач Путь, Знач Версия) Экспорт
-
- URL = "https://api.dropboxapi.com/2/files/restore";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("path", Путь , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("rev" , Версия, "Строка", Параметры);
-
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСТегами
-
-// Получить список тегов
-// Получает список тегов выбранных файлов
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Пути - Строка, Массив Из Строка - Путь или набору путей к файлам - paths
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ПолучитьСписокТегов(Знач Токен, Знач Пути) Экспорт
-
- URL = "https://api.dropboxapi.com/2/files/tags/get";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("paths", Пути, "Массив", Параметры);
-
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Добавить тег
-// Добавляет новый текстовый тег к файлу или каталогу
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь к объекту, для которого необходимо создать тег - path
-// Тег - Строка - Текст тега - tag
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ДобавитьТег(Знач Токен, Знач Путь, Знач Тег) Экспорт
-
- Возврат ОбработатьТег(Токен, Путь, Тег);
-
-КонецФункции
-
-// Удалить тег
-// Удаляет текстовый тег файла или каталога
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь к объекту, тег которого необходимо удалить - path
-// Тег - Строка - Текст тега - tag
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция УдалитьТег(Знач Токен, Знач Путь, Знач Тег) Экспорт
-
- Возврат ОбработатьТег(Токен, Путь, Тег, Истина);
-
-КонецФункции
-
-#КонецОбласти
-
-#Область НастройкиСовместногоДоступа
-
-// Опубликовать папку
-// Переводит каталог в режим публичного доступа
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь к целевому каталогу - path
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ОпубликоватьПапку(Знач Токен, Знач Путь) Экспорт
-
- URL = "https://api.dropboxapi.com/2/sharing/share_folder";
- Ответ = ОбработатьОбъект(Токен, URL, Путь);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Отменить публикацию папки
-// Отменяет режим общего доступа для каталога
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDПапки - Строка - ID публичного каталога (shared folder ID) - folder
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ОтменитьПубликациюПапки(Знач Токен, Знач IDПапки) Экспорт
-
- URL = "https://api.dropboxapi.com/2/sharing/unshare_folder";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("shared_folder_id", IDПапки, "Строка", Параметры);
-
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Добавить пользователя к файлу
-// Определяет доступ к файлу для стороннего пользователя
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDФайла - Строка - ID файла, к которому предоставляется доступ - fileid
-// АдресаПочты - Строка, Массив Из Строка - Список адресов почты добавляемых пользователей - emails
-// ТолькоПросмотр - Булево - Запрещает редактирование файла для стороннего пользователя - readonly
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ДобавитьПользователейКФайлу(Знач Токен, Знач IDФайла, Знач АдресаПочты, Знач ТолькоПросмотр = Истина) Экспорт
-
- Строка_ = "Строка";
-
- OPI_ПреобразованиеТипов.ПолучитьМассив(АдресаПочты);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла);
- OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоПросмотр);
-
- Если Не СтрНачинаетсяС(IDФайла, "id:") Тогда
- IDФайла = "id:" + IDФайла;
- КонецЕсли;
-
- URL = "https://api.dropboxapi.com/2/sharing/add_file_member";
-
- МассивПользователей = Новый Массив;
-
- Для Каждого Адрес Из АдресаПочты Цикл
-
- ДанныеПользователя = Новый Соответствие;
- OPI_Инструменты.ДобавитьПоле(".tag" , "email", Строка_, ДанныеПользователя);
- OPI_Инструменты.ДобавитьПоле("email", Адрес , Строка_, ДанныеПользователя);
-
- МассивПользователей.Добавить(ДанныеПользователя);
-
- КонецЦикла;
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("file" , IDФайла , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("members", МассивПользователей , "Массив", Параметры);
-
- Режим = ?(ТолькоПросмотр, "viewer", "editor");
-
- OPI_Инструменты.ДобавитьПоле("access_level", Режим , Строка_, Параметры);
-
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Добавить пользователей к папке
-// Предоставляет стороннии пользователям доступ к каталогу
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDПапки - Строка - ID публичного каталога (shared folder ID) - folder
-// АдресаПочты - Строка, Массив Из Строка - Список адресов почты добавляемых пользователей - emails
-// ТолькоПросмотр - Булево - Запрещает редактирование файла для стороннего пользователя - readonly
-//
-// Возвращаемое значение:
-// Неопределено - пустой ответ
-Функция ДобавитьПользователейКПапке(Знач Токен, Знач IDПапки, Знач АдресаПочты, Знач ТолькоПросмотр = Истина) Экспорт
-
- Строка_ = "Строка";
-
- OPI_ПреобразованиеТипов.ПолучитьМассив(АдресаПочты);
- OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоПросмотр);
- Режим = ?(ТолькоПросмотр, "viewer", "editor");
-
- URL = "https://api.dropboxapi.com/2/sharing/add_folder_member";
-
- МассивПользователей = Новый Массив;
-
- Для Каждого Адрес Из АдресаПочты Цикл
-
- ДанныеПользователя = Новый Соответствие;
- OPI_Инструменты.ДобавитьПоле(".tag" , "email", Строка_, ДанныеПользователя);
- OPI_Инструменты.ДобавитьПоле("email", Адрес , Строка_, ДанныеПользователя);
-
- СтруктураПользователя = Новый Структура("member,access_level", ДанныеПользователя, Режим);
-
- МассивПользователей.Добавить(СтруктураПользователя);
-
- КонецЦикла;
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("shared_folder_id", IDПапки , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("members" , МассивПользователей , "Массив", Параметры);
-
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить статус асинхронного изменения
-// Получает статус асинхронной работы по изменению доступов
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDРаботы - Строка - ID асинхронной работы - job
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ПолучитьСтатусАсинхронногоИзменения(Знач Токен, Знач IDРаботы) Экспорт
-
- URL = "https://api.dropboxapi.com/2/sharing/check_job_status";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("async_job_id", IDРаботы, "Строка", Параметры);
-
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Отменить публикацию файла
-// Запрещает доступ к файлу для внешних пользователей
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDФайла - Строка - ID файла, к которому предоставляется доступ - fileid
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
-Функция ОтменитьПубликациюФайла(Знач Токен, Знач IDФайла) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла);
-
- Если Не СтрНачинаетсяС(IDФайла, "id:") Тогда
- IDФайла = "id:" + IDФайла;
- КонецЕсли;
-
- URL = "https://api.dropboxapi.com/2/sharing/unshare_file";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("file", IDФайла, "Строка", Параметры);
-
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ОбработатьОбъект(Знач Токен, Знач URL, Знач Путь, Знач ВЗаголовках = Ложь)
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Параметры);
-
- Если ВЗаголовках Тогда
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
- Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки);
- Иначе
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
- КонецЕсли;
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ОбработатьТег(Знач Токен, Знач Путь, Знач Тег, Знач ЭтоУдаление = Ложь)
-
- Если ЭтоУдаление Тогда
- URL = "https://api.dropboxapi.com/2/files/tags/remove";
- Иначе
- URL = "https://api.dropboxapi.com/2/files/tags/add";
- КонецЕсли;
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("path" , Путь, "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("tag_text" , Тег , "Строка", Параметры);
-
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ПолучитьЗаголовкиЗапроса(Знач Токен, Знач Параметры = "")
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- Заголовки = Новый Соответствие;
- Заголовки.Вставить("Authorization" , "Bearer " + Токен);
-
- Если ЗначениеЗаполнено(Параметры) Тогда
-
- JSON = OPI_Инструменты.JSONСтрокой(Параметры, "Нет");
- JSON = СтрЗаменить(JSON, Символы.ВК + Символы.ПС, "");
-
- Заголовки.Вставить("Dropbox-API-Arg", JSON);
-
- КонецЕсли;
-
- Возврат Заголовки;
-
-КонецФункции
-
-Функция ЗагрузитьБольшойФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим)
-
- URL = "https://content.dropboxapi.com/2/files/upload_session/append_v2";
-
- РазмерЧасти = 100000000;
- ТекущаяПозиция = 0;
- ПрочитаноБайт = 0;
- ОбщийРазмер = Файл.Размер();
- Сессия = ОткрытьСессию(Токен);
-
- Пока ПрочитаноБайт < ОбщийРазмер Цикл
-
- Отступ = ТекущаяПозиция;
- Курсор = Новый Структура("offset,session_id", Отступ, Сессия);
-
- Параметры = Новый Структура("cursor", Курсор);
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
-
- ЧтениеДанных = Новый ЧтениеДанных(Файл);
- ПрочитаноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция);
- Результат = ЧтениеДанных.Прочитать(РазмерЧасти);
- ТекущиеДанные = Результат.ПолучитьДвоичныеДанные();
- РазмерТекущих = ТекущиеДанные.Размер();
- СледующаяПозиция = ТекущаяПозиция + РазмерТекущих;
-
- Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда
- Прервать;
- КонецЕсли;
-
- Ответ = OPI_Инструменты.PostBinary(URL, ТекущиеДанные, Заголовки);
-
- ТекущаяПозиция = СледующаяПозиция;
-
- КБайт = 1024;
- МБайт = КБайт * КБайт;
- Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт));
-
- ВыполнитьСборкуМусора();
- ОсвободитьОбъект(ТекущиеДанные);
-
- КонецЦикла;
-
- Ответ = ЗакрытьСессию(Токен, Путь, Режим, ОбщийРазмер, Сессия);
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ЗагрузитьМалыйФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим)
-
- Булево_ = "Булево";
- Строка_ = "Строка";
- URL = "https://content.dropboxapi.com/2/files/upload";
-
- Параметры = Новый Структура;
-
- OPI_Инструменты.ДобавитьПоле("autorename" , Ложь , Булево_, Параметры);
- OPI_Инструменты.ДобавитьПоле("mode" , Режим, Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("mute" , Ложь , Булево_, Параметры);
- OPI_Инструменты.ДобавитьПоле("path" , Путь , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("strict_conflict", Ложь , Булево_, Параметры);
-
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
-
- Ответ = OPI_Инструменты.PostBinary(URL, Файл, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ОткрытьСессию(Знач Токен)
-
- SessionId = "session_id";
- URL = "https://content.dropboxapi.com/2/files/upload_session/start";
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
- Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки);
-
- Возврат Ответ[SessionId];
-
-КонецФункции
-
-Функция ЗакрытьСессию(Знач Токен, Знач Путь, Знач Режим, Знач ОбщийРазмер, Знач Сессия)
-
- URL = "https://content.dropboxapi.com/2/files/upload_session/finish";
-
- Коммит = Новый Структура();
- OPI_Инструменты.ДобавитьПоле("mode", Режим, "Строка", Коммит);
- OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Коммит);
-
- Курсор = Новый Структура("offset,session_id", ОбщийРазмер, Сессия);
-
- Параметры = Новый Структура("commit,cursor", Коммит, Курсор);
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
-
- Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ПолучитьАккаунт(Знач Токен, Знач Аккаунт)
-
- URL = "https://api.dropboxapi.com/2/users/get_account";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("account_id", Аккаунт, "Строка", Параметры);
-
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ПолучитьСвойАккаунт(Знач Токен)
-
- URL = "https://api.dropboxapi.com/2/users/get_current_account";
- Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
-
- Ответ = OPI_Инструменты.PostBinary(URL
- , ПолучитьДвоичныеДанныеИзСтроки("null")
- , Заголовки
- ,
- , "text/plain; charset=dropbox-cors-hack");
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_Dropbox.os
+// Библиотека: Dropbox
+// Команда CLI: dropbox
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:IncorrectLineBreak-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область АккаунтИАвторизация
+
+// Получить ссылку авторизации
+// Генерирует ссылку авторизации для перехода в браузере
+//
+// Параметры:
+// КлючПриложения - Строка - Ключ приложения - appkey
+//
+// Возвращаемое значение:
+// Строка - URL для перехода в браузере
+Функция ПолучитьСсылкуАвторизации(Знач КлючПриложения) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(КлючПриложения);
+ Возврат "https://www.dropbox.com/oauth2/authorize?client_id="
+ + КлючПриложения
+ + "&response_type=code&token_access_type=offline";
+
+КонецФункции
+
+// Получить токен
+// Полеучает токен на основе кода со страницы ПолучитьСсылкуАвторизации
+//
+// Параметры:
+// КлючПриложения - Строка - Ключ приложения - appkey
+// СекретПриложения - Строка - Секрет приложения - appsecret
+// Код - Строка - Код со страницы авторизации - code
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ПолучитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач Код) Экспорт
+
+ URL = "https://api.dropbox.com/oauth2/token";
+ ТипДанных = "application/x-www-form-urlencoded; charset=utf-8";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("code" , Код , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("grant_type", "authorization_code", "Строка", Параметры);
+
+ СтруктураURL = OPI_Инструменты.РазбитьURL(URL);
+ Сервер = СтруктураURL["Сервер"];
+ Адрес = СтруктураURL["Адрес"];
+
+ Запрос = OPI_Инструменты.СоздатьЗапрос(Адрес, , ТипДанных);
+ Соединение = OPI_Инструменты.СоздатьСоединение(Сервер, КлючПриложения, СекретПриложения);
+
+ СтрокаПараметров = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
+ Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
+
+ Запрос.УстановитьТелоИзСтроки(Данные);
+
+ Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос);
+ OPI_Инструменты.ОбработатьОтвет(Ответ);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Обновить токен
+// Получает новый токен на основе рефреш токена
+//
+// Параметры:
+// КлючПриложения - Строка - Ключ приложения - appkey
+// СекретПриложения - Строка - Секрет приложения - appsecret
+// РефрешТокен - Строка - Рефреш токен - refresh
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ОбновитьТокен(Знач КлючПриложения, Знач СекретПриложения, Знач РефрешТокен) Экспорт
+
+ Строка_ = "Строка";
+ URL = "https://api.dropbox.com/oauth2/token";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("refresh_token", РефрешТокен , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("grant_type" , "refresh_token" , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("client_id" , КлючПриложения , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("client_secret", СекретПриложения, Строка_, Параметры);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, , Ложь);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить информацию об аккаунте
+// Получает информацию об аккаунте
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Аккаунт - Строка - ID аккаунта. Текущий аккаунт токена, если не заполнено - account
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ПолучитьИнформациюОбАккаунте(Знач Токен, Знач Аккаунт = "") Экспорт
+
+ Если ЗначениеЗаполнено(Аккаунт) Тогда
+ Результат = ПолучитьАккаунт(Токен, Аккаунт);
+ Иначе
+ Результат = ПолучитьСвойАккаунт(Токен);
+ КонецЕсли;
+
+ Возврат Результат;
+
+КонецФункции
+
+// Получить данные использования пространства
+// Получает информацию о количестве использованного дискового пространства
+//
+// Параметры:
+// Токен - Строка - Токен - token
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ПолучитьДанныеИспользованияПространства(Знач Токен) Экспорт
+
+ URL = "https://api.dropboxapi.com/2/users/get_space_usage";
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+ Ответ = OPI_Инструменты.PostBinary(URL
+ , ПолучитьДвоичныеДанныеИзСтроки("null")
+ , Заголовки
+ ,
+ , "text/plain; charset=dropbox-cors-hack");
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСФайламиИКаталогами
+
+// Получить информацию об объекте
+// Получает информацию о файле или каталоге
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь к объекту - path
+// Подробно - Булево - Добавляет дополнительные поля информации для медиафайлов - detail
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Путь, Знач Подробно = Ложь) Экспорт
+
+ URL = "https://api.dropboxapi.com/2/files/get_metadata";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("include_media_info", Подробно, "Булево", Параметры);
+
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить список файлов папки
+// Получает список первых файлов каталога или продолжает получение следующих при указании курсора
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь к каталогу. Необязателен, если указан курсор - path
+// Подробно - Булево - Добавляет дополнительные поля информации для медиафайлов - detail
+// Курсор - Строка - Курсор из предыдущего запроса для получения следующего набора файлов - cursor
+//
+// Возвращаемое значение:
+// HTTPОтвет - Получить список файлов папки
+Функция ПолучитьСписокФайловПапки(Знач Токен, Знач Путь = "", Знач Подробно = Ложь, Знач Курсор = "") Экспорт
+
+ Если Не ЗначениеЗаполнено(Курсор) Тогда
+
+ URL = "https://api.dropboxapi.com/2/files/list_folder";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("include_media_info", Подробно , "Булево", Параметры);
+
+ Иначе
+
+ URL = "https://api.dropboxapi.com/2/files/list_folder/continue";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("cursor", Курсор, "Строка", Параметры);
+
+ КонецЕсли;
+
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить превью
+// Получает PDF или HTML превью объекта (только для токументов)
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь к объекту - path
+//
+// Возвращаемое значение:
+// ДвоичныеДанные - превью документа
+Функция ПолучитьПревью(Знач Токен, Знач Путь) Экспорт
+
+ URL = "https://content.dropboxapi.com/2/files/get_preview";
+ Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Загрузить файл
+// Загружает файл на облачный диск
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Файл - Строка, ДвоичныеДанные - Данные файл для загрузки - file
+// Путь - Строка - Путь сохранения на Dropbox - path
+// Перезаписывать - Булево - Перезаписывать файл при конфликте путей - overwrite
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Путь, Знач Перезаписывать = Ложь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+
+ Режим = ?(Перезаписывать, "overwrite", "add");
+ Размер = Файл.Размер();
+ Граница = 100000000;
+
+ Если Размер > Граница Тогда
+ Ответ = ЗагрузитьБольшойФайл(Токен, Файл, Путь, Режим);
+ Иначе
+ Ответ = ЗагрузитьМалыйФайл(Токен, Файл, Путь, Режим);
+ КонецЕсли;
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Загрузить файл по URL
+// Загружает файл на облачный диск, получая его по указанному URL
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// URLФайла - Строка - URL источник файла - url
+// Путь - Строка - Путь сохранения на Dropbox - path
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ЗагрузитьФайлПоURL(Знач Токен, Знач URLФайла, Знач Путь) Экспорт
+
+ URL = "https://api.dropboxapi.com/2/files/save_url";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("path", Путь , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("url" , URLФайла , "Строка", Параметры);
+
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить статус загрузки по URL
+// Получает статус загрузки файла по URL
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDРаботы - Строка - ID асинхронной работы из ответа ЗагрузитьФайлПоURL - job
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ПолучитьСтатусЗагрузкиПоURL(Знач Токен, Знач IDРаботы) Экспорт
+
+ URL = "https://api.dropboxapi.com/2/files/save_url/check_job_status";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("async_job_id", IDРаботы, "Строка", Параметры);
+
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить объект
+// Удаляет объект с облачного диска
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь к объекту удаления - path
+// БезВозвратно - Строка - Удалить объект без возможности востановления - permanently
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция УдалитьОбъект(Знач Токен, Знач Путь, Знач Безвозвратно = Ложь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Безвозвратно);
+
+ Если Безвозвратно Тогда
+ URL = "https://api.dropboxapi.com/2/files/permanently_delete";
+ Иначе
+ URL = "https://api.dropboxapi.com/2/files/delete_v2";
+ КонецЕсли;
+
+ Ответ = ОбработатьОбъект(Токен, URL, Путь);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Копировать объект
+// Копирует файл или каталог по выбранному пути
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Откуда - Строка - Путь к объекту оригинала - form
+// Куда - Строка - Целевой путь для нового объекта - to
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция КопироватьОбъект(Знач Токен, Знач Откуда, Знач Куда) Экспорт
+
+ URL = "https://api.dropboxapi.com/2/files/copy_v2";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("from_path", Откуда, "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("to_path" , Куда , "Строка", Параметры);
+
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Переместить объект
+// Перемещает объект по выбранному пути
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Откуда - Строка - Путь к объекту оригинала - form
+// Куда - Строка - Целевой путь для нового объекта - to
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ПереместитьОбъект(Знач Токен, Знач Откуда, Знач Куда) Экспорт
+
+ URL = "https://api.dropboxapi.com/2/files/move_v2";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("from_path", Откуда, "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("to_path" , Куда , "Строка", Параметры);
+
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Создать папку
+// Создает пустой каталог по выбранному пути
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Целевой путь создания каталога - path
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция СоздатьПапку(Знач Токен, Знач Путь) Экспорт
+
+ URL = "https://api.dropboxapi.com/2/files/create_folder_v2";
+ Ответ = ОбработатьОбъект(Токен, URL, Путь);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Скачать файл
+// Скачивает файл по указанному пути или ID
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь или ID файла - path
+//
+// Возвращаемое значение:
+// ДвоичныеДанные - двоичные данные файла
+Функция СкачатьФайл(Знач Токен, Знач Путь) Экспорт
+
+ URL = "https://content.dropboxapi.com/2/files/download";
+ Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Скачать папку
+// Скачивает zip архив с содержимым указанного каталога
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь или ID каталога - path
+//
+// Возвращаемое значение:
+// ДвоичныеДанные - двоичные данные zip архива с содержимым каталога
+Функция СкачатьПапку(Знач Токен, Знач Путь) Экспорт
+
+ URL = "https://content.dropboxapi.com/2/files/download_zip";
+ Ответ = ОбработатьОбъект(Токен, URL, Путь, Истина);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить список версий объекта
+// Получает список версий (ревизий) объекта
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь к объекту - path
+// Количество - Строка, Число - Число последних версий объекта для отображения - amount
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ПолучитьСписокВерсийОбъекта(Знач Токен, Знач Путь, Знач Количество = 10) Экспорт
+
+ URL = "https://api.dropboxapi.com/2/files/list_revisions";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("path" , Путь , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("limit", Количество, "Число" , Параметры);
+
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Восстановить объект к версии
+// Восстанавливает состояние объекта к необходимой версии (ревизии)
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь к объекту - path
+// Версия - Строка - ID версии (ревизии) для востановления - rev
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ВосстановитьОбъектКВерсии(Знач Токен, Знач Путь, Знач Версия) Экспорт
+
+ URL = "https://api.dropboxapi.com/2/files/restore";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("path", Путь , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("rev" , Версия, "Строка", Параметры);
+
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСТегами
+
+// Получить список тегов
+// Получает список тегов выбранных файлов
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Пути - Строка, Массив Из Строка - Путь или набору путей к файлам - paths
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ПолучитьСписокТегов(Знач Токен, Знач Пути) Экспорт
+
+ URL = "https://api.dropboxapi.com/2/files/tags/get";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("paths", Пути, "Массив", Параметры);
+
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Добавить тег
+// Добавляет новый текстовый тег к файлу или каталогу
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь к объекту, для которого необходимо создать тег - path
+// Тег - Строка - Текст тега - tag
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ДобавитьТег(Знач Токен, Знач Путь, Знач Тег) Экспорт
+
+ Возврат ОбработатьТег(Токен, Путь, Тег);
+
+КонецФункции
+
+// Удалить тег
+// Удаляет текстовый тег файла или каталога
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь к объекту, тег которого необходимо удалить - path
+// Тег - Строка - Текст тега - tag
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция УдалитьТег(Знач Токен, Знач Путь, Знач Тег) Экспорт
+
+ Возврат ОбработатьТег(Токен, Путь, Тег, Истина);
+
+КонецФункции
+
+#КонецОбласти
+
+#Область НастройкиСовместногоДоступа
+
+// Опубликовать папку
+// Переводит каталог в режим публичного доступа
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь к целевому каталогу - path
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ОпубликоватьПапку(Знач Токен, Знач Путь) Экспорт
+
+ URL = "https://api.dropboxapi.com/2/sharing/share_folder";
+ Ответ = ОбработатьОбъект(Токен, URL, Путь);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Отменить публикацию папки
+// Отменяет режим общего доступа для каталога
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDПапки - Строка - ID публичного каталога (shared folder ID) - folder
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ОтменитьПубликациюПапки(Знач Токен, Знач IDПапки) Экспорт
+
+ URL = "https://api.dropboxapi.com/2/sharing/unshare_folder";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("shared_folder_id", IDПапки, "Строка", Параметры);
+
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Добавить пользователя к файлу
+// Определяет доступ к файлу для стороннего пользователя
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDФайла - Строка - ID файла, к которому предоставляется доступ - fileid
+// АдресаПочты - Строка, Массив Из Строка - Список адресов почты добавляемых пользователей - emails
+// ТолькоПросмотр - Булево - Запрещает редактирование файла для стороннего пользователя - readonly
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ДобавитьПользователейКФайлу(Знач Токен, Знач IDФайла, Знач АдресаПочты, Знач ТолькоПросмотр = Истина) Экспорт
+
+ Строка_ = "Строка";
+
+ OPI_ПреобразованиеТипов.ПолучитьМассив(АдресаПочты);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоПросмотр);
+
+ Если Не СтрНачинаетсяС(IDФайла, "id:") Тогда
+ IDФайла = "id:" + IDФайла;
+ КонецЕсли;
+
+ URL = "https://api.dropboxapi.com/2/sharing/add_file_member";
+
+ МассивПользователей = Новый Массив;
+
+ Для Каждого Адрес Из АдресаПочты Цикл
+
+ ДанныеПользователя = Новый Соответствие;
+ OPI_Инструменты.ДобавитьПоле(".tag" , "email", Строка_, ДанныеПользователя);
+ OPI_Инструменты.ДобавитьПоле("email", Адрес , Строка_, ДанныеПользователя);
+
+ МассивПользователей.Добавить(ДанныеПользователя);
+
+ КонецЦикла;
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("file" , IDФайла , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("members", МассивПользователей , "Массив", Параметры);
+
+ Режим = ?(ТолькоПросмотр, "viewer", "editor");
+
+ OPI_Инструменты.ДобавитьПоле("access_level", Режим , Строка_, Параметры);
+
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Добавить пользователей к папке
+// Предоставляет стороннии пользователям доступ к каталогу
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDПапки - Строка - ID публичного каталога (shared folder ID) - folder
+// АдресаПочты - Строка, Массив Из Строка - Список адресов почты добавляемых пользователей - emails
+// ТолькоПросмотр - Булево - Запрещает редактирование файла для стороннего пользователя - readonly
+//
+// Возвращаемое значение:
+// Неопределено - пустой ответ
+Функция ДобавитьПользователейКПапке(Знач Токен, Знач IDПапки, Знач АдресаПочты, Знач ТолькоПросмотр = Истина) Экспорт
+
+ Строка_ = "Строка";
+
+ OPI_ПреобразованиеТипов.ПолучитьМассив(АдресаПочты);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоПросмотр);
+ Режим = ?(ТолькоПросмотр, "viewer", "editor");
+
+ URL = "https://api.dropboxapi.com/2/sharing/add_folder_member";
+
+ МассивПользователей = Новый Массив;
+
+ Для Каждого Адрес Из АдресаПочты Цикл
+
+ ДанныеПользователя = Новый Соответствие;
+ OPI_Инструменты.ДобавитьПоле(".tag" , "email", Строка_, ДанныеПользователя);
+ OPI_Инструменты.ДобавитьПоле("email", Адрес , Строка_, ДанныеПользователя);
+
+ СтруктураПользователя = Новый Структура("member,access_level", ДанныеПользователя, Режим);
+
+ МассивПользователей.Добавить(СтруктураПользователя);
+
+ КонецЦикла;
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("shared_folder_id", IDПапки , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("members" , МассивПользователей , "Массив", Параметры);
+
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить статус асинхронного изменения
+// Получает статус асинхронной работы по изменению доступов
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDРаботы - Строка - ID асинхронной работы - job
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ПолучитьСтатусАсинхронногоИзменения(Знач Токен, Знач IDРаботы) Экспорт
+
+ URL = "https://api.dropboxapi.com/2/sharing/check_job_status";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("async_job_id", IDРаботы, "Строка", Параметры);
+
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Отменить публикацию файла
+// Запрещает доступ к файлу для внешних пользователей
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDФайла - Строка - ID файла, к которому предоставляется доступ - fileid
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Dropbox
+Функция ОтменитьПубликациюФайла(Знач Токен, Знач IDФайла) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла);
+
+ Если Не СтрНачинаетсяС(IDФайла, "id:") Тогда
+ IDФайла = "id:" + IDФайла;
+ КонецЕсли;
+
+ URL = "https://api.dropboxapi.com/2/sharing/unshare_file";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("file", IDФайла, "Строка", Параметры);
+
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ОбработатьОбъект(Знач Токен, Знач URL, Знач Путь, Знач ВЗаголовках = Ложь)
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Параметры);
+
+ Если ВЗаголовках Тогда
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
+ Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки);
+ Иначе
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+ КонецЕсли;
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ОбработатьТег(Знач Токен, Знач Путь, Знач Тег, Знач ЭтоУдаление = Ложь)
+
+ Если ЭтоУдаление Тогда
+ URL = "https://api.dropboxapi.com/2/files/tags/remove";
+ Иначе
+ URL = "https://api.dropboxapi.com/2/files/tags/add";
+ КонецЕсли;
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("path" , Путь, "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("tag_text" , Тег , "Строка", Параметры);
+
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ПолучитьЗаголовкиЗапроса(Знач Токен, Знач Параметры = "")
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ Заголовки = Новый Соответствие;
+ Заголовки.Вставить("Authorization" , "Bearer " + Токен);
+
+ Если ЗначениеЗаполнено(Параметры) Тогда
+
+ JSON = OPI_Инструменты.JSONСтрокой(Параметры, "Нет");
+ JSON = СтрЗаменить(JSON, Символы.ВК + Символы.ПС, "");
+
+ Заголовки.Вставить("Dropbox-API-Arg", JSON);
+
+ КонецЕсли;
+
+ Возврат Заголовки;
+
+КонецФункции
+
+Функция ЗагрузитьБольшойФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим)
+
+ URL = "https://content.dropboxapi.com/2/files/upload_session/append_v2";
+
+ РазмерЧасти = 100000000;
+ ТекущаяПозиция = 0;
+ ПрочитаноБайт = 0;
+ ОбщийРазмер = Файл.Размер();
+ Сессия = ОткрытьСессию(Токен);
+
+ Пока ПрочитаноБайт < ОбщийРазмер Цикл
+
+ Отступ = ТекущаяПозиция;
+ Курсор = Новый Структура("offset,session_id", Отступ, Сессия);
+
+ Параметры = Новый Структура("cursor", Курсор);
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
+
+ ЧтениеДанных = Новый ЧтениеДанных(Файл);
+ ПрочитаноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция);
+ Результат = ЧтениеДанных.Прочитать(РазмерЧасти);
+ ТекущиеДанные = Результат.ПолучитьДвоичныеДанные();
+ РазмерТекущих = ТекущиеДанные.Размер();
+ СледующаяПозиция = ТекущаяПозиция + РазмерТекущих;
+
+ Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда
+ Прервать;
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.PostBinary(URL, ТекущиеДанные, Заголовки);
+
+ ТекущаяПозиция = СледующаяПозиция;
+
+ КБайт = 1024;
+ МБайт = КБайт * КБайт;
+ Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт));
+
+ ВыполнитьСборкуМусора();
+ ОсвободитьОбъект(ТекущиеДанные);
+
+ КонецЦикла;
+
+ Ответ = ЗакрытьСессию(Токен, Путь, Режим, ОбщийРазмер, Сессия);
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ЗагрузитьМалыйФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим)
+
+ Булево_ = "Булево";
+ Строка_ = "Строка";
+ URL = "https://content.dropboxapi.com/2/files/upload";
+
+ Параметры = Новый Структура;
+
+ OPI_Инструменты.ДобавитьПоле("autorename" , Ложь , Булево_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("mode" , Режим, Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("mute" , Ложь , Булево_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("path" , Путь , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("strict_conflict", Ложь , Булево_, Параметры);
+
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
+
+ Ответ = OPI_Инструменты.PostBinary(URL, Файл, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ОткрытьСессию(Знач Токен)
+
+ SessionId = "session_id";
+ URL = "https://content.dropboxapi.com/2/files/upload_session/start";
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+ Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки);
+
+ Возврат Ответ[SessionId];
+
+КонецФункции
+
+Функция ЗакрытьСессию(Знач Токен, Знач Путь, Знач Режим, Знач ОбщийРазмер, Знач Сессия)
+
+ URL = "https://content.dropboxapi.com/2/files/upload_session/finish";
+
+ Коммит = Новый Структура();
+ OPI_Инструменты.ДобавитьПоле("mode", Режим, "Строка", Коммит);
+ OPI_Инструменты.ДобавитьПоле("path", Путь, "Строка", Коммит);
+
+ Курсор = Новый Структура("offset,session_id", ОбщийРазмер, Сессия);
+
+ Параметры = Новый Структура("commit,cursor", Коммит, Курсор);
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен, Параметры);
+
+ Ответ = OPI_Инструменты.PostBinary(URL, ПолучитьДвоичныеДанныеИзСтроки(""), Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ПолучитьАккаунт(Знач Токен, Знач Аккаунт)
+
+ URL = "https://api.dropboxapi.com/2/users/get_account";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("account_id", Аккаунт, "Строка", Параметры);
+
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ПолучитьСвойАккаунт(Знач Токен)
+
+ URL = "https://api.dropboxapi.com/2/users/get_current_account";
+ Заголовки = ПолучитьЗаголовкиЗапроса(Токен);
+
+ Ответ = OPI_Инструменты.PostBinary(URL
+ , ПолучитьДвоичныеДанныеИзСтроки("null")
+ , Заголовки
+ ,
+ , "text/plain; charset=dropbox-cors-hack");
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_GoogleCalendar.os b/ru/OInt/core/Modules/OPI_GoogleCalendar.os
index 39655aaeb8..639c88a94b 100644
--- a/ru/OInt/core/Modules/OPI_GoogleCalendar.os
+++ b/ru/OInt/core/Modules/OPI_GoogleCalendar.os
@@ -1,631 +1,631 @@
-// Расположение OS: ./OInt/core/Modules/OPI_GoogleCalendar.os
-// Библиотека: Google Calendar
-// Команда CLI: gcalendar
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область РаботаСМетаданнымиКалендарей
-
-// Создать календарь
-// Создает пустой календарь
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Наименование - Строка - Наименование создаваемого календаря - title
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция СоздатьКалендарь(Знач Токен, Знач Наименование) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/calendar/v3/calendars";
-
- Параметры = Новый Структура;
- Параметры.Вставить("summary" , Наименование);
- Параметры.Вставить("timeZone", "Europe/Moscow");
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить календарь
-// Получает информацию о календаре по ID
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Календарь - Строка - ID календаря - calendar
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьМетаданныеКалендаря(Знач Токен, Знач Календарь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;
- Ответ = OPI_Инструменты.Get(URL, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Изменить календарь
-// Изменяет свойства существуещего календаря
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Календарь - Строка - ID календаря - calendar
-// Наименование - Строка - Новое наименование - title
-// Описание - Строка - Новое описание календаря - description
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ИзменитьМетаданныеКалендаря(Знач Токен
- , Знач Календарь
- , Знач Наименование = ""
- , Знач Описание = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;
-
- Параметры = Новый Структура;
-
- Если ЗначениеЗаполнено(Наименование) Тогда
- Параметры.Вставить("summary", Наименование);
- КонецЕсли;
-
- Если ЗначениеЗаполнено(Описание) Тогда
- Параметры.Вставить("description", Описание);
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Очистить основной календарь
-// Очищает список событий основного календаря
-//
-// Параметры:
-// Токен - Строка - Токен - token
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ОчиститьОсновнойКалендарь(Знач Токен) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/calendar/v3/calendars/primary/clear";
- Ответ = OPI_Инструменты.Post(URL, , Заголовки, Ложь);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить календарь
-// Удаляет календарь по ID
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Календарь - Строка - ID календаря - calendar
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция УдалитьКалендарь(Знач Токен, Знач Календарь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;
- Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСоСпискомКалендарей
-
-// Получить список календарей
-// Получает массив календарей аккаунта
-//
-// Параметры:
-// Токен - Строка - Токен - token
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - Массив соответствий данных календарей
-Функция ПолучитьСписокКалендарей(Знач Токен) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- МассивКалендарей = Новый Массив;
-
- ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей);
-
- Возврат МассивКалендарей;
-
-КонецФункции
-
-// Добавить календарь в список
-// Добавляет существующий календарь в список пользователя
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Календарь - Строка - ID календаря - calendar
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ДобавитьКалендарьВСписок(Знач Токен, Знач Календарь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList";
-
- Параметры = Новый Структура;
- Параметры.Вставить("id", Календарь);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить календарь списка
-// Получает календарь из списка пользователя по ID
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Календарь - Строка - ID календаря - calendar
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьКалендарьСписка(Знач Токен, Знач Календарь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь;
- Ответ = OPI_Инструменты.Get(URL, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить календарь из списка
-// Удаляет календарь из списка пользователя
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Календарь - Строка - ID календаря - calendar
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция УдалитьКалендарьИзСписка(Знач Токен, Знач Календарь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь;
- Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Изменить календарь списка
-// Изменяет свойства календаря из списка пользователей
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Календарь - Строка - ID календаря - calendar
-// ОсновнойЦвет - Строка - HEX основного цвета (#ffffff) - primary
-// ДополнительныйЦвет - Строка - HEX дополнительного цвета (#ffffff) - secondary
-// Скрытый - Булево - Скрытый календарь - hidden
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ИзменитьКалендарьСписка(Знач Токен
- , Знач Календарь
- , Знач ОсновнойЦвет
- , Знач ДополнительныйЦвет
- , Знач Скрытый = Ложь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ОсновнойЦвет);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ДополнительныйЦвет);
- OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытый);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь + "?colorRgbFormat=true";
-
- Параметры = Новый Соответствие;
- Параметры.Вставить("hidden" , Скрытый);
- Параметры.Вставить("foregroundColor", ОсновнойЦвет);
- Параметры.Вставить("backgroundColor", ДополнительныйЦвет);
-
- Ответ = OPI_Инструменты.Put(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаССобытиями
-
-// Получить описание события !NOCLI
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - Пустой макет события
-Функция ПолучитьОписаниеСобытия() Экспорт
-
- ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
- Час = 3600;
- Событие = Новый Соответствие;
-
- Событие.Вставить("Описание" , ""); // Описание события
- Событие.Вставить("Заголовок" , "Новое событие"); // Заголовок события
- Событие.Вставить("МестоПроведения" , ""); // Строка описание места проведения
- Событие.Вставить("ДатаНачала" , ТекущаяДата); // Дата начала события
- Событие.Вставить("ДатаОкончания" , ТекущаяДата + Час); // Дата окончания события
- Событие.Вставить("МассивURLФайловВложений", Новый Соответствие); // Ключ - название, Значение - URL к файлу
- Событие.Вставить("ОтправлятьУведомления" , Истина); // Признак отправки уведомлений участникам
-
- Возврат Событие;
-
-КонецФункции
-
-// Получить список событий
-// Получает список всех событий календаря
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Календарь - Строка - ID календаря - calendar
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - Массив соответствий событий
-Функция ПолучитьСписокСобытий(Знач Токен, Знач Календарь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- МассивСобытий = Новый Массив;
-
- ПолучитьСписокСобытийРекурсивно(Заголовки, Календарь, МассивСобытий);
-
- Возврат МассивСобытий;
-
-КонецФункции
-
-// Получить событие
-// Получает событие по ID
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Календарь - Строка - ID календаря - calendar
-// Событие - Строка - ID события - event
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/calendar/v3/calendars/"
- + Календарь
- + "/events/"
- + Событие;
-
- Ответ = OPI_Инструменты.Get(URL, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Создать событие
-// Создает новое событие
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Календарь - Строка - ID календаря - calendar
-// ОписаниеСобытия - Соответствие Из КлючИЗначение - Описание события - props
-//
-// Возвращаемое значение:
-// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google
-Функция СоздатьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия) Экспорт
- Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия);
-КонецФункции
-
-// Переместить событие
-// Перемещает событие в другой календарь
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// КалендарьИсточник - Строка - ID календаря источника - from
-// КалендарьПриемник - Строка - ID календаря приемника - to
-// Событие - Строка - ID события календаря источника - event
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПереместитьСобытие(Знач Токен, Знач КалендарьИсточник, Знач КалендарьПриемник, Знач Событие) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьИсточник);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьПриемник);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/calendar/v3/calendars/"
- + КалендарьИсточник
- + "/events/"
- + Событие
- + "/move?destination="
- + КалендарьПриемник;
-
- Ответ = OPI_Инструменты.Post(URL, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Изменить событие
-// Изменяет существующее событие
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Календарь - Строка - ID календаря - calendar
-// ОписаниеСобытия - Строка - Новое описание события - props
-// Событие - Строка - ID события - event
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ИзменитьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие) Экспорт
- Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия, Событие);
-КонецФункции
-
-// Удалить событие
-// Удаляет событие по ID
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Календарь - Строка - ID календаря - calendar
-// Событие - Строка - ID события - event
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция УдалитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/calendar/v3/calendars/"
- + Календарь
- + "/events/"
- + Событие;
-
- Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ПреобразоватьДату(Знач Дата)
-
- OPI_ПреобразованиеТипов.ПолучитьДату(Дата);
-
- СтруктураДаты = Новый Структура;
-
- Если Не ТипЗнч(Дата) = Тип("Дата") Тогда
- Возврат Неопределено;
- КонецЕсли;
-
- Если Дата = НачалоДня(Дата) Тогда
- ФорматДаты = "ДФ=yyyy-MM-dd";
- Поле = "date";
- Иначе
- ФорматДаты = "ДФ=yyyy-MM-ddTHH:mm:ssZ";
- Поле = "dateTime";
- КонецЕсли;
-
- Дата = Формат(Дата, ФорматДаты);
- СтруктураДаты.Вставить(Поле , Дата);
- СтруктураДаты.Вставить("timeZone", "Europe/Moscow");
-
- Возврат СтруктураДаты;
-
-КонецФункции
-
-Функция ПреобразоватьВложения(Знач Вложения)
-
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Вложения);
-
- МассивВложений = Новый Массив;
-
- Если ТипЗнч(Вложения) = Тип("Соответствие") Или ТипЗнч(Вложения) = Тип("Структура") Тогда
-
- Для Каждого Вложение Из Вложения Цикл
-
- ТекущеВложение = Новый Структура;
- ТекущеВложение.Вставить("title" , Вложение.Ключ);
- ТекущеВложение.Вставить("fileUrl", Вложение.Значение);
-
- МассивВложений.Добавить(ТекущеВложение);
-
- КонецЦикла;
-
- КонецЕсли;
-
- Если МассивВложений.Количество() > 0 Тогда
- Возврат МассивВложений;
- Иначе
- Возврат Неопределено;
- КонецЕсли;
-
-КонецФункции
-
-Функция УправлениеСобытием(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие = "")
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеСобытия);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- Существующее = ЗначениеЗаполнено(Событие);
- URL = "https://www.googleapis.com/calendar/v3/calendars/"
- + Календарь
- + "/events"
- + ?(Существующее, "/" + Событие, "");
-
- Дата0 = ОписаниеСобытия["ДатаНачала"];
- Дата1 = ОписаниеСобытия["ДатаОкончания"];
- Вложения = ОписаниеСобытия["МассивURLФайловВложений"];
- Вложения = ПреобразоватьВложения(Вложения);
- Уведомления = ?(ОписаниеСобытия["ОтправлятьУведомления"] = Неопределено
- , Ложь
- , ОписаниеСобытия["ОтправлятьУведомления"]);
-
- Параметры = Новый Структура;
- Параметры.Вставить("summary" , ОписаниеСобытия["Заголовок"]);
- Параметры.Вставить("description", ОписаниеСобытия["Описание"]);
- Параметры.Вставить("location" , ОписаниеСобытия["МестоПроведения"]);
- Параметры.Вставить("start" , ПреобразоватьДату(Дата0));
- Параметры.Вставить("end" , ПреобразоватьДату(Дата1));
- Параметры.Вставить("attachments", Вложения);
-
- ПараметрыURL = Новый Структура;
- ПараметрыURL.Вставить("sendUpdates" , ?(Уведомления, "all", "none"));
- ПараметрыURL.Вставить("supportsAttachments" , ?(ЗначениеЗаполнено(Вложения), "true", "false"));
-
- URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
-
- OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры);
-
- Если Существующее Тогда
- Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина);
- Иначе
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки, Истина);
- КонецЕсли;
-
- Возврат Ответ;
-
-КонецФункции
-
-Процедура ПолучитьСписокКалендарейРекурсивно(Знач Заголовки, МассивКалендарей, Страница = "")
-
- Items = "items";
- NPT = "nextPageToken";
- Параметры = Новый Структура;
-
- Если ЗначениеЗаполнено(Страница) Тогда
- Параметры.Вставить("pageToken", Страница);
- КонецЕсли;
-
- Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/users/me/calendarList"
- , Параметры
- , Заголовки);
-
- Календари = Результат[Items];
- Страница = Результат[NPT];
-
- Для Каждого Календарь Из Календари Цикл
- МассивКалендарей.Добавить(Календарь);
- КонецЦикла;
-
- Если Календари.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда
- ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей, Страница);
- КонецЕсли;
-
-КонецПроцедуры
-
-Процедура ПолучитьСписокСобытийРекурсивно(Знач Заголовки, Знач Календарь, МассивСобытий, Страница = "")
-
- Items = "items";
- NPT = "nextPageToken";
- Параметры = Новый Структура;
-
- Если ЗначениеЗаполнено(Страница) Тогда
- Параметры.Вставить("pageToken", Страница);
- КонецЕсли;
-
- Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/calendars/" + Календарь + "/events"
- , Параметры
- , Заголовки);
-
- События = Результат[Items];
- Страница = Результат[NPT];
-
- Для Каждого Событие Из События Цикл
- МассивСобытий.Добавить(Событие);
- КонецЦикла;
-
- Если События.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда
- ПолучитьСписокСобытийРекурсивно(Заголовки, МассивСобытий, Страница);
- КонецЕсли;
-
-КонецПроцедуры
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_GoogleCalendar.os
+// Библиотека: Google Calendar
+// Команда CLI: gcalendar
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область РаботаСМетаданнымиКалендарей
+
+// Создать календарь
+// Создает пустой календарь
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Наименование - Строка - Наименование создаваемого календаря - title
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция СоздатьКалендарь(Знач Токен, Знач Наименование) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/calendar/v3/calendars";
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("summary" , Наименование);
+ Параметры.Вставить("timeZone", "Europe/Moscow");
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить календарь
+// Получает информацию о календаре по ID
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Календарь - Строка - ID календаря - calendar
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьМетаданныеКалендаря(Знач Токен, Знач Календарь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;
+ Ответ = OPI_Инструменты.Get(URL, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Изменить календарь
+// Изменяет свойства существуещего календаря
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Календарь - Строка - ID календаря - calendar
+// Наименование - Строка - Новое наименование - title
+// Описание - Строка - Новое описание календаря - description
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ИзменитьМетаданныеКалендаря(Знач Токен
+ , Знач Календарь
+ , Знач Наименование = ""
+ , Знач Описание = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;
+
+ Параметры = Новый Структура;
+
+ Если ЗначениеЗаполнено(Наименование) Тогда
+ Параметры.Вставить("summary", Наименование);
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(Описание) Тогда
+ Параметры.Вставить("description", Описание);
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Очистить основной календарь
+// Очищает список событий основного календаря
+//
+// Параметры:
+// Токен - Строка - Токен - token
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ОчиститьОсновнойКалендарь(Знач Токен) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/calendar/v3/calendars/primary/clear";
+ Ответ = OPI_Инструменты.Post(URL, , Заголовки, Ложь);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить календарь
+// Удаляет календарь по ID
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Календарь - Строка - ID календаря - calendar
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция УдалитьКалендарь(Знач Токен, Знач Календарь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/calendar/v3/calendars/" + Календарь;
+ Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСоСпискомКалендарей
+
+// Получить список календарей
+// Получает массив календарей аккаунта
+//
+// Параметры:
+// Токен - Строка - Токен - token
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - Массив соответствий данных календарей
+Функция ПолучитьСписокКалендарей(Знач Токен) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ МассивКалендарей = Новый Массив;
+
+ ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей);
+
+ Возврат МассивКалендарей;
+
+КонецФункции
+
+// Добавить календарь в список
+// Добавляет существующий календарь в список пользователя
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Календарь - Строка - ID календаря - calendar
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ДобавитьКалендарьВСписок(Знач Токен, Знач Календарь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList";
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("id", Календарь);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить календарь списка
+// Получает календарь из списка пользователя по ID
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Календарь - Строка - ID календаря - calendar
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьКалендарьСписка(Знач Токен, Знач Календарь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь;
+ Ответ = OPI_Инструменты.Get(URL, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить календарь из списка
+// Удаляет календарь из списка пользователя
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Календарь - Строка - ID календаря - calendar
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция УдалитьКалендарьИзСписка(Знач Токен, Знач Календарь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь;
+ Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Изменить календарь списка
+// Изменяет свойства календаря из списка пользователей
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Календарь - Строка - ID календаря - calendar
+// ОсновнойЦвет - Строка - HEX основного цвета (#ffffff) - primary
+// ДополнительныйЦвет - Строка - HEX дополнительного цвета (#ffffff) - secondary
+// Скрытый - Булево - Скрытый календарь - hidden
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ИзменитьКалендарьСписка(Знач Токен
+ , Знач Календарь
+ , Знач ОсновнойЦвет
+ , Знач ДополнительныйЦвет
+ , Знач Скрытый = Ложь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ОсновнойЦвет);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ДополнительныйЦвет);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытый);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/calendar/v3/users/me/calendarList/" + Календарь + "?colorRgbFormat=true";
+
+ Параметры = Новый Соответствие;
+ Параметры.Вставить("hidden" , Скрытый);
+ Параметры.Вставить("foregroundColor", ОсновнойЦвет);
+ Параметры.Вставить("backgroundColor", ДополнительныйЦвет);
+
+ Ответ = OPI_Инструменты.Put(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаССобытиями
+
+// Получить описание события !NOCLI
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - Пустой макет события
+Функция ПолучитьОписаниеСобытия() Экспорт
+
+ ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
+ Час = 3600;
+ Событие = Новый Соответствие;
+
+ Событие.Вставить("Описание" , ""); // Описание события
+ Событие.Вставить("Заголовок" , "Новое событие"); // Заголовок события
+ Событие.Вставить("МестоПроведения" , ""); // Строка описание места проведения
+ Событие.Вставить("ДатаНачала" , ТекущаяДата); // Дата начала события
+ Событие.Вставить("ДатаОкончания" , ТекущаяДата + Час); // Дата окончания события
+ Событие.Вставить("МассивURLФайловВложений", Новый Соответствие); // Ключ - название, Значение - URL к файлу
+ Событие.Вставить("ОтправлятьУведомления" , Истина); // Признак отправки уведомлений участникам
+
+ Возврат Событие;
+
+КонецФункции
+
+// Получить список событий
+// Получает список всех событий календаря
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Календарь - Строка - ID календаря - calendar
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - Массив соответствий событий
+Функция ПолучитьСписокСобытий(Знач Токен, Знач Календарь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ МассивСобытий = Новый Массив;
+
+ ПолучитьСписокСобытийРекурсивно(Заголовки, Календарь, МассивСобытий);
+
+ Возврат МассивСобытий;
+
+КонецФункции
+
+// Получить событие
+// Получает событие по ID
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Календарь - Строка - ID календаря - calendar
+// Событие - Строка - ID события - event
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/calendar/v3/calendars/"
+ + Календарь
+ + "/events/"
+ + Событие;
+
+ Ответ = OPI_Инструменты.Get(URL, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Создать событие
+// Создает новое событие
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Календарь - Строка - ID календаря - calendar
+// ОписаниеСобытия - Соответствие Из КлючИЗначение - Описание события - props
+//
+// Возвращаемое значение:
+// Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено - ответ сервера Google
+Функция СоздатьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия) Экспорт
+ Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия);
+КонецФункции
+
+// Переместить событие
+// Перемещает событие в другой календарь
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// КалендарьИсточник - Строка - ID календаря источника - from
+// КалендарьПриемник - Строка - ID календаря приемника - to
+// Событие - Строка - ID события календаря источника - event
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПереместитьСобытие(Знач Токен, Знач КалендарьИсточник, Знач КалендарьПриемник, Знач Событие) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьИсточник);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(КалендарьПриемник);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/calendar/v3/calendars/"
+ + КалендарьИсточник
+ + "/events/"
+ + Событие
+ + "/move?destination="
+ + КалендарьПриемник;
+
+ Ответ = OPI_Инструменты.Post(URL, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Изменить событие
+// Изменяет существующее событие
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Календарь - Строка - ID календаря - calendar
+// ОписаниеСобытия - Строка - Новое описание события - props
+// Событие - Строка - ID события - event
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ИзменитьСобытие(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие) Экспорт
+ Возврат УправлениеСобытием(Токен, Календарь, ОписаниеСобытия, Событие);
+КонецФункции
+
+// Удалить событие
+// Удаляет событие по ID
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Календарь - Строка - ID календаря - calendar
+// Событие - Строка - ID события - event
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция УдалитьСобытие(Знач Токен, Знач Календарь, Знач Событие) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/calendar/v3/calendars/"
+ + Календарь
+ + "/events/"
+ + Событие;
+
+ Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ПреобразоватьДату(Знач Дата)
+
+ OPI_ПреобразованиеТипов.ПолучитьДату(Дата);
+
+ СтруктураДаты = Новый Структура;
+
+ Если Не ТипЗнч(Дата) = Тип("Дата") Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ Если Дата = НачалоДня(Дата) Тогда
+ ФорматДаты = "ДФ=yyyy-MM-dd";
+ Поле = "date";
+ Иначе
+ ФорматДаты = "ДФ=yyyy-MM-ddTHH:mm:ssZ";
+ Поле = "dateTime";
+ КонецЕсли;
+
+ Дата = Формат(Дата, ФорматДаты);
+ СтруктураДаты.Вставить(Поле , Дата);
+ СтруктураДаты.Вставить("timeZone", "Europe/Moscow");
+
+ Возврат СтруктураДаты;
+
+КонецФункции
+
+Функция ПреобразоватьВложения(Знач Вложения)
+
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Вложения);
+
+ МассивВложений = Новый Массив;
+
+ Если ТипЗнч(Вложения) = Тип("Соответствие") Или ТипЗнч(Вложения) = Тип("Структура") Тогда
+
+ Для Каждого Вложение Из Вложения Цикл
+
+ ТекущеВложение = Новый Структура;
+ ТекущеВложение.Вставить("title" , Вложение.Ключ);
+ ТекущеВложение.Вставить("fileUrl", Вложение.Значение);
+
+ МассивВложений.Добавить(ТекущеВложение);
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ Если МассивВложений.Количество() > 0 Тогда
+ Возврат МассивВложений;
+ Иначе
+ Возврат Неопределено;
+ КонецЕсли;
+
+КонецФункции
+
+Функция УправлениеСобытием(Знач Токен, Знач Календарь, Знач ОписаниеСобытия, Знач Событие = "")
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Календарь);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Событие);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеСобытия);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ Существующее = ЗначениеЗаполнено(Событие);
+ URL = "https://www.googleapis.com/calendar/v3/calendars/"
+ + Календарь
+ + "/events"
+ + ?(Существующее, "/" + Событие, "");
+
+ Дата0 = ОписаниеСобытия["ДатаНачала"];
+ Дата1 = ОписаниеСобытия["ДатаОкончания"];
+ Вложения = ОписаниеСобытия["МассивURLФайловВложений"];
+ Вложения = ПреобразоватьВложения(Вложения);
+ Уведомления = ?(ОписаниеСобытия["ОтправлятьУведомления"] = Неопределено
+ , Ложь
+ , ОписаниеСобытия["ОтправлятьУведомления"]);
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("summary" , ОписаниеСобытия["Заголовок"]);
+ Параметры.Вставить("description", ОписаниеСобытия["Описание"]);
+ Параметры.Вставить("location" , ОписаниеСобытия["МестоПроведения"]);
+ Параметры.Вставить("start" , ПреобразоватьДату(Дата0));
+ Параметры.Вставить("end" , ПреобразоватьДату(Дата1));
+ Параметры.Вставить("attachments", Вложения);
+
+ ПараметрыURL = Новый Структура;
+ ПараметрыURL.Вставить("sendUpdates" , ?(Уведомления, "all", "none"));
+ ПараметрыURL.Вставить("supportsAttachments" , ?(ЗначениеЗаполнено(Вложения), "true", "false"));
+
+ URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
+
+ OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры);
+
+ Если Существующее Тогда
+ Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки, Истина);
+ Иначе
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки, Истина);
+ КонецЕсли;
+
+ Возврат Ответ;
+
+КонецФункции
+
+Процедура ПолучитьСписокКалендарейРекурсивно(Знач Заголовки, МассивКалендарей, Страница = "")
+
+ Items = "items";
+ NPT = "nextPageToken";
+ Параметры = Новый Структура;
+
+ Если ЗначениеЗаполнено(Страница) Тогда
+ Параметры.Вставить("pageToken", Страница);
+ КонецЕсли;
+
+ Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/users/me/calendarList"
+ , Параметры
+ , Заголовки);
+
+ Календари = Результат[Items];
+ Страница = Результат[NPT];
+
+ Для Каждого Календарь Из Календари Цикл
+ МассивКалендарей.Добавить(Календарь);
+ КонецЦикла;
+
+ Если Календари.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда
+ ПолучитьСписокКалендарейРекурсивно(Заголовки, МассивКалендарей, Страница);
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ПолучитьСписокСобытийРекурсивно(Знач Заголовки, Знач Календарь, МассивСобытий, Страница = "")
+
+ Items = "items";
+ NPT = "nextPageToken";
+ Параметры = Новый Структура;
+
+ Если ЗначениеЗаполнено(Страница) Тогда
+ Параметры.Вставить("pageToken", Страница);
+ КонецЕсли;
+
+ Результат = OPI_Инструменты.Get("https://www.googleapis.com/calendar/v3/calendars/" + Календарь + "/events"
+ , Параметры
+ , Заголовки);
+
+ События = Результат[Items];
+ Страница = Результат[NPT];
+
+ Для Каждого Событие Из События Цикл
+ МассивСобытий.Добавить(Событие);
+ КонецЦикла;
+
+ Если События.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда
+ ПолучитьСписокСобытийРекурсивно(Заголовки, МассивСобытий, Страница);
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_GoogleDrive.os b/ru/OInt/core/Modules/OPI_GoogleDrive.os
index d8a49c4833..57c5b0babf 100644
--- a/ru/OInt/core/Modules/OPI_GoogleDrive.os
+++ b/ru/OInt/core/Modules/OPI_GoogleDrive.os
@@ -1,719 +1,719 @@
-// Расположение OS: ./OInt/core/Modules/OPI_GoogleDrive.os
-// Библиотека: Google Drive
-// Команда CLI: gdrive
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область РаботаСФайламиИКаталогами
-
-// Получить информацию об объекте
-// Получает информацию о папке или файле по ID
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Идентификатор - Строка - Идентификатор файла или каталога - object
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Идентификатор) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор;
-
- Параметры = Новый Структура;
- Параметры.Вставить("fields", "*");
-
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить список каталогов
-// Получает список каталогов диска
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// ИмяСодержит - Строка - Отбор по имени - querry
-// Подробно - Булево - Добавляет список файлов к полям каталога - depth
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - Массив соответствий каталогов
-Функция ПолучитьСписокКаталогов(Знач Токен, Знач ИмяСодержит = "", Знач Подробно = Ложь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяСодержит);
- OPI_ПреобразованиеТипов.ПолучитьБулево(Подробно);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- МассивОбъектов = Новый Массив;
- Отбор = Новый Массив;
-
- Отбор.Добавить("mimeType = 'application/vnd.google-apps.folder'");
-
- Если ЗначениеЗаполнено(ИмяСодержит) Тогда
- Отбор.Добавить("name contains '" + ИмяСодержит + "'");
- КонецЕсли;
-
- ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор);
-
- Если Подробно Тогда
- РазложитьОбъектыПодробно(Токен, МассивОбъектов);
- КонецЕсли;
-
- Возврат МассивОбъектов;
-
-КонецФункции
-
-// Получить список файлов
-// Получает список файлов
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// ИмяСодержит - Строка - Отбор по имени - querry
-// Каталог - Строка - Отбор по ID каталога родителя - catalog
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - Массив соответствий файлов
-Функция ПолучитьСписокФайлов(Знач Токен, Знач ИмяСодержит = "", Знач Каталог = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяСодержит);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Каталог);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- МассивОбъектов = Новый Массив;
- Отбор = Новый Массив;
-
- Отбор.Добавить("mimeType != 'application/vnd.google-apps.folder'");
-
- Если ЗначениеЗаполнено(ИмяСодержит) Тогда
- Отбор.Добавить("name contains '" + ИмяСодержит + "'");
- КонецЕсли;
-
- Если ЗначениеЗаполнено(Каталог) Тогда
- Отбор.Добавить("'" + Каталог + "' in parents");
- КонецЕсли;
-
- ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, , Отбор);
-
- Возврат МассивОбъектов;
-
-КонецФункции
-
-// Загрузить файл
-// Загружает файл на диск
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Файл - ДвоичныеДанные,Строка - Загружаемый файл - file
-// Описание - Соответствие Из КлючИЗначение - См. ПолучитьОписаниеФайла - props - JSON описания или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Описание) Экспорт
- Возврат УправлениеФайлом(Токен, Файл, Описание);
-КонецФункции
-
-// Создать папку
-// Создает пустой каталог на диске
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Имя - Строка - Имя папки - title
-// Родитель - Строка - Родитель - catalog
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция СоздатьПапку(Знач Токен, Знач Имя, Знач Родитель = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
-
- Описание = Новый Соответствие;
- Описание.Вставить("MIME" , "application/vnd.google-apps.folder");
- Описание.Вставить("Имя" , Имя);
- Описание.Вставить("Описание", "");
- Описание.Вставить("Родитель", ?(ЗначениеЗаполнено(Родитель), Родитель, "root"));
-
- Возврат УправлениеФайлом(Токен, , Описание);
-
-КонецФункции
-
-// Скачать файл
-// Получает файл по ID
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Идентификатор - Строка - Идентификатор файла - object
-// ПутьСохранения - Строка - Путь сохранения файла - out
-//
-// Возвращаемое значение:
-// ДвоичныеДанные,Строка - Двоичные данные или путь к файлу при указании параметра ПутьСохранения
-Функция СкачатьФайл(Знач Токен, Знач Идентификатор, Знач ПутьСохранения = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор;
-
- Параметры = Новый Соответствие;
- Параметры.Вставить("alt", "media");
-
- Ответ = OPI_Инструменты.Get(URL, Параметры , Заголовки, ПутьСохранения);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Скоприровать объект
-// Копирует файл или каталог
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Идентификатор - Строка - Идентификатор объекта - object
-// НовоеИмя - Строка - Новое имя объекта - title
-// НовыйРодитель - Строка - Новый каталог размещения - catalog
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция СкопироватьОбъект(Знач Токен, Знач Идентификатор, Знач НовоеИмя = "", Знач НовыйРодитель = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(НовоеИмя);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(НовыйРодитель);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/copy";
-
- Параметры = Новый Структура;
-
- Если ЗначениеЗаполнено(НовоеИмя) Тогда
- Параметры.Вставить("name", НовоеИмя);
- КонецЕсли;
-
- Если ЗначениеЗаполнено(НовыйРодитель) Тогда
-
- МассивРодителей = Новый Массив;
- МассивРодителей.Добавить(НовыйРодитель);
- Параметры.Вставить("parents", МассивРодителей);
-
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Post(URL, Параметры , Заголовки, Истина);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Обновить файл
-// Обновляет двоичные данные файла
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Идентификатор - Строка - Идентификатор обновляемого объекта - object
-// Файл - ДвоичныеДанные,Строка - Файл источник обновления - file
-// НовоеИмя - Строка - Новое имя файла (если необходимо) - title
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ОбновитьФайл(Знач Токен, Знач Идентификатор, Знач Файл, Знач НовоеИмя = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(НовоеИмя);
- OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
-
- Если ЗначениеЗаполнено(НовоеИмя) Тогда
- Описание = Новый Соответствие;
- Описание.Вставить("Имя", НовоеИмя);
- Иначе
- Описание = "";
- КонецЕсли;
-
- Возврат УправлениеФайлом(Токен, Файл, Описание, Идентификатор);
-
-КонецФункции
-
-// Удалить объект
-// Удаляет файл или каталог по ID
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Идентификатор - Строка - Идентификатор объекта для удаления - object
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция УдалитьОбъект(Знач Токен, Знач Идентификатор) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор;
- Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить описание файла !NOCLI
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - Описание файла
-Функция ПолучитьОписаниеФайла() Экспорт
-
- Описание = Новый Соответствие;
- Описание.Вставить("MIME" , "image/jpeg"); // MIME-тип загружаемого файла
- Описание.Вставить("Имя" , "Новый файл.jpg"); // Имя файла с расширением
- Описание.Вставить("Описание" , "Это новый файл"); // Описание файла
- Описание.Вставить("Родитель" , "root"); // ID каталога загрузки или "root" для загрузки в корень
-
- Возврат Описание;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСКомментариями
-
-// Создать комментарий
-// Создает комментарий к файлу или каталогу
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Идентификатор - Строка - Идентификатор объекта, для которого необходим комментарий - object
-// Комментарий - Строка - Текст комментария - text
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция СоздатьКомментарий(Знач Токен, Знач Идентификатор, Знач Комментарий) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/comments?fields=*";
-
- Параметры = Новый Структура;
- Параметры.Вставить("content", Комментарий);
-
- Ответ = OPI_Инструменты.POST(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить комментарий
-// Получает комментарий по ID
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// ИДОбъекта - Строка - Идентификатор файла или каталога размещения комментария - object
-// ИДКомментария - Строка - Идентификатор комментария - comment
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьКомментарий(Знач Токен, Знач ИДОбъекта, Знач ИДКомментария) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДКомментария);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments/" + ИДКомментария;
-
- Параметры = Новый Структура;
- Параметры.Вставить("fields", "*");
-
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить список комментариев
-// Получает список всех комментариев объекта
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// ИДОбъекта - Строка - Идентификатор объекта - object
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьСписокКомментариев(Знач Токен, Знач ИДОбъекта) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments";
-
- Параметры = Новый Структура;
- Параметры.Вставить("fields", "*");
-
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить комментарий
-// Удаляет комментарий по ID
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// ИДОбъекта - Строка - Идентификатор файла или каталога размещения комментария - object
-// ИДКомментария - Строка - Идентификатор комментария - comment
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция УдалитьКомментарий(Знач Токен, Знач ИДОбъекта, Знач ИДКомментария) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДКомментария);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments/" + ИДКомментария;
-
- Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Процедура ПолучитьСписокОбъектовРекурсивно(Знач Заголовки, МассивОбъектов, Подробно = Ложь, Отбор = "", Страница = "")
-
- URL = "https://www.googleapis.com/drive/v3/files";
- Files = "files";
- NPT = "nextPageToken";
- Параметры = Новый Структура;
- Параметры.Вставить("fields", "*");
-
- Если ЗначениеЗаполнено(Страница) Тогда
- Параметры.Вставить("pageToken", Страница);
- КонецЕсли;
-
- Если ЗначениеЗаполнено(Отбор) И ТипЗнч(Отбор) = Тип("Массив") Тогда
- ОтборСтрока = СтрСоединить(Отбор, " and ");
- Параметры.Вставить("q", ОтборСтрока);
- КонецЕсли;
-
- Результат = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-
- Объекты = Результат[Files];
- Страница = Результат[NPT];
-
- Для Каждого ТекущийОбъект Из Объекты Цикл
- МассивОбъектов.Добавить(ТекущийОбъект);
- КонецЦикла;
-
- Если Объекты.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда
- ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор, Страница);
- КонецЕсли;
-
-КонецПроцедуры
-
-Процедура РазложитьОбъектыПодробно(Знач Токен, МассивОбъектов)
-
- Для Каждого ТекущийОбъект Из МассивОбъектов Цикл
-
- МассивФайлов = Новый Массив;
- ТекущийИД = ТекущийОбъект["id"];
-
- Результат = ПолучитьСписокФайлов(Токен, , ТекущийИД);
-
- Для Каждого Файл Из Результат Цикл
- МассивФайлов.Добавить(Файл);
- КонецЦикла;
-
- ТекущийОбъект.Вставить("files", МассивФайлов);
-
- КонецЦикла;
-
-КонецПроцедуры
-
-Процедура СформироватьПараметрыЗагрузкиФайла(Описание)
-
- СформированноеОписание = Новый Соответствие;
- OPI_Инструменты.УдалитьПустыеПоляКоллекции(Описание);
-
- СоответствиеПолей = Новый Соответствие;
- СоответствиеПолей.Вставить("MIME" , "mimeType");
- СоответствиеПолей.Вставить("Имя" , "name");
- СоответствиеПолей.Вставить("Описание" , "description");
- СоответствиеПолей.Вставить("Родитель" , "parents");
- СоответствиеПолей.Вставить("Расширение", "fileExtension");
-
- Для Каждого Элемент Из Описание Цикл
-
- Если Элемент.Ключ = "Родитель" Тогда
-
- ТекущееЗначение = Новый Массив;
- ТекущееЗначение.Добавить(Элемент.Значение);
-
- Иначе
-
- ТекущееЗначение = Элемент.Значение;
-
- КонецЕсли;
-
- ИмяПоля = СоответствиеПолей.Получить(Элемент.Ключ);
- СформированноеОписание.Вставить(ИмяПоля, ТекущееЗначение);
-
- КонецЦикла;
-
- Описание = СформированноеОписание;
-
-КонецПроцедуры
-
-Функция УправлениеФайлом(Знач Токен, Знач Файл = "", Знач Описание = "", Знач Идентификатор = "")
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
-
- Если ЗначениеЗаполнено(Описание) Тогда
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Описание);
- КонецЕсли;
-
- MimeType = "mimeType";
-
- Если ЗначениеЗаполнено(Идентификатор) Тогда
- MIME = ПолучитьИнформациюОбОбъекте(Токен, Идентификатор)[MimeType];
- Иначе
- MIME = Описание["MIME"];
- КонецЕсли;
-
- Если Не ЗначениеЗаполнено(Описание) Тогда
- Описание = Новый Соответствие;
- КонецЕсли;
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- СформироватьПараметрыЗагрузкиФайла(Описание);
- ОписаниеJSON = OPI_Инструменты.JSONСтрокой(Описание);
-
- СоответствиеФайла = Новый Соответствие;
-
- Если ЗначениеЗаполнено(Файл) Тогда
-
- РазмерЧасти = 268435457;
- Размер = OPI_Инструменты.ПреобразоватьДанныеСПолучениемРазмера(Файл, РазмерЧасти);
-
- СоответствиеФайла.Вставить(Файл, MIME);
-
- Если Размер < РазмерЧасти И ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
- Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор);
- Иначе
- Ответ = ЗагрузитьБольшойФайл(Описание, СоответствиеФайла, Заголовки, Идентификатор);
- КонецЕсли;
-
- Иначе
- Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор);
- КонецЕсли;
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ЗагрузитьМалыйФайл(Знач Описание, Знач СоответствиеФайла, Знач Заголовки, Знач Идентификатор = "")
-
- URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart";
-
- Если ЗначениеЗаполнено(Идентификатор) Тогда
- URL = СтрЗаменить(URL, "/files", "/files/" + Идентификатор);
- Ответ = OPI_Инструменты.PatchMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки);
- Иначе
- Ответ = OPI_Инструменты.PostMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки);
- КонецЕсли;
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ЗагрузитьБольшойФайл(Знач Описание, Знач СоответствиеФайла, Знач Заголовки, Знач Идентификатор = "")
-
- Для Каждого Файл Из СоответствиеФайла Цикл
- Двоичные = Файл.Ключ;
- Прервать;
- КонецЦикла;
-
- URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable";
-
- Если ЗначениеЗаполнено(Идентификатор) Тогда
- URL = СтрЗаменить(URL, "/files", "/files/" + Идентификатор);
- Ответ = OPI_Инструменты.Patch(URL, Описание, Заголовки, Истина, Истина);
- Иначе
- Ответ = OPI_Инструменты.Post(URL, Описание, Заголовки, Истина, Истина);
- КонецЕсли;
-
- АдресЗагрузки = Ответ.Заголовки["Location"];
-
- Если Не ЗначениеЗаполнено(АдресЗагрузки) Тогда
- OPI_Инструменты.ОбработатьОтвет(Ответ);
- Возврат Ответ;
- КонецЕсли;
-
- ОтветЗагрузки = ЗагрузитьФайлЧастями(Двоичные, АдресЗагрузки);
- Ответ = ?(ЗначениеЗаполнено(ОтветЗагрузки), ОтветЗагрузки, Ответ);
-
- OPI_Инструменты.ОбработатьОтвет(Ответ);
- Возврат Ответ;
-
-КонецФункции
-
-Функция ЗагрузитьФайлЧастями(Знач Двоичные, Знач АдресЗагрузки)
-
- Ответ = "";
- РазмерЧасти = 268435456;
- ПрочитаноБайт = 0;
- ТекущаяПозиция = 0;
- ОбщийРазмер = Двоичные.Размер();
- СтрОбщийРазмер = OPI_Инструменты.ЧислоВСтроку(ОбщийРазмер);
- ЧтениеДанных = Новый ЧтениеДанных(Двоичные);
- ИсходныйПоток = ЧтениеДанных.ИсходныйПоток();
-
- Пока ПрочитаноБайт < ОбщийРазмер Цикл
-
- ПрочитаноБайт = ИсходныйПоток.ТекущаяПозиция();
- Результат = ЧтениеДанных.Прочитать(РазмерЧасти);
- ТекущиеДанные = Результат.ПолучитьДвоичныеДанные();
- РазмерТекущих = ТекущиеДанные.Размер();
- СледующаяПозиция = ТекущаяПозиция + РазмерТекущих - 1;
-
- Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда
- Прервать;
- КонецЕсли;
-
- ЗаголовокПотока = "bytes "
- + OPI_Инструменты.ЧислоВСтроку(ТекущаяПозиция)
- + "-"
- + OPI_Инструменты.ЧислоВСтроку(СледующаяПозиция)
- + "/"
- + СтрОбщийРазмер;
-
- ДопЗаголовки = Новый Соответствие;
- ДопЗаголовки.Вставить("Content-Length", OPI_Инструменты.ЧислоВСтроку(РазмерТекущих));
- ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока);
- ДопЗаголовки.Вставить("Content-Type" , "application/octet-stream");
-
- Ответ = OPI_Инструменты.Put(АдресЗагрузки, ТекущиеДанные, ДопЗаголовки, Ложь, Истина);
-
- РезультатПроверки = ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция);
-
- Если ЗначениеЗаполнено(РезультатПроверки) Тогда
- Возврат РезультатПроверки;
- КонецЕсли;
-
- КБайт = 1024;
- МБайт = КБайт * КБайт;
- Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт));
-
- ВыполнитьСборкуМусора();
- ОсвободитьОбъект(ТекущиеДанные);
-
- КонецЦикла;
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция)
-
- НачалоКодовОшибок = 400;
- КонецКодовПадений = 600;
- НачалоКодовУспеха = 200;
- КонецКодовУспеха = 300;
- Перенаправление = 308;
-
- Если Ответ.КодСостояния >= НачалоКодовОшибок И Ответ.КодСостояния < КонецКодовПадений Тогда
-
- ЗаголовокПотока = "bytes */" + СтрОбщийРазмер;
- ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока);
-
- ОтветПроверки = OPI_Инструменты.Put(АдресЗагрузки, "", ДопЗаголовки, Ложь, Истина);
-
- Если ОтветПроверки.КодСостояния >= НачалоКодовУспеха И ОтветПроверки.КодСостояния < КонецКодовУспеха Тогда
-
- OPI_Инструменты.ОбработатьОтвет(ОтветПроверки);
- Возврат ОтветПроверки;
-
- ИначеЕсли ОтветПроверки.КодСостояния = Перенаправление Тогда
-
- ЗагруженныеДанные = Ответ.Заголовки["Range"];
-
- Иначе
-
- OPI_Инструменты.ОбработатьОтвет(Ответ);
- Возврат Ответ;
-
- КонецЕсли;
-
- Иначе
- ЗагруженныеДанные = Ответ.Заголовки["Range"];
- КонецЕсли;
-
- Если Не ЗначениеЗаполнено(ЗагруженныеДанные) Тогда
- OPI_Инструменты.ОбработатьОтвет(Ответ);
- Возврат Ответ;
- КонецЕсли;
-
- ЗагруженныеДанные = СтрЗаменить(ЗагруженныеДанные, "bytes=", "");
- МассивИнформации = СтрРазделить(ЗагруженныеДанные, "-", Ложь);
- НеобходимоЧастей = 2;
-
- Если Не МассивИнформации.Количество() = НеобходимоЧастей Тогда
- OPI_Инструменты.ОбработатьОтвет(Ответ);
- Возврат Ответ;
- КонецЕсли;
-
- ТекущаяПозиция = Число(МассивИнформации[1]) + 1;
-
- Возврат "";
-
-КонецФункции
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_GoogleDrive.os
+// Библиотека: Google Drive
+// Команда CLI: gdrive
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область РаботаСФайламиИКаталогами
+
+// Получить информацию об объекте
+// Получает информацию о папке или файле по ID
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Идентификатор - Строка - Идентификатор файла или каталога - object
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьИнформациюОбОбъекте(Знач Токен, Знач Идентификатор) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор;
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("fields", "*");
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить список каталогов
+// Получает список каталогов диска
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// ИмяСодержит - Строка - Отбор по имени - querry
+// Подробно - Булево - Добавляет список файлов к полям каталога - depth
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - Массив соответствий каталогов
+Функция ПолучитьСписокКаталогов(Знач Токен, Знач ИмяСодержит = "", Знач Подробно = Ложь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяСодержит);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Подробно);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ МассивОбъектов = Новый Массив;
+ Отбор = Новый Массив;
+
+ Отбор.Добавить("mimeType = 'application/vnd.google-apps.folder'");
+
+ Если ЗначениеЗаполнено(ИмяСодержит) Тогда
+ Отбор.Добавить("name contains '" + ИмяСодержит + "'");
+ КонецЕсли;
+
+ ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор);
+
+ Если Подробно Тогда
+ РазложитьОбъектыПодробно(Токен, МассивОбъектов);
+ КонецЕсли;
+
+ Возврат МассивОбъектов;
+
+КонецФункции
+
+// Получить список файлов
+// Получает список файлов
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// ИмяСодержит - Строка - Отбор по имени - querry
+// Каталог - Строка - Отбор по ID каталога родителя - catalog
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - Массив соответствий файлов
+Функция ПолучитьСписокФайлов(Знач Токен, Знач ИмяСодержит = "", Знач Каталог = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяСодержит);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Каталог);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ МассивОбъектов = Новый Массив;
+ Отбор = Новый Массив;
+
+ Отбор.Добавить("mimeType != 'application/vnd.google-apps.folder'");
+
+ Если ЗначениеЗаполнено(ИмяСодержит) Тогда
+ Отбор.Добавить("name contains '" + ИмяСодержит + "'");
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(Каталог) Тогда
+ Отбор.Добавить("'" + Каталог + "' in parents");
+ КонецЕсли;
+
+ ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, , Отбор);
+
+ Возврат МассивОбъектов;
+
+КонецФункции
+
+// Загрузить файл
+// Загружает файл на диск
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Файл - ДвоичныеДанные,Строка - Загружаемый файл - file
+// Описание - Соответствие Из КлючИЗначение - См. ПолучитьОписаниеФайла - props - JSON описания или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач Описание) Экспорт
+ Возврат УправлениеФайлом(Токен, Файл, Описание);
+КонецФункции
+
+// Создать папку
+// Создает пустой каталог на диске
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Имя - Строка - Имя папки - title
+// Родитель - Строка - Родитель - catalog
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция СоздатьПапку(Знач Токен, Знач Имя, Знач Родитель = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Имя);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
+
+ Описание = Новый Соответствие;
+ Описание.Вставить("MIME" , "application/vnd.google-apps.folder");
+ Описание.Вставить("Имя" , Имя);
+ Описание.Вставить("Описание", "");
+ Описание.Вставить("Родитель", ?(ЗначениеЗаполнено(Родитель), Родитель, "root"));
+
+ Возврат УправлениеФайлом(Токен, , Описание);
+
+КонецФункции
+
+// Скачать файл
+// Получает файл по ID
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Идентификатор - Строка - Идентификатор файла - object
+// ПутьСохранения - Строка - Путь сохранения файла - out
+//
+// Возвращаемое значение:
+// ДвоичныеДанные,Строка - Двоичные данные или путь к файлу при указании параметра ПутьСохранения
+Функция СкачатьФайл(Знач Токен, Знач Идентификатор, Знач ПутьСохранения = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор;
+
+ Параметры = Новый Соответствие;
+ Параметры.Вставить("alt", "media");
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры , Заголовки, ПутьСохранения);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Скоприровать объект
+// Копирует файл или каталог
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Идентификатор - Строка - Идентификатор объекта - object
+// НовоеИмя - Строка - Новое имя объекта - title
+// НовыйРодитель - Строка - Новый каталог размещения - catalog
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция СкопироватьОбъект(Знач Токен, Знач Идентификатор, Знач НовоеИмя = "", Знач НовыйРодитель = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(НовоеИмя);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(НовыйРодитель);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/copy";
+
+ Параметры = Новый Структура;
+
+ Если ЗначениеЗаполнено(НовоеИмя) Тогда
+ Параметры.Вставить("name", НовоеИмя);
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(НовыйРодитель) Тогда
+
+ МассивРодителей = Новый Массив;
+ МассивРодителей.Добавить(НовыйРодитель);
+ Параметры.Вставить("parents", МассивРодителей);
+
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры , Заголовки, Истина);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Обновить файл
+// Обновляет двоичные данные файла
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Идентификатор - Строка - Идентификатор обновляемого объекта - object
+// Файл - ДвоичныеДанные,Строка - Файл источник обновления - file
+// НовоеИмя - Строка - Новое имя файла (если необходимо) - title
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ОбновитьФайл(Знач Токен, Знач Идентификатор, Знач Файл, Знач НовоеИмя = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(НовоеИмя);
+ OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
+
+ Если ЗначениеЗаполнено(НовоеИмя) Тогда
+ Описание = Новый Соответствие;
+ Описание.Вставить("Имя", НовоеИмя);
+ Иначе
+ Описание = "";
+ КонецЕсли;
+
+ Возврат УправлениеФайлом(Токен, Файл, Описание, Идентификатор);
+
+КонецФункции
+
+// Удалить объект
+// Удаляет файл или каталог по ID
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Идентификатор - Строка - Идентификатор объекта для удаления - object
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция УдалитьОбъект(Знач Токен, Знач Идентификатор) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор;
+ Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить описание файла !NOCLI
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - Описание файла
+Функция ПолучитьОписаниеФайла() Экспорт
+
+ Описание = Новый Соответствие;
+ Описание.Вставить("MIME" , "image/jpeg"); // MIME-тип загружаемого файла
+ Описание.Вставить("Имя" , "Новый файл.jpg"); // Имя файла с расширением
+ Описание.Вставить("Описание" , "Это новый файл"); // Описание файла
+ Описание.Вставить("Родитель" , "root"); // ID каталога загрузки или "root" для загрузки в корень
+
+ Возврат Описание;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСКомментариями
+
+// Создать комментарий
+// Создает комментарий к файлу или каталогу
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Идентификатор - Строка - Идентификатор объекта, для которого необходим комментарий - object
+// Комментарий - Строка - Текст комментария - text
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция СоздатьКомментарий(Знач Токен, Знач Идентификатор, Знач Комментарий) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Комментарий);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/drive/v3/files/" + Идентификатор + "/comments?fields=*";
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("content", Комментарий);
+
+ Ответ = OPI_Инструменты.POST(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить комментарий
+// Получает комментарий по ID
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// ИДОбъекта - Строка - Идентификатор файла или каталога размещения комментария - object
+// ИДКомментария - Строка - Идентификатор комментария - comment
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьКомментарий(Знач Токен, Знач ИДОбъекта, Знач ИДКомментария) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДКомментария);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments/" + ИДКомментария;
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("fields", "*");
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить список комментариев
+// Получает список всех комментариев объекта
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// ИДОбъекта - Строка - Идентификатор объекта - object
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьСписокКомментариев(Знач Токен, Знач ИДОбъекта) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments";
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("fields", "*");
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить комментарий
+// Удаляет комментарий по ID
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// ИДОбъекта - Строка - Идентификатор файла или каталога размещения комментария - object
+// ИДКомментария - Строка - Идентификатор комментария - comment
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция УдалитьКомментарий(Знач Токен, Знач ИДОбъекта, Знач ИДКомментария) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДОбъекта);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДКомментария);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://www.googleapis.com/drive/v3/files/" + ИДОбъекта + "/comments/" + ИДКомментария;
+
+ Ответ = OPI_Инструменты.Delete(URL, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Процедура ПолучитьСписокОбъектовРекурсивно(Знач Заголовки, МассивОбъектов, Подробно = Ложь, Отбор = "", Страница = "")
+
+ URL = "https://www.googleapis.com/drive/v3/files";
+ Files = "files";
+ NPT = "nextPageToken";
+ Параметры = Новый Структура;
+ Параметры.Вставить("fields", "*");
+
+ Если ЗначениеЗаполнено(Страница) Тогда
+ Параметры.Вставить("pageToken", Страница);
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(Отбор) И ТипЗнч(Отбор) = Тип("Массив") Тогда
+ ОтборСтрока = СтрСоединить(Отбор, " and ");
+ Параметры.Вставить("q", ОтборСтрока);
+ КонецЕсли;
+
+ Результат = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+
+ Объекты = Результат[Files];
+ Страница = Результат[NPT];
+
+ Для Каждого ТекущийОбъект Из Объекты Цикл
+ МассивОбъектов.Добавить(ТекущийОбъект);
+ КонецЦикла;
+
+ Если Объекты.Количество() > 0 И ЗначениеЗаполнено(Страница) Тогда
+ ПолучитьСписокОбъектовРекурсивно(Заголовки, МассивОбъектов, Подробно, Отбор, Страница);
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура РазложитьОбъектыПодробно(Знач Токен, МассивОбъектов)
+
+ Для Каждого ТекущийОбъект Из МассивОбъектов Цикл
+
+ МассивФайлов = Новый Массив;
+ ТекущийИД = ТекущийОбъект["id"];
+
+ Результат = ПолучитьСписокФайлов(Токен, , ТекущийИД);
+
+ Для Каждого Файл Из Результат Цикл
+ МассивФайлов.Добавить(Файл);
+ КонецЦикла;
+
+ ТекущийОбъект.Вставить("files", МассивФайлов);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура СформироватьПараметрыЗагрузкиФайла(Описание)
+
+ СформированноеОписание = Новый Соответствие;
+ OPI_Инструменты.УдалитьПустыеПоляКоллекции(Описание);
+
+ СоответствиеПолей = Новый Соответствие;
+ СоответствиеПолей.Вставить("MIME" , "mimeType");
+ СоответствиеПолей.Вставить("Имя" , "name");
+ СоответствиеПолей.Вставить("Описание" , "description");
+ СоответствиеПолей.Вставить("Родитель" , "parents");
+ СоответствиеПолей.Вставить("Расширение", "fileExtension");
+
+ Для Каждого Элемент Из Описание Цикл
+
+ Если Элемент.Ключ = "Родитель" Тогда
+
+ ТекущееЗначение = Новый Массив;
+ ТекущееЗначение.Добавить(Элемент.Значение);
+
+ Иначе
+
+ ТекущееЗначение = Элемент.Значение;
+
+ КонецЕсли;
+
+ ИмяПоля = СоответствиеПолей.Получить(Элемент.Ключ);
+ СформированноеОписание.Вставить(ИмяПоля, ТекущееЗначение);
+
+ КонецЦикла;
+
+ Описание = СформированноеОписание;
+
+КонецПроцедуры
+
+Функция УправлениеФайлом(Знач Токен, Знач Файл = "", Знач Описание = "", Знач Идентификатор = "")
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
+
+ Если ЗначениеЗаполнено(Описание) Тогда
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Описание);
+ КонецЕсли;
+
+ MimeType = "mimeType";
+
+ Если ЗначениеЗаполнено(Идентификатор) Тогда
+ MIME = ПолучитьИнформациюОбОбъекте(Токен, Идентификатор)[MimeType];
+ Иначе
+ MIME = Описание["MIME"];
+ КонецЕсли;
+
+ Если Не ЗначениеЗаполнено(Описание) Тогда
+ Описание = Новый Соответствие;
+ КонецЕсли;
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ СформироватьПараметрыЗагрузкиФайла(Описание);
+ ОписаниеJSON = OPI_Инструменты.JSONСтрокой(Описание);
+
+ СоответствиеФайла = Новый Соответствие;
+
+ Если ЗначениеЗаполнено(Файл) Тогда
+
+ РазмерЧасти = 268435457;
+ Размер = OPI_Инструменты.ПреобразоватьДанныеСПолучениемРазмера(Файл, РазмерЧасти);
+
+ СоответствиеФайла.Вставить(Файл, MIME);
+
+ Если Размер < РазмерЧасти И ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
+ Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор);
+ Иначе
+ Ответ = ЗагрузитьБольшойФайл(Описание, СоответствиеФайла, Заголовки, Идентификатор);
+ КонецЕсли;
+
+ Иначе
+ Ответ = ЗагрузитьМалыйФайл(ОписаниеJSON, СоответствиеФайла, Заголовки, Идентификатор);
+ КонецЕсли;
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ЗагрузитьМалыйФайл(Знач Описание, Знач СоответствиеФайла, Знач Заголовки, Знач Идентификатор = "")
+
+ URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart";
+
+ Если ЗначениеЗаполнено(Идентификатор) Тогда
+ URL = СтрЗаменить(URL, "/files", "/files/" + Идентификатор);
+ Ответ = OPI_Инструменты.PatchMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки);
+ Иначе
+ Ответ = OPI_Инструменты.PostMultipartRelated(URL, Описание, СоответствиеФайла, Заголовки);
+ КонецЕсли;
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ЗагрузитьБольшойФайл(Знач Описание, Знач СоответствиеФайла, Знач Заголовки, Знач Идентификатор = "")
+
+ Для Каждого Файл Из СоответствиеФайла Цикл
+ Двоичные = Файл.Ключ;
+ Прервать;
+ КонецЦикла;
+
+ URL = "https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable";
+
+ Если ЗначениеЗаполнено(Идентификатор) Тогда
+ URL = СтрЗаменить(URL, "/files", "/files/" + Идентификатор);
+ Ответ = OPI_Инструменты.Patch(URL, Описание, Заголовки, Истина, Истина);
+ Иначе
+ Ответ = OPI_Инструменты.Post(URL, Описание, Заголовки, Истина, Истина);
+ КонецЕсли;
+
+ АдресЗагрузки = Ответ.Заголовки["Location"];
+
+ Если Не ЗначениеЗаполнено(АдресЗагрузки) Тогда
+ OPI_Инструменты.ОбработатьОтвет(Ответ);
+ Возврат Ответ;
+ КонецЕсли;
+
+ ОтветЗагрузки = ЗагрузитьФайлЧастями(Двоичные, АдресЗагрузки);
+ Ответ = ?(ЗначениеЗаполнено(ОтветЗагрузки), ОтветЗагрузки, Ответ);
+
+ OPI_Инструменты.ОбработатьОтвет(Ответ);
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ЗагрузитьФайлЧастями(Знач Двоичные, Знач АдресЗагрузки)
+
+ Ответ = "";
+ РазмерЧасти = 268435456;
+ ПрочитаноБайт = 0;
+ ТекущаяПозиция = 0;
+ ОбщийРазмер = Двоичные.Размер();
+ СтрОбщийРазмер = OPI_Инструменты.ЧислоВСтроку(ОбщийРазмер);
+ ЧтениеДанных = Новый ЧтениеДанных(Двоичные);
+ ИсходныйПоток = ЧтениеДанных.ИсходныйПоток();
+
+ Пока ПрочитаноБайт < ОбщийРазмер Цикл
+
+ ПрочитаноБайт = ИсходныйПоток.ТекущаяПозиция();
+ Результат = ЧтениеДанных.Прочитать(РазмерЧасти);
+ ТекущиеДанные = Результат.ПолучитьДвоичныеДанные();
+ РазмерТекущих = ТекущиеДанные.Размер();
+ СледующаяПозиция = ТекущаяПозиция + РазмерТекущих - 1;
+
+ Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда
+ Прервать;
+ КонецЕсли;
+
+ ЗаголовокПотока = "bytes "
+ + OPI_Инструменты.ЧислоВСтроку(ТекущаяПозиция)
+ + "-"
+ + OPI_Инструменты.ЧислоВСтроку(СледующаяПозиция)
+ + "/"
+ + СтрОбщийРазмер;
+
+ ДопЗаголовки = Новый Соответствие;
+ ДопЗаголовки.Вставить("Content-Length", OPI_Инструменты.ЧислоВСтроку(РазмерТекущих));
+ ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока);
+ ДопЗаголовки.Вставить("Content-Type" , "application/octet-stream");
+
+ Ответ = OPI_Инструменты.Put(АдресЗагрузки, ТекущиеДанные, ДопЗаголовки, Ложь, Истина);
+
+ РезультатПроверки = ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция);
+
+ Если ЗначениеЗаполнено(РезультатПроверки) Тогда
+ Возврат РезультатПроверки;
+ КонецЕсли;
+
+ КБайт = 1024;
+ МБайт = КБайт * КБайт;
+ Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт));
+
+ ВыполнитьСборкуМусора();
+ ОсвободитьОбъект(ТекущиеДанные);
+
+ КонецЦикла;
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция)
+
+ НачалоКодовОшибок = 400;
+ КонецКодовПадений = 600;
+ НачалоКодовУспеха = 200;
+ КонецКодовУспеха = 300;
+ Перенаправление = 308;
+
+ Если Ответ.КодСостояния >= НачалоКодовОшибок И Ответ.КодСостояния < КонецКодовПадений Тогда
+
+ ЗаголовокПотока = "bytes */" + СтрОбщийРазмер;
+ ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока);
+
+ ОтветПроверки = OPI_Инструменты.Put(АдресЗагрузки, "", ДопЗаголовки, Ложь, Истина);
+
+ Если ОтветПроверки.КодСостояния >= НачалоКодовУспеха И ОтветПроверки.КодСостояния < КонецКодовУспеха Тогда
+
+ OPI_Инструменты.ОбработатьОтвет(ОтветПроверки);
+ Возврат ОтветПроверки;
+
+ ИначеЕсли ОтветПроверки.КодСостояния = Перенаправление Тогда
+
+ ЗагруженныеДанные = Ответ.Заголовки["Range"];
+
+ Иначе
+
+ OPI_Инструменты.ОбработатьОтвет(Ответ);
+ Возврат Ответ;
+
+ КонецЕсли;
+
+ Иначе
+ ЗагруженныеДанные = Ответ.Заголовки["Range"];
+ КонецЕсли;
+
+ Если Не ЗначениеЗаполнено(ЗагруженныеДанные) Тогда
+ OPI_Инструменты.ОбработатьОтвет(Ответ);
+ Возврат Ответ;
+ КонецЕсли;
+
+ ЗагруженныеДанные = СтрЗаменить(ЗагруженныеДанные, "bytes=", "");
+ МассивИнформации = СтрРазделить(ЗагруженныеДанные, "-", Ложь);
+ НеобходимоЧастей = 2;
+
+ Если Не МассивИнформации.Количество() = НеобходимоЧастей Тогда
+ OPI_Инструменты.ОбработатьОтвет(Ответ);
+ Возврат Ответ;
+ КонецЕсли;
+
+ ТекущаяПозиция = Число(МассивИнформации[1]) + 1;
+
+ Возврат "";
+
+КонецФункции
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_GoogleSheets.os b/ru/OInt/core/Modules/OPI_GoogleSheets.os
index f8db5f80e2..1828f40471 100644
--- a/ru/OInt/core/Modules/OPI_GoogleSheets.os
+++ b/ru/OInt/core/Modules/OPI_GoogleSheets.os
@@ -1,409 +1,409 @@
-// Расположение OS: ./OInt/core/Modules/OPI_GoogleSheets.os
-// Библиотека: Google Sheets
-// Команда CLI: gsheets
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область РаботаСКнигами
-
-// Создать книгу
-// Создает новую книгу
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Наименование - Строка - Наименование - title
-// МассивИменЛистов - Массив из Строка - Массив имен для добавления новых листов в книгу - sheets
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция СоздатьКнигу(Знач Токен, Знач Наименование, Знач МассивИменЛистов) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИменЛистов);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://sheets.googleapis.com/v4/spreadsheets";
-
- Свойства = Новый Структура("title" , Наименование);
- Листы = Новый Массив;
-
- ЗаполнитьМассивЛистов(МассивИменЛистов, Листы);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("properties", Свойства, "Коллекция", Параметры);
- OPI_Инструменты.ДобавитьПоле("sheets" , Листы , "Коллекция", Параметры);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить книгу
-// Получает информацию о книге по ID
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Идентификатор - Строка - Идентификатор книги - spreadsheet
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьКнигу(Знач Токен, Знач Идентификатор) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Идентификатор;
-
- Ответ = OPI_Инструменты.Get(URL, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Изменить наименование книги
-// Изменяет наименование существующей книги
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Книга - Строка - ID книги - spreadsheet
-// Наименование - Строка - Новое наименование - title
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ИзменитьНаименованиеКниги(Знач Токен, Знач Книга, Знач Наименование) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
-
- Изменение = Новый Структура("title", Наименование);
- ЗапросИзменения = Новый Структура("properties,fields", Изменение, "title");
- Запрос = Новый Структура("updateSpreadsheetProperties", ЗапросИзменения);
-
- МассивЗапросов = Новый Массив;
- МассивЗапросов.Добавить(Запрос);
-
- Параметры = Новый Структура("requests", МассивЗапросов);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСЛистами
-
-// Добавить лист
-// Добавляет новый лист в книгу
-//
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Книга - Строка - Идентификатор книги - spreadsheet
-// Наименование - Строка - Наименование нового листа - title
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ДобавитьЛист(Знач Токен, Знач Книга, Знач Наименование) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
- Лист = СоздатьЛист(Наименование);
-
- Запросы = Новый Массив;
- Изменение = Новый Структура("addSheet", Лист);
- Запросы.Добавить(Изменение);
-
- Параметры = Новый Структура("requests", Запросы);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить лист
-// Удаляет лист из книги
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Книга - Строка - Идентификатор книги - spreadsheet
-// Лист - Строка - Идентификатор удаляемого листа - sheet
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция УдалитьЛист(Знач Токен, Знач Книга, Знач Лист) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
-
- Запросы = Новый Массив;
- Лист = Новый Структура("sheetId" , Лист);
- Изменение = Новый Структура("deleteSheet", Лист);
- Запросы.Добавить(Изменение);
-
- Параметры = Новый Структура("requests", Запросы);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Копировать лист
-// Копирует лист из одной книги в другую
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Откуда - Строка - ID книги источника - from
-// Куда - Строка - ID книги приемника - to
-// Лист - Строка - ID копируемого листа - sheet
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция КопироватьЛист(Знач Токен, Знач Откуда, Знач Куда, Знач Лист) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Откуда);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Куда);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://sheets.googleapis.com/v4/spreadsheets/"
- + Откуда
- + "/sheets/"
- + Лист
- + ":copyTo";
-
- Параметры = Новый Структура("destinationSpreadsheetId", Куда);
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСДанными
-
-// Установить значения ячеек
-// Устанавливает значения ячеек листа
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Книга - Строка - ID книги - spreadsheet
-// СоответствиеЗначений - Соответствие Из КлючИЗначение - Данные заполнения, где ключ это имя ячейки вида A1 - data
-// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname
-// ОсновноеИзмерение - Строка - Основное измерение при заполнении диапазона массивом - dim
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция УстановитьЗначенияЯчеек(Знач Токен
- , Знач Книга
- , Знач СоответствиеЗначений
- , Знач Лист = ""
- , Знач ОсновноеИзмерение = "COLUMNS") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеЗначений);
-
- Если Не ТипЗнч(СоответствиеЗначений) = Тип("Структура")
- И Не ТипЗнч(СоответствиеЗначений) = Тип("Соответствие") Тогда
- Возврат "Не удалось привести структуру значений к коллекции";
- КонецЕсли;
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchUpdate";
- МассивДанных = СформироватьМассивДанныхЯчеек(СоответствиеЗначений, ОсновноеИзмерение, Лист);
-
- Параметры = Новый Структура("data,valueInputOption", МассивДанных, "USER_ENTERED");
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Очистить ячейки
-// Очищает значение в ячейках
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Книга - Строка - ID книги - spreadsheet
-// МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для очистки - cells
-// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ОчиститьЯчейки(Знач Токен, Знач Книга, Знач МассивЯчеек, Знач Лист = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchClear";
-
- СформироватьМассивИменЯчеек(МассивЯчеек, Лист);
-
- Параметры = Новый Структура("ranges", МассивЯчеек);
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить значения ячеек
-// Получает значения ячеек таблицы
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Книга - Строка - ID книги - spreadsheet
-// МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для получения (весь лист, если не заполнено) - cells
-// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьЗначенияЯчеек(Знач Токен, Знач Книга, Знач МассивЯчеек = "", Знач Лист = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
-
- Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
- URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchGet";
-
- Если ЗначениеЗаполнено(МассивЯчеек) Тогда
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек);
- СформироватьМассивИменЯчеек(МассивЯчеек, Лист);
-
- Первый = Истина;
- Для Каждого Ячейка Из МассивЯчеек Цикл
- Разделитель = ?(Первый, "?", "&");
- URL = URL + Разделитель + "ranges=" + Ячейка;
- Первый = Ложь;
- КонецЦикла;
- Иначе
- URL = URL + "?ranges='" + Лист + "'";
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Get(URL, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Процедура ЗаполнитьМассивЛистов(Знач МассивИмен, МассивЛистов)
-
- Для Каждого ИмяЛиста Из МассивИмен Цикл
-
- Лист = СоздатьЛист(ИмяЛиста);
- МассивЛистов.Добавить(Лист);
-
- КонецЦикла;
-
-КонецПроцедуры
-
-Процедура ДобавитьИмяЛиста(Ячейка, Знач Лист)
-
- Если ЗначениеЗаполнено(Лист) Тогда
- Ячейка = "'" + Лист + "'!" + Ячейка;
- КонецЕсли;
-
-КонецПроцедуры
-
-Функция СоздатьЛист(Знач Наименование)
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
-
- СвойстваЛиста = Новый Структура("title" , Наименование);
- Лист = Новый Структура("properties", СвойстваЛиста);
-
- Возврат Лист;
-
-КонецФункции
-
-Функция СформироватьМассивДанныхЯчеек(Знач СтруктураЗначений, Знач ОсновноеИзмерение, Знач Лист)
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
-
- МассивДанных = Новый Массив;
-
- Для Каждого ДанныеЯчейки Из СтруктураЗначений Цикл
-
- ТекущееЗначение = ДанныеЯчейки.Значение;
- ТекущийКлюч = ДанныеЯчейки.Ключ;
-
- ДобавитьИмяЛиста(ТекущийКлюч, Лист);
-
- OPI_ПреобразованиеТипов.ПолучитьМассив(ТекущееЗначение);
-
- ТекущиеДанные = Новый Соответствие;
- ТекущийМассив = Новый Массив;
-
- ТекущийМассив.Добавить(ТекущееЗначение);
-
- OPI_Инструменты.ДобавитьПоле("range" , ТекущийКлюч , "Строка", ТекущиеДанные);
- OPI_Инструменты.ДобавитьПоле("values" , ТекущийМассив , "Массив", ТекущиеДанные);
- OPI_Инструменты.ДобавитьПоле("majorDimension", ОсновноеИзмерение, "Строка", ТекущиеДанные);
-
- МассивДанных.Добавить(ТекущиеДанные);
-
- КонецЦикла;
-
- Возврат МассивДанных;
-
-КонецФункции
-
-Процедура СформироватьМассивИменЯчеек(Знач МассивИмен, Знач Лист)
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
-
- Для Н = 0 По МассивИмен.ВГраница() Цикл
- ДобавитьИмяЛиста(МассивИмен[Н], Лист);
- КонецЦикла;
-
-КонецПроцедуры
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_GoogleSheets.os
+// Библиотека: Google Sheets
+// Команда CLI: gsheets
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область РаботаСКнигами
+
+// Создать книгу
+// Создает новую книгу
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Наименование - Строка - Наименование - title
+// МассивИменЛистов - Массив из Строка - Массив имен для добавления новых листов в книгу - sheets
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция СоздатьКнигу(Знач Токен, Знач Наименование, Знач МассивИменЛистов) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИменЛистов);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://sheets.googleapis.com/v4/spreadsheets";
+
+ Свойства = Новый Структура("title" , Наименование);
+ Листы = Новый Массив;
+
+ ЗаполнитьМассивЛистов(МассивИменЛистов, Листы);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("properties", Свойства, "Коллекция", Параметры);
+ OPI_Инструменты.ДобавитьПоле("sheets" , Листы , "Коллекция", Параметры);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить книгу
+// Получает информацию о книге по ID
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Идентификатор - Строка - Идентификатор книги - spreadsheet
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьКнигу(Знач Токен, Знач Идентификатор) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Идентификатор;
+
+ Ответ = OPI_Инструменты.Get(URL, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Изменить наименование книги
+// Изменяет наименование существующей книги
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Книга - Строка - ID книги - spreadsheet
+// Наименование - Строка - Новое наименование - title
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ИзменитьНаименованиеКниги(Знач Токен, Знач Книга, Знач Наименование) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
+
+ Изменение = Новый Структура("title", Наименование);
+ ЗапросИзменения = Новый Структура("properties,fields", Изменение, "title");
+ Запрос = Новый Структура("updateSpreadsheetProperties", ЗапросИзменения);
+
+ МассивЗапросов = Новый Массив;
+ МассивЗапросов.Добавить(Запрос);
+
+ Параметры = Новый Структура("requests", МассивЗапросов);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСЛистами
+
+// Добавить лист
+// Добавляет новый лист в книгу
+//
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Книга - Строка - Идентификатор книги - spreadsheet
+// Наименование - Строка - Наименование нового листа - title
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ДобавитьЛист(Знач Токен, Знач Книга, Знач Наименование) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
+ Лист = СоздатьЛист(Наименование);
+
+ Запросы = Новый Массив;
+ Изменение = Новый Структура("addSheet", Лист);
+ Запросы.Добавить(Изменение);
+
+ Параметры = Новый Структура("requests", Запросы);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить лист
+// Удаляет лист из книги
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Книга - Строка - Идентификатор книги - spreadsheet
+// Лист - Строка - Идентификатор удаляемого листа - sheet
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция УдалитьЛист(Знач Токен, Знач Книга, Знач Лист) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + ":batchUpdate";
+
+ Запросы = Новый Массив;
+ Лист = Новый Структура("sheetId" , Лист);
+ Изменение = Новый Структура("deleteSheet", Лист);
+ Запросы.Добавить(Изменение);
+
+ Параметры = Новый Структура("requests", Запросы);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Копировать лист
+// Копирует лист из одной книги в другую
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Откуда - Строка - ID книги источника - from
+// Куда - Строка - ID книги приемника - to
+// Лист - Строка - ID копируемого листа - sheet
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция КопироватьЛист(Знач Токен, Знач Откуда, Знач Куда, Знач Лист) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Откуда);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Куда);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://sheets.googleapis.com/v4/spreadsheets/"
+ + Откуда
+ + "/sheets/"
+ + Лист
+ + ":copyTo";
+
+ Параметры = Новый Структура("destinationSpreadsheetId", Куда);
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСДанными
+
+// Установить значения ячеек
+// Устанавливает значения ячеек листа
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Книга - Строка - ID книги - spreadsheet
+// СоответствиеЗначений - Соответствие Из КлючИЗначение - Данные заполнения, где ключ это имя ячейки вида A1 - data
+// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname
+// ОсновноеИзмерение - Строка - Основное измерение при заполнении диапазона массивом - dim
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция УстановитьЗначенияЯчеек(Знач Токен
+ , Знач Книга
+ , Знач СоответствиеЗначений
+ , Знач Лист = ""
+ , Знач ОсновноеИзмерение = "COLUMNS") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеЗначений);
+
+ Если Не ТипЗнч(СоответствиеЗначений) = Тип("Структура")
+ И Не ТипЗнч(СоответствиеЗначений) = Тип("Соответствие") Тогда
+ Возврат "Не удалось привести структуру значений к коллекции";
+ КонецЕсли;
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchUpdate";
+ МассивДанных = СформироватьМассивДанныхЯчеек(СоответствиеЗначений, ОсновноеИзмерение, Лист);
+
+ Параметры = Новый Структура("data,valueInputOption", МассивДанных, "USER_ENTERED");
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Очистить ячейки
+// Очищает значение в ячейках
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Книга - Строка - ID книги - spreadsheet
+// МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для очистки - cells
+// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ОчиститьЯчейки(Знач Токен, Знач Книга, Знач МассивЯчеек, Знач Лист = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchClear";
+
+ СформироватьМассивИменЯчеек(МассивЯчеек, Лист);
+
+ Параметры = Новый Структура("ranges", МассивЯчеек);
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить значения ячеек
+// Получает значения ячеек таблицы
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Книга - Строка - ID книги - spreadsheet
+// МассивЯчеек - Массив из Строка - Массив ячеек вида А1 для получения (весь лист, если не заполнено) - cells
+// Лист - Строка - Имя листа (первый лист по умолчанию) - sheetname
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьЗначенияЯчеек(Знач Токен, Знач Книга, Знач МассивЯчеек = "", Знач Лист = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Книга);
+
+ Заголовки = OPI_GoogleWorkspace.ПолучитьЗаголовокАвторизации(Токен);
+ URL = "https://sheets.googleapis.com/v4/spreadsheets/" + Книга + "/values:batchGet";
+
+ Если ЗначениеЗаполнено(МассивЯчеек) Тогда
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивЯчеек);
+ СформироватьМассивИменЯчеек(МассивЯчеек, Лист);
+
+ Первый = Истина;
+ Для Каждого Ячейка Из МассивЯчеек Цикл
+ Разделитель = ?(Первый, "?", "&");
+ URL = URL + Разделитель + "ranges=" + Ячейка;
+ Первый = Ложь;
+ КонецЦикла;
+ Иначе
+ URL = URL + "?ranges='" + Лист + "'";
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Get(URL, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Процедура ЗаполнитьМассивЛистов(Знач МассивИмен, МассивЛистов)
+
+ Для Каждого ИмяЛиста Из МассивИмен Цикл
+
+ Лист = СоздатьЛист(ИмяЛиста);
+ МассивЛистов.Добавить(Лист);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ДобавитьИмяЛиста(Ячейка, Знач Лист)
+
+ Если ЗначениеЗаполнено(Лист) Тогда
+ Ячейка = "'" + Лист + "'!" + Ячейка;
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция СоздатьЛист(Знач Наименование)
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+
+ СвойстваЛиста = Новый Структура("title" , Наименование);
+ Лист = Новый Структура("properties", СвойстваЛиста);
+
+ Возврат Лист;
+
+КонецФункции
+
+Функция СформироватьМассивДанныхЯчеек(Знач СтруктураЗначений, Знач ОсновноеИзмерение, Знач Лист)
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
+
+ МассивДанных = Новый Массив;
+
+ Для Каждого ДанныеЯчейки Из СтруктураЗначений Цикл
+
+ ТекущееЗначение = ДанныеЯчейки.Значение;
+ ТекущийКлюч = ДанныеЯчейки.Ключ;
+
+ ДобавитьИмяЛиста(ТекущийКлюч, Лист);
+
+ OPI_ПреобразованиеТипов.ПолучитьМассив(ТекущееЗначение);
+
+ ТекущиеДанные = Новый Соответствие;
+ ТекущийМассив = Новый Массив;
+
+ ТекущийМассив.Добавить(ТекущееЗначение);
+
+ OPI_Инструменты.ДобавитьПоле("range" , ТекущийКлюч , "Строка", ТекущиеДанные);
+ OPI_Инструменты.ДобавитьПоле("values" , ТекущийМассив , "Массив", ТекущиеДанные);
+ OPI_Инструменты.ДобавитьПоле("majorDimension", ОсновноеИзмерение, "Строка", ТекущиеДанные);
+
+ МассивДанных.Добавить(ТекущиеДанные);
+
+ КонецЦикла;
+
+ Возврат МассивДанных;
+
+КонецФункции
+
+Процедура СформироватьМассивИменЯчеек(Знач МассивИмен, Знач Лист)
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Лист);
+
+ Для Н = 0 По МассивИмен.ВГраница() Цикл
+ ДобавитьИмяЛиста(МассивИмен[Н], Лист);
+ КонецЦикла;
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_GoogleWorkspace.os b/ru/OInt/core/Modules/OPI_GoogleWorkspace.os
index bb65b18314..4fd739a8a3 100644
--- a/ru/OInt/core/Modules/OPI_GoogleWorkspace.os
+++ b/ru/OInt/core/Modules/OPI_GoogleWorkspace.os
@@ -1,173 +1,173 @@
-// Расположение OS: ./OInt/core/Modules/OPI_GoogleWorkspace.os
-// Библиотека: Google Workspace
-// Команда CLI: google
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-// Сформировать ссылку получения кода
-// Возвращает URL для авторизации в браузере
-//
-// Параметры:
-// ClientID - Строка - Client ID - id
-// Calendar - Булево - разрешение на методы Calendar - calendar
-// Drive - Булево - разрешение на методы Drive - drive
-// Sheets - Булево - разрешение на методы Sheets - sheets
-//
-// Возвращаемое значение:
-// Строка - Ссылка получения кода
-Функция СформироватьСсылкуПолученияКода(Знач ClientID
- , Знач Calendar = Истина
- , Знач Drive = Истина
- , Знач Sheets = Истина) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
- OPI_ПреобразованиеТипов.ПолучитьБулево(Calendar);
- OPI_ПреобразованиеТипов.ПолучитьБулево(Sheets);
- OPI_ПреобразованиеТипов.ПолучитьБулево(Drive);
-
- URL = "https://accounts.google.com/o/oauth2/auth";
-
- ПараметрыURL = Новый Структура;
- ПараметрыURL.Вставить("response_type", "code");
- ПараметрыURL.Вставить("client_id" , ClientID);
- ПараметрыURL.Вставить("redirect_uri" , "http://localhost");
- ПараметрыURL.Вставить("access_type" , "offline");
- ПараметрыURL.Вставить("scope" , ПолучитьСписокРазрешений(Calendar, Drive, Sheets));
-
- URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
-
- Возврат URL;
-
-КонецФункции
-
-// Получить токен по коду
-// Получает токен по коду из авторизации в бразуере
-//
-// Параметры:
-// ClientID - Строка - Client ID - id
-// ClientSecret - Строка - Client secret - secret
-// Code - Строка - Code из браузера - code
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ПолучитьТокенПоКоду(Знач ClientID, Знач ClientSecret, Знач Code) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Code);
-
- URL = "https://accounts.google.com/o/oauth2/token";
-
- ПараметрыURL = Новый Структура;
- ПараметрыURL.Вставить("grant_type" , "authorization_code");
- ПараметрыURL.Вставить("client_id" , ClientID);
- ПараметрыURL.Вставить("client_secret", ClientSecret);
- ПараметрыURL.Вставить("redirect_uri" , "http://localhost");
- ПараметрыURL.Вставить("code" , Code);
-
- Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Обновить токен
-// Обновляет токен по Refresh token
-//
-// Параметры:
-// ClientID - Строка - Client ID - id
-// ClientSecret - Строка - Client secret - secret
-// RefreshToken - Строка - Refresh token - refresh
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
-Функция ОбновитьТокен(Знач ClientID, Знач ClientSecret, Знач RefreshToken) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(RefreshToken);
-
- URL = "https://accounts.google.com/o/oauth2/token";
-
- ПараметрыURL = Новый Структура;
- ПараметрыURL.Вставить("grant_type" , "refresh_token");
- ПараметрыURL.Вставить("client_id" , ClientID);
- ПараметрыURL.Вставить("client_secret", ClientSecret);
- ПараметрыURL.Вставить("refresh_token", RefreshToken);
-
- Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область СлужебныйПрограммныйИнтерфейс
-
-Функция ПолучитьЗаголовокАвторизации(Знач Токен) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- Заголовки = Новый Соответствие;
- Заголовки.Вставить("Authorization", "Bearer " + Токен);
-
- Возврат Заголовки;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИфункции
-
-Функция ПолучитьСписокРазрешений(Calendar, Drive, Sheets)
-
- МассивРазрешений = Новый Массив;
-
- Если Calendar Тогда
- МассивРазрешений.Добавить("https://www.googleapis.com/auth/calendar");
- КонецЕсли;
-
- Если Drive Тогда
- МассивРазрешений.Добавить("https://www.googleapis.com/auth/drive");
- КонецЕсли;
-
- Если Sheets Тогда
- МассивРазрешений.Добавить("https://www.googleapis.com/auth/spreadsheets");
- КонецЕсли;
-
- Возврат СтрСоединить(МассивРазрешений, " ");
-
-КонецФункции
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_GoogleWorkspace.os
+// Библиотека: Google Workspace
+// Команда CLI: google
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+// Сформировать ссылку получения кода
+// Возвращает URL для авторизации в браузере
+//
+// Параметры:
+// ClientID - Строка - Client ID - id
+// Calendar - Булево - разрешение на методы Calendar - calendar
+// Drive - Булево - разрешение на методы Drive - drive
+// Sheets - Булево - разрешение на методы Sheets - sheets
+//
+// Возвращаемое значение:
+// Строка - Ссылка получения кода
+Функция СформироватьСсылкуПолученияКода(Знач ClientID
+ , Знач Calendar = Истина
+ , Знач Drive = Истина
+ , Знач Sheets = Истина) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Calendar);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Sheets);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Drive);
+
+ URL = "https://accounts.google.com/o/oauth2/auth";
+
+ ПараметрыURL = Новый Структура;
+ ПараметрыURL.Вставить("response_type", "code");
+ ПараметрыURL.Вставить("client_id" , ClientID);
+ ПараметрыURL.Вставить("redirect_uri" , "http://localhost");
+ ПараметрыURL.Вставить("access_type" , "offline");
+ ПараметрыURL.Вставить("scope" , ПолучитьСписокРазрешений(Calendar, Drive, Sheets));
+
+ URL = URL + OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
+
+ Возврат URL;
+
+КонецФункции
+
+// Получить токен по коду
+// Получает токен по коду из авторизации в бразуере
+//
+// Параметры:
+// ClientID - Строка - Client ID - id
+// ClientSecret - Строка - Client secret - secret
+// Code - Строка - Code из браузера - code
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ПолучитьТокенПоКоду(Знач ClientID, Знач ClientSecret, Знач Code) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Code);
+
+ URL = "https://accounts.google.com/o/oauth2/token";
+
+ ПараметрыURL = Новый Структура;
+ ПараметрыURL.Вставить("grant_type" , "authorization_code");
+ ПараметрыURL.Вставить("client_id" , ClientID);
+ ПараметрыURL.Вставить("client_secret", ClientSecret);
+ ПараметрыURL.Вставить("redirect_uri" , "http://localhost");
+ ПараметрыURL.Вставить("code" , Code);
+
+ Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Обновить токен
+// Обновляет токен по Refresh token
+//
+// Параметры:
+// ClientID - Строка - Client ID - id
+// ClientSecret - Строка - Client secret - secret
+// RefreshToken - Строка - Refresh token - refresh
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Google
+Функция ОбновитьТокен(Знач ClientID, Знач ClientSecret, Знач RefreshToken) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(RefreshToken);
+
+ URL = "https://accounts.google.com/o/oauth2/token";
+
+ ПараметрыURL = Новый Структура;
+ ПараметрыURL.Вставить("grant_type" , "refresh_token");
+ ПараметрыURL.Вставить("client_id" , ClientID);
+ ПараметрыURL.Вставить("client_secret", ClientSecret);
+ ПараметрыURL.Вставить("refresh_token", RefreshToken);
+
+ Ответ = OPI_Инструменты.Post(URL, ПараметрыURL, , Ложь);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+Функция ПолучитьЗаголовокАвторизации(Знач Токен) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ Заголовки = Новый Соответствие;
+ Заголовки.Вставить("Authorization", "Bearer " + Токен);
+
+ Возврат Заголовки;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИфункции
+
+Функция ПолучитьСписокРазрешений(Calendar, Drive, Sheets)
+
+ МассивРазрешений = Новый Массив;
+
+ Если Calendar Тогда
+ МассивРазрешений.Добавить("https://www.googleapis.com/auth/calendar");
+ КонецЕсли;
+
+ Если Drive Тогда
+ МассивРазрешений.Добавить("https://www.googleapis.com/auth/drive");
+ КонецЕсли;
+
+ Если Sheets Тогда
+ МассивРазрешений.Добавить("https://www.googleapis.com/auth/spreadsheets");
+ КонецЕсли;
+
+ Возврат СтрСоединить(МассивРазрешений, " ");
+
+КонецФункции
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_Notion.os b/ru/OInt/core/Modules/OPI_Notion.os
index fb9c068f55..9303abb4fa 100644
--- a/ru/OInt/core/Modules/OPI_Notion.os
+++ b/ru/OInt/core/Modules/OPI_Notion.os
@@ -1,889 +1,889 @@
-// Расположение OS: ./OInt/core/Modules/OPI_Notion.os
-// Библиотека: Notion
-// Команда CLI: notion
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:NumberOfOptionalParams-off
-// BSLLS:UsingServiceTag-off
-
-// @skip-check method-too-many-params
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область РаботаСоСтраницами
-
-// Создать страницу
-// Создает дочернюю страницу над другой страницей-родителем
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Родитель - Строка - ID Родителя - page
-// Заголовок - Строка - Заголовок страницы - title
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция СоздатьСтраницу(Знач Токен, Знач Родитель, Знач Заголовок) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
-
- Заголовки = СоздатьЗаголовкиЗапроса(Токен);
- Свойства = Новый Структура;
- Параметры = Новый Структура;
-
- ДобавитьЗаголовокСтраницы(Заголовок, Свойства);
- ДобавитьРодителяСтраницы(Родитель, Ложь, Параметры);
-
- Параметры.Вставить("properties", Свойства);
-
- Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Создать страницу в базу
-// Создает страницу в базе-родителе
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Родитель - Строка - ID родительской базы - base
-// Данные - Соответствие Из КлючИЗначение - Соответствие свойств - data
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция СоздатьСтраницуВБазу(Знач Токен, Знач Родитель, Знач Данные) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные);
-
- Заголовки = СоздатьЗаголовкиЗапроса(Токен);
- Параметры = Новый Структура;
-
- ДобавитьРодителяСтраницы(Родитель, Истина, Параметры);
-
- Свойства = ЗаполнитьДанныеПоСхеме(Родитель, Данные, Токен);
- Параметры.Вставить("properties", Свойства);
-
- Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить страницу
-// Получает информацию о странице по ID
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Страница - Строка - ID страницы - page
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция ПолучитьСтраницу(Знач Токен, Знач Страница) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Страница);
-
- Заголовки = СоздатьЗаголовкиЗапроса(Токен);
- ПреобразоватьИД(Страница);
-
- Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/pages/" + Страница, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Изменить свойства страницы.
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Страница - Строка - ID изменяемой страницы - page
-// Данные - Соответствие Из КлючИЗначение - Соответствие изменяемых параметров - data
-// Иконка - Строка - URL картинки иконки страницы - icon
-// Обложка - Строка - URL картинки обложки страницы - cover
-// Архивирована - Булево - Архивировать страницу или нет (булево) - archive
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция ИзменитьСвойстваСтраницы(Знач Токен
- , Знач Страница
- , Знач Данные = ""
- , Знач Иконка = ""
- , Знач Обложка = ""
- , Знач Архивирована = Ложь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Страница);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Иконка);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Обложка);
- OPI_ПреобразованиеТипов.ПолучитьБулево(Архивирована);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные);
-
- Заголовки = СоздатьЗаголовкиЗапроса(Токен);
- Параметры = Новый Структура;
- Files = "files";
-
- Если ЗначениеЗаполнено(Данные)
- И (ТипЗнч(Данные) = Тип("Соответствие") Или ТипЗнч(Данные) = Тип("Структура")) Тогда
- Свойства = ЗаполнитьДанныеПоСхеме(Страница, Данные, Токен, Ложь);
- Иначе
- Свойства = Новый Соответствие;
- КонецЕсли;
-
- Если ЗначениеЗаполнено(Иконка) Тогда
- СоответствиеИконки = Новый Соответствие;
- СоответствиеИконки.Вставить("Icon", Иконка);
-
- ОбъектИконка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеИконки);
- ОбъектИконка = ОбъектИконка[Files][0];
- ОбъектИконка.Удалить("name");
-
- Параметры.Вставить("icon", ОбъектИконка);
- КонецЕсли;
-
- Если ЗначениеЗаполнено(Обложка) Тогда
- СоответствиеОбложки = Новый Соответствие;
- СоответствиеОбложки.Вставить("Cover", Обложка);
-
- ОбъектОбложка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеОбложки);
- ОбъектОбложка = ОбъектОбложка[Files][0];
- ОбъектОбложка.Удалить("name");
-
- Параметры.Вставить("cover", ОбъектОбложка);
- КонецЕсли;
-
- Параметры.Вставить("properties", Свойства);
- Параметры.Вставить("archived" , Архивирована);
-
- ПреобразоватьИД(Страница);
-
- Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/pages/" + Страница, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСБазамиДанных
-
-// Создать базу данных
-// Создает базу данных
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Родитель - Строка - ID страницы родителя - page
-// Заголовок - Строка - Заголовок базы данных - title
-// Свойства - Структура Из Строка - Свойства базы данных - props
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция СоздатьБазуДанных(Знач Токен, Знач Родитель, Знач Заголовок, Знач Свойства = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Свойства);
-
- // Пример структуры/соответствия свойств
-
- // Имя : title
- // Описание : rich_text
- // В работе : checkbox
- // Количество : number
- // Дата : date
- // Статус : Соответствие
- // Активный : green
- // Неактивный : red
- // Архив : yellow
-
- // Все страницы, которые будут созданы как дочерние, должны иметь свойства базы-родителя
-
- Если Не ТипЗнч(Свойства) = Тип("Структура") И Не ТипЗнч(Свойства) = Тип("Соответствие") Тогда
- Свойства = Новый Структура("Наименование", "title");
- КонецЕсли;
-
- Заголовки = СоздатьЗаголовкиЗапроса(Токен);
- Параметры = Новый Структура;
-
- ДобавитьРодителяБазы(Родитель, Ложь, Параметры);
- ДобавитьЗаголовокБазы(Заголовок, Параметры);
- ДобавитьСвойстваБазы(Свойства, Параметры);
-
- Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/databases", Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить базу данных
-// Получить данные о базе данных
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// База - Строка - ID базы данных - base
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция ПолучитьБазуДанных(Знач Токен, Знач База) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
-
- Заголовки = СоздатьЗаголовкиЗапроса(Токен);
- ПреобразоватьИД(База);
-
- Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/databases/" + База, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Изменить свойства базы
-// Изменяет свойства существующей базы
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// База - Строка - ID целевой базы - base
-// Свойства - Соответствие из КлючИЗначение - Новые или изменяемые свойства базы данных - props
-// Заголовок - Строка - Новый заголовок базы - title
-// Описание - Строка - Новое описание базы - description
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция ИзменитьСвойстваБазы(Знач Токен, Знач База, Знач Свойства = "", Знач Заголовок = "", Знач Описание = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Свойства);
-
- Параметры = Новый Структура;
- Заголовки = СоздатьЗаголовкиЗапроса(Токен);
- ПреобразоватьИД(База);
-
- Если ЗначениеЗаполнено(Заголовок) Тогда
- ДобавитьЗаголовокБазы(Заголовок, Параметры);
- КонецЕсли;
-
- Если ЗначениеЗаполнено(Описание) Тогда
- ДобавитьОписаниеБазы(Описание, Параметры);
- КонецЕсли;
-
- Если ТипЗнч(Свойства) = Тип("Структура") Или ТипЗнч(Свойства) = Тип("Соответствие") Тогда
- ДобавитьСвойстваБазы(Свойства, Параметры);
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/databases/" + База, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСБлоками
-
-// Создать блок
-// Создает новый блок на основе существующего блока
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Родитель - Строка - ID родительского блока или страницы - page
-// Блок - Строка,Соответствие Из КлючИЗначение - ID блока или сам блок образец - block
-// ВставитьПосле - Строка - ID блока, после которого необходимо встаивть новый - prev
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция СоздатьБлок(Знач Токен, Знач Родитель, Знач Блок, Знач ВставитьПосле = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ВставитьПосле);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блок);
-
- Если ТипЗнч(Блок) = Тип("Массив") Тогда
- Блок = Блок[0];
- КонецЕсли;
-
- Заголовки = СоздатьЗаголовкиЗапроса(Токен);
- ПреобразоватьИД(Родитель);
-
- Если ТипЗнч(Блок) = Тип("Строка") Тогда
- ПреобразоватьИД(Блок);
- Блок = ВернутьБлок(Токен, Блок);
- КонецЕсли;
-
- МассивБлоков = Новый Массив;
- МассивБлоков.Добавить(Блок);
-
- Параметры = Новый Соответствие;
- Параметры.Вставить("children", МассивБлоков);
-
- Если ЗначениеЗаполнено(ВставитьПосле) Тогда
- Параметры.Вставить("after", ВставитьПосле);
- КонецЕсли;
-
- URL = "https://api.notion.com/v1/blocks/" + Родитель + "/children";
- Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Вернуть блок.
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// ИДБлока - Строка - ID блока - block
-// ТолькоОснова - Булево - Истина > служебные поля удаляются, остается только сам блок - core
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция ВернутьБлок(Знач Токен, Знач ИДБлока, Знач ТолькоОснова = Истина) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока);
- OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоОснова);
-
- ПреобразоватьИД(ИДБлока);
-
- Заголовки = СоздатьЗаголовкиЗапроса(Токен);
- Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки);
-
- Если ТолькоОснова Тогда
- УдалитьЛишниеПоляБлока(Ответ);
- КонецЕсли;
-
- Возврат Ответ;
-
-КонецФункции
-
-// Вернуть дочерние блоки
-// Созвращает список дочерних блоков блока-родителя
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// ИДБлока - Строка - ID блока родителя - block
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция ВернутьДочерниеБлоки(Знач Токен, Знач ИДБлока) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока);
-
- ПреобразоватьИД(ИДБлока);
-
- Заголовки = СоздатьЗаголовкиЗапроса(Токен);
- Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока + "/children", , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить блок
-// Удаляет блок по ID
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// ИДБлока - Строка - ID блока - block
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция УдалитьБлок(Знач Токен, Знач ИДБлока) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока);
-
- ПреобразоватьИД(ИДБлока);
-
- Заголовки = СоздатьЗаголовкиЗапроса(Токен);
- Ответ = OPI_Инструменты.Delete("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область Пользователи
-
-// Список пользователей
-// Возвращает список пользователей рабочего пространства
-//
-// Параметры:
-// Токен - Строка - Токен - token
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция СписокПользователей(Знач Токен) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- Заголовки = СоздатьЗаголовкиЗапроса(Токен);
- Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/users", , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить данные пользователя
-// Получает данные пользователя по ID
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// ИДПользователя - Строка - ID целевого пользователя - user
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
-Функция ПолучитьДанныеПользователя(Знач Токен, Знач ИДПользователя) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДПользователя);
-
- ПреобразоватьИД(ИДПользователя);
-
- Заголовки = СоздатьЗаголовкиЗапроса(Токен);
- Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/users/" + ИДПользователя, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция СоздатьЗаголовкиЗапроса(Знач Токен)
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- Заголовки = Новый Соответствие;
- Заголовки.Вставить("Authorization" , "Bearer " + Токен);
- Заголовки.Вставить("Notion-Version", "2022-06-28");
-
- Возврат Заголовки;
-
-КонецФункции
-
-Процедура ПреобразоватьИД(Идентификатор)
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
-
- Идентификатор = СтрЗаменить(Идентификатор, "-", "");
-
-КонецПроцедуры
-
-Процедура ДобавитьРодителяСтраницы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура)
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(РодительБаза);
-
- ПреобразоватьИД(Родитель);
-
- ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id");
- СтруктураРодителя = Новый Структура(ПолеИдентификатора, Родитель);
-
- ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя);
-
-КонецПроцедуры
-
-Процедура ДобавитьРодителяБазы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура)
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(РодительБаза);
-
- ПреобразоватьИД(Родитель);
-
- ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id");
-
- СтруктураРодителя = Новый Структура();
- СтруктураРодителя.Вставить("type" , ПолеИдентификатора);
- СтруктураРодителя.Вставить(ПолеИдентификатора, Родитель);
-
- ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя);
-
-КонецПроцедуры
-
-Процедура ДобавитьЗаголовокСтраницы(Знач Заголовок, ОсновнаяСтруктура)
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
-
- ПодчиненнаяСтруктура = Новый Структура;
- СтруктураДанных = Новый Структура;
- СтруктураТекста = Новый Структура;
- МассивДанных = Новый Массив;
- Title = "title";
-
- СтруктураТекста.Вставить("content", Заголовок);
- СтруктураТекста.Вставить("link" , Неопределено);
-
- СтруктураДанных.Вставить("text", СтруктураТекста);
- СтруктураДанных.Вставить("type", "text");
-
- МассивДанных.Добавить(СтруктураДанных);
-
- ПодчиненнаяСтруктура.Вставить("id" , Title);
- ПодчиненнаяСтруктура.Вставить("type" , Title);
- ПодчиненнаяСтруктура.Вставить(Title , МассивДанных);
-
- ОсновнаяСтруктура.Вставить(Title, ПодчиненнаяСтруктура);
-
-КонецПроцедуры
-
-Процедура ДобавитьЗаголовокБазы(Знач Заголовок, ОсновнаяСтруктура)
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
-
- Заголовок = ПреобразоватьЗаголовок(Заголовок);
- ОсновнаяСтруктура.Вставить("title", Заголовок["title"]);
-
-КонецПроцедуры
-
-Процедура ДобавитьОписаниеБазы(Знач Описание, ОсновнаяСтруктура)
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
-
- Заголовок = ПреобразоватьЗаголовок(Описание);
- ОсновнаяСтруктура.Вставить("description", Заголовок["title"]);
-
-КонецПроцедуры
-
-Процедура ДобавитьСвойстваБазы(Знач Свойства, ОсновнаяСтруктура)
-
- Если Свойства.Количество() = 0 Тогда
- ОсновнаяСтруктура.Вставить("properties", Новый Структура);
- Возврат;
- КонецЕсли;
-
- СоответствиеПараметров = Новый Соответствие;
-
- Для Каждого Свойство Из Свойства Цикл
-
- Если ТипЗнч(Свойство.Значение) = Тип("Строка") Тогда
-
- СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура(Свойство.Значение, Новый Структура));
-
- ИначеЕсли ТипЗнч(Свойство.Значение) = Тип("Структура")
- Или ТипЗнч(Свойство.Значение) = Тип("Соответствие") Тогда
-
- ВыборЗначения = СформироватьЗначенияВыбора(Свойство.Значение);
- СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура("select", ВыборЗначения));
-
- Иначе
-
- СоответствиеПараметров.Вставить(Свойство.Ключ, Свойство.Значение);
-
- КонецЕсли;
-
- КонецЦикла;
-
- ОсновнаяСтруктура.Вставить("properties", СоответствиеПараметров);
-
-КонецПроцедуры
-
-Функция СформироватьЗначенияВыбора(Знач СтруктураВариантов)
-
- МассивВариантов = Новый Массив;
-
- Для Каждого Вариант Из СтруктураВариантов Цикл
-
- СоответствиеВарианта = Новый Соответствие;
- СоответствиеВарианта.Вставить("name" , Вариант.Ключ);
- СоответствиеВарианта.Вставить("color", Вариант.Значение);
-
- МассивВариантов.Добавить(СоответствиеВарианта);
-
- КонецЦикла;
-
- Возврат Новый Структура("options", МассивВариантов);
-
-КонецФункции
-
-Функция ЗаполнитьДанныеПоСхеме(Знач Схема, Знач Данные, Знач Токен, Знач ЭтоБаза = Истина)
-
- Если ЭтоБаза Тогда
- ДанныеСхемы = ПолучитьБазуДанных(Токен, Схема);
- Иначе
- ДанныеСхемы = ПолучитьСтраницу(Токен, Схема);
- КонецЕсли;
-
- ПоляБазы = ДанныеСхемы["properties"];
- Свойства = Новый Соответствие;
-
- Если ЗначениеЗаполнено(ПоляБазы) Тогда
-
- Для Каждого Поле Из ПоляБазы Цикл
-
- ДанныеПоля = Поле.Значение;
- ТипПоля = ДанныеПоля["type"];
-
- ЗаполняемыеДанные = Данные.Получить(Поле.Ключ);
-
- Если ЗаполняемыеДанные = Неопределено Тогда
- Продолжить;
- КонецЕсли;
-
- ПреобразованныеДанные = ПреобразоватьЗначениеПоТипу(ТипПоля, ЗаполняемыеДанные);
-
- Если ПреобразованныеДанные = Неопределено Тогда
- Продолжить;
- КонецЕсли;
-
- Свойства.Вставить(ДанныеПоля["id"], ПреобразованныеДанные);
-
- КонецЦикла;
-
- КонецЕсли;
-
- Возврат Свойства;
-
-КонецФункции
-
-Процедура УдалитьЛишниеПоляБлока(Знач Блок)
-
- МассивЛишних = Новый Массив;
- МассивЛишних.Добавить("request_id");
- МассивЛишних.Добавить("archived");
- МассивЛишних.Добавить("created_by");
- МассивЛишних.Добавить("last_edited_time");
- МассивЛишних.Добавить("created_time");
- МассивЛишних.Добавить("has_children");
- МассивЛишних.Добавить("parrent");
- МассивЛишних.Добавить("last_edited_by");
- МассивЛишних.Добавить("id");
-
- Для Каждого Поле Из МассивЛишних Цикл
-
- Если Не Блок.Получить(Поле) = Неопределено Тогда
- Блок.Удалить(Поле);
- КонецЕсли;
-
- КонецЦикла;
-
-КонецПроцедуры
-
-#Область ПреобразованиеТипов
-
-Функция ПреобразоватьЗначениеПоТипу(Знач Тип, Знач Значение)
-
- Если Тип = "title" Тогда
- Возврат ПреобразоватьЗаголовок(Значение);
- ИначеЕсли Тип = "rich_text" Тогда
- Возврат ПреобразоватьТекст(Значение);
- ИначеЕсли Тип = "number" Тогда
- Возврат ПреобразоватьЧисло(Значение);
- ИначеЕсли Тип = "select" Тогда
- Возврат ПреобразоватьВариантВыбора(Значение);
- ИначеЕсли Тип = "multi_select" Тогда
- Возврат ПреобразоватьМножественныйВыбор(Значение);
- ИначеЕсли Тип = "status" Тогда
- Возврат ПреобразоватьСтатус(Значение);
- ИначеЕсли Тип = "date" Тогда
- Возврат ПреобразоватьДату(Значение);
- ИначеЕсли Тип = "relation" Тогда
- Возврат ПреобразоватьСвязь(Значение);
- ИначеЕсли Тип = "people" Тогда
- Возврат ПреобразоватьПользователей(Значение);
- ИначеЕсли Тип = "files" Тогда
- Возврат ПреобразоватьФайлы(Значение);
- ИначеЕсли Тип = "checkbox" Тогда
- Возврат ПреобразоватьБулево(Значение);
- ИначеЕсли Тип = "url" Тогда
- Возврат ПреобразоватьСсылку(Значение);
- ИначеЕсли Тип = "email" Тогда
- Возврат ПреобразоватьПочту(Значение);
- ИначеЕсли Тип = "phone_number" Тогда
- Возврат ПреобразоватьТелефон(Значение);
- Иначе
- Возврат Неопределено;
- КонецЕсли;
-
-КонецФункции
-
-Функция ПреобразоватьЗаголовок(Знач Заголовок)
-
- СтруктураДанных = Новый Структура;
- СтруктураТекста = Новый Структура;
- МассивДанных = Новый Массив;
-
- СтруктураТекста.Вставить("content", Заголовок);
- СтруктураТекста.Вставить("link" , Неопределено);
-
- СтруктураДанных.Вставить("type", "text");
- СтруктураДанных.Вставить("text", СтруктураТекста);
-
- МассивДанных.Добавить(СтруктураДанных);
-
- Возврат Новый Структура("title", МассивДанных);
-
-КонецФункции
-
-Функция ПреобразоватьТекст(Знач Текст)
-
- МассивТекста = Новый Массив;
- СтруктураТекста = Новый Структура;
-
- СтруктураТекста.Вставить("type", "text");
- СтруктураТекста.Вставить("text", Новый Структура("content", Текст));
-
- МассивТекста.Добавить(СтруктураТекста);
-
- Возврат Новый Структура("rich_text", МассивТекста);
-
-КонецФункции
-
-Функция ПреобразоватьЧисло(Знач Число)
- Возврат Новый Структура("number", Число);
-КонецФункции
-
-Функция ПреобразоватьВариантВыбора(Знач Вариант)
-
- СтруктураВыбора = Новый Структура;
- СтруктураВыбора.Вставить("select", Новый Структура("name", Вариант));
-
- Возврат СтруктураВыбора;
-
-КонецФункции
-
-Функция ПреобразоватьСтатус(Знач Статус)
-
- СтруктураСтатуса = Новый Структура;
- СтруктураСтатуса.Вставить("status", Новый Структура("name", Статус));
-
- Возврат СтруктураСтатуса;
-
-КонецФункции
-
-Функция ПреобразоватьМножественныйВыбор(Знач МассивВариантов)
-
- МассивВариантовВыбора = Новый Массив;
-
- Для Каждого Вариант Из МассивВариантов Цикл
- МассивВариантовВыбора.Добавить(Новый Структура("name", Вариант));
- КонецЦикла;
-
- Возврат Новый Структура("multi_select", МассивВариантовВыбора);
-
-КонецФункции
-
-Функция ПреобразоватьДату(Знач Дата)
-
- СтруктураДаты = Новый Структура;
-
- Если Дата = НачалоДня(Дата) Тогда
- ФорматДаты = "ДФ=yyyy-MM-dd";
- Иначе
- ФорматДаты = "ДФ=yyyy-MM-ddThh:mm:ssZ";
- КонецЕсли;
-
- Дата = Формат(Дата, ФорматДаты);
- СтруктураДаты.Вставить("start", Дата);
-
- Возврат Новый Структура("date", СтруктураДаты);
-
-КонецФункции
-
-Функция ПреобразоватьСвязь(Знач Идентификатор)
-
- МассивСвязи = Новый Массив;
- МассивСвязи.Добавить(Новый Структура("id", Идентификатор));
-
- Возврат Новый Структура("relation", МассивСвязи);
-
-КонецФункции
-
-Функция ПреобразоватьПользователей(Знач МассивИД)
-
- Если Не ТипЗнч(МассивИД) = Тип("Массив") Тогда
- МассивИД_ = Новый Массив;
- МассивИД_.Добавить(МассивИД);
- МассивИД = МассивИД_;
- КонецЕсли;
-
- МассивПользователей = Новый Массив;
-
- Для Каждого Идентификатор Из МассивИД Цикл
-
- СтруктураПользователя = Новый Структура;
- СтруктураПользователя.Вставить("object", "user");
- СтруктураПользователя.Вставить("id" , Идентификатор);
- МассивПользователей.Добавить(СтруктураПользователя);
-
- КонецЦикла;
-
- Возврат Новый Структура("people", МассивПользователей);
-
-КонецФункции
-
-Функция ПреобразоватьФайлы(Знач СоответствиеФайлов)
-
- МассивФайлов = Новый Массив;
-
- Для Каждого Файл Из СоответствиеФайлов Цикл
-
- СтруктураФайла = Новый Структура;
- СтруктураФайла.Вставить("type" , "external");
- СтруктураФайла.Вставить("name" , Файл.Ключ);
- СтруктураФайла.Вставить("external", Новый Структура("url", Файл.Значение));
-
- МассивФайлов.Добавить(СтруктураФайла);
-
- КонецЦикла;
-
- Возврат Новый Структура("files", МассивФайлов);
-
-КонецФункции
-
-Функция ПреобразоватьБулево(Знач Булево)
- Возврат Новый Структура("checkbox", Булево);
-КонецФункции
-
-Функция ПреобразоватьСсылку(Знач URL)
- Возврат Новый Структура("url", URL);
-КонецФункции
-
-Функция ПреобразоватьПочту(Знач Почта)
- Возврат Новый Структура("email", Почта);
-КонецФункции
-
-Функция ПреобразоватьТелефон(Знач Телефон)
- Возврат Новый Структура("phone_number", Телефон);
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_Notion.os
+// Библиотека: Notion
+// Команда CLI: notion
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:NumberOfOptionalParams-off
+// BSLLS:UsingServiceTag-off
+
+// @skip-check method-too-many-params
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область РаботаСоСтраницами
+
+// Создать страницу
+// Создает дочернюю страницу над другой страницей-родителем
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Родитель - Строка - ID Родителя - page
+// Заголовок - Строка - Заголовок страницы - title
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция СоздатьСтраницу(Знач Токен, Знач Родитель, Знач Заголовок) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
+
+ Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+ Свойства = Новый Структура;
+ Параметры = Новый Структура;
+
+ ДобавитьЗаголовокСтраницы(Заголовок, Свойства);
+ ДобавитьРодителяСтраницы(Родитель, Ложь, Параметры);
+
+ Параметры.Вставить("properties", Свойства);
+
+ Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Создать страницу в базу
+// Создает страницу в базе-родителе
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Родитель - Строка - ID родительской базы - base
+// Данные - Соответствие Из КлючИЗначение - Соответствие свойств - data
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция СоздатьСтраницуВБазу(Знач Токен, Знач Родитель, Знач Данные) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные);
+
+ Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+ Параметры = Новый Структура;
+
+ ДобавитьРодителяСтраницы(Родитель, Истина, Параметры);
+
+ Свойства = ЗаполнитьДанныеПоСхеме(Родитель, Данные, Токен);
+ Параметры.Вставить("properties", Свойства);
+
+ Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/pages", Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить страницу
+// Получает информацию о странице по ID
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Страница - Строка - ID страницы - page
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция ПолучитьСтраницу(Знач Токен, Знач Страница) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Страница);
+
+ Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+ ПреобразоватьИД(Страница);
+
+ Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/pages/" + Страница, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Изменить свойства страницы.
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Страница - Строка - ID изменяемой страницы - page
+// Данные - Соответствие Из КлючИЗначение - Соответствие изменяемых параметров - data
+// Иконка - Строка - URL картинки иконки страницы - icon
+// Обложка - Строка - URL картинки обложки страницы - cover
+// Архивирована - Булево - Архивировать страницу или нет (булево) - archive
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция ИзменитьСвойстваСтраницы(Знач Токен
+ , Знач Страница
+ , Знач Данные = ""
+ , Знач Иконка = ""
+ , Знач Обложка = ""
+ , Знач Архивирована = Ложь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Страница);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Иконка);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Обложка);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Архивирована);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Данные);
+
+ Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+ Параметры = Новый Структура;
+ Files = "files";
+
+ Если ЗначениеЗаполнено(Данные)
+ И (ТипЗнч(Данные) = Тип("Соответствие") Или ТипЗнч(Данные) = Тип("Структура")) Тогда
+ Свойства = ЗаполнитьДанныеПоСхеме(Страница, Данные, Токен, Ложь);
+ Иначе
+ Свойства = Новый Соответствие;
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(Иконка) Тогда
+ СоответствиеИконки = Новый Соответствие;
+ СоответствиеИконки.Вставить("Icon", Иконка);
+
+ ОбъектИконка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеИконки);
+ ОбъектИконка = ОбъектИконка[Files][0];
+ ОбъектИконка.Удалить("name");
+
+ Параметры.Вставить("icon", ОбъектИконка);
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(Обложка) Тогда
+ СоответствиеОбложки = Новый Соответствие;
+ СоответствиеОбложки.Вставить("Cover", Обложка);
+
+ ОбъектОбложка = ПреобразоватьЗначениеПоТипу(Files, СоответствиеОбложки);
+ ОбъектОбложка = ОбъектОбложка[Files][0];
+ ОбъектОбложка.Удалить("name");
+
+ Параметры.Вставить("cover", ОбъектОбложка);
+ КонецЕсли;
+
+ Параметры.Вставить("properties", Свойства);
+ Параметры.Вставить("archived" , Архивирована);
+
+ ПреобразоватьИД(Страница);
+
+ Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/pages/" + Страница, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСБазамиДанных
+
+// Создать базу данных
+// Создает базу данных
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Родитель - Строка - ID страницы родителя - page
+// Заголовок - Строка - Заголовок базы данных - title
+// Свойства - Структура Из Строка - Свойства базы данных - props
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция СоздатьБазуДанных(Знач Токен, Знач Родитель, Знач Заголовок, Знач Свойства = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Свойства);
+
+ // Пример структуры/соответствия свойств
+
+ // Имя : title
+ // Описание : rich_text
+ // В работе : checkbox
+ // Количество : number
+ // Дата : date
+ // Статус : Соответствие
+ // Активный : green
+ // Неактивный : red
+ // Архив : yellow
+
+ // Все страницы, которые будут созданы как дочерние, должны иметь свойства базы-родителя
+
+ Если Не ТипЗнч(Свойства) = Тип("Структура") И Не ТипЗнч(Свойства) = Тип("Соответствие") Тогда
+ Свойства = Новый Структура("Наименование", "title");
+ КонецЕсли;
+
+ Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+ Параметры = Новый Структура;
+
+ ДобавитьРодителяБазы(Родитель, Ложь, Параметры);
+ ДобавитьЗаголовокБазы(Заголовок, Параметры);
+ ДобавитьСвойстваБазы(Свойства, Параметры);
+
+ Ответ = OPI_Инструменты.Post("https://api.notion.com/v1/databases", Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить базу данных
+// Получить данные о базе данных
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// База - Строка - ID базы данных - base
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция ПолучитьБазуДанных(Знач Токен, Знач База) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+
+ Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+ ПреобразоватьИД(База);
+
+ Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/databases/" + База, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Изменить свойства базы
+// Изменяет свойства существующей базы
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// База - Строка - ID целевой базы - base
+// Свойства - Соответствие из КлючИЗначение - Новые или изменяемые свойства базы данных - props
+// Заголовок - Строка - Новый заголовок базы - title
+// Описание - Строка - Новое описание базы - description
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция ИзменитьСвойстваБазы(Знач Токен, Знач База, Знач Свойства = "", Знач Заголовок = "", Знач Описание = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(База);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Свойства);
+
+ Параметры = Новый Структура;
+ Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+ ПреобразоватьИД(База);
+
+ Если ЗначениеЗаполнено(Заголовок) Тогда
+ ДобавитьЗаголовокБазы(Заголовок, Параметры);
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(Описание) Тогда
+ ДобавитьОписаниеБазы(Описание, Параметры);
+ КонецЕсли;
+
+ Если ТипЗнч(Свойства) = Тип("Структура") Или ТипЗнч(Свойства) = Тип("Соответствие") Тогда
+ ДобавитьСвойстваБазы(Свойства, Параметры);
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Patch("https://api.notion.com/v1/databases/" + База, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСБлоками
+
+// Создать блок
+// Создает новый блок на основе существующего блока
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Родитель - Строка - ID родительского блока или страницы - page
+// Блок - Строка,Соответствие Из КлючИЗначение - ID блока или сам блок образец - block
+// ВставитьПосле - Строка - ID блока, после которого необходимо встаивть новый - prev
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция СоздатьБлок(Знач Токен, Знач Родитель, Знач Блок, Знач ВставитьПосле = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Родитель);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ВставитьПосле);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блок);
+
+ Если ТипЗнч(Блок) = Тип("Массив") Тогда
+ Блок = Блок[0];
+ КонецЕсли;
+
+ Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+ ПреобразоватьИД(Родитель);
+
+ Если ТипЗнч(Блок) = Тип("Строка") Тогда
+ ПреобразоватьИД(Блок);
+ Блок = ВернутьБлок(Токен, Блок);
+ КонецЕсли;
+
+ МассивБлоков = Новый Массив;
+ МассивБлоков.Добавить(Блок);
+
+ Параметры = Новый Соответствие;
+ Параметры.Вставить("children", МассивБлоков);
+
+ Если ЗначениеЗаполнено(ВставитьПосле) Тогда
+ Параметры.Вставить("after", ВставитьПосле);
+ КонецЕсли;
+
+ URL = "https://api.notion.com/v1/blocks/" + Родитель + "/children";
+ Ответ = OPI_Инструменты.Patch(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Вернуть блок.
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// ИДБлока - Строка - ID блока - block
+// ТолькоОснова - Булево - Истина > служебные поля удаляются, остается только сам блок - core
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция ВернутьБлок(Знач Токен, Знач ИДБлока, Знач ТолькоОснова = Истина) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(ТолькоОснова);
+
+ ПреобразоватьИД(ИДБлока);
+
+ Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+ Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки);
+
+ Если ТолькоОснова Тогда
+ УдалитьЛишниеПоляБлока(Ответ);
+ КонецЕсли;
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Вернуть дочерние блоки
+// Созвращает список дочерних блоков блока-родителя
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// ИДБлока - Строка - ID блока родителя - block
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция ВернутьДочерниеБлоки(Знач Токен, Знач ИДБлока) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока);
+
+ ПреобразоватьИД(ИДБлока);
+
+ Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+ Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/blocks/" + ИДБлока + "/children", , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить блок
+// Удаляет блок по ID
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// ИДБлока - Строка - ID блока - block
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция УдалитьБлок(Знач Токен, Знач ИДБлока) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДБлока);
+
+ ПреобразоватьИД(ИДБлока);
+
+ Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+ Ответ = OPI_Инструменты.Delete("https://api.notion.com/v1/blocks/" + ИДБлока, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область Пользователи
+
+// Список пользователей
+// Возвращает список пользователей рабочего пространства
+//
+// Параметры:
+// Токен - Строка - Токен - token
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция СписокПользователей(Знач Токен) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+ Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/users", , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить данные пользователя
+// Получает данные пользователя по ID
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// ИДПользователя - Строка - ID целевого пользователя - user
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Notion
+Функция ПолучитьДанныеПользователя(Знач Токен, Знач ИДПользователя) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДПользователя);
+
+ ПреобразоватьИД(ИДПользователя);
+
+ Заголовки = СоздатьЗаголовкиЗапроса(Токен);
+ Ответ = OPI_Инструменты.Get("https://api.notion.com/v1/users/" + ИДПользователя, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция СоздатьЗаголовкиЗапроса(Знач Токен)
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ Заголовки = Новый Соответствие;
+ Заголовки.Вставить("Authorization" , "Bearer " + Токен);
+ Заголовки.Вставить("Notion-Version", "2022-06-28");
+
+ Возврат Заголовки;
+
+КонецФункции
+
+Процедура ПреобразоватьИД(Идентификатор)
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Идентификатор);
+
+ Идентификатор = СтрЗаменить(Идентификатор, "-", "");
+
+КонецПроцедуры
+
+Процедура ДобавитьРодителяСтраницы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура)
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(РодительБаза);
+
+ ПреобразоватьИД(Родитель);
+
+ ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id");
+ СтруктураРодителя = Новый Структура(ПолеИдентификатора, Родитель);
+
+ ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя);
+
+КонецПроцедуры
+
+Процедура ДобавитьРодителяБазы(Знач Родитель, Знач РодительБаза, ОсновнаяСтруктура)
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(РодительБаза);
+
+ ПреобразоватьИД(Родитель);
+
+ ПолеИдентификатора = ?(РодительБаза, "database_id", "page_id");
+
+ СтруктураРодителя = Новый Структура();
+ СтруктураРодителя.Вставить("type" , ПолеИдентификатора);
+ СтруктураРодителя.Вставить(ПолеИдентификатора, Родитель);
+
+ ОсновнаяСтруктура.Вставить("parent", СтруктураРодителя);
+
+КонецПроцедуры
+
+Процедура ДобавитьЗаголовокСтраницы(Знач Заголовок, ОсновнаяСтруктура)
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
+
+ ПодчиненнаяСтруктура = Новый Структура;
+ СтруктураДанных = Новый Структура;
+ СтруктураТекста = Новый Структура;
+ МассивДанных = Новый Массив;
+ Title = "title";
+
+ СтруктураТекста.Вставить("content", Заголовок);
+ СтруктураТекста.Вставить("link" , Неопределено);
+
+ СтруктураДанных.Вставить("text", СтруктураТекста);
+ СтруктураДанных.Вставить("type", "text");
+
+ МассивДанных.Добавить(СтруктураДанных);
+
+ ПодчиненнаяСтруктура.Вставить("id" , Title);
+ ПодчиненнаяСтруктура.Вставить("type" , Title);
+ ПодчиненнаяСтруктура.Вставить(Title , МассивДанных);
+
+ ОсновнаяСтруктура.Вставить(Title, ПодчиненнаяСтруктура);
+
+КонецПроцедуры
+
+Процедура ДобавитьЗаголовокБазы(Знач Заголовок, ОсновнаяСтруктура)
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
+
+ Заголовок = ПреобразоватьЗаголовок(Заголовок);
+ ОсновнаяСтруктура.Вставить("title", Заголовок["title"]);
+
+КонецПроцедуры
+
+Процедура ДобавитьОписаниеБазы(Знач Описание, ОсновнаяСтруктура)
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
+
+ Заголовок = ПреобразоватьЗаголовок(Описание);
+ ОсновнаяСтруктура.Вставить("description", Заголовок["title"]);
+
+КонецПроцедуры
+
+Процедура ДобавитьСвойстваБазы(Знач Свойства, ОсновнаяСтруктура)
+
+ Если Свойства.Количество() = 0 Тогда
+ ОсновнаяСтруктура.Вставить("properties", Новый Структура);
+ Возврат;
+ КонецЕсли;
+
+ СоответствиеПараметров = Новый Соответствие;
+
+ Для Каждого Свойство Из Свойства Цикл
+
+ Если ТипЗнч(Свойство.Значение) = Тип("Строка") Тогда
+
+ СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура(Свойство.Значение, Новый Структура));
+
+ ИначеЕсли ТипЗнч(Свойство.Значение) = Тип("Структура")
+ Или ТипЗнч(Свойство.Значение) = Тип("Соответствие") Тогда
+
+ ВыборЗначения = СформироватьЗначенияВыбора(Свойство.Значение);
+ СоответствиеПараметров.Вставить(Свойство.Ключ, Новый Структура("select", ВыборЗначения));
+
+ Иначе
+
+ СоответствиеПараметров.Вставить(Свойство.Ключ, Свойство.Значение);
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ ОсновнаяСтруктура.Вставить("properties", СоответствиеПараметров);
+
+КонецПроцедуры
+
+Функция СформироватьЗначенияВыбора(Знач СтруктураВариантов)
+
+ МассивВариантов = Новый Массив;
+
+ Для Каждого Вариант Из СтруктураВариантов Цикл
+
+ СоответствиеВарианта = Новый Соответствие;
+ СоответствиеВарианта.Вставить("name" , Вариант.Ключ);
+ СоответствиеВарианта.Вставить("color", Вариант.Значение);
+
+ МассивВариантов.Добавить(СоответствиеВарианта);
+
+ КонецЦикла;
+
+ Возврат Новый Структура("options", МассивВариантов);
+
+КонецФункции
+
+Функция ЗаполнитьДанныеПоСхеме(Знач Схема, Знач Данные, Знач Токен, Знач ЭтоБаза = Истина)
+
+ Если ЭтоБаза Тогда
+ ДанныеСхемы = ПолучитьБазуДанных(Токен, Схема);
+ Иначе
+ ДанныеСхемы = ПолучитьСтраницу(Токен, Схема);
+ КонецЕсли;
+
+ ПоляБазы = ДанныеСхемы["properties"];
+ Свойства = Новый Соответствие;
+
+ Если ЗначениеЗаполнено(ПоляБазы) Тогда
+
+ Для Каждого Поле Из ПоляБазы Цикл
+
+ ДанныеПоля = Поле.Значение;
+ ТипПоля = ДанныеПоля["type"];
+
+ ЗаполняемыеДанные = Данные.Получить(Поле.Ключ);
+
+ Если ЗаполняемыеДанные = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+
+ ПреобразованныеДанные = ПреобразоватьЗначениеПоТипу(ТипПоля, ЗаполняемыеДанные);
+
+ Если ПреобразованныеДанные = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Свойства.Вставить(ДанныеПоля["id"], ПреобразованныеДанные);
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ Возврат Свойства;
+
+КонецФункции
+
+Процедура УдалитьЛишниеПоляБлока(Знач Блок)
+
+ МассивЛишних = Новый Массив;
+ МассивЛишних.Добавить("request_id");
+ МассивЛишних.Добавить("archived");
+ МассивЛишних.Добавить("created_by");
+ МассивЛишних.Добавить("last_edited_time");
+ МассивЛишних.Добавить("created_time");
+ МассивЛишних.Добавить("has_children");
+ МассивЛишних.Добавить("parrent");
+ МассивЛишних.Добавить("last_edited_by");
+ МассивЛишних.Добавить("id");
+
+ Для Каждого Поле Из МассивЛишних Цикл
+
+ Если Не Блок.Получить(Поле) = Неопределено Тогда
+ Блок.Удалить(Поле);
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+#Область ПреобразованиеТипов
+
+Функция ПреобразоватьЗначениеПоТипу(Знач Тип, Знач Значение)
+
+ Если Тип = "title" Тогда
+ Возврат ПреобразоватьЗаголовок(Значение);
+ ИначеЕсли Тип = "rich_text" Тогда
+ Возврат ПреобразоватьТекст(Значение);
+ ИначеЕсли Тип = "number" Тогда
+ Возврат ПреобразоватьЧисло(Значение);
+ ИначеЕсли Тип = "select" Тогда
+ Возврат ПреобразоватьВариантВыбора(Значение);
+ ИначеЕсли Тип = "multi_select" Тогда
+ Возврат ПреобразоватьМножественныйВыбор(Значение);
+ ИначеЕсли Тип = "status" Тогда
+ Возврат ПреобразоватьСтатус(Значение);
+ ИначеЕсли Тип = "date" Тогда
+ Возврат ПреобразоватьДату(Значение);
+ ИначеЕсли Тип = "relation" Тогда
+ Возврат ПреобразоватьСвязь(Значение);
+ ИначеЕсли Тип = "people" Тогда
+ Возврат ПреобразоватьПользователей(Значение);
+ ИначеЕсли Тип = "files" Тогда
+ Возврат ПреобразоватьФайлы(Значение);
+ ИначеЕсли Тип = "checkbox" Тогда
+ Возврат ПреобразоватьБулево(Значение);
+ ИначеЕсли Тип = "url" Тогда
+ Возврат ПреобразоватьСсылку(Значение);
+ ИначеЕсли Тип = "email" Тогда
+ Возврат ПреобразоватьПочту(Значение);
+ ИначеЕсли Тип = "phone_number" Тогда
+ Возврат ПреобразоватьТелефон(Значение);
+ Иначе
+ Возврат Неопределено;
+ КонецЕсли;
+
+КонецФункции
+
+Функция ПреобразоватьЗаголовок(Знач Заголовок)
+
+ СтруктураДанных = Новый Структура;
+ СтруктураТекста = Новый Структура;
+ МассивДанных = Новый Массив;
+
+ СтруктураТекста.Вставить("content", Заголовок);
+ СтруктураТекста.Вставить("link" , Неопределено);
+
+ СтруктураДанных.Вставить("type", "text");
+ СтруктураДанных.Вставить("text", СтруктураТекста);
+
+ МассивДанных.Добавить(СтруктураДанных);
+
+ Возврат Новый Структура("title", МассивДанных);
+
+КонецФункции
+
+Функция ПреобразоватьТекст(Знач Текст)
+
+ МассивТекста = Новый Массив;
+ СтруктураТекста = Новый Структура;
+
+ СтруктураТекста.Вставить("type", "text");
+ СтруктураТекста.Вставить("text", Новый Структура("content", Текст));
+
+ МассивТекста.Добавить(СтруктураТекста);
+
+ Возврат Новый Структура("rich_text", МассивТекста);
+
+КонецФункции
+
+Функция ПреобразоватьЧисло(Знач Число)
+ Возврат Новый Структура("number", Число);
+КонецФункции
+
+Функция ПреобразоватьВариантВыбора(Знач Вариант)
+
+ СтруктураВыбора = Новый Структура;
+ СтруктураВыбора.Вставить("select", Новый Структура("name", Вариант));
+
+ Возврат СтруктураВыбора;
+
+КонецФункции
+
+Функция ПреобразоватьСтатус(Знач Статус)
+
+ СтруктураСтатуса = Новый Структура;
+ СтруктураСтатуса.Вставить("status", Новый Структура("name", Статус));
+
+ Возврат СтруктураСтатуса;
+
+КонецФункции
+
+Функция ПреобразоватьМножественныйВыбор(Знач МассивВариантов)
+
+ МассивВариантовВыбора = Новый Массив;
+
+ Для Каждого Вариант Из МассивВариантов Цикл
+ МассивВариантовВыбора.Добавить(Новый Структура("name", Вариант));
+ КонецЦикла;
+
+ Возврат Новый Структура("multi_select", МассивВариантовВыбора);
+
+КонецФункции
+
+Функция ПреобразоватьДату(Знач Дата)
+
+ СтруктураДаты = Новый Структура;
+
+ Если Дата = НачалоДня(Дата) Тогда
+ ФорматДаты = "ДФ=yyyy-MM-dd";
+ Иначе
+ ФорматДаты = "ДФ=yyyy-MM-ddThh:mm:ssZ";
+ КонецЕсли;
+
+ Дата = Формат(Дата, ФорматДаты);
+ СтруктураДаты.Вставить("start", Дата);
+
+ Возврат Новый Структура("date", СтруктураДаты);
+
+КонецФункции
+
+Функция ПреобразоватьСвязь(Знач Идентификатор)
+
+ МассивСвязи = Новый Массив;
+ МассивСвязи.Добавить(Новый Структура("id", Идентификатор));
+
+ Возврат Новый Структура("relation", МассивСвязи);
+
+КонецФункции
+
+Функция ПреобразоватьПользователей(Знач МассивИД)
+
+ Если Не ТипЗнч(МассивИД) = Тип("Массив") Тогда
+ МассивИД_ = Новый Массив;
+ МассивИД_.Добавить(МассивИД);
+ МассивИД = МассивИД_;
+ КонецЕсли;
+
+ МассивПользователей = Новый Массив;
+
+ Для Каждого Идентификатор Из МассивИД Цикл
+
+ СтруктураПользователя = Новый Структура;
+ СтруктураПользователя.Вставить("object", "user");
+ СтруктураПользователя.Вставить("id" , Идентификатор);
+ МассивПользователей.Добавить(СтруктураПользователя);
+
+ КонецЦикла;
+
+ Возврат Новый Структура("people", МассивПользователей);
+
+КонецФункции
+
+Функция ПреобразоватьФайлы(Знач СоответствиеФайлов)
+
+ МассивФайлов = Новый Массив;
+
+ Для Каждого Файл Из СоответствиеФайлов Цикл
+
+ СтруктураФайла = Новый Структура;
+ СтруктураФайла.Вставить("type" , "external");
+ СтруктураФайла.Вставить("name" , Файл.Ключ);
+ СтруктураФайла.Вставить("external", Новый Структура("url", Файл.Значение));
+
+ МассивФайлов.Добавить(СтруктураФайла);
+
+ КонецЦикла;
+
+ Возврат Новый Структура("files", МассивФайлов);
+
+КонецФункции
+
+Функция ПреобразоватьБулево(Знач Булево)
+ Возврат Новый Структура("checkbox", Булево);
+КонецФункции
+
+Функция ПреобразоватьСсылку(Знач URL)
+ Возврат Новый Структура("url", URL);
+КонецФункции
+
+Функция ПреобразоватьПочту(Знач Почта)
+ Возврат Новый Структура("email", Почта);
+КонецФункции
+
+Функция ПреобразоватьТелефон(Знач Телефон)
+ Возврат Новый Структура("phone_number", Телефон);
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_Slack.os b/ru/OInt/core/Modules/OPI_Slack.os
index 7ec31af5b4..237f9bc5fd 100644
--- a/ru/OInt/core/Modules/OPI_Slack.os
+++ b/ru/OInt/core/Modules/OPI_Slack.os
@@ -1,1055 +1,1055 @@
-// Расположение OS: ./OInt/core/Modules/OPI_Slack.os
-// Библиотека: Slack
-// Команда CLI: slack
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:Typo-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область УправлениеИНастройки
-
-// Получить информацию о боте
-// Получает основную информацию о боте
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьИнформациюОБоте(Знач Токен) Экспорт
-
- URL = "https://slack.com/api/auth.test";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Ответ = OPI_Инструменты.Get(URL, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить список рабочих областей
-// Получает список рабочих областей, в которых подключен бот
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСписокРабочихОбластей(Знач Токен, Знач Курсор = "") Экспорт
-
- URL = "https://slack.com/api/auth.teams.list";
- Ответ = ПолучениеОбщихДанных(Токен, URL, Курсор);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить список пользователей
-// Получает список пользователей рабочей области
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСписокПользователей(Знач Токен, Знач Курсор = "") Экспорт
-
- URL = "https://slack.com/api/users.list";
- Ответ = ПолучениеОбщихДанных(Токен, URL, Курсор);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаССообщениями
-
-// Отправить сообщение
-// Отправляет сообщение в выбранный час
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - Идентификатор канала - channel
-// Текст - Строка - Текст сообщения - text
-// ДатаОтправки - Дата - Дата отправки для отложенного сообщения - date
-// Блоки - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ОтправитьСообщение(Знач Токен, Знач Канал, Знач Текст = "", Знач ДатаОтправки = "", Знач Блоки = "") Экспорт
-
- Строка_ = "Строка";
- ЕстьДата = ЗначениеЗаполнено(ДатаОтправки);
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Если ЗначениеЗаполнено(Блоки) И ТипЗнч(Блоки) = Тип(Строка_) Тогда
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блоки);
-
- Если ТипЗнч(Блоки) = Тип("Массив") Тогда
-
- Для Н = 0 По Блоки.ВГраница() Цикл
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блоки[Н]);
- КонецЦикла;
-
- КонецЕсли;
-
- КонецЕсли;
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("channel", Канал, Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("text" , Текст, Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("blocks" , Блоки, "Массив" , Параметры);
-
- Если ЕстьДата Тогда
-
- URL = "https://slack.com/api/chat.scheduleMessage";
- OPI_Инструменты.ДобавитьПоле("post_at", ДатаОтправки, "Дата", Параметры);
-
- Иначе
-
- URL = "https://slack.com/api/chat.postMessage";
-
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Отправить эфемерное сообщение
-// Отправляет сообщение, которое приходит в канал, но видно
-// только конкретному пользователю
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - Идентификатор канала - channel
-// Текст - Строка - Текст сообщения - text
-// Пользователь - Строка - ID пользователя - user
-// Блоки - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ОтправитьЭфемерноеСообщение(Знач Токен
- , Знач Канал
- , Знач Текст = ""
- , Знач Пользователь = ""
- , Знач Блоки = "") Экспорт
-
- Строка_ = "Строка";
-
- Если ЗначениеЗаполнено(Блоки) И Не ТипЗнч(Блоки) = Тип(Строка_) Тогда
- OPI_ПреобразованиеТипов.ПолучитьМассив(Блоки);
- КонецЕсли;
-
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("text" , Текст , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("user" , Пользователь, Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("blocks" , Блоки , "Коллекция", Параметры);
-
- URL = "https://slack.com/api/chat.postEphemeral";
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Изменить сообщение
-// Изменяет состав существующего сообщения
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - Идентификатор канала - channel
-// Отметка - Строка - Временная отметка сообщения - stamp
-// Текст - Строка - Новый текст сообщения - text
-// МассивБлоков - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ИзменитьСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач Текст = "", Знач МассивБлоков = "") Экспорт
-
- Строка_ = "Строка";
- URL = "https://slack.com/api/chat.update";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("text" , Текст , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("ts" , Отметка , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("blocks" , МассивБлоков, "Коллекция", Параметры);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить сообщение
-// Удаляет сообщение канала по timestamp
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - Идентификатор канала - channel
-// Отметка - Строка - Временная отметка или ID сообщения - stamp
-// ЭтоОтложенное - Булево - Признак удаления отложенного сообщения - issheduled
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция УдалитьСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач ЭтоОтложенное = Ложь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьБулево(ЭтоОтложенное);
-
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Если ЭтоОтложенное Тогда
- URL = "https://slack.com/api/chat.deleteScheduledMessage";
- ПолеОтметки = "scheduled_message_id";
- Иначе
- URL = "https://slack.com/api/chat.delete";
- ПолеОтметки = "ts";
- КонецЕсли;
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("channel" , Канал , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле(ПолеОтметки, Отметка, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить список отложенных сообщений
-// Получает список отложенных сообщений канала
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - Идентификатор канала - channel
-// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСписокОтложенныхСообщений(Знач Токен, Знач Канал, Знач Курсор = "") Экспорт
-
- URL = "https://slack.com/api/chat.scheduledMessages.list";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить ссылку на сообщение
-// Получает постоянный UTL к сообщению канала
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - Идентификатор канала - channel
-// Отметка - Строка - Временная отметка или ID сообщения - stamp
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСсылкуНаСообщение(Знач Токен, Знач Канал, Знач Отметка) Экспорт
-
- URL = "https://slack.com/api/chat.getPermalink";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("channel" , Канал , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("message_ts", Отметка, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить список ответов на сообщение
-// Получает массив сообщений, которые являются ответом на указанное
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - Идентификатор канала - channel
-// Отметка - Строка - Временная отметка или ID сообщения - stamp
-// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСписокОтветовНаСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач Курсор = "") Экспорт
-
- Строка_ = "Строка";
- URL = "https://slack.com/api/conversations.replies";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("cursor" , Курсор , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("ts" , Отметка, Строка_, Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСКаналами
-
-// Получить список каналов
-// Получает список доступных каналов
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// ИсключатьАрхивированные - Булево - Признак исключения архивированных каналов - notarchived
-// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСписокКаналов(Знач Токен, Знач ИсключатьАрхивированные = Ложь, Знач Курсор = "") Экспорт
-
- URL = "https://slack.com/api/conversations.list";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("exclude_archived", ИсключатьАрхивированные, "Булево", Параметры);
- OPI_Инструменты.ДобавитьПоле("cursor" , Курсор , "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить список пользователей канала
-// Получает список пользователей указанного канала
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - Идентификатор канала - channel
-// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСписокПользователейКанала(Знач Токен, Знач Канал, Знач Курсор = "") Экспорт
-
- URL = "https://slack.com/api/conversations.members";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Создать канал
-// Создает новый канал
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Название - Строка - Наименование канала - title
-// Приватный - Булево - Создать канал приватным - private
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция СоздатьКанал(Знач Токен, Знач Название, Знач Приватный = Ложь) Экспорт
-
- URL = "https://slack.com/api/conversations.create";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("name" , Название , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("is_private", Приватный, "Булево", Параметры);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Архивировать канал
-// Архивирует активный канал
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - ID канала - channel
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция АрхивироватьКанал(Знач Токен, Знач Канал) Экспорт
-
- URL = "https://slack.com/api/conversations.archive";
- Ответ = УправлениеДиалогом(Токен, Канал, URL);
- Возврат Ответ;
-
-КонецФункции
-
-// Получить канал
-// Получает информацию о канале
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - ID канала - channel
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьКанал(Знач Токен, Знач Канал) Экспорт
-
- URL = "https://slack.com/api/conversations.info";
- Ответ = УправлениеДиалогом(Токен, Канал, URL, "GET");
- Возврат Ответ;
-
-КонецФункции
-
-// Получить историю канала
-// Получает информацию событиях канала
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - ID канала - channel
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьИсториюКанала(Знач Токен, Знач Канал) Экспорт
-
- URL = "https://slack.com/api/conversations.history";
- Ответ = УправлениеДиалогом(Токен, Канал, URL, "GET");
- Возврат Ответ;
-
-КонецФункции
-
-// Пригласить пользователей в канал
-// Добавляет указанных пользователей в канал
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - ID канала - channel
-// МассивПользователей - Массив Из Строка - Массив ID пользователей - users
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПригласитьПользователейВКанал(Знач Токен, Знач Канал, Знач МассивПользователей) Экспорт
-
- URL = "https://slack.com/api/conversations.invite";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПользователей);
- МассивПользователей = СтрСоединить(МассивПользователей, ",");
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("users" , МассивПользователей, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Выгнать пользователя из канала
-// Удаляет указанного пользователя из канала
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - ID канала - channel
-// Пользователь - Строка - ID пользователя - user
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ВыгнатьПользователяИзКанала(Знач Токен, Знач Канал, Знач Пользователь) Экспорт
-
- URL = "https://slack.com/api/conversations.kick";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("user" , Пользователь, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Вступить в канал
-// Добавляет текущего бота в канал
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - ID канала - channel
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ВступитьВКанал(Знач Токен, Знач Канал) Экспорт
-
- URL = "https://slack.com/api/conversations.join";
- Ответ = УправлениеДиалогом(Токен, Канал, URL);
- Возврат Ответ;
-
-КонецФункции
-
-// Покинуть канал
-// Удаляет текущего бота из канала
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - ID канала - channel
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПокинутьКанал(Знач Токен, Знач Канал) Экспорт
-
- URL = "https://slack.com/api/conversations.leave";
- Ответ = УправлениеДиалогом(Токен, Канал, URL);
- Возврат Ответ;
-
-КонецФункции
-
-// Установить тему канала
-// Устанавливает тему канала
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - ID канала - channel
-// Тема - Строка - Тема канала - theme
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция УстановитьТемуКанала(Знач Токен, Знач Канал, Знач Тема) Экспорт
-
- URL = "https://slack.com/api/conversations.setTopic";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("topic" , Тема , "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Установить цель канала
-// Устанавливает цель (описание) канала
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - ID канала - channel
-// Цель - Строка - Цель канала - purpose
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция УстановитьЦельКанала(Знач Токен, Знач Канал, Знач Цель) Экспорт
-
- URL = "https://slack.com/api/conversations.setPurpose";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("purpose", Цель , "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Переименовать канал
-// Изменяет название канала
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - ID канала - channel
-// Название - Строка - Новое название канала - title
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПереименоватьКанал(Знач Токен, Знач Канал, Знач Название) Экспорт
-
- URL = "https://slack.com/api/conversations.rename";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("name" , Название, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСДиалогами
-
-// Открыть диалог
-// Открывает новый диалог с одним или несколькими пользователями
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// МассивПользователей - Массив из Строка - Массив ID пользователей - users
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ОткрытьДиалог(Знач Токен, Знач МассивПользователей) Экспорт
-
- URL = "https://slack.com/api/conversations.open";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПользователей);
- МассивПользователей = СтрСоединить(МассивПользователей, ",");
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("users", МассивПользователей, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Закрыть диалог
-// Закрывает существующий диалог
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Диалог - Строка - ID диалога - conv
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ЗакрытьДиалог(Знач Токен, Знач Диалог) Экспорт
-
- URL = "https://slack.com/api/conversations.close";
- Ответ = УправлениеДиалогом(Токен, Диалог, URL);
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСФайлами
-
-// Получить список файлов
-// Получает список файлов бота или канала
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - Канал для отбора - channel
-// НомерСтраницы - Число, Строка - Номер страницы - page
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСписокФайлов(Знач Токен, Знач Канал = "", Знач НомерСтраницы = 1) Экспорт
-
- URL = "https://slack.com/api/files.list";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("page" , НомерСтраницы, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Загрузить файл
-// Загружает файл на сервера Slack
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Файл - Строка,ДвоичныеДанные - Файл для загрузки - file
-// ИмяФайла - Строка - Имя файла с расширением - filename
-// Заголовок - Строка - Имя файла в Slack - title
-// Канал - Строка - ID канала - channel
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач ИмяФайла, Знач Заголовок, Знач Канал = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяФайла);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
-
- Строка_ = "Строка";
- Upload_url = "upload_url";
- File_id = "file_id";
- URL = "https://slack.com/api/files.getUploadURLExternal";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
- Размер = Файл.Размер();
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("filename", ИмяФайла, Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("length" , Размер , Строка_, Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
- URL = Ответ[Upload_url];
- Идентификатор = Ответ[File_id];
-
- Если Не ЗначениеЗаполнено(URL) Или Не ЗначениеЗаполнено(Идентификатор) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- Файлы = Новый Соответствие;
- Файлы.Вставить(ИмяФайла, Файл);
-
- Ответ = OPI_Инструменты.PostMultipart(URL, , Файлы, , Заголовки);
- URL = "https://slack.com/api/files.completeUploadExternal";
- ФайлСлак = Новый Структура("id, title", Идентификатор, Заголовок);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("filename" , ИмяФайла, Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("channel_id", Канал , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("files" , ФайлСлак, "Массив", Параметры);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить данные файла
-// Получает информацию о файле
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// ИдентификаторФайла - Строка - Идентификатор файла - fileid
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьДанныеФайла(Знач Токен, Знач ИдентификаторФайла) Экспорт
-
- URL = "https://slack.com/api/files.info";
- Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL, "GET");
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить файл
-// Удаляет файл на Slack
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// ИдентификаторФайла - Строка - Идентификатор файла - fileid
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция УдалитьФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт
-
- URL = "https://slack.com/api/files.delete";
- Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Сделать файл публичным
-// Создает публичный URL для файла. Требует токен пользователя
-//
-// Параметры:
-// Токен - Строка - Токен пользователя - token
-// ИдентификаторФайла - Строка - Идентификатор файла - fileid
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция СделатьФайлПубличным(Знач Токен, Знач ИдентификаторФайла) Экспорт
-
- URL = "https://slack.com/api/files.sharedPublicURL";
- Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Сделать файл приватным
-// Удаляет публичный URL у файла. Требует токен пользователя
-//
-// Параметры:
-// Токен - Строка - Токен пользователя - token
-// ИдентификаторФайла - Строка - Идентификатор файла - fileid
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция СделатьФайлПриватным(Знач Токен, Знач ИдентификаторФайла) Экспорт
-
- URL = "https://slack.com/api/files.revokePublicURL";
- Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСУдаленнымиФайлами
-
-// Получить список внешних файлов
-// Получает список внешних файлов пользователя или канала
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Канал - Строка - Канал для отбора - channel
-// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьСписокВнешнихФайлов(Знач Токен, Знач Канал = "", Знач Курсор = "") Экспорт
-
- URL = "https://slack.com/api/files.remote.list";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить внешний файл
-// Получает информацию о внешнем файле
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// ИдентификаторФайла - Строка - Идентификатор файла - fileid
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ПолучитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт
-
- URL = "https://slack.com/api/files.remote.info";
- Ответ = УправлениеВнешнимФайлом(Токен, ИдентификаторФайла, URL);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Добавить внешний файл
-// Добавляет новый внешний файл
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// URL - Строка - URL к внешнему файлу - url
-// Заголовок - Строка - Заголовок файла для Slack - title
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ДобавитьВнешнийФайл(Знач Токен, Знач URL, Знач Заголовок) Экспорт
-
- Строка_ = "Строка";
- URL = "https://slack.com/api/files.remote.add";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
- UID = Строка(Новый УникальныйИдентификатор());
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("external_url", URL , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("external_id" , UID , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("title" , Заголовок , Строка_, Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Отправить внешний файл
-// Отправляет внейшний файл по списку каналов
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// ИдентификаторФайла - Строка - Идентификатор файла - fileid
-// МассивКаналов - Массив Из Строка - Массив каналов для отправки - channels
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция ОтправитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла, Знач МассивКаналов) Экспорт
-
- URL = "https://slack.com/api/files.remote.share";
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКаналов);
- МассивКаналов = СтрСоединить(МассивКаналов, ",");
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("file" , ИдентификаторФайла , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("channels", МассивКаналов , "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить внешний файл
-// Удаляет внешний файл из Slack
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// ИдентификаторФайла - Строка - Идентификатор файла - fileid
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
-Функция УдалитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт
-
- URL = "https://slack.com/api/files.remote.remove";
- Ответ = УправлениеВнешнимФайлом(Токен, ИдентификаторФайла, URL);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область ФормированиеБлоков
-
-// Сформировать блок картинку
-// Формирует блок с картинкой для добавления в массив блоков сообщения
-//
-// Параметры:
-// URL - Строка - URL картинки - picture
-// АльтернативныйТекст - Строка - Альтернативный текст картинки - alt
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - Блок картинки
-Функция СформироватьБлокКартинку(Знач URL, Знач АльтернативныйТекст = "") Экспорт
-
- Строка_ = "Строка";
-
- Блок = Новый Соответствие;
- OPI_Инструменты.ДобавитьПоле("type" , "image" , Строка_, Блок);
- OPI_Инструменты.ДобавитьПоле("image_url", URL , Строка_, Блок);
- OPI_Инструменты.ДобавитьПоле("alt_text" , АльтернативныйТекст , Строка_, Блок);
-
- Возврат Блок;
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ПолучитьЗаголовокАвторизации(Знач Токен)
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- Заголовки = Новый Соответствие;
- Заголовки.Вставить("Authorization", "Bearer " + Токен);
- Возврат Заголовки;
-
-КонецФункции
-
-Функция УправлениеДиалогом(Знач Токен, Знач Канал, Знач URL, Знач ВидЗапроса = "POST")
-
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
- ВидЗапроса = вРег(ВидЗапроса);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("channel", Канал, "Строка", Параметры);
-
- Если ВидЗапроса = "POST" Тогда
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
- Иначе
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
- КонецЕсли;
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция УправлениеФайлом(Знач Токен, Знач ИдентификаторФайла, Знач URL, Знач ВидЗапроса = "POST")
-
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
- ВидЗапроса = вРег(ВидЗапроса);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры);
-
- Если ВидЗапроса = "POST" Тогда
- Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
- Иначе
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
- КонецЕсли;
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ПолучениеОбщихДанных(Знач Токен, Знач URL, Знач Курсор)
-
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("cursor", Курсор, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция УправлениеВнешнимФайлом(Знач Токен, Знач ИдентификаторФайла, Знач URL)
-
- Заголовки = ПолучитьЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_Slack.os
+// Библиотека: Slack
+// Команда CLI: slack
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:Typo-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область УправлениеИНастройки
+
+// Получить информацию о боте
+// Получает основную информацию о боте
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьИнформациюОБоте(Знач Токен) Экспорт
+
+ URL = "https://slack.com/api/auth.test";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Ответ = OPI_Инструменты.Get(URL, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить список рабочих областей
+// Получает список рабочих областей, в которых подключен бот
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСписокРабочихОбластей(Знач Токен, Знач Курсор = "") Экспорт
+
+ URL = "https://slack.com/api/auth.teams.list";
+ Ответ = ПолучениеОбщихДанных(Токен, URL, Курсор);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить список пользователей
+// Получает список пользователей рабочей области
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСписокПользователей(Знач Токен, Знач Курсор = "") Экспорт
+
+ URL = "https://slack.com/api/users.list";
+ Ответ = ПолучениеОбщихДанных(Токен, URL, Курсор);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаССообщениями
+
+// Отправить сообщение
+// Отправляет сообщение в выбранный час
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - Идентификатор канала - channel
+// Текст - Строка - Текст сообщения - text
+// ДатаОтправки - Дата - Дата отправки для отложенного сообщения - date
+// Блоки - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ОтправитьСообщение(Знач Токен, Знач Канал, Знач Текст = "", Знач ДатаОтправки = "", Знач Блоки = "") Экспорт
+
+ Строка_ = "Строка";
+ ЕстьДата = ЗначениеЗаполнено(ДатаОтправки);
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Если ЗначениеЗаполнено(Блоки) И ТипЗнч(Блоки) = Тип(Строка_) Тогда
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блоки);
+
+ Если ТипЗнч(Блоки) = Тип("Массив") Тогда
+
+ Для Н = 0 По Блоки.ВГраница() Цикл
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Блоки[Н]);
+ КонецЦикла;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("channel", Канал, Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("text" , Текст, Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("blocks" , Блоки, "Массив" , Параметры);
+
+ Если ЕстьДата Тогда
+
+ URL = "https://slack.com/api/chat.scheduleMessage";
+ OPI_Инструменты.ДобавитьПоле("post_at", ДатаОтправки, "Дата", Параметры);
+
+ Иначе
+
+ URL = "https://slack.com/api/chat.postMessage";
+
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Отправить эфемерное сообщение
+// Отправляет сообщение, которое приходит в канал, но видно
+// только конкретному пользователю
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - Идентификатор канала - channel
+// Текст - Строка - Текст сообщения - text
+// Пользователь - Строка - ID пользователя - user
+// Блоки - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ОтправитьЭфемерноеСообщение(Знач Токен
+ , Знач Канал
+ , Знач Текст = ""
+ , Знач Пользователь = ""
+ , Знач Блоки = "") Экспорт
+
+ Строка_ = "Строка";
+
+ Если ЗначениеЗаполнено(Блоки) И Не ТипЗнч(Блоки) = Тип(Строка_) Тогда
+ OPI_ПреобразованиеТипов.ПолучитьМассив(Блоки);
+ КонецЕсли;
+
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("text" , Текст , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("user" , Пользователь, Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("blocks" , Блоки , "Коллекция", Параметры);
+
+ URL = "https://slack.com/api/chat.postEphemeral";
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Изменить сообщение
+// Изменяет состав существующего сообщения
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - Идентификатор канала - channel
+// Отметка - Строка - Временная отметка сообщения - stamp
+// Текст - Строка - Новый текст сообщения - text
+// МассивБлоков - Массив Из Структура - Массив описаний блоков - blocks - JSON массива описаний блоков
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ИзменитьСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач Текст = "", Знач МассивБлоков = "") Экспорт
+
+ Строка_ = "Строка";
+ URL = "https://slack.com/api/chat.update";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("text" , Текст , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("ts" , Отметка , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("blocks" , МассивБлоков, "Коллекция", Параметры);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить сообщение
+// Удаляет сообщение канала по timestamp
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - Идентификатор канала - channel
+// Отметка - Строка - Временная отметка или ID сообщения - stamp
+// ЭтоОтложенное - Булево - Признак удаления отложенного сообщения - issheduled
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция УдалитьСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач ЭтоОтложенное = Ложь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьБулево(ЭтоОтложенное);
+
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Если ЭтоОтложенное Тогда
+ URL = "https://slack.com/api/chat.deleteScheduledMessage";
+ ПолеОтметки = "scheduled_message_id";
+ Иначе
+ URL = "https://slack.com/api/chat.delete";
+ ПолеОтметки = "ts";
+ КонецЕсли;
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("channel" , Канал , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле(ПолеОтметки, Отметка, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить список отложенных сообщений
+// Получает список отложенных сообщений канала
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - Идентификатор канала - channel
+// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСписокОтложенныхСообщений(Знач Токен, Знач Канал, Знач Курсор = "") Экспорт
+
+ URL = "https://slack.com/api/chat.scheduledMessages.list";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить ссылку на сообщение
+// Получает постоянный UTL к сообщению канала
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - Идентификатор канала - channel
+// Отметка - Строка - Временная отметка или ID сообщения - stamp
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСсылкуНаСообщение(Знач Токен, Знач Канал, Знач Отметка) Экспорт
+
+ URL = "https://slack.com/api/chat.getPermalink";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("channel" , Канал , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("message_ts", Отметка, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить список ответов на сообщение
+// Получает массив сообщений, которые являются ответом на указанное
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - Идентификатор канала - channel
+// Отметка - Строка - Временная отметка или ID сообщения - stamp
+// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСписокОтветовНаСообщение(Знач Токен, Знач Канал, Знач Отметка, Знач Курсор = "") Экспорт
+
+ Строка_ = "Строка";
+ URL = "https://slack.com/api/conversations.replies";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("channel", Канал , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("cursor" , Курсор , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("ts" , Отметка, Строка_, Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСКаналами
+
+// Получить список каналов
+// Получает список доступных каналов
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// ИсключатьАрхивированные - Булево - Признак исключения архивированных каналов - notarchived
+// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСписокКаналов(Знач Токен, Знач ИсключатьАрхивированные = Ложь, Знач Курсор = "") Экспорт
+
+ URL = "https://slack.com/api/conversations.list";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("exclude_archived", ИсключатьАрхивированные, "Булево", Параметры);
+ OPI_Инструменты.ДобавитьПоле("cursor" , Курсор , "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить список пользователей канала
+// Получает список пользователей указанного канала
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - Идентификатор канала - channel
+// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСписокПользователейКанала(Знач Токен, Знач Канал, Знач Курсор = "") Экспорт
+
+ URL = "https://slack.com/api/conversations.members";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Создать канал
+// Создает новый канал
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Название - Строка - Наименование канала - title
+// Приватный - Булево - Создать канал приватным - private
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция СоздатьКанал(Знач Токен, Знач Название, Знач Приватный = Ложь) Экспорт
+
+ URL = "https://slack.com/api/conversations.create";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("name" , Название , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("is_private", Приватный, "Булево", Параметры);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Архивировать канал
+// Архивирует активный канал
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - ID канала - channel
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция АрхивироватьКанал(Знач Токен, Знач Канал) Экспорт
+
+ URL = "https://slack.com/api/conversations.archive";
+ Ответ = УправлениеДиалогом(Токен, Канал, URL);
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить канал
+// Получает информацию о канале
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - ID канала - channel
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьКанал(Знач Токен, Знач Канал) Экспорт
+
+ URL = "https://slack.com/api/conversations.info";
+ Ответ = УправлениеДиалогом(Токен, Канал, URL, "GET");
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить историю канала
+// Получает информацию событиях канала
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - ID канала - channel
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьИсториюКанала(Знач Токен, Знач Канал) Экспорт
+
+ URL = "https://slack.com/api/conversations.history";
+ Ответ = УправлениеДиалогом(Токен, Канал, URL, "GET");
+ Возврат Ответ;
+
+КонецФункции
+
+// Пригласить пользователей в канал
+// Добавляет указанных пользователей в канал
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - ID канала - channel
+// МассивПользователей - Массив Из Строка - Массив ID пользователей - users
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПригласитьПользователейВКанал(Знач Токен, Знач Канал, Знач МассивПользователей) Экспорт
+
+ URL = "https://slack.com/api/conversations.invite";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПользователей);
+ МассивПользователей = СтрСоединить(МассивПользователей, ",");
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("users" , МассивПользователей, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Выгнать пользователя из канала
+// Удаляет указанного пользователя из канала
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - ID канала - channel
+// Пользователь - Строка - ID пользователя - user
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ВыгнатьПользователяИзКанала(Знач Токен, Знач Канал, Знач Пользователь) Экспорт
+
+ URL = "https://slack.com/api/conversations.kick";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("user" , Пользователь, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Вступить в канал
+// Добавляет текущего бота в канал
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - ID канала - channel
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ВступитьВКанал(Знач Токен, Знач Канал) Экспорт
+
+ URL = "https://slack.com/api/conversations.join";
+ Ответ = УправлениеДиалогом(Токен, Канал, URL);
+ Возврат Ответ;
+
+КонецФункции
+
+// Покинуть канал
+// Удаляет текущего бота из канала
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - ID канала - channel
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПокинутьКанал(Знач Токен, Знач Канал) Экспорт
+
+ URL = "https://slack.com/api/conversations.leave";
+ Ответ = УправлениеДиалогом(Токен, Канал, URL);
+ Возврат Ответ;
+
+КонецФункции
+
+// Установить тему канала
+// Устанавливает тему канала
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - ID канала - channel
+// Тема - Строка - Тема канала - theme
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция УстановитьТемуКанала(Знач Токен, Знач Канал, Знач Тема) Экспорт
+
+ URL = "https://slack.com/api/conversations.setTopic";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("topic" , Тема , "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Установить цель канала
+// Устанавливает цель (описание) канала
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - ID канала - channel
+// Цель - Строка - Цель канала - purpose
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция УстановитьЦельКанала(Знач Токен, Знач Канал, Знач Цель) Экспорт
+
+ URL = "https://slack.com/api/conversations.setPurpose";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("purpose", Цель , "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Переименовать канал
+// Изменяет название канала
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - ID канала - channel
+// Название - Строка - Новое название канала - title
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПереименоватьКанал(Знач Токен, Знач Канал, Знач Название) Экспорт
+
+ URL = "https://slack.com/api/conversations.rename";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("name" , Название, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСДиалогами
+
+// Открыть диалог
+// Открывает новый диалог с одним или несколькими пользователями
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// МассивПользователей - Массив из Строка - Массив ID пользователей - users
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ОткрытьДиалог(Знач Токен, Знач МассивПользователей) Экспорт
+
+ URL = "https://slack.com/api/conversations.open";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивПользователей);
+ МассивПользователей = СтрСоединить(МассивПользователей, ",");
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("users", МассивПользователей, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Закрыть диалог
+// Закрывает существующий диалог
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Диалог - Строка - ID диалога - conv
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ЗакрытьДиалог(Знач Токен, Знач Диалог) Экспорт
+
+ URL = "https://slack.com/api/conversations.close";
+ Ответ = УправлениеДиалогом(Токен, Диалог, URL);
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСФайлами
+
+// Получить список файлов
+// Получает список файлов бота или канала
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - Канал для отбора - channel
+// НомерСтраницы - Число, Строка - Номер страницы - page
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСписокФайлов(Знач Токен, Знач Канал = "", Знач НомерСтраницы = 1) Экспорт
+
+ URL = "https://slack.com/api/files.list";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("page" , НомерСтраницы, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Загрузить файл
+// Загружает файл на сервера Slack
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Файл - Строка,ДвоичныеДанные - Файл для загрузки - file
+// ИмяФайла - Строка - Имя файла с расширением - filename
+// Заголовок - Строка - Имя файла в Slack - title
+// Канал - Строка - ID канала - channel
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ЗагрузитьФайл(Знач Токен, Знач Файл, Знач ИмяФайла, Знач Заголовок, Знач Канал = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяФайла);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Заголовок);
+
+ Строка_ = "Строка";
+ Upload_url = "upload_url";
+ File_id = "file_id";
+ URL = "https://slack.com/api/files.getUploadURLExternal";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+ Размер = Файл.Размер();
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("filename", ИмяФайла, Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("length" , Размер , Строка_, Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+ URL = Ответ[Upload_url];
+ Идентификатор = Ответ[File_id];
+
+ Если Не ЗначениеЗаполнено(URL) Или Не ЗначениеЗаполнено(Идентификатор) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ Файлы = Новый Соответствие;
+ Файлы.Вставить(ИмяФайла, Файл);
+
+ Ответ = OPI_Инструменты.PostMultipart(URL, , Файлы, , Заголовки);
+ URL = "https://slack.com/api/files.completeUploadExternal";
+ ФайлСлак = Новый Структура("id, title", Идентификатор, Заголовок);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("filename" , ИмяФайла, Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("channel_id", Канал , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("files" , ФайлСлак, "Массив", Параметры);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить данные файла
+// Получает информацию о файле
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// ИдентификаторФайла - Строка - Идентификатор файла - fileid
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьДанныеФайла(Знач Токен, Знач ИдентификаторФайла) Экспорт
+
+ URL = "https://slack.com/api/files.info";
+ Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL, "GET");
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить файл
+// Удаляет файл на Slack
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// ИдентификаторФайла - Строка - Идентификатор файла - fileid
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция УдалитьФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт
+
+ URL = "https://slack.com/api/files.delete";
+ Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Сделать файл публичным
+// Создает публичный URL для файла. Требует токен пользователя
+//
+// Параметры:
+// Токен - Строка - Токен пользователя - token
+// ИдентификаторФайла - Строка - Идентификатор файла - fileid
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция СделатьФайлПубличным(Знач Токен, Знач ИдентификаторФайла) Экспорт
+
+ URL = "https://slack.com/api/files.sharedPublicURL";
+ Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Сделать файл приватным
+// Удаляет публичный URL у файла. Требует токен пользователя
+//
+// Параметры:
+// Токен - Строка - Токен пользователя - token
+// ИдентификаторФайла - Строка - Идентификатор файла - fileid
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция СделатьФайлПриватным(Знач Токен, Знач ИдентификаторФайла) Экспорт
+
+ URL = "https://slack.com/api/files.revokePublicURL";
+ Ответ = УправлениеФайлом(Токен, ИдентификаторФайла, URL);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСУдаленнымиФайлами
+
+// Получить список внешних файлов
+// Получает список внешних файлов пользователя или канала
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Канал - Строка - Канал для отбора - channel
+// Курсор - Строка - Указатель из предыдущего запроса, если строк результата > 100 - cursor
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьСписокВнешнихФайлов(Знач Токен, Знач Канал = "", Знач Курсор = "") Экспорт
+
+ URL = "https://slack.com/api/files.remote.list";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("channel", Канал , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("cursor" , Курсор, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить внешний файл
+// Получает информацию о внешнем файле
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// ИдентификаторФайла - Строка - Идентификатор файла - fileid
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ПолучитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт
+
+ URL = "https://slack.com/api/files.remote.info";
+ Ответ = УправлениеВнешнимФайлом(Токен, ИдентификаторФайла, URL);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Добавить внешний файл
+// Добавляет новый внешний файл
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// URL - Строка - URL к внешнему файлу - url
+// Заголовок - Строка - Заголовок файла для Slack - title
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ДобавитьВнешнийФайл(Знач Токен, Знач URL, Знач Заголовок) Экспорт
+
+ Строка_ = "Строка";
+ URL = "https://slack.com/api/files.remote.add";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+ UID = Строка(Новый УникальныйИдентификатор());
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("external_url", URL , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("external_id" , UID , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("title" , Заголовок , Строка_, Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Отправить внешний файл
+// Отправляет внейшний файл по списку каналов
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// ИдентификаторФайла - Строка - Идентификатор файла - fileid
+// МассивКаналов - Массив Из Строка - Массив каналов для отправки - channels
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция ОтправитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла, Знач МассивКаналов) Экспорт
+
+ URL = "https://slack.com/api/files.remote.share";
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКаналов);
+ МассивКаналов = СтрСоединить(МассивКаналов, ",");
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("file" , ИдентификаторФайла , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("channels", МассивКаналов , "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить внешний файл
+// Удаляет внешний файл из Slack
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// ИдентификаторФайла - Строка - Идентификатор файла - fileid
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Slack
+Функция УдалитьВнешнийФайл(Знач Токен, Знач ИдентификаторФайла) Экспорт
+
+ URL = "https://slack.com/api/files.remote.remove";
+ Ответ = УправлениеВнешнимФайлом(Токен, ИдентификаторФайла, URL);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ФормированиеБлоков
+
+// Сформировать блок картинку
+// Формирует блок с картинкой для добавления в массив блоков сообщения
+//
+// Параметры:
+// URL - Строка - URL картинки - picture
+// АльтернативныйТекст - Строка - Альтернативный текст картинки - alt
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - Блок картинки
+Функция СформироватьБлокКартинку(Знач URL, Знач АльтернативныйТекст = "") Экспорт
+
+ Строка_ = "Строка";
+
+ Блок = Новый Соответствие;
+ OPI_Инструменты.ДобавитьПоле("type" , "image" , Строка_, Блок);
+ OPI_Инструменты.ДобавитьПоле("image_url", URL , Строка_, Блок);
+ OPI_Инструменты.ДобавитьПоле("alt_text" , АльтернативныйТекст , Строка_, Блок);
+
+ Возврат Блок;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ПолучитьЗаголовокАвторизации(Знач Токен)
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ Заголовки = Новый Соответствие;
+ Заголовки.Вставить("Authorization", "Bearer " + Токен);
+ Возврат Заголовки;
+
+КонецФункции
+
+Функция УправлениеДиалогом(Знач Токен, Знач Канал, Знач URL, Знач ВидЗапроса = "POST")
+
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+ ВидЗапроса = вРег(ВидЗапроса);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("channel", Канал, "Строка", Параметры);
+
+ Если ВидЗапроса = "POST" Тогда
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+ Иначе
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+ КонецЕсли;
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция УправлениеФайлом(Знач Токен, Знач ИдентификаторФайла, Знач URL, Знач ВидЗапроса = "POST")
+
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+ ВидЗапроса = вРег(ВидЗапроса);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры);
+
+ Если ВидЗапроса = "POST" Тогда
+ Ответ = OPI_Инструменты.Post(URL, Параметры, Заголовки);
+ Иначе
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+ КонецЕсли;
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ПолучениеОбщихДанных(Знач Токен, Знач URL, Знач Курсор)
+
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("cursor", Курсор, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция УправлениеВнешнимФайлом(Знач Токен, Знач ИдентификаторФайла, Знач URL)
+
+ Заголовки = ПолучитьЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("file", ИдентификаторФайла , "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_Telegram.os b/ru/OInt/core/Modules/OPI_Telegram.os
index 0b368450ed..0fd95001d1 100644
--- a/ru/OInt/core/Modules/OPI_Telegram.os
+++ b/ru/OInt/core/Modules/OPI_Telegram.os
@@ -1,1253 +1,1253 @@
-// Расположение OS: ./OInt/core/Modules/OPI_Telegram.os
-// Библиотека: Telegram
-// Команда CLI: telegram
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:Typo-off
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:UnreachableCode-off
-// BSLLS:CommentedCode-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область ПолучениеДанныхИНастройка
-
-// Получить информацию о боте
-// Выполняет запрос /getMe, возвращающий базовую информацию о боте: имя, id, возможность добавлять бота в группы и т.д.
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ПолучитьИнформациюБота(Знач Токен) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- URL = "api.telegram.org/bot" + Токен + "/getMe";
- Ответ = OPI_Инструменты.Get(URL);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить обновления
-// Выполняет запрос /getUpdates, возвращающий информацию о событиях бота. Используется при работе в polling режиме
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// Таймаут - Строка,Число - Время ожидания новых событий - timeout
-// Смещение - Строка,Число - Смещение в списке получаемых сообщений - offset
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ПолучитьОбновления(Знач Токен, Знач Таймаут = 0, Знач Смещение = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- URL = "api.telegram.org/bot" + Токен + "/getUpdates";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("timeout", Таймаут , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("offset" , Смещение, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры);
- Возврат Ответ;
-
-КонецФункции
-
-// Установить Webhook
-// Устанавливает URL обработчика событий бота для работы в режиме Webhook
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// URL - Строка - Адрес обработки запросов от Telegram (с https:) - url
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("url", URL, "Строка", Параметры);
-
- URL = "api.telegram.org/bot" + Токен + "/setWebHook";
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить Webhook
-// Удаляет URL обработчика событий бота для работы в режиме Webhook
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция УдалитьWebhook(Знач Токен) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- URL = "api.telegram.org/bot" + Токен + "/deleteWebHook";
- Ответ = OPI_Инструменты.Get(URL);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Скачать файл
-// Скачивает файл с серверов Telegram
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDФайла - Строка - ID файла для скачивания - fileid
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция СкачатьФайл(Знач Токен, Знач IDФайла) Экспорт
-
- Result = "result";
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла);
-
- Параметры = Новый Структура("file_id", IDФайла);
-
- URL = "api.telegram.org/bot" + Токен + "/getFile";
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Путь = Ответ[Result]["file_path"];
-
- Если Не ЗначениеЗаполнено(Путь) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- URL = "api.telegram.org/file/bot" + Токен + "/" + Путь;
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-// ОбработатьДанные Telegram Mini App
-// Обрабатывает данные TMA и опредеяет их достоверность
-//
-// Параметры:
-// СтрокаДанных - Строка - querry из Telegram.WebApp.initData
-// Токен - Строка - Токен бота
-//
-// Возвращаемое значение:
-// Соответствие из Строка - Соответствие данных с результатом проверки в поле passed
-Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(СтрокаДанных);
-
- СтрокаДанных = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL);
- СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных);
- Ключ = "WebAppData";
- Хэш = "";
- КлючДвоичные = ПолучитьДвоичныеДанныеИзСтроки(Ключ);
-
- Результат = OPI_Криптография.HMACSHA256(КлючДвоичные, ПолучитьДвоичныеДанныеИзСтроки(Токен));
-
- ТЗнач = Новый ТаблицаЗначений;
- ТЗнач.Колонки.Добавить("Ключ");
- ТЗнач.Колонки.Добавить("Значение");
-
- Для Каждого Данные Из СтруктураДанных Цикл
-
- НоваяСтрока = ТЗнач.Добавить();
- НоваяСтрока.Ключ = Данные.Ключ;
- НоваяСтрока.Значение = Данные.Значение;
-
- КонецЦикла;
-
- ТЗнач.Сортировать("Ключ");
-
- СоответствиеВозврата = Новый Соответствие;
- DCS = "";
-
- Для Каждого СтрокаТЗ Из ТЗнач Цикл
-
- Если СтрокаТЗ.Ключ <> "hash" Тогда
- DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС;
- СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение);
- Иначе
- Хэш = СтрокаТЗ.Значение;
- КонецЕсли;
-
- КонецЦикла;
-
- DCS = Лев(DCS, СтрДлина(DCS) - 1);
- Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS));
-
- Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись);
-
- Если Финал = вРег(Хэш) Тогда
- Ответ = Истина;
- Иначе
- Ответ = Ложь;
- КонецЕсли;
-
- СоответствиеВозврата.Вставить("passed", Ответ);
-
- Возврат СоответствиеВозврата;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область ОтправкаДанных
-
-// Отправить текстовое сообщение
-// Отправляет текстовое сообщение в чат или канал
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
-// Текст - Строка - Текст сообщения - text
-// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьТекстовоеСообщение(Знач Токен
- , Знач IDЧата
- , Знач Текст
- , Знач Клавиатура = ""
- , Знач Разметка = "Markdown") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_Инструменты.ЗаменитьСпецСимволы(Текст, Разметка);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , "Строка" , Параметры);
- OPI_Инструменты.ДобавитьПоле("text" , Текст , "Строка" , Параметры);
- OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
-
- ДобавитьИдентификаторЧата(IDЧата, Параметры);
-
- URL = "api.telegram.org/bot" + Токен + "/sendMessage";
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Отправить картинку
-// Отправляет картинку в чат или канал
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
-// Текст - Строка - Текст сообщения - text
-// Картинка - ДвоичныеДанные,Строка - Файл картинки - picture
-// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьКартинку(Знач Токен
- , Знач IDЧата
- , Знач Текст
- , Знач Картинка
- , Знач Клавиатура = ""
- , Знач Разметка = "Markdown") Экспорт
-
- Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура, Разметка);
-
-КонецФункции
-
-// Отправить видео
-// Отправляет видео в чат или канал
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
-// Текст - Строка - Текст сообщения - text
-// Видео - ДвоичныеДанные,Строка - Файл видео - video
-// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьВидео(Знач Токен
- , Знач IDЧата
- , Знач Текст
- , Знач Видео
- , Знач Клавиатура = ""
- , Знач Разметка = "Markdown") Экспорт
-
- Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура, Разметка);
-
-КонецФункции
-
-// Отправить аудио
-// Отправляет аудиофайл в чат или канал
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
-// Текст - Строка - Текст сообщения - text
-// Аудио - ДвоичныеДанные,Строка - Файл аудио - audio
-// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьАудио(Знач Токен
- , Знач IDЧата
- , Знач Текст
- , Знач Аудио
- , Знач Клавиатура = ""
- , Знач Разметка = "Markdown") Экспорт
-
- Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура, Разметка);
-
-КонецФункции
-
-// Отправить документ
-// Отправляет документ в чат или канал
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
-// Текст - Строка - Текст сообщения - text
-// Документ - ДвоичныеДанные,Строка - Файл документа - doc
-// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьДокумент(Знач Токен
- , Знач IDЧата
- , Знач Текст
- , Знач Документ
- , Знач Клавиатура = ""
- , Знач Разметка = "Markdown") Экспорт
-
- Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура, Разметка);
-
-КонецФункции
-
-// Отправить гифку
-// Отправляет гифку в чат или канал
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
-// Текст - Строка - Текст сообщения - text
-// Гифка - ДвоичныеДанные,Строка - Файл гифки - gif
-// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьГифку(Знач Токен
- , Знач IDЧата
- , Знач Текст
- , Знач Гифка
- , Знач Клавиатура = ""
- , Знач Разметка = "Markdown") Экспорт
-
- Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура, Разметка);
-
-КонецФункции
-
-// Отправить группу медиафайлов
-// Отправляет набор файлов в чат или канал. Варианты типов медиа: audio, document, photo, video
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
-// Текст - Строка - Текст сообщения - text
-// СоответствиеФайлов - Соответствие из Строка - Коллекция файлов - media - JSON файлов или путь к .json
-// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьМедиагруппу(Знач Токен
- , Знач IDЧата
- , Знач Текст
- , Знач СоответствиеФайлов
- , Знач Клавиатура = ""
- , Знач Разметка = "Markdown") Экспорт
-
- // СоответствиеФайлов
- // Ключ - Файл, Значение - Тип
- // Типы: audio, document, photo, video
- // Нельзя замешивать разные типы!
-
- Строка_ = "Строка";
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов);
-
- OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка);
-
- URL = "api.telegram.org/bot" + Токен + "/sendMediaGroup";
- СтруктураФайлов = Новый Структура;
- Медиа = Новый Массив;
- Параметры = Новый Структура;
-
- ДобавитьИдентификаторЧата(IDЧата, Параметры);
- СформироватьМассивМедиа(СоответствиеФайлов, Текст, СтруктураФайлов, Медиа);
-
- OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("caption" , Текст , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("media" , Медиа , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
-
- Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed");
-
- Возврат Ответ;
-
-КонецФункции
-
-// Отправить местоположение
-// Отправляет местоположение по географической широте и долготе в чат или канал
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
-// Широта - Строка,Число - Географическая широта - lat
-// Долгота - Строка,Число - Географическая долгота - long
-// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьМестоположение(Знач Токен, Знач IDЧата, Знач Широта, Знач Долгота, Знач Клавиатура = "") Экспорт
-
- Строка_ = "Строка";
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
-
- URL = "api.telegram.org/bot" + Токен + "/sendLocation";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("latitude" , Широта , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("longitude" , Долгота , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура , "СтрокаФайла", Параметры);
-
- ДобавитьИдентификаторЧата(IDЧата, Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Отправить контакт
-// Отправляет контакт с именем и номером телефона
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
-// Имя - Строка - Имя контакта - name
-// Фамилия - Строка - Фамилия контакта - surname
-// Телефон - Строка - Телефон контакта - phone
-// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьКонтакт(Знач Токен, Знач IDЧата, Знач Имя, Знач Фамилия, Знач Телефон, Знач Клавиатура = "") Экспорт
-
- Строка_ = "Строка";
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
-
- URL = "api.telegram.org/bot" + Токен + "/sendContact";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown", Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("first_name" , Имя , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("last_name" , Фамилия , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("phone_number", Телефон , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
-
- ДобавитьИдентификаторЧата(IDЧата, Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Отправить опрос
-// Отправляет опрос с вариантами ответа
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
-// Вопрос - Строка - Вопрос опроса - question
-// МассивОтветов - Массив из Строка - Массив вариантов ответа - options
-// Анонимный - Булево - Анонимность опроса - anonymous
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОтправитьОпрос(Знач Токен, Знач IDЧата, Знач Вопрос, Знач МассивОтветов, Знач Анонимный = Истина) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов);
-
- OPI_ПреобразованиеТипов.ПолучитьБулево(Анонимный);
-
- URL = "api.telegram.org/bot" + Токен + "/sendPoll";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка" , Параметры);
- OPI_Инструменты.ДобавитьПоле("question" , Вопрос , "Строка" , Параметры);
- OPI_Инструменты.ДобавитьПоле("options" , МассивОтветов, "СтрокаФайла", Параметры);
-
- Параметры.Вставить("is_anonymous", ?(Анонимный, 1, 0));
- ДобавитьИдентификаторЧата(IDЧата, Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Переслать сообщение
-// Пересылает сообщение между чатами или в рамках одного чата
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// IDОригинала - Строка,Число - ID оригинального сообщения - message
-// ОткудаID - Строка,Число - ID чата оригинального сообщения - from
-// КудаID - Строка,Число - ID целевого чата или IDЧата*IDТемы - to
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ПереслатьСообщение(Знач Токен, Знач IDОригинала, Знач ОткудаID, Знач КудаID) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОригинала);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ОткудаID);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(КудаID);
-
- URL = "api.telegram.org/bot" + Токен + "/forwardMessage";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("from_chat_id", ОткудаID , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("message_id" , IDОригинала, "Строка", Параметры);
-
- ДобавитьИдентификаторЧата(КудаID, Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Сформировать клавиатуру по массиву кнопок
-// Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели
-//
-// Параметры:
-// МассивКнопок - Массив из Строка - Массив кнопок - buttons
-// ПодСообщением - Булево - Клавиатура под сообщением или на нижней панели - under
-// ОднаПодОдной - Булево - Истина > кнопки выводятся в столбик, Ложь > в строку - column
-//
-// Возвращаемое значение:
-// Строка - JSON клавиатуры
-Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок
- , Знач ПодСообщением = Ложь
- , Знач ОднаПодОдной = Истина) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьБулево(ПодСообщением);
- OPI_ПреобразованиеТипов.ПолучитьБулево(ОднаПодОдной);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок);
-
- Если ОднаПодОдной Тогда
- Строки = СоздатьВысокуюКлавиатуру(МассивКнопок);
- Иначе
- Строки = СоздатьДлиннуюКлавиатуру(МассивКнопок);
- КонецЕсли;
-
- Если ПодСообщением Тогда
- СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1);
- Иначе
- СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина);
- КонецЕсли;
-
- Клавиатура = OPI_Инструменты.JSONСтрокой(СтруктураПараметра);
-
- Возврат Клавиатура;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область Администрирование
-
-// Бан
-// Банит пользователя в выбранном чате
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
-// IDПользователя - Строка,Число - ID целевого пользователя - user
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция Бан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт
-
- Строка_ = "Строка";
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- URL = "api.telegram.org/bot" + Токен + "/banChatMember";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("user_id" , IDПользователя, Строка_, Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Разбан
-// Разбанивает забаненного ранее пользователя
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
-// IDПользователя - Строка,Число - ID целевого пользователя - user
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция Разбан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт
-
- Строка_ = "Строка";
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- URL = "api.telegram.org/bot" + Токен + "/unbanChatMember";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("user_id" , IDПользователя, Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("only_if_banned", Ложь , "Булево", Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Создать ссылку-приглашение
-// Создает ссылку для вступления в закрытый чат
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
-// Заголовок - Строка - Заголовок приглашения - title
-// ДатаИстечения - Дата - Дата окончания жизни ссылки (безсрочно, если не указано) - expire
-// ЛимитПользователей - Число - Лимит пользователей (бесконечно, если не указано) - limit
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция СоздатьСсылкуПриглашение(Знач Токен
- , Знач IDЧата
- , Знач Заголовок = ""
- , Знач ДатаИстечения = ""
- , Знач ЛимитПользователей = 0) Экспорт
-
- Строка_ = "Строка";
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- URL = "api.telegram.org/bot" + Токен + "/createChatInviteLink";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("name" , Заголовок , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("member_limit" , ЛимитПользователей, Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("expire_date" , ДатаИстечения , "Дата" , Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Закрепить сообщение
-// Закрепляет сообщение в шапке чата
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDЧата - Строка,Число - ID целевого чата - chat
-// IDСообщения - Строка,Число - ID целевого сообщения - message
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ЗакрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт
-
- Строка_ = "Строка";
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- URL = "api.telegram.org/bot" + Токен + "/pinChatMessage";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("message_id" , IDСообщения, Строка_ , Параметры);
- OPI_Инструменты.ДобавитьПоле("disable_notification", Ложь , "Булево", Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Открепить сообщение
-// Открепляет сообщение в шапке чата
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// IDЧата - Строка,Число - ID целевого чата - chat
-// IDСообщения - Строка,Число - ID целевого сообщения - message
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОткрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт
-
- Строка_ = "Строка";
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- URL = "api.telegram.org/bot" + Токен + "/unpinChatMessage";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("message_id", IDСообщения, Строка_, Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить число участников
-// Получает общее число участников чата
-//
-// Параметры:
-// Токен - Строка - Токен бота - token
-// IDЧата - Строка,Число - ID целевого чата - chat
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- URL = "api.telegram.org/bot" + Токен + "/getChatMemberCount";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСТемамиФорума
-
-// Получить список иконок-аватаров
-// Получает соответствие ID Emoji для установки в качестве иконок тем форума
-//
-// Параметры:
-// Токен - Строка - Токен - token
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - Ключ > ID, Значение > Emoji
-Функция ПолучитьСписокИконокАватаров(Знач Токен) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- Result = "result";
- URL = "api.telegram.org/bot" + Токен + "/getForumTopicIconStickers";
- Ответ = OPI_Инструменты.Get(URL);
- Иконки = Ответ[Result];
-
- Если Не ЗначениеЗаполнено(Иконки) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- Коллекция = Новый Соответствие;
-
- Для Каждого Иконка Из Иконки Цикл
- Коллекция.Вставить(Иконка["custom_emoji_id"], Иконка["emoji"]);
- КонецЦикла;
-
- Возврат Коллекция;
-
-КонецФункции
-
-// Создать тему форума
-// Создает новую тему в группе с включенным функционалом тем
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDЧата - Строка,Число - ID чата создания темы - forum
-// Заголовок - Строка - Заголовок темы - title
-// IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция СоздатьТемуФорума(Знач Токен, Знач IDЧата, Знач Заголовок, Знач IDИконки = "") Экспорт
- Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки);
-КонецФункции
-
-// Изменить тему форума
-// Создает новую тему в группе с включенным функционалом тем
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDЧата - Строка,Число - ID чата создания темы - forum
-// IDТемы - Строка,Число - ID темы - topic
-// Заголовок - Строка - Новый заголовок - title
-// IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ИзменитьТемуФорума(Знач Токен
- , Знач IDЧата
- , Знач IDТемы
- , Знач Заголовок = Неопределено
- , Знач IDИконки = Неопределено) Экспорт
-
- Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки, IDТемы);
-КонецФункции
-
-// Закрыть тему форума
-// Закрывает тему для новых сообщений
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDЧата - Строка,Число - ID чата темы - forum
-// IDТемы - Строка,Число - ID темы - topic
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ЗакрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
- Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 2, IDТемы);
-КонецФункции
-
-// Открыть тему форума
-// Повторно открывает ранее закрытую тему форума
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDЧата - Строка,Число - ID чата темы - forum
-// IDТемы - Строка,Число - ID темы - topic
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОткрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
- Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 1, IDТемы);
-КонецФункции
-
-// Удалить тему форума
-// Удаляет тему форума
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDЧата - Строка,Число - ID чата темы - forum
-// IDТемы - Строка,Число - ID темы - topic
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция УдалитьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы) Экспорт
- Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 3, IDТемы);
-КонецФункции
-
-// Скрыть главную тему форума
-// Скрывает главную тему форума
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDЧата - Строка,Число - ID чата темы - forum
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция СкрытьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт
- Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Истина);
-КонецФункции
-
-// Показать главную тему форума
-// Показывает ранее скрытую главную тему форума
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDЧата - Строка,Число - ID чата темы - forum
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ПоказатьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт
- Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Ложь);
-КонецФункции
-
-// Изменить имя главной темы форума
-// Изменяет имя главной темы форума
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDЧата - Строка,Число - ID чата темы - forum
-// Заголовок - Строка - Новое имя главной темы - title
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ИзменитьИмяГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Заголовок) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- URL = "api.telegram.org/bot" + Токен + "/editGeneralForumTopic";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("name" , Заголовок, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Очистить список закрепленных сообщений темы
-// Очищает список закрепленных сообщений в теме форума
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDЧата - Строка,Число - ID чата темы - forum
-// IDТемы - Строка,Число - ID темы. Главная, если не заполнено - topic
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
-Функция ОчиститьСписокЗакрепленныхСообщенийТемы(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDТемы);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата, "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры);
-
- Если ЗначениеЗаполнено(IDТемы) Тогда
- Метод = "/unpinAllForumTopicMessages";
- Иначе
- Метод = "/unpinAllGeneralForumTopicMessages";
- КонецЕсли;
-
- URL = "api.telegram.org/bot" + Токен + Метод;
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ОтправитьФайл(Знач Токен, Знач IDЧата, Знач Текст, Знач Файл, Знач Вид, Знач Клавиатура, Знач Разметка)
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Вид);
-
- Расширение = "";
- Метод = "";
-
- ОпределитьМетодОтправки(Вид, Метод, Расширение);
- ПреобразоватьДанныеФайла(Файл, Расширение, Вид);
- OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , "Строка" , Параметры);
- OPI_Инструменты.ДобавитьПоле("caption" , Текст , "Строка" , Параметры);
- OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
-
- ДобавитьИдентификаторЧата(IDЧата, Параметры);
-
- СтруктураФайлов = Новый Структура;
- СтруктураФайлов.Вставить(Вид + Расширение, Файл);
-
- URL = "api.telegram.org/bot" + Токен + Метод;
- Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed");
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция УправлениеТемойФорума(Знач Токен
- , Знач IDЧата
- , Знач Заголовок = Неопределено
- , Знач IDИконки = Неопределено
- , Знач IDТемы = "")
-
- Строка_ = "Строка";
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("name" , Заголовок, Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("icon_custom_emoji_id", IDИконки , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("message_thread_id" , IDТемы , Строка_, Параметры);
-
- Если ЗначениеЗаполнено(IDТемы) Тогда
- Метод = "/editForumTopic";
- Иначе
- Метод = "/createForumTopic";
- КонецЕсли;
-
- OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры);
- Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + Метод, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция УправлениеСостояниемТемыФорума(Знач Токен, Знач IDЧата, Знач Статус, Знач IDТемы = "")
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- Если ЗначениеЗаполнено(IDТемы) Тогда
- Форум = "Forum";
- Иначе
- Форум = "GeneralForum";
- КонецЕсли;
-
- Метод = ОпределитьМетодУправленияФорумом(Статус, Форум);
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата, "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры);
-
- URL = "api.telegram.org/bot" + Токен + Метод;
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция УправлениеВидимостьюГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Скрыть)
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьБулево(Скрыть);
-
- Если Скрыть Тогда
- Метод = "/hideGeneralForumTopic";
- Иначе
- Метод = "/unhideGeneralForumTopic";
- КонецЕсли;
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата, "Строка", Параметры);
-
- URL = "api.telegram.org/bot" + Токен + Метод;
- Ответ = OPI_Инструменты.Get(URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ОпределитьМетодУправленияФорумом(Знач Статус, Знач Форум)
-
- Открыть = 1;
- Закрыть = 2;
- Удалить = 3;
-
- Если Статус = Открыть Тогда
- Метод = "/reopen" + Форум + "Topic";
- ИначеЕсли Статус = Закрыть Тогда
- Метод = "/close" + Форум + "Topic";
- ИначеЕсли Статус = Удалить Тогда
- Метод = "/deleteForumTopic";
- Иначе
- ВызватьИсключение "Некорректный статус управления форумом";
- КонецЕсли;
-
- Возврат Метод;
-
-КонецФункции
-
-Функция СоздатьВысокуюКлавиатуру(Знач МассивКнопок)
-
- Строки = Новый Массив;
-
- Для Каждого Кнопка Из МассивКнопок Цикл
- Кнопки = Новый Массив;
- Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка);
- Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
- Строки.Добавить(Кнопки);
- КонецЦикла;
-
- Возврат Строки;
-
-КонецФункции
-
-Функция СоздатьДлиннуюКлавиатуру(Знач МассивКнопок)
-
- Строки = Новый Массив;
- Кнопки = Новый Массив;
-
- Для Каждого Кнопка Из МассивКнопок Цикл
- Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка);
- Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
- КонецЦикла;
-
- Строки.Добавить(Кнопки);
-
- Возврат Строки;
-
-КонецФункции
-
-Процедура СформироватьМассивМедиа(Знач СоответствиеФайлов, Знач Текст, СтруктураФайлов, Медиа)
-
- Счетчик = 0;
-
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
-
- Если ТипЗнч(СоответствиеФайлов) <> Тип("Соответствие") Тогда
- ВызватьИсключение("Не удалось получить информацию из json медиа!");
- Возврат;
- КонецЕсли;
-
- Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл
-
- Если Не ТипЗнч(ТекущийФайл.Ключ) = Тип("ДвоичныеДанные") Тогда
-
- Двоичные = ТекущийФайл.Ключ;
- OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Двоичные);
-
- ЭтотФайл = Новый Файл(ТекущийФайл.Ключ);
- ИмяМедиа = ТекущийФайл.Значение
- + Строка(Счетчик)
- + ?(ТекущийФайл.Значение = "document", ЭтотФайл.Расширение, "");
-
- ПолноеИмяМедиа = СтрЗаменить(ИмяМедиа, ".", "___");
-
- Иначе
- Двоичные = ТекущийФайл.Ключ;
- ИмяМедиа = ТекущийФайл.Значение + Строка(Счетчик);
- ПолноеИмяМедиа = ИмяМедиа;
- КонецЕсли;
-
- СтруктураФайлов.Вставить(ПолноеИмяМедиа, Двоичные);
-
- СтруктураМедиа = Новый Структура;
- СтруктураМедиа.Вставить("type" , ТекущийФайл.Значение);
- СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа);
-
- Если Счетчик = 0 Тогда
- СтруктураМедиа.Вставить("caption", Текст);
- КонецЕсли;
-
- Медиа.Добавить(СтруктураМедиа);
-
- Счетчик = Счетчик + 1;
-
- КонецЦикла;
-
- Медиа = OPI_Инструменты.JSONСтрокой(Медиа);
-
-КонецПроцедуры
-
-Процедура ДобавитьИдентификаторЧата(Знач IDЧата, Параметры)
-
- IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
- МассивЧата = СтрРазделить(IDЧата, "*", Ложь);
-
- Если МассивЧата.Количество() > 1 Тогда
-
- IDЧата = МассивЧата[0];
- IDТемы = МассивЧата[1];
-
- Параметры.Вставить("message_thread_id", IDТемы);
-
- КонецЕсли;
-
- Параметры.Вставить("chat_id", IDЧата);
-
-КонецПроцедуры
-
-Процедура ОпределитьМетодОтправки(Знач Вид, Метод, Расширение)
-
- Если Вид = "photo" Тогда
- Метод = "/sendPhoto";
- ИначеЕсли Вид = "video" Тогда
- Метод = "/sendVideo";
- ИначеЕсли Вид = "audio" Тогда
- Метод = "/sendAudio";
- ИначеЕсли Вид = "document" Тогда
- Метод = "/sendDocument";
- ИначеЕсли Вид = "animation" Тогда
- Метод = "/sendAnimation";
- Расширение = ".gif";
- Иначе
- ВызватьИсключение "Некорректный вид отправки";
- КонецЕсли;
-
-КонецПроцедуры
-
-Процедура ПреобразоватьДанныеФайла(Файл, Расширение, Вид)
-
- Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
-
- ТекущийФайл = Новый Файл(Файл);
- Расширение = ?(Вид = "document", ТекущийФайл.Расширение, Расширение);
- OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
-
- КонецЕсли;
-
- Расширение = СтрЗаменить(Расширение, ".", "___");
-
-КонецПроцедуры
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_Telegram.os
+// Библиотека: Telegram
+// Команда CLI: telegram
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:Typo-off
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:UnreachableCode-off
+// BSLLS:CommentedCode-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область ПолучениеДанныхИНастройка
+
+// Получить информацию о боте
+// Выполняет запрос /getMe, возвращающий базовую информацию о боте: имя, id, возможность добавлять бота в группы и т.д.
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ПолучитьИнформациюБота(Знач Токен) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ URL = "api.telegram.org/bot" + Токен + "/getMe";
+ Ответ = OPI_Инструменты.Get(URL);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить обновления
+// Выполняет запрос /getUpdates, возвращающий информацию о событиях бота. Используется при работе в polling режиме
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// Таймаут - Строка,Число - Время ожидания новых событий - timeout
+// Смещение - Строка,Число - Смещение в списке получаемых сообщений - offset
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ПолучитьОбновления(Знач Токен, Знач Таймаут = 0, Знач Смещение = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ URL = "api.telegram.org/bot" + Токен + "/getUpdates";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("timeout", Таймаут , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("offset" , Смещение, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+ Возврат Ответ;
+
+КонецФункции
+
+// Установить Webhook
+// Устанавливает URL обработчика событий бота для работы в режиме Webhook
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// URL - Строка - Адрес обработки запросов от Telegram (с https:) - url
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("url", URL, "Строка", Параметры);
+
+ URL = "api.telegram.org/bot" + Токен + "/setWebHook";
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить Webhook
+// Удаляет URL обработчика событий бота для работы в режиме Webhook
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция УдалитьWebhook(Знач Токен) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ URL = "api.telegram.org/bot" + Токен + "/deleteWebHook";
+ Ответ = OPI_Инструменты.Get(URL);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Скачать файл
+// Скачивает файл с серверов Telegram
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDФайла - Строка - ID файла для скачивания - fileid
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция СкачатьФайл(Знач Токен, Знач IDФайла) Экспорт
+
+ Result = "result";
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDФайла);
+
+ Параметры = Новый Структура("file_id", IDФайла);
+
+ URL = "api.telegram.org/bot" + Токен + "/getFile";
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Путь = Ответ[Result]["file_path"];
+
+ Если Не ЗначениеЗаполнено(Путь) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ URL = "api.telegram.org/file/bot" + Токен + "/" + Путь;
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// ОбработатьДанные Telegram Mini App
+// Обрабатывает данные TMA и опредеяет их достоверность
+//
+// Параметры:
+// СтрокаДанных - Строка - querry из Telegram.WebApp.initData
+// Токен - Строка - Токен бота
+//
+// Возвращаемое значение:
+// Соответствие из Строка - Соответствие данных с результатом проверки в поле passed
+Функция ОбработатьДанныеTMA(Знач СтрокаДанных, Знач Токен) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(СтрокаДанных);
+
+ СтрокаДанных = РаскодироватьСтроку(СтрокаДанных, СпособКодированияСтроки.КодировкаURL);
+ СтруктураДанных = OPI_Инструменты.ПараметрыЗапросаВСоответствие(СтрокаДанных);
+ Ключ = "WebAppData";
+ Хэш = "";
+ КлючДвоичные = ПолучитьДвоичныеДанныеИзСтроки(Ключ);
+
+ Результат = OPI_Криптография.HMACSHA256(КлючДвоичные, ПолучитьДвоичныеДанныеИзСтроки(Токен));
+
+ ТЗнач = Новый ТаблицаЗначений;
+ ТЗнач.Колонки.Добавить("Ключ");
+ ТЗнач.Колонки.Добавить("Значение");
+
+ Для Каждого Данные Из СтруктураДанных Цикл
+
+ НоваяСтрока = ТЗнач.Добавить();
+ НоваяСтрока.Ключ = Данные.Ключ;
+ НоваяСтрока.Значение = Данные.Значение;
+
+ КонецЦикла;
+
+ ТЗнач.Сортировать("Ключ");
+
+ СоответствиеВозврата = Новый Соответствие;
+ DCS = "";
+
+ Для Каждого СтрокаТЗ Из ТЗнач Цикл
+
+ Если СтрокаТЗ.Ключ <> "hash" Тогда
+ DCS = DCS + СтрокаТЗ.Ключ + "=" + СтрокаТЗ.Значение + Символы.ПС;
+ СоответствиеВозврата.Вставить(СтрокаТЗ.Ключ, СтрокаТЗ.Значение);
+ Иначе
+ Хэш = СтрокаТЗ.Значение;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ DCS = Лев(DCS, СтрДлина(DCS) - 1);
+ Подпись = OPI_Криптография.HMACSHA256(Результат, ПолучитьДвоичныеДанныеИзСтроки(DCS));
+
+ Финал = ПолучитьHexСтрокуИзДвоичныхДанных(Подпись);
+
+ Если Финал = вРег(Хэш) Тогда
+ Ответ = Истина;
+ Иначе
+ Ответ = Ложь;
+ КонецЕсли;
+
+ СоответствиеВозврата.Вставить("passed", Ответ);
+
+ Возврат СоответствиеВозврата;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ОтправкаДанных
+
+// Отправить текстовое сообщение
+// Отправляет текстовое сообщение в чат или канал
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
+// Текст - Строка - Текст сообщения - text
+// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьТекстовоеСообщение(Знач Токен
+ , Знач IDЧата
+ , Знач Текст
+ , Знач Клавиатура = ""
+ , Знач Разметка = "Markdown") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_Инструменты.ЗаменитьСпецСимволы(Текст, Разметка);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , "Строка" , Параметры);
+ OPI_Инструменты.ДобавитьПоле("text" , Текст , "Строка" , Параметры);
+ OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
+
+ ДобавитьИдентификаторЧата(IDЧата, Параметры);
+
+ URL = "api.telegram.org/bot" + Токен + "/sendMessage";
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Отправить картинку
+// Отправляет картинку в чат или канал
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
+// Текст - Строка - Текст сообщения - text
+// Картинка - ДвоичныеДанные,Строка - Файл картинки - picture
+// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьКартинку(Знач Токен
+ , Знач IDЧата
+ , Знач Текст
+ , Знач Картинка
+ , Знач Клавиатура = ""
+ , Знач Разметка = "Markdown") Экспорт
+
+ Возврат ОтправитьФайл(Токен, IDЧата, Текст, Картинка, "photo", Клавиатура, Разметка);
+
+КонецФункции
+
+// Отправить видео
+// Отправляет видео в чат или канал
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
+// Текст - Строка - Текст сообщения - text
+// Видео - ДвоичныеДанные,Строка - Файл видео - video
+// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьВидео(Знач Токен
+ , Знач IDЧата
+ , Знач Текст
+ , Знач Видео
+ , Знач Клавиатура = ""
+ , Знач Разметка = "Markdown") Экспорт
+
+ Возврат ОтправитьФайл(Токен, IDЧата, Текст, Видео, "video", Клавиатура, Разметка);
+
+КонецФункции
+
+// Отправить аудио
+// Отправляет аудиофайл в чат или канал
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
+// Текст - Строка - Текст сообщения - text
+// Аудио - ДвоичныеДанные,Строка - Файл аудио - audio
+// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьАудио(Знач Токен
+ , Знач IDЧата
+ , Знач Текст
+ , Знач Аудио
+ , Знач Клавиатура = ""
+ , Знач Разметка = "Markdown") Экспорт
+
+ Возврат ОтправитьФайл(Токен, IDЧата, Текст, Аудио, "audio", Клавиатура, Разметка);
+
+КонецФункции
+
+// Отправить документ
+// Отправляет документ в чат или канал
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
+// Текст - Строка - Текст сообщения - text
+// Документ - ДвоичныеДанные,Строка - Файл документа - doc
+// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьДокумент(Знач Токен
+ , Знач IDЧата
+ , Знач Текст
+ , Знач Документ
+ , Знач Клавиатура = ""
+ , Знач Разметка = "Markdown") Экспорт
+
+ Возврат ОтправитьФайл(Токен, IDЧата, Текст, Документ, "document", Клавиатура, Разметка);
+
+КонецФункции
+
+// Отправить гифку
+// Отправляет гифку в чат или канал
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
+// Текст - Строка - Текст сообщения - text
+// Гифка - ДвоичныеДанные,Строка - Файл гифки - gif
+// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьГифку(Знач Токен
+ , Знач IDЧата
+ , Знач Текст
+ , Знач Гифка
+ , Знач Клавиатура = ""
+ , Знач Разметка = "Markdown") Экспорт
+
+ Возврат ОтправитьФайл(Токен, IDЧата, Текст, Гифка, "animation", Клавиатура, Разметка);
+
+КонецФункции
+
+// Отправить группу медиафайлов
+// Отправляет набор файлов в чат или канал. Варианты типов медиа: audio, document, photo, video
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
+// Текст - Строка - Текст сообщения - text
+// СоответствиеФайлов - Соответствие из Строка - Коллекция файлов - media - JSON файлов или путь к .json
+// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+// Разметка - Строка - Вид обработки текста (HTML, Markdown, MarkdownV2) - parsemode
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьМедиагруппу(Знач Токен
+ , Знач IDЧата
+ , Знач Текст
+ , Знач СоответствиеФайлов
+ , Знач Клавиатура = ""
+ , Знач Разметка = "Markdown") Экспорт
+
+ // СоответствиеФайлов
+ // Ключ - Файл, Значение - Тип
+ // Типы: audio, document, photo, video
+ // Нельзя замешивать разные типы!
+
+ Строка_ = "Строка";
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов);
+
+ OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка);
+
+ URL = "api.telegram.org/bot" + Токен + "/sendMediaGroup";
+ СтруктураФайлов = Новый Структура;
+ Медиа = Новый Массив;
+ Параметры = Новый Структура;
+
+ ДобавитьИдентификаторЧата(IDЧата, Параметры);
+ СформироватьМассивМедиа(СоответствиеФайлов, Текст, СтруктураФайлов, Медиа);
+
+ OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("caption" , Текст , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("media" , Медиа , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
+
+ Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed");
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Отправить местоположение
+// Отправляет местоположение по географической широте и долготе в чат или канал
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
+// Широта - Строка,Число - Географическая широта - lat
+// Долгота - Строка,Число - Географическая долгота - long
+// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьМестоположение(Знач Токен, Знач IDЧата, Знач Широта, Знач Долгота, Знач Клавиатура = "") Экспорт
+
+ Строка_ = "Строка";
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
+
+ URL = "api.telegram.org/bot" + Токен + "/sendLocation";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("latitude" , Широта , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("longitude" , Долгота , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура , "СтрокаФайла", Параметры);
+
+ ДобавитьИдентификаторЧата(IDЧата, Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Отправить контакт
+// Отправляет контакт с именем и номером телефона
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
+// Имя - Строка - Имя контакта - name
+// Фамилия - Строка - Фамилия контакта - surname
+// Телефон - Строка - Телефон контакта - phone
+// Клавиатура - Строка - См. СформироватьКлавиатуруПоМассивуКнопок - keyboard - JSON клавиатуры или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьКонтакт(Знач Токен, Знач IDЧата, Знач Имя, Знач Фамилия, Знач Телефон, Знач Клавиатура = "") Экспорт
+
+ Строка_ = "Строка";
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
+
+ URL = "api.telegram.org/bot" + Токен + "/sendContact";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown", Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("first_name" , Имя , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("last_name" , Фамилия , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("phone_number", Телефон , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
+
+ ДобавитьИдентификаторЧата(IDЧата, Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Отправить опрос
+// Отправляет опрос с вариантами ответа
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
+// Вопрос - Строка - Вопрос опроса - question
+// МассивОтветов - Массив из Строка - Массив вариантов ответа - options
+// Анонимный - Булево - Анонимность опроса - anonymous
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОтправитьОпрос(Знач Токен, Знач IDЧата, Знач Вопрос, Знач МассивОтветов, Знач Анонимный = Истина) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов);
+
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Анонимный);
+
+ URL = "api.telegram.org/bot" + Токен + "/sendPoll";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка" , Параметры);
+ OPI_Инструменты.ДобавитьПоле("question" , Вопрос , "Строка" , Параметры);
+ OPI_Инструменты.ДобавитьПоле("options" , МассивОтветов, "СтрокаФайла", Параметры);
+
+ Параметры.Вставить("is_anonymous", ?(Анонимный, 1, 0));
+ ДобавитьИдентификаторЧата(IDЧата, Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Переслать сообщение
+// Пересылает сообщение между чатами или в рамках одного чата
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// IDОригинала - Строка,Число - ID оригинального сообщения - message
+// ОткудаID - Строка,Число - ID чата оригинального сообщения - from
+// КудаID - Строка,Число - ID целевого чата или IDЧата*IDТемы - to
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ПереслатьСообщение(Знач Токен, Знач IDОригинала, Знач ОткудаID, Знач КудаID) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОригинала);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ОткудаID);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(КудаID);
+
+ URL = "api.telegram.org/bot" + Токен + "/forwardMessage";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("from_chat_id", ОткудаID , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("message_id" , IDОригинала, "Строка", Параметры);
+
+ ДобавитьИдентификаторЧата(КудаID, Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Сформировать клавиатуру по массиву кнопок
+// Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели
+//
+// Параметры:
+// МассивКнопок - Массив из Строка - Массив кнопок - buttons
+// ПодСообщением - Булево - Клавиатура под сообщением или на нижней панели - under
+// ОднаПодОдной - Булево - Истина > кнопки выводятся в столбик, Ложь > в строку - column
+//
+// Возвращаемое значение:
+// Строка - JSON клавиатуры
+Функция СформироватьКлавиатуруПоМассивуКнопок(Знач МассивКнопок
+ , Знач ПодСообщением = Ложь
+ , Знач ОднаПодОдной = Истина) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьБулево(ПодСообщением);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(ОднаПодОдной);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок);
+
+ Если ОднаПодОдной Тогда
+ Строки = СоздатьВысокуюКлавиатуру(МассивКнопок);
+ Иначе
+ Строки = СоздатьДлиннуюКлавиатуру(МассивКнопок);
+ КонецЕсли;
+
+ Если ПодСообщением Тогда
+ СтруктураПараметра = Новый Структура("inline_keyboard,rows", Строки, 1);
+ Иначе
+ СтруктураПараметра = Новый Структура("keyboard,resize_keyboard", Строки, Истина);
+ КонецЕсли;
+
+ Клавиатура = OPI_Инструменты.JSONСтрокой(СтруктураПараметра);
+
+ Возврат Клавиатура;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область Администрирование
+
+// Бан
+// Банит пользователя в выбранном чате
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
+// IDПользователя - Строка,Число - ID целевого пользователя - user
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция Бан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт
+
+ Строка_ = "Строка";
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ URL = "api.telegram.org/bot" + Токен + "/banChatMember";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("user_id" , IDПользователя, Строка_, Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Разбан
+// Разбанивает забаненного ранее пользователя
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
+// IDПользователя - Строка,Число - ID целевого пользователя - user
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция Разбан(Знач Токен, Знач IDЧата, Знач IDПользователя) Экспорт
+
+ Строка_ = "Строка";
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ URL = "api.telegram.org/bot" + Токен + "/unbanChatMember";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("user_id" , IDПользователя, Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("only_if_banned", Ложь , "Булево", Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Создать ссылку-приглашение
+// Создает ссылку для вступления в закрытый чат
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// IDЧата - Строка,Число - ID целевого чата или IDЧата*IDТемы - chat
+// Заголовок - Строка - Заголовок приглашения - title
+// ДатаИстечения - Дата - Дата окончания жизни ссылки (безсрочно, если не указано) - expire
+// ЛимитПользователей - Число - Лимит пользователей (бесконечно, если не указано) - limit
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция СоздатьСсылкуПриглашение(Знач Токен
+ , Знач IDЧата
+ , Знач Заголовок = ""
+ , Знач ДатаИстечения = ""
+ , Знач ЛимитПользователей = 0) Экспорт
+
+ Строка_ = "Строка";
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ URL = "api.telegram.org/bot" + Токен + "/createChatInviteLink";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("name" , Заголовок , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("member_limit" , ЛимитПользователей, Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("expire_date" , ДатаИстечения , "Дата" , Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Закрепить сообщение
+// Закрепляет сообщение в шапке чата
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDЧата - Строка,Число - ID целевого чата - chat
+// IDСообщения - Строка,Число - ID целевого сообщения - message
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ЗакрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт
+
+ Строка_ = "Строка";
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ URL = "api.telegram.org/bot" + Токен + "/pinChatMessage";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("parse_mode" , "Markdown" , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("message_id" , IDСообщения, Строка_ , Параметры);
+ OPI_Инструменты.ДобавитьПоле("disable_notification", Ложь , "Булево", Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Открепить сообщение
+// Открепляет сообщение в шапке чата
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// IDЧата - Строка,Число - ID целевого чата - chat
+// IDСообщения - Строка,Число - ID целевого сообщения - message
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОткрепитьСообщение(Знач Токен, Знач IDЧата, Знач IDСообщения) Экспорт
+
+ Строка_ = "Строка";
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ URL = "api.telegram.org/bot" + Токен + "/unpinChatMessage";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("message_id", IDСообщения, Строка_, Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить число участников
+// Получает общее число участников чата
+//
+// Параметры:
+// Токен - Строка - Токен бота - token
+// IDЧата - Строка,Число - ID целевого чата - chat
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ПолучитьЧислоУчастников(Знач Токен, Знач IDЧата) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ URL = "api.telegram.org/bot" + Токен + "/getChatMemberCount";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("parse_mode", "Markdown" , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСТемамиФорума
+
+// Получить список иконок-аватаров
+// Получает соответствие ID Emoji для установки в качестве иконок тем форума
+//
+// Параметры:
+// Токен - Строка - Токен - token
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - Ключ > ID, Значение > Emoji
+Функция ПолучитьСписокИконокАватаров(Знач Токен) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ Result = "result";
+ URL = "api.telegram.org/bot" + Токен + "/getForumTopicIconStickers";
+ Ответ = OPI_Инструменты.Get(URL);
+ Иконки = Ответ[Result];
+
+ Если Не ЗначениеЗаполнено(Иконки) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ Коллекция = Новый Соответствие;
+
+ Для Каждого Иконка Из Иконки Цикл
+ Коллекция.Вставить(Иконка["custom_emoji_id"], Иконка["emoji"]);
+ КонецЦикла;
+
+ Возврат Коллекция;
+
+КонецФункции
+
+// Создать тему форума
+// Создает новую тему в группе с включенным функционалом тем
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDЧата - Строка,Число - ID чата создания темы - forum
+// Заголовок - Строка - Заголовок темы - title
+// IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция СоздатьТемуФорума(Знач Токен, Знач IDЧата, Знач Заголовок, Знач IDИконки = "") Экспорт
+ Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки);
+КонецФункции
+
+// Изменить тему форума
+// Создает новую тему в группе с включенным функционалом тем
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDЧата - Строка,Число - ID чата создания темы - forum
+// IDТемы - Строка,Число - ID темы - topic
+// Заголовок - Строка - Новый заголовок - title
+// IDИконки - Строка - См. ПолучитьСписокИконокАватаров - icon
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ИзменитьТемуФорума(Знач Токен
+ , Знач IDЧата
+ , Знач IDТемы
+ , Знач Заголовок = Неопределено
+ , Знач IDИконки = Неопределено) Экспорт
+
+ Возврат УправлениеТемойФорума(Токен, IDЧата, Заголовок, IDИконки, IDТемы);
+КонецФункции
+
+// Закрыть тему форума
+// Закрывает тему для новых сообщений
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDЧата - Строка,Число - ID чата темы - forum
+// IDТемы - Строка,Число - ID темы - topic
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ЗакрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
+ Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 2, IDТемы);
+КонецФункции
+
+// Открыть тему форума
+// Повторно открывает ранее закрытую тему форума
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDЧата - Строка,Число - ID чата темы - forum
+// IDТемы - Строка,Число - ID темы - topic
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОткрытьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
+ Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 1, IDТемы);
+КонецФункции
+
+// Удалить тему форума
+// Удаляет тему форума
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDЧата - Строка,Число - ID чата темы - forum
+// IDТемы - Строка,Число - ID темы - topic
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция УдалитьТемуФорума(Знач Токен, Знач IDЧата, Знач IDТемы) Экспорт
+ Возврат УправлениеСостояниемТемыФорума(Токен, IDЧата, 3, IDТемы);
+КонецФункции
+
+// Скрыть главную тему форума
+// Скрывает главную тему форума
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDЧата - Строка,Число - ID чата темы - forum
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция СкрытьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт
+ Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Истина);
+КонецФункции
+
+// Показать главную тему форума
+// Показывает ранее скрытую главную тему форума
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDЧата - Строка,Число - ID чата темы - forum
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ПоказатьГлавнуюТемуФорума(Знач Токен, Знач IDЧата) Экспорт
+ Возврат УправлениеВидимостьюГлавнойТемыФорума(Токен, IDЧата, Ложь);
+КонецФункции
+
+// Изменить имя главной темы форума
+// Изменяет имя главной темы форума
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDЧата - Строка,Число - ID чата темы - forum
+// Заголовок - Строка - Новое имя главной темы - title
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ИзменитьИмяГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Заголовок) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ URL = "api.telegram.org/bot" + Токен + "/editGeneralForumTopic";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("name" , Заголовок, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Очистить список закрепленных сообщений темы
+// Очищает список закрепленных сообщений в теме форума
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDЧата - Строка,Число - ID чата темы - forum
+// IDТемы - Строка,Число - ID темы. Главная, если не заполнено - topic
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Telegram
+Функция ОчиститьСписокЗакрепленныхСообщенийТемы(Знач Токен, Знач IDЧата, Знач IDТемы = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDТемы);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата, "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры);
+
+ Если ЗначениеЗаполнено(IDТемы) Тогда
+ Метод = "/unpinAllForumTopicMessages";
+ Иначе
+ Метод = "/unpinAllGeneralForumTopicMessages";
+ КонецЕсли;
+
+ URL = "api.telegram.org/bot" + Токен + Метод;
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ОтправитьФайл(Знач Токен, Знач IDЧата, Знач Текст, Знач Файл, Знач Вид, Знач Клавиатура, Знач Разметка)
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDЧата);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Вид);
+
+ Расширение = "";
+ Метод = "";
+
+ ОпределитьМетодОтправки(Вид, Метод, Расширение);
+ ПреобразоватьДанныеФайла(Файл, Расширение, Вид);
+ OPI_Инструменты.ЗаменитьСпецсимволы(Текст, Разметка);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("parse_mode" , Разметка , "Строка" , Параметры);
+ OPI_Инструменты.ДобавитьПоле("caption" , Текст , "Строка" , Параметры);
+ OPI_Инструменты.ДобавитьПоле("reply_markup", Клавиатура, "СтрокаФайла", Параметры);
+
+ ДобавитьИдентификаторЧата(IDЧата, Параметры);
+
+ СтруктураФайлов = Новый Структура;
+ СтруктураФайлов.Вставить(Вид + Расширение, Файл);
+
+ URL = "api.telegram.org/bot" + Токен + Метод;
+ Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, СтруктураФайлов, "mixed");
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция УправлениеТемойФорума(Знач Токен
+ , Знач IDЧата
+ , Знач Заголовок = Неопределено
+ , Знач IDИконки = Неопределено
+ , Знач IDТемы = "")
+
+ Строка_ = "Строка";
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("name" , Заголовок, Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("icon_custom_emoji_id", IDИконки , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("message_thread_id" , IDТемы , Строка_, Параметры);
+
+ Если ЗначениеЗаполнено(IDТемы) Тогда
+ Метод = "/editForumTopic";
+ Иначе
+ Метод = "/createForumTopic";
+ КонецЕсли;
+
+ OPI_Инструменты.УдалитьПустыеПоляКоллекции(Параметры);
+ Ответ = OPI_Инструменты.Get("api.telegram.org/bot" + Токен + Метод, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция УправлениеСостояниемТемыФорума(Знач Токен, Знач IDЧата, Знач Статус, Знач IDТемы = "")
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ Если ЗначениеЗаполнено(IDТемы) Тогда
+ Форум = "Forum";
+ Иначе
+ Форум = "GeneralForum";
+ КонецЕсли;
+
+ Метод = ОпределитьМетодУправленияФорумом(Статус, Форум);
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("chat_id" , IDЧата, "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("message_thread_id", IDТемы, "Строка", Параметры);
+
+ URL = "api.telegram.org/bot" + Токен + Метод;
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция УправлениеВидимостьюГлавнойТемыФорума(Знач Токен, Знач IDЧата, Знач Скрыть)
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Скрыть);
+
+ Если Скрыть Тогда
+ Метод = "/hideGeneralForumTopic";
+ Иначе
+ Метод = "/unhideGeneralForumTopic";
+ КонецЕсли;
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("chat_id", IDЧата, "Строка", Параметры);
+
+ URL = "api.telegram.org/bot" + Токен + Метод;
+ Ответ = OPI_Инструменты.Get(URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ОпределитьМетодУправленияФорумом(Знач Статус, Знач Форум)
+
+ Открыть = 1;
+ Закрыть = 2;
+ Удалить = 3;
+
+ Если Статус = Открыть Тогда
+ Метод = "/reopen" + Форум + "Topic";
+ ИначеЕсли Статус = Закрыть Тогда
+ Метод = "/close" + Форум + "Topic";
+ ИначеЕсли Статус = Удалить Тогда
+ Метод = "/deleteForumTopic";
+ Иначе
+ ВызватьИсключение "Некорректный статус управления форумом";
+ КонецЕсли;
+
+ Возврат Метод;
+
+КонецФункции
+
+Функция СоздатьВысокуюКлавиатуру(Знач МассивКнопок)
+
+ Строки = Новый Массив;
+
+ Для Каждого Кнопка Из МассивКнопок Цикл
+ Кнопки = Новый Массив;
+ Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка);
+ Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
+ Строки.Добавить(Кнопки);
+ КонецЦикла;
+
+ Возврат Строки;
+
+КонецФункции
+
+Функция СоздатьДлиннуюКлавиатуру(Знач МассивКнопок)
+
+ Строки = Новый Массив;
+ Кнопки = Новый Массив;
+
+ Для Каждого Кнопка Из МассивКнопок Цикл
+ Кнопка = OPI_Инструменты.ЧислоВСтроку(Кнопка);
+ Кнопки.Добавить(Новый Структура("text,callback_data", Кнопка, Кнопка));
+ КонецЦикла;
+
+ Строки.Добавить(Кнопки);
+
+ Возврат Строки;
+
+КонецФункции
+
+Процедура СформироватьМассивМедиа(Знач СоответствиеФайлов, Знач Текст, СтруктураФайлов, Медиа)
+
+ Счетчик = 0;
+
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(СоответствиеФайлов);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
+
+ Если ТипЗнч(СоответствиеФайлов) <> Тип("Соответствие") Тогда
+ ВызватьИсключение("Не удалось получить информацию из json медиа!");
+ Возврат;
+ КонецЕсли;
+
+ Для Каждого ТекущийФайл Из СоответствиеФайлов Цикл
+
+ Если Не ТипЗнч(ТекущийФайл.Ключ) = Тип("ДвоичныеДанные") Тогда
+
+ Двоичные = ТекущийФайл.Ключ;
+ OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Двоичные);
+
+ ЭтотФайл = Новый Файл(ТекущийФайл.Ключ);
+ ИмяМедиа = ТекущийФайл.Значение
+ + Строка(Счетчик)
+ + ?(ТекущийФайл.Значение = "document", ЭтотФайл.Расширение, "");
+
+ ПолноеИмяМедиа = СтрЗаменить(ИмяМедиа, ".", "___");
+
+ Иначе
+ Двоичные = ТекущийФайл.Ключ;
+ ИмяМедиа = ТекущийФайл.Значение + Строка(Счетчик);
+ ПолноеИмяМедиа = ИмяМедиа;
+ КонецЕсли;
+
+ СтруктураФайлов.Вставить(ПолноеИмяМедиа, Двоичные);
+
+ СтруктураМедиа = Новый Структура;
+ СтруктураМедиа.Вставить("type" , ТекущийФайл.Значение);
+ СтруктураМедиа.Вставить("media", "attach://" + ИмяМедиа);
+
+ Если Счетчик = 0 Тогда
+ СтруктураМедиа.Вставить("caption", Текст);
+ КонецЕсли;
+
+ Медиа.Добавить(СтруктураМедиа);
+
+ Счетчик = Счетчик + 1;
+
+ КонецЦикла;
+
+ Медиа = OPI_Инструменты.JSONСтрокой(Медиа);
+
+КонецПроцедуры
+
+Процедура ДобавитьИдентификаторЧата(Знач IDЧата, Параметры)
+
+ IDЧата = OPI_Инструменты.ЧислоВСтроку(IDЧата);
+ МассивЧата = СтрРазделить(IDЧата, "*", Ложь);
+
+ Если МассивЧата.Количество() > 1 Тогда
+
+ IDЧата = МассивЧата[0];
+ IDТемы = МассивЧата[1];
+
+ Параметры.Вставить("message_thread_id", IDТемы);
+
+ КонецЕсли;
+
+ Параметры.Вставить("chat_id", IDЧата);
+
+КонецПроцедуры
+
+Процедура ОпределитьМетодОтправки(Знач Вид, Метод, Расширение)
+
+ Если Вид = "photo" Тогда
+ Метод = "/sendPhoto";
+ ИначеЕсли Вид = "video" Тогда
+ Метод = "/sendVideo";
+ ИначеЕсли Вид = "audio" Тогда
+ Метод = "/sendAudio";
+ ИначеЕсли Вид = "document" Тогда
+ Метод = "/sendDocument";
+ ИначеЕсли Вид = "animation" Тогда
+ Метод = "/sendAnimation";
+ Расширение = ".gif";
+ Иначе
+ ВызватьИсключение "Некорректный вид отправки";
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ПреобразоватьДанныеФайла(Файл, Расширение, Вид)
+
+ Если Не ТипЗнч(Файл) = Тип("ДвоичныеДанные") Тогда
+
+ ТекущийФайл = Новый Файл(Файл);
+ Расширение = ?(Вид = "document", ТекущийФайл.Расширение, Расширение);
+ OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
+
+ КонецЕсли;
+
+ Расширение = СтрЗаменить(Расширение, ".", "___");
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_Twitter.os b/ru/OInt/core/Modules/OPI_Twitter.os
index 21cd27e345..0e52e5651e 100644
--- a/ru/OInt/core/Modules/OPI_Twitter.os
+++ b/ru/OInt/core/Modules/OPI_Twitter.os
@@ -1,682 +1,682 @@
-// Расположение OS: ./OInt/core/Modules/OPI_Twitter.os
-// Библиотека: Twitter
-// Команда CLI: twitter
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-// Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры()
-// и почитать комментарии
-
-// BSLLS:Typo-off
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:NumberOfOptionalParams-off
-// BSLLS:UsingServiceTag-off
-
-//@skip-check method-too-many-params
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область ДанныеИНастройка
-
-// Получить ссылку для авторизации
-// Формирует ссылку для авторизации через браузер
-//
-// Параметры:
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Строка - URL для перехода в браузере
-Функция ПолучитьСсылкуАвторизации(Параметры = "") Экспорт
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-
- ПараметрыURL = Новый Структура;
-
- ПараметрыURL.Вставить("response_type" , "code");
- ПараметрыURL.Вставить("client_id" , Параметры_["client_id"]);
- ПараметрыURL.Вставить("redirect_uri" , Параметры_["redirect_uri"]);
- ПараметрыURL.Вставить("scope" , Параметры_["scope"]);
- ПараметрыURL.Вставить("state" , "state");
- ПараметрыURL.Вставить("code_challenge" , "challenge");
- ПараметрыURL.Вставить("code_challenge_method", "plain");
-
- ПараметрыURL = OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
- Линк = "https://twitter.com/i/oauth2/authorize" + ПараметрыURL;
-
- Возврат Линк;
-
-КонецФункции
-
-// Получить токен
-// Получает токен по коду, полученному при авторизации по ссылке из ПолучитьСсылкуАвторизации
-//
-// Параметры:
-// Код - Строка - Код, полученный из авторизации См.ПолучитьСсылкуАвторизации - code
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
-Функция ПолучитьТокен(Знач Код, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Код);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-
- ПараметрыЗапроса = Новый Структура;
- ПараметрыЗапроса.Вставить("code" , Код);
- ПараметрыЗапроса.Вставить("grant_type" , "authorization_code");
- ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]);
- ПараметрыЗапроса.Вставить("redirect_uri" , Параметры_["redirect_uri"]);
- ПараметрыЗапроса.Вставить("code_verifier", "challenge");
-
- Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token"
- , ПараметрыЗапроса, , Ложь);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Обновить токен
-// Обновляет v2 токен при помощи refresh_token
-//
-// Параметры:
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
-Функция ОбновитьТокен(Знач Параметры = "") Экспорт
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Refresh = "refresh_token";
-
- ПараметрыЗапроса = Новый Структура;
- ПараметрыЗапроса.Вставить(Refresh , Параметры_[Refresh]);
- ПараметрыЗапроса.Вставить("grant_type" , Refresh);
- ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]);
-
- Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token"
- , ПараметрыЗапроса, , Ложь);
-
- Возврат Ответ;
-
-КонецФункции
-
-// !NOCLI
-// Метод для вставки в http-сервис, адрес которого указывается в redirect_uri
-// Вызывает метод получения токена, так как для получения токена из кода, приходящего
-// на redirect_uri после авторизации через браузер есть всего 30 секунд
-//
-// Параметры:
-// Запрос - HTTPСервисЗапрос - Запрос, приходящий на http-сервис
-//
-// Возвращаемое значение:
-// HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера
-Функция ОбработкаВходящегоЗапросаПослеАвторизации(Запрос) Экспорт
-
- Код = Запрос.ПараметрыЗапроса["code"];
- ОтветТокен = ПолучитьТокен(Код);
-
- // BSLLS:CommentedCode-off
- // Предпочтительное хранение токенов
- // Константы.TwitterRefresh.Установить(ОтветТокен["refresh_token"]);
- // Константы.TwitterToken.Установить(ОтветТокен["access_token"]);
- // BSLLS:CommentedCode-on
-
- Возврат ОтветТокен;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область Твиты
-
-// !NOCLI
-// Создать произвольный твит
-//
-// Параметры:
-// Текст - Строка - Текст твита
-// МассивМедиа - Массив из Строка,ДвоичныеДанные - Массив двоичных данных или путей к файлам
-// МассивВариантовОпроса - Массив из Строка - Массив вариантов опроса, если необходимо
-// ДлительностьОпроса - Строка,Число - Длительность опроса, если необходимо (опрос без длительности не создается)
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
-Функция СоздатьПроизвольныйТвит(Знач Текст = ""
- , Знач МассивМедиа = ""
- , Знач МассивВариантовОпроса = ""
- , Знач ДлительностьОпроса = ""
- , Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ДлительностьОпроса);
-
- Если ЗначениеЗаполнено(МассивМедиа) Тогда
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивМедиа);
- КонецЕсли;
-
- Если ЗначениеЗаполнено(МассивВариантовОпроса) Тогда
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивВариантовОпроса);
- КонецЕсли;
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- URL = "https://api.twitter.com/2/tweets";
- Массив = "Массив";
- Поля = Новый Соответствие;
-
- Если ЗначениеЗаполнено(Текст) Тогда
- Поля.Вставить("text", Текст);
- КонецЕсли;
-
- Если ТипЗнч(МассивВариантовОпроса) = Тип(Массив) И ЗначениеЗаполнено(ДлительностьОпроса) Тогда
-
- ДлительностьОпроса = Число(ДлительностьОпроса);
-
- Если МассивВариантовОпроса.Количество() > 0 Тогда
-
- СтруктураВарианта = Новый Структура("options,duration_minutes", МассивВариантовОпроса, ДлительностьОпроса);
- Поля.Вставить("poll", СтруктураВарианта);
-
- КонецЕсли;
-
- КонецЕсли;
-
- Если ТипЗнч(МассивМедиа) = Тип(Массив) Тогда
- Если МассивМедиа.Количество() > 0 Тогда
- Поля.Вставить("media", Новый Структура("media_ids", МассивМедиа));
- КонецЕсли;
- КонецЕсли;
-
- Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_);
- Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Создать текстовый твит
-// Создает твит без вложений
-//
-// Параметры:
-// Текст - Строка - Текст твита - text
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
-Функция СоздатьТекстовыйТвит(Знач Текст, Знач Параметры = "") Экспорт
- Возврат СоздатьПроизвольныйТвит(Текст, , , , Параметры);
-КонецФункции
-
-// Создать твит картинки
-// Создает твит с картинкой вложением
-//
-// Параметры:
-// Текст - Строка - Текст твита - text
-// МассивКартинок - Массив из Строка,ДвоичныеДанные - Массив файлов картинок - pictures
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
-Функция СоздатьТвитКартинки(Знач Текст, Знач МассивКартинок, Знач Параметры = "") Экспорт
-
- МассивМедиа = ЗагрузитьМассивВложений(МассивКартинок, "tweet_image", Параметры);
- Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
-
-КонецФункции
-
-// Создать твит гифки
-// Создает твит с вложением-гифкой
-//
-// Параметры:
-// Текст - Строка - Текст твита - text
-// МассивГифок - Массив из Строка,ДвоичныеДанные - Массив файлов гифок - gifs
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
-Функция СоздатьТвитГифки(Знач Текст, Знач МассивГифок, Знач Параметры = "") Экспорт
-
- МассивМедиа = ЗагрузитьМассивВложений(МассивГифок, "tweet_gif", Параметры);
- Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
-
-КонецФункции
-
-// Создать твит видео
-// Создает твит с видеовложением
-//
-// Параметры:
-// Текст - Строка - Текст твита - text
-// МассивВидео - Массив из Строка,ДвоичныеДанные - Массив файлов видео - videos
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
-Функция СоздатьТвитВидео(Знач Текст, Знач МассивВидео, Знач Параметры = "") Экспорт
-
- МассивМедиа = ЗагрузитьМассивВложений(МассивВидео, "tweet_video", Параметры);
- Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
-
-КонецФункции
-
-// Создать твит опрос
-// Создает твит с опросом
-//
-// Параметры:
-// Текст - Строка - Текст твита - text
-// МассивВариантов - Массив из Строка - Массив вариантов опроса - options
-// Длительность - Строка,Число - Длительность опроса - duration
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
-Функция СоздатьТвитОпрос(Знач Текст, Знач МассивВариантов, Знач Длительность, Знач Параметры = "") Экспорт
- Возврат СоздатьПроизвольныйТвит(Текст, , МассивВариантов, Длительность, Параметры);
-КонецФункции
-
-// Загрузить массив вложений !NOCLI
-// Загружает файлы на сервер и возвращает их ID
-//
-// Параметры:
-// МассивФайлов - Массив из Строка, ДвоичныеДанные - Массив файлов
-// ТипВложений - Строка - Тип вложений
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Массив Из Строка - Массив ID медиа
-Функция ЗагрузитьМассивВложений(Знач МассивФайлов, Знач ТипВложений, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ТипВложений);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивФайлов);
-
- МассивМедиа = Новый Массив;
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- MIS = "media_id_string";
-
- Если ЗначениеЗаполнено(МассивФайлов) Тогда
-
- Для Каждого ФайлОтправки Из МассивФайлов Цикл
-
- OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(ФайлОтправки);
-
- Ответ = ЗагрузитьМедиафайл(ФайлОтправки, ТипВложений, Параметры_);
- IDМедиа = Ответ[MIS];
-
- Если Не ЗначениеЗаполнено(IDМедиа) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- МассивМедиа.Добавить(IDМедиа);
-
- КонецЦикла;
-
- КонецЕсли;
-
- Возврат МассивМедиа;
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ЗагрузитьМедиафайл(Знач Файл, Знач Тип, Знач Параметры)
-
- OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
-
- ВидЗапроса = "POST";
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- URL = "https://upload.twitter.com/1.1/media/upload.json";
-
- Если Тип = "tweet_image" Тогда
-
- Поля = Новый Структура;
- Поля.Вставить("media_data" , Base64Строка(Файл));
- Поля.Вставить("media_category", Тип);
-
- Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, ВидЗапроса, URL);
- Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
-
- Иначе
-
- Ответ = ЗагрузитьМедиаЧастями(Файл, Тип, ВидЗапроса, URL, Параметры_);
-
- КонецЕсли;
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ЗагрузитьМедиаЧастями(Знач Файл, Знач Тип, Знач ВидЗапроса, Знач URL, Параметры)
-
- Единица = 1024;
- Количество = 4;
- MediaKey = "media_key";
- MIS = "media_id_string";
- Command = "command";
- Размер = Файл.Размер();
-
- СоответствиеMIME = Новый Соответствие;
- СоответствиеMIME.Вставить("tweet_image", "image/jpeg");
- СоответствиеMIME.Вставить("tweet_video", "video/mp4");
- СоответствиеMIME.Вставить("tweet_gif" , "image/gif");
-
- РазмерЧасти = Количество * Единица * Единица;
- МассивЧтения = РазделитьДвоичныеДанные(Файл, РазмерЧасти);
-
- Поля = Новый Структура;
- Поля.Вставить(Command , "INIT");
- Поля.Вставить("total_bytes" , OPI_Инструменты.ЧислоВСтроку(Размер));
- Поля.Вставить("media_type" , СоответствиеMIME.Получить(Тип));
- Поля.Вставить("media_category" , Тип);
-
- Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, ВидЗапроса, URL);
-
- ОтветИнициализации = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
- KeyИнициализации = ОтветИнициализации[MediaKey];
- IDИнициализации = ОтветИнициализации[MIS];
-
- Если Не ЗначениеЗаполнено(KeyИнициализации) Или Не ЗначениеЗаполнено(IDИнициализации) Тогда
- Возврат ОтветИнициализации;
- КонецЕсли;
-
- Счетчик = 0;
-
- Для Каждого Часть Из МассивЧтения Цикл
-
- Поля = Новый Структура;
- Поля.Вставить(Command , "APPEND");
- Поля.Вставить("media_key" , KeyИнициализации);
- Поля.Вставить("segment_index" , OPI_Инструменты.ЧислоВСтроку(Счетчик));
- Поля.Вставить("media" , Часть);
-
- Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Новый Структура, ВидЗапроса, URL);
-
- OPI_Инструменты.PostMultipart(URL, Поля, , , Авторизация);
-
- Счетчик = Счетчик + 1;
-
- КонецЦикла;
-
- Поля = Новый Структура;
- Поля.Вставить(Command , "FINALIZE");
- Поля.Вставить("media_id", IDИнициализации);
-
- СтатусОбработки = ПолучитьСтатусОбработки(Параметры, Поля, URL);
-
- Если Не ТипЗнч(СтатусОбработки) = Тип("Строка") Тогда
- Возврат СтатусОбработки;
- КонецЕсли;
-
- Ответ = ОжидатьЗавершенияОбработки(СтатусОбработки, IDИнициализации, URL, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ОжидатьЗавершенияОбработки(Знач СтатусОбработки, Знач IDИнициализации, Знач URL, Знач Параметры)
-
- ProcessingInfo = "processing_info";
- Command = "command";
- Поля = Новый Структура;
-
- Поля.Вставить(Command , "STATUS");
- Поля.Вставить("media_id", IDИнициализации);
-
- Пока Строка(СтатусОбработки) = "pending" Или Строка(СтатусОбработки) = "in_progress" Цикл
-
- Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "GET", URL);
- Ответ = OPI_Инструменты.Get(URL, Поля, Авторизация);
- Информация = Ответ[ProcessingInfo];
-
- Если Не ЗначениеЗаполнено(Информация) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- СтатусОбработки = Информация["state"];
-
- Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- КонецЦикла;
-
- Если СтатусОбработки = "failed" Тогда
- ВызватьИсключение "Твиттер не смог обработать загруженное вами видео";
- КонецЕсли;
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ПолучитьСтандартныеПараметры(Знач Параметры = "")
-
- // Здесь собрано определение данных, необходимых для работы.
- // Для Twitter это довольно значительный набор, что обсуловлено наличием сразу 2-х API,
- // которые, при этом, созданы не для разныз задач, но просто являются версиями друг друга.
- // Актуальной версией API является v2 и она требует получения временных токенов. Несмотря на то,
- // что Twitter настаивает на использовании этой актуальной версии, они как-то умудрились не перенести
- // механизм загрузки файлов и некоторые другие из старой версии - v1.1. Поэтому что-то нужно делать
- // на версии 1.1, а что-то на 2: вплоть до того что они убрали возможность постить твиты из v1.1,
- // но только через нее в твит можно добавить картинку. При этом способы авторизации и токены у них разные
-
- // Мировая гигокорпорация Илона Маска, кстати, напоминаю ;)
-
- // P.S Далее часто упоминается "страница настроек Twitter Developer" - это
- // https://developer.twitter.com/en/portal/dashboard и выбор конкретного проекта из списка (значек c ключем)
-
- Параметры_ = Новый Соответствие;
- Разрешения = "tweet.read tweet.write tweet.moderate.write users.read "
- + "follows.read follows.write offline.access space.read mute.read "
- + "mute.write like.read like.write list.read list.write block.read "
- + "block.write bookmark.read bookmark.write";
-
- // Данные для API v2
-
- // redirect_uri - URL вашего http-сервиса (или другого обработчика запросов) для авторизации
- // scope - набор разрешений для получаемого ключа. Может быть любой, но offline.access обязателен
- // client_id - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer
- // client_secret - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer
- // access_token - ПолучитьСсылкуАвторизации() -> Браузер -> code придет на redirect_uri -> ПолучитьТокен(code)
- // refresh_token - Приходит вместе с access_token и используется для его обновления (время жизни access_token - 2 ч)
- // Обновление происходит методом ОбновитьТокен с новыми access_token и refresh_token.
- // При следующем обновлении нужно использовать уже новый refresh_token, так что захардкодить
- // не получится (access_token тоже не получится)
-
- // |--> ОбновитьТокен() ->|access_token --> Используется в т-нии 2-х часов для запросов
- // | |refresh_token --|
- // |--------[через 2 ч.]-------------------|
-
- // Данные для API v1.1
-
- // oauth_token - Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer
- // oauth_token_secret - Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer
- // oauth_consumer_key - Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer
- // oauth_consumer_secret - Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer
-
- // Эти токены обновлять не надо
-
- Параметры_.Вставить("redirect_uri" , "");
- Параметры_.Вставить("scope" , Разрешения);
- Параметры_.Вставить("client_id" , "");
- Параметры_.Вставить("client_secret" , "");
- Параметры_.Вставить("access_token" , ""); // Должно быть нечто вроде Константы.TwitterToken.Получить()
- Параметры_.Вставить("refresh_token" , ""); // Должно быть нечто вроде Константы.TwitterRefresh.Получить()
- Параметры_.Вставить("oauth_token" , "");
- Параметры_.Вставить("oauth_token_secret" , "");
- Параметры_.Вставить("oauth_consumer_key" , "");
- Параметры_.Вставить("oauth_consumer_secret", "");
-
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Параметры);
-
- Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда
- Для Каждого ПереданныйПараметр Из Параметры Цикл
- Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение));
- КонецЦикла;
- КонецЕсли;
-
- Возврат Параметры_;
-
-КонецФункции
-
-Функция СоздатьЗаголовокАвторизацииV1(Знач Параметры, Знач Поля, Знач ВидЗапроса, Знач URL)
-
- ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
- ЗаголовокАвторизации = "";
- МетодХэширования = "HMAC-SHA1";
- ВерсияАпи = "1.0";
- СтрокаСигнатуры = "";
- Подпись = "";
- OCK = "oauth_consumer_key";
- OTK = "oauth_token";
- ТекущаяДатаUNIX = OPI_Инструменты.UNIXTime(ТекущаяДата);
- ТекущаяДатаUNIX = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX);
- ТаблицаПараметров = Новый ТаблицаЗначений;
- ТаблицаПараметров.Колонки.Добавить("Ключ");
- ТаблицаПараметров.Колонки.Добавить("Значение");
-
- Для Каждого Поле Из Поля Цикл
-
- НоваяСтрока = ТаблицаПараметров.Добавить();
- НоваяСтрока.Ключ = Поле.Ключ;
- НоваяСтрока.Значение = Поле.Значение;
-
- КонецЦикла;
-
- НоваяСтрока = ТаблицаПараметров.Добавить();
- НоваяСтрока.Ключ = OCK;
- НоваяСтрока.Значение = Параметры[OCK];
-
- НоваяСтрока = ТаблицаПараметров.Добавить();
- НоваяСтрока.Ключ = OTK;
- НоваяСтрока.Значение = Параметры[OTK];
-
- НоваяСтрока = ТаблицаПараметров.Добавить();
- НоваяСтрока.Ключ = "oauth_version";
- НоваяСтрока.Значение = ВерсияАпи;
-
- НоваяСтрока = ТаблицаПараметров.Добавить();
- НоваяСтрока.Ключ = "oauth_signature_method";
- НоваяСтрока.Значение = МетодХэширования;
-
- НоваяСтрока = ТаблицаПараметров.Добавить();
- НоваяСтрока.Ключ = "oauth_timestamp";
- НоваяСтрока.Значение = ТекущаяДатаUNIX;
-
- НоваяСтрока = ТаблицаПараметров.Добавить();
- НоваяСтрока.Ключ = "oauth_nonce";
- НоваяСтрока.Значение = ТекущаяДатаUNIX;
-
- Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
-
- СтрокаТаблицы.Ключ = КодироватьСтроку(СтрокаТаблицы.Ключ, СпособКодированияСтроки.КодировкаURL);
- СтрокаТаблицы.Значение = КодироватьСтроку(СтрокаТаблицы.Значение, СпособКодированияСтроки.КодировкаURL);
-
- КонецЦикла;
-
- ТаблицаПараметров.Сортировать("Ключ");
-
- Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
-
- СтрокаСигнатуры = СтрокаСигнатуры
- + СтрокаТаблицы.Ключ
- + "="
- + СтрокаТаблицы.Значение
- + "&";
-
- КонецЦикла;
-
- СтрокаСигнатуры = Лев(СтрокаСигнатуры, СтрДлина(СтрокаСигнатуры) - 1);
- СтрокаСигнатуры = вРег(ВидЗапроса)
- + "&"
- + КодироватьСтроку(URL, СпособКодированияСтроки.КодировкаURL)
- + "&"
- + КодироватьСтроку(СтрокаСигнатуры, СпособКодированияСтроки.КодировкаURL);
-
- Подпись = КодироватьСтроку(Параметры["oauth_consumer_secret"], СпособКодированияСтроки.КодировкаURL)
- + "&"
- + КодироватьСтроку(Параметры["oauth_token_secret"], СпособКодированияСтроки.КодировкаURL);
-
- Сигнатура = OPI_Криптография.HMAC(ПолучитьДвоичныеДанныеИзСтроки(Подпись)
- , ПолучитьДвоичныеДанныеИзСтроки(СтрокаСигнатуры)
- , ХешФункция.SHA1
- , 64);
-
- Сигнатура = КодироватьСтроку(Base64Строка(Сигнатура), СпособКодированияСтроки.КодировкаURL);
-
- Разделитель = """,";
- ЗаголовокАвторизации = ЗаголовокАвторизации
- + "OAuth "
- + "oauth_consumer_key=""" + Параметры[OCK] + Разделитель
- + "oauth_token=""" + Параметры[OTK] + Разделитель
- + "oauth_signature_method=""" + МетодХэширования + Разделитель
- + "oauth_timestamp=""" + ТекущаяДатаUNIX + Разделитель
- + "oauth_nonce=""" + ТекущаяДатаUNIX + Разделитель
- + "oauth_version=""" + ВерсияАпи + Разделитель
- + "oauth_signature=""" + Сигнатура;
-
- СоответствиеЗаголовка = Новый Соответствие;
- СоответствиеЗаголовка.Вставить("authorization", ЗаголовокАвторизации);
-
- Возврат СоответствиеЗаголовка;
-
-КонецФункции
-
-Функция СоздатьЗаголовокАвторизацииV2(Знач Параметры)
-
- СоответствиеВозврата = Новый Соответствие;
- СоответствиеВозврата.Вставить("Authorization", "Bearer " + Параметры["access_token"]);
-
- Возврат СоответствиеВозврата;
-
-КонецФункции
-
-Функция ПолучитьСтатусОбработки(Знач Параметры, Знач Поля, Знач URL)
-
- ProcessingInfo = "processing_info";
- Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "POST", URL);
-
- Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
- Информация = Ответ[ProcessingInfo];
-
- Если Не ЗначениеЗаполнено(Информация) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- СтатусОбработки = Информация["state"];
-
- Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда
- Возврат Ответ;
- Иначе
- Возврат СтатусОбработки;
- КонецЕсли;
-
-КонецФункции
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_Twitter.os
+// Библиотека: Twitter
+// Команда CLI: twitter
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+// Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры()
+// и почитать комментарии
+
+// BSLLS:Typo-off
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:NumberOfOptionalParams-off
+// BSLLS:UsingServiceTag-off
+
+//@skip-check method-too-many-params
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область ДанныеИНастройка
+
+// Получить ссылку для авторизации
+// Формирует ссылку для авторизации через браузер
+//
+// Параметры:
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Строка - URL для перехода в браузере
+Функция ПолучитьСсылкуАвторизации(Параметры = "") Экспорт
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+
+ ПараметрыURL = Новый Структура;
+
+ ПараметрыURL.Вставить("response_type" , "code");
+ ПараметрыURL.Вставить("client_id" , Параметры_["client_id"]);
+ ПараметрыURL.Вставить("redirect_uri" , Параметры_["redirect_uri"]);
+ ПараметрыURL.Вставить("scope" , Параметры_["scope"]);
+ ПараметрыURL.Вставить("state" , "state");
+ ПараметрыURL.Вставить("code_challenge" , "challenge");
+ ПараметрыURL.Вставить("code_challenge_method", "plain");
+
+ ПараметрыURL = OPI_Инструменты.ПараметрыЗапросаВСтроку(ПараметрыURL);
+ Линк = "https://twitter.com/i/oauth2/authorize" + ПараметрыURL;
+
+ Возврат Линк;
+
+КонецФункции
+
+// Получить токен
+// Получает токен по коду, полученному при авторизации по ссылке из ПолучитьСсылкуАвторизации
+//
+// Параметры:
+// Код - Строка - Код, полученный из авторизации См.ПолучитьСсылкуАвторизации - code
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
+Функция ПолучитьТокен(Знач Код, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Код);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+
+ ПараметрыЗапроса = Новый Структура;
+ ПараметрыЗапроса.Вставить("code" , Код);
+ ПараметрыЗапроса.Вставить("grant_type" , "authorization_code");
+ ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]);
+ ПараметрыЗапроса.Вставить("redirect_uri" , Параметры_["redirect_uri"]);
+ ПараметрыЗапроса.Вставить("code_verifier", "challenge");
+
+ Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token"
+ , ПараметрыЗапроса, , Ложь);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Обновить токен
+// Обновляет v2 токен при помощи refresh_token
+//
+// Параметры:
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
+Функция ОбновитьТокен(Знач Параметры = "") Экспорт
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Refresh = "refresh_token";
+
+ ПараметрыЗапроса = Новый Структура;
+ ПараметрыЗапроса.Вставить(Refresh , Параметры_[Refresh]);
+ ПараметрыЗапроса.Вставить("grant_type" , Refresh);
+ ПараметрыЗапроса.Вставить("client_id" , Параметры_["client_id"]);
+
+ Ответ = OPI_Инструменты.Post("https://api.twitter.com/2/oauth2/token"
+ , ПараметрыЗапроса, , Ложь);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// !NOCLI
+// Метод для вставки в http-сервис, адрес которого указывается в redirect_uri
+// Вызывает метод получения токена, так как для получения токена из кода, приходящего
+// на redirect_uri после авторизации через браузер есть всего 30 секунд
+//
+// Параметры:
+// Запрос - HTTPСервисЗапрос - Запрос, приходящий на http-сервис
+//
+// Возвращаемое значение:
+// HTTPОтвет, Произвольный, ДвоичныеДанные - Результат чтения JSON ответа сервера
+Функция ОбработкаВходящегоЗапросаПослеАвторизации(Запрос) Экспорт
+
+ Код = Запрос.ПараметрыЗапроса["code"];
+ ОтветТокен = ПолучитьТокен(Код);
+
+ // BSLLS:CommentedCode-off
+ // Предпочтительное хранение токенов
+ // Константы.TwitterRefresh.Установить(ОтветТокен["refresh_token"]);
+ // Константы.TwitterToken.Установить(ОтветТокен["access_token"]);
+ // BSLLS:CommentedCode-on
+
+ Возврат ОтветТокен;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область Твиты
+
+// !NOCLI
+// Создать произвольный твит
+//
+// Параметры:
+// Текст - Строка - Текст твита
+// МассивМедиа - Массив из Строка,ДвоичныеДанные - Массив двоичных данных или путей к файлам
+// МассивВариантовОпроса - Массив из Строка - Массив вариантов опроса, если необходимо
+// ДлительностьОпроса - Строка,Число - Длительность опроса, если необходимо (опрос без длительности не создается)
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
+Функция СоздатьПроизвольныйТвит(Знач Текст = ""
+ , Знач МассивМедиа = ""
+ , Знач МассивВариантовОпроса = ""
+ , Знач ДлительностьОпроса = ""
+ , Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ДлительностьОпроса);
+
+ Если ЗначениеЗаполнено(МассивМедиа) Тогда
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивМедиа);
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(МассивВариантовОпроса) Тогда
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивВариантовОпроса);
+ КонецЕсли;
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ URL = "https://api.twitter.com/2/tweets";
+ Массив = "Массив";
+ Поля = Новый Соответствие;
+
+ Если ЗначениеЗаполнено(Текст) Тогда
+ Поля.Вставить("text", Текст);
+ КонецЕсли;
+
+ Если ТипЗнч(МассивВариантовОпроса) = Тип(Массив) И ЗначениеЗаполнено(ДлительностьОпроса) Тогда
+
+ ДлительностьОпроса = Число(ДлительностьОпроса);
+
+ Если МассивВариантовОпроса.Количество() > 0 Тогда
+
+ СтруктураВарианта = Новый Структура("options,duration_minutes", МассивВариантовОпроса, ДлительностьОпроса);
+ Поля.Вставить("poll", СтруктураВарианта);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Если ТипЗнч(МассивМедиа) = Тип(Массив) Тогда
+ Если МассивМедиа.Количество() > 0 Тогда
+ Поля.Вставить("media", Новый Структура("media_ids", МассивМедиа));
+ КонецЕсли;
+ КонецЕсли;
+
+ Авторизация = СоздатьЗаголовокАвторизацииV2(Параметры_);
+ Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Создать текстовый твит
+// Создает твит без вложений
+//
+// Параметры:
+// Текст - Строка - Текст твита - text
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
+Функция СоздатьТекстовыйТвит(Знач Текст, Знач Параметры = "") Экспорт
+ Возврат СоздатьПроизвольныйТвит(Текст, , , , Параметры);
+КонецФункции
+
+// Создать твит картинки
+// Создает твит с картинкой вложением
+//
+// Параметры:
+// Текст - Строка - Текст твита - text
+// МассивКартинок - Массив из Строка,ДвоичныеДанные - Массив файлов картинок - pictures
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
+Функция СоздатьТвитКартинки(Знач Текст, Знач МассивКартинок, Знач Параметры = "") Экспорт
+
+ МассивМедиа = ЗагрузитьМассивВложений(МассивКартинок, "tweet_image", Параметры);
+ Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
+
+КонецФункции
+
+// Создать твит гифки
+// Создает твит с вложением-гифкой
+//
+// Параметры:
+// Текст - Строка - Текст твита - text
+// МассивГифок - Массив из Строка,ДвоичныеДанные - Массив файлов гифок - gifs
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
+Функция СоздатьТвитГифки(Знач Текст, Знач МассивГифок, Знач Параметры = "") Экспорт
+
+ МассивМедиа = ЗагрузитьМассивВложений(МассивГифок, "tweet_gif", Параметры);
+ Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
+
+КонецФункции
+
+// Создать твит видео
+// Создает твит с видеовложением
+//
+// Параметры:
+// Текст - Строка - Текст твита - text
+// МассивВидео - Массив из Строка,ДвоичныеДанные - Массив файлов видео - videos
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
+Функция СоздатьТвитВидео(Знач Текст, Знач МассивВидео, Знач Параметры = "") Экспорт
+
+ МассивМедиа = ЗагрузитьМассивВложений(МассивВидео, "tweet_video", Параметры);
+ Возврат СоздатьПроизвольныйТвит(Текст, МассивМедиа, , , Параметры);
+
+КонецФункции
+
+// Создать твит опрос
+// Создает твит с опросом
+//
+// Параметры:
+// Текст - Строка - Текст твита - text
+// МассивВариантов - Массив из Строка - Массив вариантов опроса - options
+// Длительность - Строка,Число - Длительность опроса - duration
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Twitter
+Функция СоздатьТвитОпрос(Знач Текст, Знач МассивВариантов, Знач Длительность, Знач Параметры = "") Экспорт
+ Возврат СоздатьПроизвольныйТвит(Текст, , МассивВариантов, Длительность, Параметры);
+КонецФункции
+
+// Загрузить массив вложений !NOCLI
+// Загружает файлы на сервер и возвращает их ID
+//
+// Параметры:
+// МассивФайлов - Массив из Строка, ДвоичныеДанные - Массив файлов
+// ТипВложений - Строка - Тип вложений
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Массив Из Строка - Массив ID медиа
+Функция ЗагрузитьМассивВложений(Знач МассивФайлов, Знач ТипВложений, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ТипВложений);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивФайлов);
+
+ МассивМедиа = Новый Массив;
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ MIS = "media_id_string";
+
+ Если ЗначениеЗаполнено(МассивФайлов) Тогда
+
+ Для Каждого ФайлОтправки Из МассивФайлов Цикл
+
+ OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(ФайлОтправки);
+
+ Ответ = ЗагрузитьМедиафайл(ФайлОтправки, ТипВложений, Параметры_);
+ IDМедиа = Ответ[MIS];
+
+ Если Не ЗначениеЗаполнено(IDМедиа) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ МассивМедиа.Добавить(IDМедиа);
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+ Возврат МассивМедиа;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ЗагрузитьМедиафайл(Знач Файл, Знач Тип, Знач Параметры)
+
+ OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
+
+ ВидЗапроса = "POST";
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ URL = "https://upload.twitter.com/1.1/media/upload.json";
+
+ Если Тип = "tweet_image" Тогда
+
+ Поля = Новый Структура;
+ Поля.Вставить("media_data" , Base64Строка(Файл));
+ Поля.Вставить("media_category", Тип);
+
+ Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры_, Поля, ВидЗапроса, URL);
+ Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
+
+ Иначе
+
+ Ответ = ЗагрузитьМедиаЧастями(Файл, Тип, ВидЗапроса, URL, Параметры_);
+
+ КонецЕсли;
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ЗагрузитьМедиаЧастями(Знач Файл, Знач Тип, Знач ВидЗапроса, Знач URL, Параметры)
+
+ Единица = 1024;
+ Количество = 4;
+ MediaKey = "media_key";
+ MIS = "media_id_string";
+ Command = "command";
+ Размер = Файл.Размер();
+
+ СоответствиеMIME = Новый Соответствие;
+ СоответствиеMIME.Вставить("tweet_image", "image/jpeg");
+ СоответствиеMIME.Вставить("tweet_video", "video/mp4");
+ СоответствиеMIME.Вставить("tweet_gif" , "image/gif");
+
+ РазмерЧасти = Количество * Единица * Единица;
+ МассивЧтения = РазделитьДвоичныеДанные(Файл, РазмерЧасти);
+
+ Поля = Новый Структура;
+ Поля.Вставить(Command , "INIT");
+ Поля.Вставить("total_bytes" , OPI_Инструменты.ЧислоВСтроку(Размер));
+ Поля.Вставить("media_type" , СоответствиеMIME.Получить(Тип));
+ Поля.Вставить("media_category" , Тип);
+
+ Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, ВидЗапроса, URL);
+
+ ОтветИнициализации = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
+ KeyИнициализации = ОтветИнициализации[MediaKey];
+ IDИнициализации = ОтветИнициализации[MIS];
+
+ Если Не ЗначениеЗаполнено(KeyИнициализации) Или Не ЗначениеЗаполнено(IDИнициализации) Тогда
+ Возврат ОтветИнициализации;
+ КонецЕсли;
+
+ Счетчик = 0;
+
+ Для Каждого Часть Из МассивЧтения Цикл
+
+ Поля = Новый Структура;
+ Поля.Вставить(Command , "APPEND");
+ Поля.Вставить("media_key" , KeyИнициализации);
+ Поля.Вставить("segment_index" , OPI_Инструменты.ЧислоВСтроку(Счетчик));
+ Поля.Вставить("media" , Часть);
+
+ Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Новый Структура, ВидЗапроса, URL);
+
+ OPI_Инструменты.PostMultipart(URL, Поля, , , Авторизация);
+
+ Счетчик = Счетчик + 1;
+
+ КонецЦикла;
+
+ Поля = Новый Структура;
+ Поля.Вставить(Command , "FINALIZE");
+ Поля.Вставить("media_id", IDИнициализации);
+
+ СтатусОбработки = ПолучитьСтатусОбработки(Параметры, Поля, URL);
+
+ Если Не ТипЗнч(СтатусОбработки) = Тип("Строка") Тогда
+ Возврат СтатусОбработки;
+ КонецЕсли;
+
+ Ответ = ОжидатьЗавершенияОбработки(СтатусОбработки, IDИнициализации, URL, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ОжидатьЗавершенияОбработки(Знач СтатусОбработки, Знач IDИнициализации, Знач URL, Знач Параметры)
+
+ ProcessingInfo = "processing_info";
+ Command = "command";
+ Поля = Новый Структура;
+
+ Поля.Вставить(Command , "STATUS");
+ Поля.Вставить("media_id", IDИнициализации);
+
+ Пока Строка(СтатусОбработки) = "pending" Или Строка(СтатусОбработки) = "in_progress" Цикл
+
+ Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "GET", URL);
+ Ответ = OPI_Инструменты.Get(URL, Поля, Авторизация);
+ Информация = Ответ[ProcessingInfo];
+
+ Если Не ЗначениеЗаполнено(Информация) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ СтатусОбработки = Информация["state"];
+
+ Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Если СтатусОбработки = "failed" Тогда
+ ВызватьИсключение "Твиттер не смог обработать загруженное вами видео";
+ КонецЕсли;
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ПолучитьСтандартныеПараметры(Знач Параметры = "")
+
+ // Здесь собрано определение данных, необходимых для работы.
+ // Для Twitter это довольно значительный набор, что обсуловлено наличием сразу 2-х API,
+ // которые, при этом, созданы не для разныз задач, но просто являются версиями друг друга.
+ // Актуальной версией API является v2 и она требует получения временных токенов. Несмотря на то,
+ // что Twitter настаивает на использовании этой актуальной версии, они как-то умудрились не перенести
+ // механизм загрузки файлов и некоторые другие из старой версии - v1.1. Поэтому что-то нужно делать
+ // на версии 1.1, а что-то на 2: вплоть до того что они убрали возможность постить твиты из v1.1,
+ // но только через нее в твит можно добавить картинку. При этом способы авторизации и токены у них разные
+
+ // Мировая гигокорпорация Илона Маска, кстати, напоминаю ;)
+
+ // P.S Далее часто упоминается "страница настроек Twitter Developer" - это
+ // https://developer.twitter.com/en/portal/dashboard и выбор конкретного проекта из списка (значек c ключем)
+
+ Параметры_ = Новый Соответствие;
+ Разрешения = "tweet.read tweet.write tweet.moderate.write users.read "
+ + "follows.read follows.write offline.access space.read mute.read "
+ + "mute.write like.read like.write list.read list.write block.read "
+ + "block.write bookmark.read bookmark.write";
+
+ // Данные для API v2
+
+ // redirect_uri - URL вашего http-сервиса (или другого обработчика запросов) для авторизации
+ // scope - набор разрешений для получаемого ключа. Может быть любой, но offline.access обязателен
+ // client_id - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer
+ // client_secret - Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer
+ // access_token - ПолучитьСсылкуАвторизации() -> Браузер -> code придет на redirect_uri -> ПолучитьТокен(code)
+ // refresh_token - Приходит вместе с access_token и используется для его обновления (время жизни access_token - 2 ч)
+ // Обновление происходит методом ОбновитьТокен с новыми access_token и refresh_token.
+ // При следующем обновлении нужно использовать уже новый refresh_token, так что захардкодить
+ // не получится (access_token тоже не получится)
+
+ // |--> ОбновитьТокен() ->|access_token --> Используется в т-нии 2-х часов для запросов
+ // | |refresh_token --|
+ // |--------[через 2 ч.]-------------------|
+
+ // Данные для API v1.1
+
+ // oauth_token - Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer
+ // oauth_token_secret - Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer
+ // oauth_consumer_key - Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer
+ // oauth_consumer_secret - Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer
+
+ // Эти токены обновлять не надо
+
+ Параметры_.Вставить("redirect_uri" , "");
+ Параметры_.Вставить("scope" , Разрешения);
+ Параметры_.Вставить("client_id" , "");
+ Параметры_.Вставить("client_secret" , "");
+ Параметры_.Вставить("access_token" , ""); // Должно быть нечто вроде Константы.TwitterToken.Получить()
+ Параметры_.Вставить("refresh_token" , ""); // Должно быть нечто вроде Константы.TwitterRefresh.Получить()
+ Параметры_.Вставить("oauth_token" , "");
+ Параметры_.Вставить("oauth_token_secret" , "");
+ Параметры_.Вставить("oauth_consumer_key" , "");
+ Параметры_.Вставить("oauth_consumer_secret", "");
+
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Параметры);
+
+ Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда
+ Для Каждого ПереданныйПараметр Из Параметры Цикл
+ Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение));
+ КонецЦикла;
+ КонецЕсли;
+
+ Возврат Параметры_;
+
+КонецФункции
+
+Функция СоздатьЗаголовокАвторизацииV1(Знач Параметры, Знач Поля, Знач ВидЗапроса, Знач URL)
+
+ ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
+ ЗаголовокАвторизации = "";
+ МетодХэширования = "HMAC-SHA1";
+ ВерсияАпи = "1.0";
+ СтрокаСигнатуры = "";
+ Подпись = "";
+ OCK = "oauth_consumer_key";
+ OTK = "oauth_token";
+ ТекущаяДатаUNIX = OPI_Инструменты.UNIXTime(ТекущаяДата);
+ ТекущаяДатаUNIX = OPI_Инструменты.ЧислоВСтроку(ТекущаяДатаUNIX);
+ ТаблицаПараметров = Новый ТаблицаЗначений;
+ ТаблицаПараметров.Колонки.Добавить("Ключ");
+ ТаблицаПараметров.Колонки.Добавить("Значение");
+
+ Для Каждого Поле Из Поля Цикл
+
+ НоваяСтрока = ТаблицаПараметров.Добавить();
+ НоваяСтрока.Ключ = Поле.Ключ;
+ НоваяСтрока.Значение = Поле.Значение;
+
+ КонецЦикла;
+
+ НоваяСтрока = ТаблицаПараметров.Добавить();
+ НоваяСтрока.Ключ = OCK;
+ НоваяСтрока.Значение = Параметры[OCK];
+
+ НоваяСтрока = ТаблицаПараметров.Добавить();
+ НоваяСтрока.Ключ = OTK;
+ НоваяСтрока.Значение = Параметры[OTK];
+
+ НоваяСтрока = ТаблицаПараметров.Добавить();
+ НоваяСтрока.Ключ = "oauth_version";
+ НоваяСтрока.Значение = ВерсияАпи;
+
+ НоваяСтрока = ТаблицаПараметров.Добавить();
+ НоваяСтрока.Ключ = "oauth_signature_method";
+ НоваяСтрока.Значение = МетодХэширования;
+
+ НоваяСтрока = ТаблицаПараметров.Добавить();
+ НоваяСтрока.Ключ = "oauth_timestamp";
+ НоваяСтрока.Значение = ТекущаяДатаUNIX;
+
+ НоваяСтрока = ТаблицаПараметров.Добавить();
+ НоваяСтрока.Ключ = "oauth_nonce";
+ НоваяСтрока.Значение = ТекущаяДатаUNIX;
+
+ Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
+
+ СтрокаТаблицы.Ключ = КодироватьСтроку(СтрокаТаблицы.Ключ, СпособКодированияСтроки.КодировкаURL);
+ СтрокаТаблицы.Значение = КодироватьСтроку(СтрокаТаблицы.Значение, СпособКодированияСтроки.КодировкаURL);
+
+ КонецЦикла;
+
+ ТаблицаПараметров.Сортировать("Ключ");
+
+ Для Каждого СтрокаТаблицы Из ТаблицаПараметров Цикл
+
+ СтрокаСигнатуры = СтрокаСигнатуры
+ + СтрокаТаблицы.Ключ
+ + "="
+ + СтрокаТаблицы.Значение
+ + "&";
+
+ КонецЦикла;
+
+ СтрокаСигнатуры = Лев(СтрокаСигнатуры, СтрДлина(СтрокаСигнатуры) - 1);
+ СтрокаСигнатуры = вРег(ВидЗапроса)
+ + "&"
+ + КодироватьСтроку(URL, СпособКодированияСтроки.КодировкаURL)
+ + "&"
+ + КодироватьСтроку(СтрокаСигнатуры, СпособКодированияСтроки.КодировкаURL);
+
+ Подпись = КодироватьСтроку(Параметры["oauth_consumer_secret"], СпособКодированияСтроки.КодировкаURL)
+ + "&"
+ + КодироватьСтроку(Параметры["oauth_token_secret"], СпособКодированияСтроки.КодировкаURL);
+
+ Сигнатура = OPI_Криптография.HMAC(ПолучитьДвоичныеДанныеИзСтроки(Подпись)
+ , ПолучитьДвоичныеДанныеИзСтроки(СтрокаСигнатуры)
+ , ХешФункция.SHA1
+ , 64);
+
+ Сигнатура = КодироватьСтроку(Base64Строка(Сигнатура), СпособКодированияСтроки.КодировкаURL);
+
+ Разделитель = """,";
+ ЗаголовокАвторизации = ЗаголовокАвторизации
+ + "OAuth "
+ + "oauth_consumer_key=""" + Параметры[OCK] + Разделитель
+ + "oauth_token=""" + Параметры[OTK] + Разделитель
+ + "oauth_signature_method=""" + МетодХэширования + Разделитель
+ + "oauth_timestamp=""" + ТекущаяДатаUNIX + Разделитель
+ + "oauth_nonce=""" + ТекущаяДатаUNIX + Разделитель
+ + "oauth_version=""" + ВерсияАпи + Разделитель
+ + "oauth_signature=""" + Сигнатура;
+
+ СоответствиеЗаголовка = Новый Соответствие;
+ СоответствиеЗаголовка.Вставить("authorization", ЗаголовокАвторизации);
+
+ Возврат СоответствиеЗаголовка;
+
+КонецФункции
+
+Функция СоздатьЗаголовокАвторизацииV2(Знач Параметры)
+
+ СоответствиеВозврата = Новый Соответствие;
+ СоответствиеВозврата.Вставить("Authorization", "Bearer " + Параметры["access_token"]);
+
+ Возврат СоответствиеВозврата;
+
+КонецФункции
+
+Функция ПолучитьСтатусОбработки(Знач Параметры, Знач Поля, Знач URL)
+
+ ProcessingInfo = "processing_info";
+ Авторизация = СоздатьЗаголовокАвторизацииV1(Параметры, Поля, "POST", URL);
+
+ Ответ = OPI_Инструменты.Post(URL, Поля, Авторизация, Ложь);
+ Информация = Ответ[ProcessingInfo];
+
+ Если Не ЗначениеЗаполнено(Информация) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ СтатусОбработки = Информация["state"];
+
+ Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда
+ Возврат Ответ;
+ Иначе
+ Возврат СтатусОбработки;
+ КонецЕсли;
+
+КонецФункции
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_VK.os b/ru/OInt/core/Modules/OPI_VK.os
index 067ed51ce6..deab0f9880 100644
--- a/ru/OInt/core/Modules/OPI_VK.os
+++ b/ru/OInt/core/Modules/OPI_VK.os
@@ -1,2190 +1,2190 @@
-// Расположение OS: ./OInt/core/Modules/OPI_VK.os
-// Библиотека: VK
-// Команда CLI: vk
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-// Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры()
-// и почитать комментарии
-
-// BSLLS:NumberOfOptionalParams-off
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:NumberOfOptionalParams-off
-// BSLLS:UsingServiceTag-off
-// BSLLS:UnusedLocalVariable-off
-
-//@skip-check method-too-many-params
-//@skip-check wrong-string-literal-content
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область ПолучениеТокена
-
-// Создать ссылку получения токена
-// Получение ссылки для интерактивного получения токена (access_token), который необходим
-// для дальнейших действий
-//
-// Параметры:
-// app_id - Строка,Число - app_id из настроек приложения - app
-//
-// Возвращаемое значение:
-// Строка - URL, по которому необходимо перейти в браузере
-Функция СоздатьСсылкуПолученияТокена(Знач App_id) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(App_id);
-
- // access_token нужно будет забрать из параметра в строке адреса браузера
- Возврат "https://oauth.vk.com/authorize?client_id=" + App_id
- + "&scope=offline,wall,groups,photos,stats,stories,ads,market,video"
- + "&v=5.131&response_type=token&redirect_uri=https://api.vk.com/blank.html";
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСГруппой
-
-// Создать пост
-// Создает пост с картинками
-//
-// Параметры:
-// Текст - Строка - Текст поста - text
-// МассивКартинок - Массив из Строка,ДвоичныеДанные - Массив картинок - pictures
-// Реклама - Булево - Признак ""Это реклама"" - ad
-// СсылкаПодЗаписью - Строка - Ссылка (URL) под записью - url
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьПост(Знач Текст
- , Знач МассивКартинок
- , Знач Реклама = Ложь
- , Знач СсылкаПодЗаписью = ""
- , Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКартинок);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- МассивВложений = Новый Массив;
-
- Для Каждого КартинкаПоста Из МассивКартинок Цикл
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- ОтветСоответствие = ПолучитьСоответствиеКартинки(КартинкаПоста, Параметры_, "Пост");
-
- OwnerId = ОтветСоответствие.Получить("owner_id");
- ObjectId = ОтветСоответствие.Получить("id");
-
- Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда
- Возврат ОтветСоответствие;
- КонецЕсли;
-
- OwnerId = OPI_Инструменты.ЧислоВСтроку(OwnerId);
- ObjectId = OPI_Инструменты.ЧислоВСтроку(ObjectId);
-
- ФотоID = "photo" + OwnerId + "_" + ObjectId;
-
- МассивВложений.Добавить(ФотоID);
-
- КонецЦикла;
-
- Ответ = СоздатьСоставнойПост(Текст, МассивВложений, Реклама, СсылкаПодЗаписью, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Создать составной пост
-// Создает пост на основе массива идетификаторов объектов (картинок, видео и др.)
-//
-// Параметры:
-// Текст - Строка - Текст поста - text
-// Объекты - Массив из Строка - Массив идентификаторов вида photo123_123 - objects
-// Реклама - Булево - Признак ""Это реклама"" - ad
-// СсылкаПодЗаписью - Строка - Ссылка (URL) под записью - url
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьСоставнойПост(Знач Текст
- , Знач Объекты
- , Знач Реклама = Ложь
- , Знач СсылкаПодЗаписью = ""
- , Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(СсылкаПодЗаписью);
- OPI_ПреобразованиеТипов.ПолучитьБулево(Реклама);
-
- Параметры = ПолучитьСтандартныеПараметры(Параметры);
- СтрокаВложений = СтрСоединить(Объекты, ",");
- СтрокаВложений = СтрокаВложений + СсылкаПодЗаписью;
-
- Параметры.Вставить("message" , Текст);
- Параметры.Вставить("attachments" , СтрокаВложений);
- Параметры.Вставить("mark_as_ads" , ?(Реклама, 1, 0));
- Параметры.Вставить("close_comments" , ?(Реклама, 1, 0));
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить пост
-// Удаляет пост по id
-//
-// Параметры:
-// IDПоста - Строка,Число - ID поста - post
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция УдалитьПост(Знач IDПоста, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("post_id", IDПоста);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.delete", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Создать опрос
-// Создает опрос с вариантами ответа
-//
-// Параметры:
-// Вопрос - Строка - Вопрос опроса - question
-// МассивОтветов - Массив из Строка - Массив вариантов ответа - options
-// Картинка - Строка,ДвоичныеДанные - Картинка опроса - picture
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьОпрос(Знач Вопрос, Знач МассивОтветов, Знач Картинка = "", Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Вопрос);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Response = "response";
-
- Если ЗначениеЗаполнено(Картинка) Тогда
-
- Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Опрос");
-
- Фото = Ответ.Получить(Response);
-
- Если ЗначениеЗаполнено(Фото) Тогда
-
- IDФото = Фото["id"];
-
- Если Не ЗначениеЗаполнено(IDФото) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- Иначе
- Возврат Ответ;
- КонецЕсли;
-
- КонецЕсли;
-
- Параметры_.Вставить("is_anonymous", 1);
- Параметры_.Вставить("is_multiple" , 0);
-
- Ответы = СтрСоединить(МассивОтветов, """,""");
- Ответы = "[""" + Ответы + """]";
-
- Параметры_.Вставить("add_answers", Ответы);
- Параметры_.Вставить("photo_id" , OPI_Инструменты.ЧислоВСтроку(IDФото));
- Параметры_.Вставить("question" , Вопрос);
-
- Опрос = OPI_Инструменты.Get("api.vk.com/method/polls.create", Параметры_);
- ОпросСоответствие = Опрос.Получить(Response);
-
- Если Не ЗначениеЗаполнено(ОпросСоответствие) Тогда
- Возврат Опрос;
- КонецЕсли;
-
- OwnerId = ОпросСоответствие.Получить("owner_id");
- ObjectId = ОпросСоответствие.Получить("id");
-
- Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда
- Возврат Опрос;
- КонецЕсли;
-
- ОпросID = "poll"
- + OPI_Инструменты.ЧислоВСтроку(OwnerId)
- + "_"
- + OPI_Инструменты.ЧислоВСтроку(ObjectId);
-
- Параметры_.Вставить("attachments", ОпросID);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Создать альбом
-// Создает альбом для хранения картинок
-//
-// Параметры:
-// Наименование - Строка - Наименование альбома - title
-// Описание - Строка - Описание альбома - description
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьАльбом(Знач Наименование, Знач Описание = "", Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-
- Параметры_.Вставить("title" , Наименование);
- Параметры_.Вставить("description" , Описание);
- Параметры_.Вставить("upload_by_admins_only", 1);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.createAlbum", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить альбом
-// Удаляет ранее созданный альбом
-//
-// Параметры:
-// IDАльбома - Строка,Число - ID альбома - album
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция УдалитьАльбом(Знач IDАльбома, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("album_id", OPI_Инструменты.ЧислоВСтроку(IDАльбома));
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.deleteAlbum", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Создать историю
-// Создает историю из картинки
-//
-// Параметры:
-// Картинка - Строка,ДвоичныеДанные - Фон истории - picture
-// URL - Строка - URL для кнопки под историей - url
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьИсторию(Знач Картинка, Знач URL = "", Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("link_text" , "more");
- Параметры_.Вставить("link_url" , URL);
- Параметры_.Вставить("add_to_news", "1");
-
- Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "История");
- Возврат Ответ;
-
-КонецФункции
-
-// Сохранить картинку в альбом
-// Сохраняет картинку в альбом сообщества
-//
-// Параметры:
-// IDАльбома - Строка,Число - ID альбома - album
-// Картинка - ДвоичныеДанные,Строка - Файл картинки - picture
-// Описание - Строка - Описание картинки - description
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СохранитьКартинкуВАльбом(Знач IDАльбома, Знач Картинка, Знач Описание = "", Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-
- Параметры_.Вставить("album_id", IDАльбома);
- Параметры_.Вставить("caption" , Описание);
-
- Возврат ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Альбом");
-
-КонецФункции
-
-// Удалить картинку
-// Удалить картинку из альбома
-//
-// Параметры:
-// IDКартинки - Строка,Число - ID картинки - pictureid
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция УдалитьКартинку(Знач IDКартинки, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКартинки);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("photo_id", IDКартинки);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.delete", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Загрузить видео на сервер
-// Загружает видео в группу с возможностью его дальнейшего использования
-//
-// Параметры:
-// Видео - Строка, ДвоичныеДанные - Файл видео - file
-// Наименование - Строка - Наименование видео - title
-// Описание - Строка - Описание видео - description
-// Альбом - Строка - ID альбома, если необходимо - album
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ЗагрузитьВидеоНаСервер(Знач Видео
- , Знач Наименование
- , Знач Описание = ""
- , Знач Альбом = ""
- , Знач Параметры = "") Экспорт
-
- Строка_ = "Строка";
- Параметры = ПолучитьСтандартныеПараметры(Параметры);
-
- OPI_Инструменты.ДобавитьПоле("name" , Наименование, Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("description", Описание , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("album_id" , Альбом , Строка_, Параметры);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/video.save", Параметры);
-
- Результат = Ответ["response"];
-
- Если Не ЗначениеЗаполнено(Результат) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- URL = Результат["upload_url"];
-
- Если Не ЗначениеЗаполнено(URL) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- СоответствиеФайлов = Новый Соответствие;
- OPI_Инструменты.ДобавитьПоле("video_file.mp4", Видео, "ДвоичныеДанные", СоответствиеФайлов);
-
- РазмерДанных = СоответствиеФайлов["video_file.mp4"].Размер();
- РазмерДанных = OPI_Инструменты.ЧислоВСтроку(РазмерДанных);
-
- Ответ = OPI_Инструменты.PostMultipart(URL, , СоответствиеФайлов, "video/mp4");
-
- Возврат Ответ;
-
-КонецФункции
-
-// Загрузить фото на сервер
-// Загружает фото на сервер для его дальнейшего использования
-//
-// Параметры:
-// Картинка - Строка, ДвоичныеДанные - Файл картинки - file
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-// Вид - Строка - Вид загрузки (Пост, Товар, История, Опрос, Прочее) - type
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ЗагрузитьФотоНаСервер(Знач Картинка, Знач Параметры = "", Знач Вид = "Пост") Экспорт
-
- Параметры = ПолучитьСтандартныеПараметры(Параметры);
- Метод = ОпределитьМетодЗагрузкиИзображений(Вид);
- Файлы = Новый Соответствие;
-
- Response = "response";
- URL = "api.vk.com/method/";
- Загрузка = URL + Метод["Загрузка"];
- Сохранение = URL + Метод["Сохранение"];
-
- Если ТипЗнч(Картинка) = Тип("Строка") Тогда
- КлючКартинка = СтрЗаменить(Картинка, ".", "___");
- OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка);
- Иначе
- КлючКартинка = "image___jpeg";
- КонецЕсли;
-
- Файлы.Вставить(КлючКартинка, Картинка);
-
- Для Н = 1 По 5 Цикл
-
- Ответ = OPI_Инструменты.Get(Загрузка, Параметры);
- Результат = Ответ[Response];
-
- Если ЗначениеЗаполнено(Результат) Тогда
-
- URL = Результат["upload_url"];
-
- Если Не ЗначениеЗаполнено(URL) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- Иначе
- Возврат Ответ;
- КонецЕсли;
-
- Параметры.Вставить("upload_url", URL);
- Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, Файлы);
-
- Если ТипЗнч(Ответ) = Тип("Соответствие") Тогда
- Прервать;
- КонецЕсли;
-
- КонецЦикла;
-
- Если ТипЗнч(Ответ) <> Тип("Соответствие") Тогда
- Возврат ПолучитьСтрокуИзДвоичныхДанных(Ответ);
- КонецЕсли;
-
- ЗаполнитьПараметрыЗагрузкиФото(Метод, Ответ, Параметры);
-
- Ответ = OPI_Инструменты.Get(Сохранение, Параметры);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСОбсуждениями
-
-// Создать обсуждение
-// Создает новое обсуждение
-//
-// Параметры:
-// Наименование - Строка - Наименование обсуждения - title
-// ТекстПервогоСообщения - Строка - Текст первого сообщения - text
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьОбсуждение(Знач Наименование, Знач ТекстПервогоСообщения, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекстПервогоСообщения);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("title", Наименование);
- Параметры_.Вставить("text" , ТекстПервогоСообщения);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/board.addTopic", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Закрыть обсуждение
-// Закрывает или удаляет обсуждение
-//
-// Параметры:
-// IDОбсуждения - Строка,Число - ID обсуждения - topic
-// УдалитьПолностью - Булево - Удалить полностью (Истина) или закрыть - remove
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ЗакрытьОбсуждение(Знач IDОбсуждения, Знач УдалитьПолностью = Ложь, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения);
- OPI_ПреобразованиеТипов.ПолучитьБулево(УдалитьПолностью);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("topic_id", IDОбсуждения);
-
- Метод = ?(УдалитьПолностью, "deleteTopic", "closeTopic");
- Ответ = OPI_Инструменты.Get("api.vk.com/method/board." + Метод, Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Открыть обсуждение
-// Открывает ранее закрытое обсуждение
-//
-// Параметры:
-// IDОбсуждения - Строка,Число - ID обсуждения - topic
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ОткрытьОбсуждение(Знач IDОбсуждения, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("topic_id", IDОбсуждения);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/board.openTopic", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Написать в обсуждение
-// Добавляет сообщение в обсуждение от имени группы
-//
-// Параметры:
-// IDОбсуждения - Строка,Число - ID обсуждения - topic
-// Текст - Строка - Текст сообщения - text
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция НаписатьВОбсуждение(Знач IDОбсуждения, Знач Текст, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("topic_id", IDОбсуждения);
- Параметры_.Вставить("message" , Текст);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/board.createComment", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область ИнтерактивныеДействия
-
-// Поставить лайк
-// Ставит лайк на пост
-//
-// Параметры:
-// IDПоста - Строка,Число - ID поста - post
-// IDСтены - Строка,Число - ID стены расположения поста - wall
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ПоставитьЛайк(Знач IDПоста, Знач IDСтены = "", Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- IDСтены = ?(ЗначениеЗаполнено(IDСтены), IDСтены, Параметры_["owner_id"]);
- ОбъектВК = "wall" + IDСтены + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста);
-
- Параметры_.Вставить("type" , "post");
- Параметры_.Вставить("object" , ОбъектВК);
- Параметры_.Вставить("item_id" , OPI_Инструменты.ЧислоВСтроку(IDПоста));
- Параметры_.Вставить("owner_id" , OPI_Инструменты.ЧислоВСтроку(IDСтены));
- Параметры_.Вставить("from_group" , 0);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/likes.add", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Сделать репост
-// Делает репост записи
-//
-// Параметры:
-// IDПоста - Строка,Число - ID поста - post
-// IDСтены - Строка,Число - ID стены расположения поста - from
-// ЦелеваяСтена - Строка,Число - ID целевой стены или группы - to
-// Рекламный - Булево - Признак рекламного поста - ad
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СделатьРепост(Знач IDПоста
- , Знач IDСтены = ""
- , Знач ЦелеваяСтена = ""
- , Знач Рекламный = Ложь
- , Знач Параметры = "") Экспорт
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- GroupId = Параметры_["group_id"];
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦелеваяСтена);
- OPI_ПреобразованиеТипов.ПолучитьБулево(Рекламный);
-
- Источник = ?(ЗначениеЗаполнено(IDСтены), IDСтены, GroupId);
- Приемник = ?(ЗначениеЗаполнено(ЦелеваяСтена), ЦелеваяСтена, GroupId);
-
- Параметры_.Вставить("object" , "wall" + Источник + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста));
- Параметры_.Вставить("group_id" , СтрЗаменить(Приемник, "-", ""));
- Параметры_.Вставить("mark_as_ads" , ?(Рекламный, 1, 0));
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.repost", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Написать сообщение
-// Написать сообщение пользователю в диалоге сообщества
-//
-// Параметры:
-// Текст - Строка - Текст сообщения - text
-// IDПользователя - Строка - ID пользователя адресата - user
-// Communitytoken - Строка - Токен бота чата сообщества, котрый можно получить в настройках - ct
-// Клавиатура - Строка - JSON клавиатуры. См.СформироватьКлавиатуру - keyboard
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция НаписатьСообщение(Знач Текст
- , Знач IDПользователя
- , Знач Communitytoken
- , Знач Клавиатура = ""
- , Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Communitytoken);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Клавиатура);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("access_token", Communitytoken);
-
- Параметры_.Вставить("user_id" , IDПользователя);
- Параметры_.Вставить("peer_id" , IDПользователя);
- Параметры_.Вставить("parse_mode" , "Markdown");
- Параметры_.Вставить("random_id" , 0);
- Параметры_.Вставить("message" , Текст);
-
- Если ЗначениеЗаполнено(Клавиатура) Тогда
- Параметры_.Вставить("keyboard", Клавиатура);
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/messages.send", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Написать комментарий
-// Создает комментарий под выбранной записью
-//
-// Параметры:
-// IDПоста - Строка,Число - ID целевого поста - post
-// IDСтены - Строка,Число - ID стены расположения поста - wall
-// Текст - Строка - Текст комментария - text
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция НаписатьКомментарий(Знач IDПоста, Знач IDСтены, Знач Текст, Знач Параметры = "") Экспорт
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- GroupId = Параметры_["group_id"];
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
-
- Параметры_.Вставить("owner_id" , IDСтены);
- Параметры_.Вставить("from_group" , GroupId);
- Параметры_.Вставить("post_id" , IDПоста);
- Параметры_.Вставить("message" , Текст);
-
- Параметры_.Удалить("group_id");
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.createComment", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Сократить ссылку
-// Создает сокращенный URL из обычного
-//
-// Параметры:
-// URL - Строка - URL для сокращения - url
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Строка - Сокращенный URL
-Функция СократитьСсылку(Знач URL, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
-
- Response = "response";
- Параметры_ = Новый Структура;
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("url", URL);
-
- Ответ = OPI_Инструменты.Get("https://api.vk.com/method/utils.getShortLink", Параметры_);
- Результат = Ответ[Response];
-
- Если ЗначениеЗаполнено(Результат) Тогда
-
- URL = Результат["short_url"];
-
- Если ЗначениеЗаполнено(URL) Тогда
- Возврат URL;
- Иначе
- Возврат Ответ;
- КонецЕсли;
-
- Иначе
- Возврат Ответ;
- КонецЕсли;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область Статистика
-
-// Получить статистику
-// Получает общую статистику сообщества за период
-//
-// Параметры:
-// ДатаНачала - Дата - Дата начала периода - datefrom
-// ДатаОкончания - Дата - Дата окончания периода - dateto
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ПолучитьСтатистику(Знач ДатаНачала, Знач ДатаОкончания, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьДату(ДатаНачала);
- OPI_ПреобразованиеТипов.ПолучитьДату(ДатаОкончания);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-
- ДатаНачала = OPI_Инструменты.UNIXTime(ДатаНачала);
- ДатаОкончания = OPI_Инструменты.UNIXTime(ДатаОкончания);
-
- Параметры_.Вставить("timestamp_from", ДатаНачала);
- Параметры_.Вставить("timestamp_to" , ДатаОкончания);
- Параметры_.Вставить("stats_groups" , "visitors, reach, activity");
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/stats.get", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить статистику по постам
-// Получает статистику в разрезе постов
-//
-// Параметры:
-// МассивИДПостов - Массив из Строка,Число - Массив ID постов - posts
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Массив из Произвольный - Массив данных статистики по постам
-Функция ПолучитьСтатистикуПостов(Знач МассивИДПостов, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИДПостов);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- МассивОтветов = Новый Массив;
- МассивНабора = Новый Массив;
- МаксимумПостов = 30;
- Response = "response";
-
- Для Каждого Пост Из МассивИДПостов Цикл
-
- МассивНабора.Добавить(OPI_Инструменты.ЧислоВСтроку(Пост));
-
- Если МассивНабора.Количество() = МаксимумПостов Тогда
-
- СтрокаНомеров = СтрСоединить(МассивНабора, ",");
- Параметры_.Вставить("post_ids", СтрокаНомеров);
-
- Статистика = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_);
- МассивСтатистики = Статистика[Response];
-
- Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл
- МассивОтветов.Добавить(ЭлементСтатистики);
- КонецЦикла;
-
- МассивНабора = Новый Массив;
-
- КонецЕсли;
-
- КонецЦикла;
-
- СтрокаНомеров = СтрСоединить(МассивНабора, ",");
- Параметры_.Вставить("post_ids", СтрокаНомеров);
-
- Статистика = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_);
- МассивСтатистики = Статистика[Response];
-
- Если ТипЗнч(МассивСтатистики) = Тип("Массив") Тогда
- Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл
- МассивОтветов.Добавить(ЭлементСтатистики);
- КонецЦикла;
- КонецЕсли;
-
- Возврат МассивОтветов;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСРекламнымКабинетом
-
-// Создать рекламную кампанию
-// Создает кампанию в выбранном рекламном кабинете
-//
-// Параметры:
-// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet
-// Наименование - Строка - Наименование кампании - title
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьРекламнуюКампанию(Знач IDКабинета, Знач Наименование, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
-
- ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
- КонечнаяДата = ДобавитьМесяц(ТекущаяДата, 24);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("account_id", IDКабинета);
-
- МассивСтруктур = Новый Массив;
- ДатаСтарт = OPI_Инструменты.UNIXTime(ТекущаяДата);
- ДатаСтоп = OPI_Инструменты.UNIXTime(КонечнаяДата);
-
- СтруктураКампании = Новый Структура;
- СтруктураКампании.Вставить("type" , "promoted_posts");
- СтруктураКампании.Вставить("name" , Наименование);
- СтруктураКампании.Вставить("day_limit" , 0);
- СтруктураКампании.Вставить("all_limit" , 0);
- СтруктураКампании.Вставить("start_time" , ДатаСтарт);
- СтруктураКампании.Вставить("stop_time" , ДатаСтоп);
- СтруктураКампании.Вставить("status" , 1);
-
- МассивСтруктур.Добавить(СтруктураКампании);
-
- JSONДата = OPI_Инструменты.JSONСтрокой(МассивСтруктур);
-
- Параметры_.Вставить("data", JSONДата);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.createCampaigns", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Создать рекламное объявление
-// Создает рекламное объявление на основе поста
-//
-// Параметры:
-// НомерКампании - Строка,Число - ID рекламной кампании - campaign
-// ДневнойЛимит - Строка,Число - Дневной лимит в рублях - limit
-// НомерКатегории - Строка,Число - Номер рекламной категории - category
-// IDПоста - Строка,Число - ID поста, используемого в качетсве рекламы - post
-// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьРекламноеОбъявление(Знач НомерКампании
- , Знач ДневнойЛимит
- , Знач НомерКатегории
- , Знач IDПоста
- , Знач IDКабинета
- , Знач Параметры = "") Экспорт
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- GroupId = Параметры_["group_id"];
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКампании);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ДневнойЛимит);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКатегории);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета);
-
- Линк = "https://vk.com/wall-" + GroupId + "_" + IDПоста;
-
- МассивСтруктур = Новый Массив;
- СтруктураКампании = Новый Структура;
- СтруктураКампании.Вставить("campaign_id" , НомерКампании);
- СтруктураКампании.Вставить("ad_format" , 9);
- СтруктураКампании.Вставить("conversion_event_id" , 1);
- СтруктураКампании.Вставить("autobidding" , 1);
- СтруктураКампании.Вставить("cost_type" , 3);
- СтруктураКампании.Вставить("goal_type" , 2);
- СтруктураКампании.Вставить("ad_platform" , "all");
- СтруктураКампании.Вставить("publisher_platforms" , "vk");
- СтруктураКампании.Вставить("publisher_platforms_auto" , "1");
- СтруктураКампании.Вставить("day_limit" , ДневнойЛимит);
- СтруктураКампании.Вставить("all_limit" , "0");
- СтруктураКампании.Вставить("category1_id" , НомерКатегории);
- СтруктураКампании.Вставить("age_restriction" , 0);
- СтруктураКампании.Вставить("status" , 1);
- СтруктураКампании.Вставить("name" , "Объявление");
- СтруктураКампании.Вставить("link_url" , Линк);
-
- МассивСтруктур.Добавить(СтруктураКампании);
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина);
-
- Параметры_.Вставить("data" , МассивСтруктур);
- Параметры_.Вставить("account_id" , IDКабинета);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.createAds", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Приостановить рекламное объявление
-// Приостанавливает показ рекламного объявления
-//
-// Параметры:
-// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet
-// IDОбъявления - Строка,Число - ID объявления - adv
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ПриостановитьРекламноеОбъявление(Знач IDКабинета, Знач IDОбъявления, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбъявления);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-
- Параметры_.Вставить("account_id", IDКабинета);
-
- МассивСтруктур = Новый Массив;
- СтруктураКампании = Новый Структура;
-
- СтруктураКампании.Вставить("ad_id" , IDОбъявления);
- СтруктураКампании.Вставить("status" , 0);
-
- МассивСтруктур.Добавить(СтруктураКампании);
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина);
-
- Параметры_.Вставить("data", МассивСтруктур);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.updateAds", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить список рекламных категорий
-// Получает список id рекламных категорий для создания рекламного объявления
-//
-// Параметры:
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ПолучитьСписокРекламныхКатегорий(Знач Параметры = "") Экспорт
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.getCategories", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСТоварами
-
-// Получить список категорий товаров
-// Получает список ID товарных категорий для указания при создании товара
-//
-// Параметры:
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из Строка - Ключ - ID, Значение - Имя
-Функция ПолучитьСписокКатегорийТоваров(Знач Параметры = "") Экспорт
-
- Response = "response";
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_);
- Результат = Ответ[Response];
-
- Если ЗначениеЗаполнено(Результат) Тогда
-
- Количество = Результат["count"];
-
- Если Не ЗначениеЗаполнено(Количество) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- Иначе
- Возврат Ответ;
- КонецЕсли;
-
- Параметры_.Вставить("count", Количество);
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_);
- Результат = Ответ[Response];
-
- Если ЗначениеЗаполнено(Результат) Тогда
-
- Категории = Результат["items"];
-
- Если Не ЗначениеЗаполнено(Категории) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- Иначе
- Возврат Ответ;
- КонецЕсли;
-
- СоответствиеКатегорий = Новый Соответствие;
-
- Для Каждого Категория Из Категории Цикл
- СоответствиеКатегорий.Вставить(Категория["id"], Категория["name"]);
- КонецЦикла;
-
- Возврат СоответствиеКатегорий;
-
-КонецФункции
-
-// Получить список товаров
-// Получает список товаров сообщества
-//
-// Параметры:
-// Подборка - Строка,Число - ID подборки, если нужен отбор - sel
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - Массив соответствий товаров
-Функция ПолучитьСписокТоваров(Знач Подборка = "", Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("count" , 200);
- Параметры_.Вставить("extended" , 1);
- Параметры_.Вставить("with_disabled", 1);
-
- Если ЗначениеЗаполнено(Подборка) Тогда
- Параметры_.Вставить("album_id", Подборка);
- КонецЕсли;
-
- МассивТоваров = Новый Массив;
- ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры_);
-
- Возврат МассивТоваров;
-
-КонецФункции
-
-// Получить товары по ID
-// Получает информацию о товарах по массиву ID
-//
-// Параметры:
-// Товары - Строка, Массив Из Строка - Массив ID товаров - items
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ПолучитьТоварыПоИД(Знач Товары, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Товары);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- СтрокаТоваров = "";
- Owner = "owner_id";
-
- Для Каждого Товар Из Товары Цикл
- ТекущийТовар = Параметры_[Owner] + "_" + Товар;
- ТекущийТовар = OPI_Инструменты.ЧислоВСтроку(ТекущийТовар);
- СтрокаТоваров = СтрокаТоваров + ТекущийТовар + ",";
- КонецЦикла;
-
- СтрокаТоваров = Лев(СтрокаТоваров, СтрДлина(СтрокаТоваров) - 1);
- Параметры_.Вставить("item_ids", СтрокаТоваров);
- Параметры_.Вставить("extended", 1);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getById", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Добавить товар
-// Добавляет новый товар в каталог сообщества
-//
-// Параметры:
-// ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь
-// Подборка - Строка - ID подборка для помещения товара, если необходимо - sel
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ДобавитьТовар(Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт
- Возврат УправлениеТоваром(ОписаниеТовара, , Подборка, Параметры);
-КонецФункции
-
-// Изменить товар
-// Изменяет ранее созданный товар
-//
-// Параметры:
-// Товар - Число,Строка - Идентификатор изменяемого товара - item
-// ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь
-// Подборка - Строка - Идентификатор новой подборки, если необходимо - sel
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ИзменитьТовар(Знач Товар, Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт
- Возврат УправлениеТоваром(ОписаниеТовара, Товар, Подборка, Параметры);
-КонецФункции
-
-// Удалить товар
-// Удаляет ранее созданный товар
-//
-// Параметры:
-// Товар - Строка,Число - ID товара - item
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция УдалитьТовар(Знач Товар, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("item_id", Товар);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.delete", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Сгруппировать товары
-// Группирует товары на основе одинаковых наборов свойств
-//
-// Параметры:
-// МассивТоваров - Массив Из Строка - Массив ID товаров - items
-// СуществующаяГруппа - Строка - ID существующей группы, если необходимо - sellgroup
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СгруппироватьТовары(Знач МассивТоваров, Знач СуществующаяГруппа = "", Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(СуществующаяГруппа);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- МассивТоваров_ = Новый Массив;
-
- Для Каждого Товар Из МассивТоваров Цикл
- МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар));
- КонецЦикла;
-
- Товары = СтрСоединить(МассивТоваров_, ",");
-
- Параметры_.Вставить("item_ids", Товары);
-
- Если ЗначениеЗаполнено(СуществующаяГруппа) Тогда
- Параметры_.Вставить("item_group_id", СуществующаяГруппа);
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.groupItems", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить описание товара. !NOCLI
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - Пустое описание товара:
-// *Имя - Строка - Имя товара
-// *Описание - Строка - Описание товара
-// *Категория - Строка - См. ПолучитьСписокКатегорийТоваров
-// *Цена - Число - Цена товара
-// *СтараяЦена - Число - Для отображения скидки/изменения цены
-// *ОсновноеФото - Строка,ДвоичныеДанные - Двоичные данные или путь к фото
-// *URL - Строка - Ссылка на страницу сайта магазина
-// *ДополнительныеФото - Массив Из Строка - Двоичные данные или пути к фото
-// *ЗначенияСвойств - Массив Из Строка - См.ДобавитьВариантСвойстваТовара
-// *ГлавныйВГруппе - Булево - Главный в группе, если есть в группе
-// *Ширина - Число - Ширина товара в мм.
-// *Высота - Число - Высота товара в мм.
-// *Глубина - Число - Глубина товара в мм.
-// *Вес - Число - Вес в гр.
-// *SKU - Строка - SKU
-// *ДоступныйОстаток - Число - Остаток. -1 - не ограничено
-Функция ПолучитьОписаниеТовара() Экспорт
-
- Товар = Новый Соответствие();
- Товар.Вставить("Имя" , "Новый товар"); // Имя товара
- Товар.Вставить("Описание" , "Описание товара"); // Описание товара
- Товар.Вставить("Категория" , "20173"); // См ПолучитьСписокКатегорийТоваров()
- Товар.Вставить("Цена" , 1); // Цена.
- Товар.Вставить("СтараяЦена" , Неопределено); // Для отражения изменения цены
- Товар.Вставить("ОсновноеФото" , Неопределено); // ДД или путь к осн. фото
- Товар.Вставить("URL" , Неопределено); // Ссылка на страницу магазина
- Товар.Вставить("ДополнительныеФото" , Новый Массив); // Массив путей или ДД для доп. фото
- Товар.Вставить("ЗначенияСвойств" , Новый Массив); // Значения свойств (варианты). Максимум 2
- Товар.Вставить("ГлавныйВГруппе" , Ложь); // Сделать главным в своей группе
- Товар.Вставить("Ширина" , Неопределено); // В миллиметрах
- Товар.Вставить("Высота" , Неопределено); // В миллиметрах
- Товар.Вставить("Глубина" , Неопределено); // В миллиметрах
- Товар.Вставить("Вес" , Неопределено); // В граммах
- Товар.Вставить("SKU" , Неопределено); // Артикул
- Товар.Вставить("ДоступныйОстаток" , 1);
-
- Возврат Товар;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСПодборкамиТоваров
-
-// Получить список подборок
-// Получает список подборок товаров
-//
-// Параметры:
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - Массив соответствий подборок
-Функция ПолучитьСписокПодборок(Знач Параметры = "") Экспорт
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("count", 100);
-
- МассивАльбомов = Новый Массив;
- ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры_);
-
- Возврат МассивАльбомов;
-
-КонецФункции
-
-// Получить подборки по ID
-// Получить список подборок по массиву ID
-//
-// Параметры:
-// Подборки - Строка, Массив Из Строка - ID подборок - sels
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ПолучитьПодборкиПоИД(Знач Подборки, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Подборки);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Подборки_ = Новый Массив;
- СтрокаПодборок = "";
-
- Для Каждого Подборка Из Подборки Цикл
- Подборки_.Добавить(OPI_Инструменты.ЧислоВСтроку(Подборка));
- КонецЦикла;
-
- СтрокаПодборок = СтрСоединить(Подборки_, ",");
-
- Параметры_.Вставить("album_ids", СтрокаПодборок);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getAlbumById", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Создать подборку товаров
-// Создает пустую подборку товаров
-//
-// Параметры:
-// Название - Строка - Название подборки - title
-// Картинка - Строка,ДвоичныеДанные - Файл картинки - picture
-// Основная - Булево - Основная - main
-// Скрытая - Булево - Скрытая - hidden
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьПодборкуТоваров(Знач Название
- , Знач Картинка
- , Знач Основная = Ложь
- , Знач Скрытая = Ложь
- , Знач Параметры = "") Экспорт
-
- Возврат УправлениеПодборкой(Название, Картинка, , Основная, Скрытая, Параметры);
-
-КонецФункции
-
-// Изменить подборку товаров
-// Изменяет свойства подборки товаров
-//
-// Параметры:
-// Название - Строка - Новое название подборки - title
-// Подборка - Строка - ID подборки - sel
-// Картинка - Строка,ДвоичныеДанные - Новая картинка подборки - picture
-// Основная - Булево - Основная - main
-// Скрытая - Булево - Скрытая - hidden
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ИзменитьПодборкуТоваров(Знач Название
- , Знач Подборка
- , Знач Картинка = ""
- , Знач Основная = Ложь
- , Знач Скрытая = Ложь
- , Знач Параметры = "") Экспорт
-
- Возврат УправлениеПодборкой(Название, Картинка, Подборка, Основная, Скрытая, Параметры);
-
-КонецФункции
-
-// Добавить товар в подборку
-// Добавляет товар в подборку
-//
-// Параметры:
-// МассивТоваров - Массив из Строка, Число - Массив товаров или товар - items
-// Подборка - Строка - ID подборки - sel
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ДобавитьТоварВПодборку(Знач МассивТоваров, Знач Подборка, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- МассивТоваров_ = Новый Массив;
-
- Для Каждого Товар Из МассивТоваров Цикл
- МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар));
- КонецЦикла;
-
- СписокТоваров = СтрСоединить(МассивТоваров_, ",");
-
- Параметры_.Вставить("item_ids" , СписокТоваров);
- Параметры_.Вставить("album_ids", Подборка);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addToAlbum", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить товар из подборки
-// Удаляет ранее добавленный товар из подборки
-//
-// Параметры:
-// Товар - Строка - ID товара - item
-// Подборка - Строка - ID подборки - sel
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция УдалитьТоварИзПодборки(Знач Товар, Знач Подборка, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-
- Параметры_.Вставить("item_id" , Товар);
- Параметры_.Вставить("album_ids", Подборка);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.removeFromAlbum", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить подборку
-// Удаляет подборку по ID
-//
-// Параметры:
-// Подборка - Строка - ID подборки - sel
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция УдалитьПодборку(Знач Подборка, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("album_id", Подборка);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteAlbum", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСоСвойствамиТоваров
-
-// Получить список свойств
-// Получает список свойств товаров группы
-//
-// Параметры:
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ПолучитьСписокСвойств(Знач Параметры = "") Экспорт
-
- Response = "response";
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getProperties", Параметры_);
- Свойства = Ответ[Response]["items"];
-
- Возврат Свойства;
-
-КонецФункции
-
-// Создать свойство товара
-// Создает новое свойство для использования в товарах
-//
-// Параметры:
-// Название - Строка - Название свойства - title
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция СоздатьСвойствоТовара(Знач Название, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Название);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("title", Название);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addProperty", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Изменить свойство товара
-// Изменяет существующее свойство товара
-//
-// Параметры:
-// Название - Строка - Новое название - title
-// Свойство - Строка,Число - ID свойства - prop
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ИзменитьСвойствоТовара(Знач Название, Знач Свойство, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Название);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("title" , Название);
- Параметры_.Вставить("property_id", Свойство);
- Параметры_.Вставить("type" , "text");
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editProperty", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить свойство товара
-// Удаляет существующее свойство товара
-//
-// Параметры:
-// Свойство - Строка,Число - ID свойства - prop
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция УдалитьСвойствоТовара(Знач Свойство, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("property_id", Свойство);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteProperty", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Добавить вариант свойства товара
-// Добавляет вариант для существующего свойства
-//
-// Параметры:
-// Значение - Строка - Значение свойства - value
-// Свойство - Строка,Число - ID свойства, куда добавляется вариант - prop
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ДобавитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("property_id", Свойство);
- Параметры_.Вставить("title" , Значение);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addPropertyVariant", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Изменить вариант свойства товара
-// Изменяет значение варианта существующего свойства товара
-//
-// Параметры:
-// Значение - Строка - Новое значение свойства - value
-// Свойство - Строка,Число - ID свойства - prop
-// Вариант - Строка,Число - ID варианта - option
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ИзменитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Вариант, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("property_id", Свойство);
- Параметры_.Вставить("variant_id" , Вариант);
- Параметры_.Вставить("title" , Значение);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editPropertyVariant", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить вариант свойства товара
-// Удаляет ранее созданный вариант свойства
-//
-// Параметры:
-// Вариант - Строка,Число - ID варианта - option
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция УдалитьВариантСвойстваТовара(Знач Вариант, Знач Параметры = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("variant_id", Вариант);
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deletePropertyVariant", Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область РаботаСЗаказами
-
-// Получить список заказов
-// Возвращает список заказов сообщества
-//
-// Параметры:
-// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
-Функция ПолучитьСписокЗаказов(Знач Параметры = "") Экспорт
-
- Параметры = ПолучитьСтандартныеПараметры(Параметры);
- Параметры.Вставить("count", 50);
-
- МассивЗаказов = Новый Массив;
- ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры);
-
- Возврат МассивЗаказов;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область Прочие
-
-// Сформировать клавиатуру
-// Формирует клавиатуру по массиву кнопок
-//
-// Параметры:
-// МассивКнопок - Массив из Строка - Массив заголовков кнопок - buttons
-//
-// Возвращаемое значение:
-// Строка - JSON клавиатуры
-Функция СформироватьКлавиатуру(Знач МассивКнопок) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок);
-
- Клавиатура = Новый Структура;
- МассивКлавиатуры = Новый Массив;
- МассивБлока = Новый Массив;
-
- Для Каждого Действие Из МассивКнопок Цикл
-
- Кнопка = Новый Структура;
- Выражение = Новый Структура;
-
- Выражение.Вставить("type" , "text");
- Выражение.Вставить("label", Действие);
-
- Кнопка.Вставить("action", Выражение);
- МассивБлока.Добавить(Кнопка);
-
- КонецЦикла;
-
- МассивКлавиатуры.Добавить(МассивБлока);
-
- Клавиатура.Вставить("buttons" , МассивКлавиатуры);
- Клавиатура.Вставить("one_time", Ложь);
-
- Возврат OPI_Инструменты.JSONСтрокой(Клавиатура);
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ПолучитьСтандартныеПараметры(Знач Параметры = "")
-
- // Здесь собрано определение данных для работы с VK API
- // Вы можете переопределять их, передавая в качестве параметра
- // Совпадающие поля будут перезаписаны с приоритетом параметра функции
-
- Параметры_ = Новый Структура;
-
- // access_token - можно получить в браузере по URL из функции СоздатьСсылкуПолученияТокена()
- // from_group - действия будут выполняться от лица группы
- // owner_id - id группы с "-" в начале. Можно найти в настройках группы ВК или в ее URL, если не был
- // установлен свой
- // app_id - id приложения, которое необходимо создать в профиле на странице для разработчиков
- // group_id - owner_id, но без "-"
-
- Параметры_.Вставить("access_token" , "");
- Параметры_.Вставить("from_group" , "1");
- Параметры_.Вставить("owner_id" , "");
- Параметры_.Вставить("v" , "5.131");
- Параметры_.Вставить("app_id" , "");
- Параметры_.Вставить("group_id" , "");
-
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Параметры);
-
- Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда
- Для Каждого ПереданныйПараметр Из Параметры Цикл
- Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение));
- КонецЦикла;
- КонецЕсли;
-
- Возврат Параметры_;
-
-КонецФункции
-
-Функция ПолучитьИДКартинки(Знач Картинка, Знач Параметры, Знач Вид)
-
- Response = "response";
- Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид);
- Результат = Ответ[Response];
-
- Если ЗначениеЗаполнено(Результат) Тогда
- ИДФото = Результат["photo_id"];
-
- Если Не ЗначениеЗаполнено(ИДФото) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- Иначе
- Возврат Ответ;
- КонецЕсли;
-
- ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото);
- Возврат ИДФото;
-
-КонецФункции
-
-Функция ПолучитьСоответствиеКартинки(Знач Картинка, Знач Параметры, Знач Вид)
-
- Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид);
- ОтветМассив = Ответ.Получить("response");
-
- Если Не ЗначениеЗаполнено(ОтветМассив) Или Не ТипЗнч(ОтветМассив) = Тип("Массив") Тогда
- Возврат Ответ;
- Иначе
- Если ОтветМассив.Количество() = 0 Тогда
- Возврат Ответ;
- Иначе
- ОтветСоответствие = ОтветМассив[0];
- КонецЕсли;
- КонецЕсли;
-
- Возврат ОтветСоответствие;
-
-КонецФункции
-
-Функция ПолучитьМассивПодборок(Знач Подборки, Знач Параметры = "")
-
- Response = "response";
- Подборки = ПолучитьПодборкиПоИД(Подборки, Параметры);
- Результат = Подборки[Response];
-
- Если ЗначениеЗаполнено(Результат) Тогда
-
- МассивПодборок = Результат["items"];
-
- Если Не ЗначениеЗаполнено(МассивПодборок) Тогда
- Возврат Подборки;
- КонецЕсли;
-
- Иначе
- Возврат Подборки;
- КонецЕсли;
-
- Возврат МассивПодборок;
-
-КонецФункции
-
-Функция ОпределитьМетодЗагрузкиИзображений(Знач Вид)
-
- СоответствиеМетодов = Новый Соответствие;
- Загрузка = "Загрузка";
- Сохранение = "Сохранение";
- Способ = "Способ";
- Фото = "Фото";
-
- Если Вид = "Пост" Тогда
-
- СоответствиеМетодов.Вставить(Загрузка , "photos.getWallUploadServer");
- СоответствиеМетодов.Вставить(Сохранение, "photos.saveWallPhoto");
- СоответствиеМетодов.Вставить(Фото , "photo");
- СоответствиеМетодов.Вставить(Способ , 1);
-
- ИначеЕсли Вид = "Товар" Тогда
-
- СоответствиеМетодов.Вставить(Загрузка , "market.getProductPhotoUploadServer");
- СоответствиеМетодов.Вставить(Сохранение, "market.saveProductPhoto");
- СоответствиеМетодов.Вставить(Способ , 2);
-
- ИначеЕсли Вид = "История" Тогда
-
- СоответствиеМетодов.Вставить(Загрузка , "stories.getPhotoUploadServer");
- СоответствиеМетодов.Вставить(Сохранение, "stories.save");
- СоответствиеМетодов.Вставить(Способ , 3);
-
- ИначеЕсли Вид = "Опрос" Тогда
-
- СоответствиеМетодов.Вставить(Загрузка , "polls.getPhotoUploadServer");
- СоответствиеМетодов.Вставить(Сохранение, "polls.savePhoto");
- СоответствиеМетодов.Вставить(Фото , "photo");
- СоответствиеМетодов.Вставить(Способ , 1);
-
- Иначе
-
- СоответствиеМетодов.Вставить(Загрузка , "photos.getUploadServer");
- СоответствиеМетодов.Вставить(Сохранение, "photos.save");
- СоответствиеМетодов.Вставить(Фото , "photos_list");
- СоответствиеМетодов.Вставить(Способ , 1);
-
- КонецЕсли;
-
- Возврат СоответствиеМетодов;
-
-КонецФункции
-
-Функция ПолучитьСоответствиеПараметровТовара()
-
- Поля = Новый Соответствие();
- Поля.Вставить("Имя" , "name");
- Поля.Вставить("Описание" , "description");
- Поля.Вставить("Категория" , "category_id");
- Поля.Вставить("Цена" , "price");
- Поля.Вставить("СтараяЦена" , "old_price");
- Поля.Вставить("URL" , "url");
- Поля.Вставить("ГлавныйВГруппе" , "is_main_variant");
- Поля.Вставить("Ширина" , "dimension_width");
- Поля.Вставить("Высота" , "dimension_height");
- Поля.Вставить("Глубина" , "dimension_length");
- Поля.Вставить("Вес" , "weight");
- Поля.Вставить("SKU" , "sku");
- Поля.Вставить("ДоступныйОстаток" , "stock_amount");
-
- Возврат Поля;
-
-КонецФункции
-
-Функция УправлениеТоваром(Знач ОписаниеТовара, Знач ИДТовара = "", Знач Подборка = "", Знач Параметры = "")
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДТовара);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеТовара);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Параметры_.Вставить("v", "5.199");
-
- Response = "response";
-
- ЗаполнитьПоляЗапросаТовара(ОписаниеТовара, Параметры_);
-
- Если ЗначениеЗаполнено(ИДТовара) Тогда
- Параметры_.Вставить("item_id", ИДТовара);
- Метод = "edit";
- Иначе
- Метод = "add";
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_);
- Результат = Ответ[Response];
-
- Если Не ЗначениеЗаполнено(ИДТовара) И ЗначениеЗаполнено(Результат) Тогда
-
- ИДТовара = Результат["market_item_id"];
-
- Если Не ЗначениеЗаполнено(ИДТовара) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- Иначе
- Возврат Ответ;
- КонецЕсли;
-
- Если ЗначениеЗаполнено(Подборка) И ЗначениеЗаполнено(ИДТовара) Тогда
- ДобавитьТоварВПодборку(ИДТовара, Подборка, Параметры_);
- КонецЕсли;
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция УправлениеПодборкой(Знач Название
- , Знач Картинка = ""
- , Знач ИДПодборки = ""
- , Знач Основная = Ложь
- , Знач Скрытая = Ложь
- , Знач Параметры = "")
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Название);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДПодборки);
- OPI_ПреобразованиеТипов.ПолучитьБулево(Основная);
- OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытая);
-
- Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
- Ответ = ДобавитьПараметрКартинки(Картинка, ИДПодборки, Параметры_);
-
- Если ЗначениеЗаполнено(Ответ) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- Параметры_.Вставить("title" , Название);
- Параметры_.Вставить("main_album" , ?(Основная, 1, 0));
- Параметры_.Вставить("is_hidden" , ?(Скрытая, 1, 0));
-
- Если ЗначениеЗаполнено(ИДПодборки) Тогда
- Параметры_.Вставить("album_id", ИДПодборки);
- Метод = "editAlbum";
- Иначе
- Метод = "addAlbum";
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_);
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ДобавитьПараметрКартинки(Знач Картинка, Знач ИДПодборки, Параметры)
-
- PhotoID = "photo_id";
-
- Если ЗначениеЗаполнено(Картинка) Тогда
-
- ИДФото = ПолучитьИДКартинки(Картинка, Параметры, "Товар");
-
- Если Не ТипЗнч(ИДФото) = Тип("Строка") Тогда
- Возврат ИДФото;
- КонецЕсли;
-
- Параметры.Вставить(PhotoID, ИДФото);
-
- Иначе
-
- Если ЗначениеЗаполнено(ИДПодборки) Тогда
-
- Подборки = ПолучитьМассивПодборок(ИДПодборки, Параметры);
-
- Если Не ТипЗнч(Подборки) = Тип("Массив") Тогда
- Возврат Подборки;
- КонецЕсли;
-
- Если Не Подборки.Количество() = 0 Тогда
- ИДФото = Подборки[0]["photo"]["id"];
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДФото);
- Параметры.Вставить(PhotoID, ИДФото);
- КонецЕсли;
-
- КонецЕсли;
-
- КонецЕсли;
-
- Возврат "";
-
-КонецФункции
-
-Процедура ЗаполнитьПараметрыЗагрузкиФото(Знач Метод, Знач Ответ, Параметры)
-
- Response = "response";
- Способ = Метод["Способ"];
- СтандартныйСпособ = 1;
- НовыйСпособ = 2;
-
- Если Способ = СтандартныйСпособ Тогда
-
- Hash = "hash";
- Serv = "server";
- Aid = "aid";
- Фото = Метод["Фото"];
-
- Параметры.Вставить(Hash, Ответ[Hash]);
- Параметры.Вставить(Фото, Ответ[Фото]);
-
- СерверФото = Ответ.Получить(Serv);
-
- Если ЗначениеЗаполнено(СерверФото) Тогда
- СерверФото = OPI_Инструменты.ЧислоВСтроку(СерверФото);
- Параметры.Вставить(Serv, СерверФото);
- КонецЕсли;
-
- Идентификатор = Ответ.Получить(Aid);
-
- Если ЗначениеЗаполнено(Идентификатор) Тогда
- Идентификатор = OPI_Инструменты.ЧислоВСтроку(Идентификатор);
- Параметры.Вставить(Aid , Идентификатор);
- КонецЕсли;
-
- ИначеЕсли Способ = НовыйСпособ Тогда
-
- ОтветСтрокой = OPI_Инструменты.JSONСтрокой(Ответ);
- Параметры.Вставить("upload_response", ОтветСтрокой);
-
- Иначе
-
- Параметры.Вставить("upload_results", Ответ[Response]["upload_result"]);
-
- КонецЕсли;
-
-КонецПроцедуры
-
-Процедура ЗаполнитьПоляЗапросаТовара(Знач ОписаниеТовара, Параметры)
-
- Response = "response";
- ОсновноеФото = ОписаниеТовара["ОсновноеФото"];
- ДопФото = ОписаниеТовара["ДополнительныеФото"];
- Свойства = ОписаниеТовара["ЗначенияСвойств"];
-
- Если ЗначениеЗаполнено(ОсновноеФото) Тогда
-
- Ответ = ЗагрузитьФотоНаСервер(ОсновноеФото, Параметры, "Товар");
- Результат = Ответ[Response];
-
- Если ЗначениеЗаполнено(Результат) Тогда
- ИДФото = Результат["photo_id"];
-
- Если Не ЗначениеЗаполнено(ИДФото) Тогда
- Возврат;
- КонецЕсли;
-
- Иначе
- Возврат;
- КонецЕсли;
-
- ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото);
- Параметры.Вставить("main_photo_id", ИДФото);
-
- КонецЕсли;
-
- Если ТипЗнч(Свойства) = Тип("Массив") Тогда
-
- Свойства_ = Новый Массив;
-
- Для Каждого Свойство Из Свойства Цикл
- Свойства_.Добавить(OPI_Инструменты.ЧислоВСтроку(Свойство));
- КонецЦикла;
-
- Свойства = СтрСоединить(Свойства_, ",");
-
- КонецЕсли;
-
- Если ЗначениеЗаполнено(Свойства) Тогда
- Параметры.Вставить("variant_ids", OPI_Инструменты.ЧислоВСтроку(Свойства));
- КонецЕсли;
-
- ДобавитьДополнительныеФотоТовара(ДопФото, Параметры);
-
- Для Каждого Поле Из ПолучитьСоответствиеПараметровТовара() Цикл
-
- Значение = ОписаниеТовара[Поле.Ключ];
-
- Если Значение <> Неопределено Тогда
- Параметры.Вставить(Поле.Значение, ОписаниеТовара[Поле.Ключ]);
- КонецЕсли;
-
- КонецЦикла;
-
-КонецПроцедуры
-
-Процедура ДобавитьДополнительныеФотоТовара(Знач МассивФото, Параметры)
-
- Если ТипЗнч(МассивФото) = Тип("Массив") Тогда
- Если МассивФото.Количество() > 0 Тогда
-
- СтрокаФотографий = "";
-
- Для Каждого Фото Из МассивФото Цикл
-
- ИДФото = ПолучитьИДКартинки(Фото, Параметры, "Товар");
-
- Если Не ТипЗнч(ИДФото) = Тип("Строка") Тогда
- Возврат;
- КонецЕсли;
-
- СтрокаФотографий = СтрокаФотографий + ИДФото + ",";
-
- КонецЦикла;
-
- СтрокаФотографий = Лев(СтрокаФотографий, СтрДлина(СтрокаФотографий) - 1);
- Параметры.Вставить("photo_ids", СтрокаФотографий);
- КонецЕсли;
- КонецЕсли;
-
-КонецПроцедуры
-
-Процедура ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг = 0)
-
- Response = "response";
- МаксимумВЗапросе = 200;
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.get", Параметры);
- Товары = Ответ[Response]["items"];
-
- Если Товары.Количество() = 0 Тогда
- Возврат;
- КонецЕсли;
-
- Для Каждого Товар Из Товары Цикл
- МассивТоваров.Добавить(Товар);
- КонецЦикла;
-
- Сдвиг = Сдвиг + МаксимумВЗапросе;
- Параметры.Вставить("offset", Сдвиг);
- ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг);
-
-КонецПроцедуры
-
-Процедура ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг = 0)
-
- Response = "response";
- МаксимумВЗапросе = 100;
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getAlbums", Параметры);
- Альбомы = Ответ[Response]["items"];
-
- Если Альбомы.Количество() = 0 Тогда
- Возврат;
- КонецЕсли;
-
- Для Каждого Альбом Из Альбомы Цикл
- МассивАльбомов.Добавить(Альбом);
- КонецЦикла;
-
- Сдвиг = Сдвиг + МаксимумВЗапросе;
- Параметры.Вставить("offset", Сдвиг);
- ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг);
-
-КонецПроцедуры
-
-Процедура ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг = 0)
-
- Response = "response";
- МаксимумВЗапросе = 50;
- Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getGroupOrders", Параметры);
- Заказы = Ответ[Response]["items"];
-
- Если Заказы.Количество() = 0 Тогда
- Возврат;
- КонецЕсли;
-
- Для Каждого Заказ Из Заказы Цикл
- МассивЗаказов.Добавить(Заказ);
- КонецЦикла;
-
- Сдвиг = Сдвиг + МаксимумВЗапросе;
- Параметры.Вставить("offset", Сдвиг);
- ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг);
-
-КонецПроцедуры
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_VK.os
+// Библиотека: VK
+// Команда CLI: vk
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+// Если в не знаете с чего начать, то стоит найти метод ПолучитьСтандартныеПараметры()
+// и почитать комментарии
+
+// BSLLS:NumberOfOptionalParams-off
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:NumberOfOptionalParams-off
+// BSLLS:UsingServiceTag-off
+// BSLLS:UnusedLocalVariable-off
+
+//@skip-check method-too-many-params
+//@skip-check wrong-string-literal-content
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область ПолучениеТокена
+
+// Создать ссылку получения токена
+// Получение ссылки для интерактивного получения токена (access_token), который необходим
+// для дальнейших действий
+//
+// Параметры:
+// app_id - Строка,Число - app_id из настроек приложения - app
+//
+// Возвращаемое значение:
+// Строка - URL, по которому необходимо перейти в браузере
+Функция СоздатьСсылкуПолученияТокена(Знач App_id) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(App_id);
+
+ // access_token нужно будет забрать из параметра в строке адреса браузера
+ Возврат "https://oauth.vk.com/authorize?client_id=" + App_id
+ + "&scope=offline,wall,groups,photos,stats,stories,ads,market,video"
+ + "&v=5.131&response_type=token&redirect_uri=https://api.vk.com/blank.html";
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСГруппой
+
+// Создать пост
+// Создает пост с картинками
+//
+// Параметры:
+// Текст - Строка - Текст поста - text
+// МассивКартинок - Массив из Строка,ДвоичныеДанные - Массив картинок - pictures
+// Реклама - Булево - Признак ""Это реклама"" - ad
+// СсылкаПодЗаписью - Строка - Ссылка (URL) под записью - url
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьПост(Знач Текст
+ , Знач МассивКартинок
+ , Знач Реклама = Ложь
+ , Знач СсылкаПодЗаписью = ""
+ , Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКартинок);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ МассивВложений = Новый Массив;
+
+ Для Каждого КартинкаПоста Из МассивКартинок Цикл
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ ОтветСоответствие = ПолучитьСоответствиеКартинки(КартинкаПоста, Параметры_, "Пост");
+
+ OwnerId = ОтветСоответствие.Получить("owner_id");
+ ObjectId = ОтветСоответствие.Получить("id");
+
+ Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда
+ Возврат ОтветСоответствие;
+ КонецЕсли;
+
+ OwnerId = OPI_Инструменты.ЧислоВСтроку(OwnerId);
+ ObjectId = OPI_Инструменты.ЧислоВСтроку(ObjectId);
+
+ ФотоID = "photo" + OwnerId + "_" + ObjectId;
+
+ МассивВложений.Добавить(ФотоID);
+
+ КонецЦикла;
+
+ Ответ = СоздатьСоставнойПост(Текст, МассивВложений, Реклама, СсылкаПодЗаписью, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Создать составной пост
+// Создает пост на основе массива идетификаторов объектов (картинок, видео и др.)
+//
+// Параметры:
+// Текст - Строка - Текст поста - text
+// Объекты - Массив из Строка - Массив идентификаторов вида photo123_123 - objects
+// Реклама - Булево - Признак ""Это реклама"" - ad
+// СсылкаПодЗаписью - Строка - Ссылка (URL) под записью - url
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьСоставнойПост(Знач Текст
+ , Знач Объекты
+ , Знач Реклама = Ложь
+ , Знач СсылкаПодЗаписью = ""
+ , Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(СсылкаПодЗаписью);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Реклама);
+
+ Параметры = ПолучитьСтандартныеПараметры(Параметры);
+ СтрокаВложений = СтрСоединить(Объекты, ",");
+ СтрокаВложений = СтрокаВложений + СсылкаПодЗаписью;
+
+ Параметры.Вставить("message" , Текст);
+ Параметры.Вставить("attachments" , СтрокаВложений);
+ Параметры.Вставить("mark_as_ads" , ?(Реклама, 1, 0));
+ Параметры.Вставить("close_comments" , ?(Реклама, 1, 0));
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить пост
+// Удаляет пост по id
+//
+// Параметры:
+// IDПоста - Строка,Число - ID поста - post
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция УдалитьПост(Знач IDПоста, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("post_id", IDПоста);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.delete", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Создать опрос
+// Создает опрос с вариантами ответа
+//
+// Параметры:
+// Вопрос - Строка - Вопрос опроса - question
+// МассивОтветов - Массив из Строка - Массив вариантов ответа - options
+// Картинка - Строка,ДвоичныеДанные - Картинка опроса - picture
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьОпрос(Знач Вопрос, Знач МассивОтветов, Знач Картинка = "", Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Вопрос);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивОтветов);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Response = "response";
+
+ Если ЗначениеЗаполнено(Картинка) Тогда
+
+ Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Опрос");
+
+ Фото = Ответ.Получить(Response);
+
+ Если ЗначениеЗаполнено(Фото) Тогда
+
+ IDФото = Фото["id"];
+
+ Если Не ЗначениеЗаполнено(IDФото) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ Иначе
+ Возврат Ответ;
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Параметры_.Вставить("is_anonymous", 1);
+ Параметры_.Вставить("is_multiple" , 0);
+
+ Ответы = СтрСоединить(МассивОтветов, """,""");
+ Ответы = "[""" + Ответы + """]";
+
+ Параметры_.Вставить("add_answers", Ответы);
+ Параметры_.Вставить("photo_id" , OPI_Инструменты.ЧислоВСтроку(IDФото));
+ Параметры_.Вставить("question" , Вопрос);
+
+ Опрос = OPI_Инструменты.Get("api.vk.com/method/polls.create", Параметры_);
+ ОпросСоответствие = Опрос.Получить(Response);
+
+ Если Не ЗначениеЗаполнено(ОпросСоответствие) Тогда
+ Возврат Опрос;
+ КонецЕсли;
+
+ OwnerId = ОпросСоответствие.Получить("owner_id");
+ ObjectId = ОпросСоответствие.Получить("id");
+
+ Если Не ЗначениеЗаполнено(OwnerId) Или Не ЗначениеЗаполнено(ObjectId) Тогда
+ Возврат Опрос;
+ КонецЕсли;
+
+ ОпросID = "poll"
+ + OPI_Инструменты.ЧислоВСтроку(OwnerId)
+ + "_"
+ + OPI_Инструменты.ЧислоВСтроку(ObjectId);
+
+ Параметры_.Вставить("attachments", ОпросID);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.post", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Создать альбом
+// Создает альбом для хранения картинок
+//
+// Параметры:
+// Наименование - Строка - Наименование альбома - title
+// Описание - Строка - Описание альбома - description
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьАльбом(Знач Наименование, Знач Описание = "", Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+
+ Параметры_.Вставить("title" , Наименование);
+ Параметры_.Вставить("description" , Описание);
+ Параметры_.Вставить("upload_by_admins_only", 1);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.createAlbum", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить альбом
+// Удаляет ранее созданный альбом
+//
+// Параметры:
+// IDАльбома - Строка,Число - ID альбома - album
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция УдалитьАльбом(Знач IDАльбома, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("album_id", OPI_Инструменты.ЧислоВСтроку(IDАльбома));
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.deleteAlbum", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Создать историю
+// Создает историю из картинки
+//
+// Параметры:
+// Картинка - Строка,ДвоичныеДанные - Фон истории - picture
+// URL - Строка - URL для кнопки под историей - url
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьИсторию(Знач Картинка, Знач URL = "", Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("link_text" , "more");
+ Параметры_.Вставить("link_url" , URL);
+ Параметры_.Вставить("add_to_news", "1");
+
+ Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры_, "История");
+ Возврат Ответ;
+
+КонецФункции
+
+// Сохранить картинку в альбом
+// Сохраняет картинку в альбом сообщества
+//
+// Параметры:
+// IDАльбома - Строка,Число - ID альбома - album
+// Картинка - ДвоичныеДанные,Строка - Файл картинки - picture
+// Описание - Строка - Описание картинки - description
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СохранитьКартинкуВАльбом(Знач IDАльбома, Знач Картинка, Знач Описание = "", Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDАльбома);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Описание);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+
+ Параметры_.Вставить("album_id", IDАльбома);
+ Параметры_.Вставить("caption" , Описание);
+
+ Возврат ЗагрузитьФотоНаСервер(Картинка, Параметры_, "Альбом");
+
+КонецФункции
+
+// Удалить картинку
+// Удалить картинку из альбома
+//
+// Параметры:
+// IDКартинки - Строка,Число - ID картинки - pictureid
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция УдалитьКартинку(Знач IDКартинки, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКартинки);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("photo_id", IDКартинки);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/photos.delete", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Загрузить видео на сервер
+// Загружает видео в группу с возможностью его дальнейшего использования
+//
+// Параметры:
+// Видео - Строка, ДвоичныеДанные - Файл видео - file
+// Наименование - Строка - Наименование видео - title
+// Описание - Строка - Описание видео - description
+// Альбом - Строка - ID альбома, если необходимо - album
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ЗагрузитьВидеоНаСервер(Знач Видео
+ , Знач Наименование
+ , Знач Описание = ""
+ , Знач Альбом = ""
+ , Знач Параметры = "") Экспорт
+
+ Строка_ = "Строка";
+ Параметры = ПолучитьСтандартныеПараметры(Параметры);
+
+ OPI_Инструменты.ДобавитьПоле("name" , Наименование, Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("description", Описание , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("album_id" , Альбом , Строка_, Параметры);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/video.save", Параметры);
+
+ Результат = Ответ["response"];
+
+ Если Не ЗначениеЗаполнено(Результат) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ URL = Результат["upload_url"];
+
+ Если Не ЗначениеЗаполнено(URL) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ СоответствиеФайлов = Новый Соответствие;
+ OPI_Инструменты.ДобавитьПоле("video_file.mp4", Видео, "ДвоичныеДанные", СоответствиеФайлов);
+
+ РазмерДанных = СоответствиеФайлов["video_file.mp4"].Размер();
+ РазмерДанных = OPI_Инструменты.ЧислоВСтроку(РазмерДанных);
+
+ Ответ = OPI_Инструменты.PostMultipart(URL, , СоответствиеФайлов, "video/mp4");
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Загрузить фото на сервер
+// Загружает фото на сервер для его дальнейшего использования
+//
+// Параметры:
+// Картинка - Строка, ДвоичныеДанные - Файл картинки - file
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+// Вид - Строка - Вид загрузки (Пост, Товар, История, Опрос, Прочее) - type
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ЗагрузитьФотоНаСервер(Знач Картинка, Знач Параметры = "", Знач Вид = "Пост") Экспорт
+
+ Параметры = ПолучитьСтандартныеПараметры(Параметры);
+ Метод = ОпределитьМетодЗагрузкиИзображений(Вид);
+ Файлы = Новый Соответствие;
+
+ Response = "response";
+ URL = "api.vk.com/method/";
+ Загрузка = URL + Метод["Загрузка"];
+ Сохранение = URL + Метод["Сохранение"];
+
+ Если ТипЗнч(Картинка) = Тип("Строка") Тогда
+ КлючКартинка = СтрЗаменить(Картинка, ".", "___");
+ OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Картинка);
+ Иначе
+ КлючКартинка = "image___jpeg";
+ КонецЕсли;
+
+ Файлы.Вставить(КлючКартинка, Картинка);
+
+ Для Н = 1 По 5 Цикл
+
+ Ответ = OPI_Инструменты.Get(Загрузка, Параметры);
+ Результат = Ответ[Response];
+
+ Если ЗначениеЗаполнено(Результат) Тогда
+
+ URL = Результат["upload_url"];
+
+ Если Не ЗначениеЗаполнено(URL) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ Иначе
+ Возврат Ответ;
+ КонецЕсли;
+
+ Параметры.Вставить("upload_url", URL);
+ Ответ = OPI_Инструменты.PostMultipart(URL, Параметры, Файлы);
+
+ Если ТипЗнч(Ответ) = Тип("Соответствие") Тогда
+ Прервать;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Если ТипЗнч(Ответ) <> Тип("Соответствие") Тогда
+ Возврат ПолучитьСтрокуИзДвоичныхДанных(Ответ);
+ КонецЕсли;
+
+ ЗаполнитьПараметрыЗагрузкиФото(Метод, Ответ, Параметры);
+
+ Ответ = OPI_Инструменты.Get(Сохранение, Параметры);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСОбсуждениями
+
+// Создать обсуждение
+// Создает новое обсуждение
+//
+// Параметры:
+// Наименование - Строка - Наименование обсуждения - title
+// ТекстПервогоСообщения - Строка - Текст первого сообщения - text
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьОбсуждение(Знач Наименование, Знач ТекстПервогоСообщения, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекстПервогоСообщения);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("title", Наименование);
+ Параметры_.Вставить("text" , ТекстПервогоСообщения);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/board.addTopic", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Закрыть обсуждение
+// Закрывает или удаляет обсуждение
+//
+// Параметры:
+// IDОбсуждения - Строка,Число - ID обсуждения - topic
+// УдалитьПолностью - Булево - Удалить полностью (Истина) или закрыть - remove
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ЗакрытьОбсуждение(Знач IDОбсуждения, Знач УдалитьПолностью = Ложь, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(УдалитьПолностью);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("topic_id", IDОбсуждения);
+
+ Метод = ?(УдалитьПолностью, "deleteTopic", "closeTopic");
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/board." + Метод, Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Открыть обсуждение
+// Открывает ранее закрытое обсуждение
+//
+// Параметры:
+// IDОбсуждения - Строка,Число - ID обсуждения - topic
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ОткрытьОбсуждение(Знач IDОбсуждения, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("topic_id", IDОбсуждения);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/board.openTopic", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Написать в обсуждение
+// Добавляет сообщение в обсуждение от имени группы
+//
+// Параметры:
+// IDОбсуждения - Строка,Число - ID обсуждения - topic
+// Текст - Строка - Текст сообщения - text
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция НаписатьВОбсуждение(Знач IDОбсуждения, Знач Текст, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбсуждения);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("topic_id", IDОбсуждения);
+ Параметры_.Вставить("message" , Текст);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/board.createComment", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ИнтерактивныеДействия
+
+// Поставить лайк
+// Ставит лайк на пост
+//
+// Параметры:
+// IDПоста - Строка,Число - ID поста - post
+// IDСтены - Строка,Число - ID стены расположения поста - wall
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ПоставитьЛайк(Знач IDПоста, Знач IDСтены = "", Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ IDСтены = ?(ЗначениеЗаполнено(IDСтены), IDСтены, Параметры_["owner_id"]);
+ ОбъектВК = "wall" + IDСтены + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста);
+
+ Параметры_.Вставить("type" , "post");
+ Параметры_.Вставить("object" , ОбъектВК);
+ Параметры_.Вставить("item_id" , OPI_Инструменты.ЧислоВСтроку(IDПоста));
+ Параметры_.Вставить("owner_id" , OPI_Инструменты.ЧислоВСтроку(IDСтены));
+ Параметры_.Вставить("from_group" , 0);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/likes.add", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Сделать репост
+// Делает репост записи
+//
+// Параметры:
+// IDПоста - Строка,Число - ID поста - post
+// IDСтены - Строка,Число - ID стены расположения поста - from
+// ЦелеваяСтена - Строка,Число - ID целевой стены или группы - to
+// Рекламный - Булево - Признак рекламного поста - ad
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СделатьРепост(Знач IDПоста
+ , Знач IDСтены = ""
+ , Знач ЦелеваяСтена = ""
+ , Знач Рекламный = Ложь
+ , Знач Параметры = "") Экспорт
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ GroupId = Параметры_["group_id"];
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦелеваяСтена);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Рекламный);
+
+ Источник = ?(ЗначениеЗаполнено(IDСтены), IDСтены, GroupId);
+ Приемник = ?(ЗначениеЗаполнено(ЦелеваяСтена), ЦелеваяСтена, GroupId);
+
+ Параметры_.Вставить("object" , "wall" + Источник + "_" + OPI_Инструменты.ЧислоВСтроку(IDПоста));
+ Параметры_.Вставить("group_id" , СтрЗаменить(Приемник, "-", ""));
+ Параметры_.Вставить("mark_as_ads" , ?(Рекламный, 1, 0));
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.repost", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Написать сообщение
+// Написать сообщение пользователю в диалоге сообщества
+//
+// Параметры:
+// Текст - Строка - Текст сообщения - text
+// IDПользователя - Строка - ID пользователя адресата - user
+// Communitytoken - Строка - Токен бота чата сообщества, котрый можно получить в настройках - ct
+// Клавиатура - Строка - JSON клавиатуры. См.СформироватьКлавиатуру - keyboard
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция НаписатьСообщение(Знач Текст
+ , Знач IDПользователя
+ , Знач Communitytoken
+ , Знач Клавиатура = ""
+ , Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Communitytoken);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Клавиатура);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("access_token", Communitytoken);
+
+ Параметры_.Вставить("user_id" , IDПользователя);
+ Параметры_.Вставить("peer_id" , IDПользователя);
+ Параметры_.Вставить("parse_mode" , "Markdown");
+ Параметры_.Вставить("random_id" , 0);
+ Параметры_.Вставить("message" , Текст);
+
+ Если ЗначениеЗаполнено(Клавиатура) Тогда
+ Параметры_.Вставить("keyboard", Клавиатура);
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/messages.send", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Написать комментарий
+// Создает комментарий под выбранной записью
+//
+// Параметры:
+// IDПоста - Строка,Число - ID целевого поста - post
+// IDСтены - Строка,Число - ID стены расположения поста - wall
+// Текст - Строка - Текст комментария - text
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция НаписатьКомментарий(Знач IDПоста, Знач IDСтены, Знач Текст, Знач Параметры = "") Экспорт
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ GroupId = Параметры_["group_id"];
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDСтены);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
+
+ Параметры_.Вставить("owner_id" , IDСтены);
+ Параметры_.Вставить("from_group" , GroupId);
+ Параметры_.Вставить("post_id" , IDПоста);
+ Параметры_.Вставить("message" , Текст);
+
+ Параметры_.Удалить("group_id");
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/wall.createComment", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Сократить ссылку
+// Создает сокращенный URL из обычного
+//
+// Параметры:
+// URL - Строка - URL для сокращения - url
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Строка - Сокращенный URL
+Функция СократитьСсылку(Знач URL, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
+
+ Response = "response";
+ Параметры_ = Новый Структура;
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("url", URL);
+
+ Ответ = OPI_Инструменты.Get("https://api.vk.com/method/utils.getShortLink", Параметры_);
+ Результат = Ответ[Response];
+
+ Если ЗначениеЗаполнено(Результат) Тогда
+
+ URL = Результат["short_url"];
+
+ Если ЗначениеЗаполнено(URL) Тогда
+ Возврат URL;
+ Иначе
+ Возврат Ответ;
+ КонецЕсли;
+
+ Иначе
+ Возврат Ответ;
+ КонецЕсли;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область Статистика
+
+// Получить статистику
+// Получает общую статистику сообщества за период
+//
+// Параметры:
+// ДатаНачала - Дата - Дата начала периода - datefrom
+// ДатаОкончания - Дата - Дата окончания периода - dateto
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ПолучитьСтатистику(Знач ДатаНачала, Знач ДатаОкончания, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьДату(ДатаНачала);
+ OPI_ПреобразованиеТипов.ПолучитьДату(ДатаОкончания);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+
+ ДатаНачала = OPI_Инструменты.UNIXTime(ДатаНачала);
+ ДатаОкончания = OPI_Инструменты.UNIXTime(ДатаОкончания);
+
+ Параметры_.Вставить("timestamp_from", ДатаНачала);
+ Параметры_.Вставить("timestamp_to" , ДатаОкончания);
+ Параметры_.Вставить("stats_groups" , "visitors, reach, activity");
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/stats.get", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить статистику по постам
+// Получает статистику в разрезе постов
+//
+// Параметры:
+// МассивИДПостов - Массив из Строка,Число - Массив ID постов - posts
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Массив из Произвольный - Массив данных статистики по постам
+Функция ПолучитьСтатистикуПостов(Знач МассивИДПостов, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивИДПостов);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ МассивОтветов = Новый Массив;
+ МассивНабора = Новый Массив;
+ МаксимумПостов = 30;
+ Response = "response";
+
+ Для Каждого Пост Из МассивИДПостов Цикл
+
+ МассивНабора.Добавить(OPI_Инструменты.ЧислоВСтроку(Пост));
+
+ Если МассивНабора.Количество() = МаксимумПостов Тогда
+
+ СтрокаНомеров = СтрСоединить(МассивНабора, ",");
+ Параметры_.Вставить("post_ids", СтрокаНомеров);
+
+ Статистика = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_);
+ МассивСтатистики = Статистика[Response];
+
+ Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл
+ МассивОтветов.Добавить(ЭлементСтатистики);
+ КонецЦикла;
+
+ МассивНабора = Новый Массив;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ СтрокаНомеров = СтрСоединить(МассивНабора, ",");
+ Параметры_.Вставить("post_ids", СтрокаНомеров);
+
+ Статистика = OPI_Инструменты.Get("api.vk.com/method/stats.getPostReach", Параметры_);
+ МассивСтатистики = Статистика[Response];
+
+ Если ТипЗнч(МассивСтатистики) = Тип("Массив") Тогда
+ Для Каждого ЭлементСтатистики Из МассивСтатистики Цикл
+ МассивОтветов.Добавить(ЭлементСтатистики);
+ КонецЦикла;
+ КонецЕсли;
+
+ Возврат МассивОтветов;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСРекламнымКабинетом
+
+// Создать рекламную кампанию
+// Создает кампанию в выбранном рекламном кабинете
+//
+// Параметры:
+// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet
+// Наименование - Строка - Наименование кампании - title
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьРекламнуюКампанию(Знач IDКабинета, Знач Наименование, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
+
+ ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
+ КонечнаяДата = ДобавитьМесяц(ТекущаяДата, 24);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("account_id", IDКабинета);
+
+ МассивСтруктур = Новый Массив;
+ ДатаСтарт = OPI_Инструменты.UNIXTime(ТекущаяДата);
+ ДатаСтоп = OPI_Инструменты.UNIXTime(КонечнаяДата);
+
+ СтруктураКампании = Новый Структура;
+ СтруктураКампании.Вставить("type" , "promoted_posts");
+ СтруктураКампании.Вставить("name" , Наименование);
+ СтруктураКампании.Вставить("day_limit" , 0);
+ СтруктураКампании.Вставить("all_limit" , 0);
+ СтруктураКампании.Вставить("start_time" , ДатаСтарт);
+ СтруктураКампании.Вставить("stop_time" , ДатаСтоп);
+ СтруктураКампании.Вставить("status" , 1);
+
+ МассивСтруктур.Добавить(СтруктураКампании);
+
+ JSONДата = OPI_Инструменты.JSONСтрокой(МассивСтруктур);
+
+ Параметры_.Вставить("data", JSONДата);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.createCampaigns", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Создать рекламное объявление
+// Создает рекламное объявление на основе поста
+//
+// Параметры:
+// НомерКампании - Строка,Число - ID рекламной кампании - campaign
+// ДневнойЛимит - Строка,Число - Дневной лимит в рублях - limit
+// НомерКатегории - Строка,Число - Номер рекламной категории - category
+// IDПоста - Строка,Число - ID поста, используемого в качетсве рекламы - post
+// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьРекламноеОбъявление(Знач НомерКампании
+ , Знач ДневнойЛимит
+ , Знач НомерКатегории
+ , Знач IDПоста
+ , Знач IDКабинета
+ , Знач Параметры = "") Экспорт
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ GroupId = Параметры_["group_id"];
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(GroupId);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКампании);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ДневнойЛимит);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(НомерКатегории);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПоста);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета);
+
+ Линк = "https://vk.com/wall-" + GroupId + "_" + IDПоста;
+
+ МассивСтруктур = Новый Массив;
+ СтруктураКампании = Новый Структура;
+ СтруктураКампании.Вставить("campaign_id" , НомерКампании);
+ СтруктураКампании.Вставить("ad_format" , 9);
+ СтруктураКампании.Вставить("conversion_event_id" , 1);
+ СтруктураКампании.Вставить("autobidding" , 1);
+ СтруктураКампании.Вставить("cost_type" , 3);
+ СтруктураКампании.Вставить("goal_type" , 2);
+ СтруктураКампании.Вставить("ad_platform" , "all");
+ СтруктураКампании.Вставить("publisher_platforms" , "vk");
+ СтруктураКампании.Вставить("publisher_platforms_auto" , "1");
+ СтруктураКампании.Вставить("day_limit" , ДневнойЛимит);
+ СтруктураКампании.Вставить("all_limit" , "0");
+ СтруктураКампании.Вставить("category1_id" , НомерКатегории);
+ СтруктураКампании.Вставить("age_restriction" , 0);
+ СтруктураКампании.Вставить("status" , 1);
+ СтруктураКампании.Вставить("name" , "Объявление");
+ СтруктураКампании.Вставить("link_url" , Линк);
+
+ МассивСтруктур.Добавить(СтруктураКампании);
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина);
+
+ Параметры_.Вставить("data" , МассивСтруктур);
+ Параметры_.Вставить("account_id" , IDКабинета);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.createAds", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Приостановить рекламное объявление
+// Приостанавливает показ рекламного объявления
+//
+// Параметры:
+// IDКабинета - Строка,Число - ID рекламного кабинета - cabinet
+// IDОбъявления - Строка,Число - ID объявления - adv
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ПриостановитьРекламноеОбъявление(Знач IDКабинета, Знач IDОбъявления, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDКабинета);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDОбъявления);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+
+ Параметры_.Вставить("account_id", IDКабинета);
+
+ МассивСтруктур = Новый Массив;
+ СтруктураКампании = Новый Структура;
+
+ СтруктураКампании.Вставить("ad_id" , IDОбъявления);
+ СтруктураКампании.Вставить("status" , 0);
+
+ МассивСтруктур.Добавить(СтруктураКампании);
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(МассивСтруктур, Истина);
+
+ Параметры_.Вставить("data", МассивСтруктур);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.updateAds", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить список рекламных категорий
+// Получает список id рекламных категорий для создания рекламного объявления
+//
+// Параметры:
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ПолучитьСписокРекламныхКатегорий(Знач Параметры = "") Экспорт
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/ads.getCategories", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСТоварами
+
+// Получить список категорий товаров
+// Получает список ID товарных категорий для указания при создании товара
+//
+// Параметры:
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из Строка - Ключ - ID, Значение - Имя
+Функция ПолучитьСписокКатегорийТоваров(Знач Параметры = "") Экспорт
+
+ Response = "response";
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_);
+ Результат = Ответ[Response];
+
+ Если ЗначениеЗаполнено(Результат) Тогда
+
+ Количество = Результат["count"];
+
+ Если Не ЗначениеЗаполнено(Количество) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ Иначе
+ Возврат Ответ;
+ КонецЕсли;
+
+ Параметры_.Вставить("count", Количество);
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getCategories", Параметры_);
+ Результат = Ответ[Response];
+
+ Если ЗначениеЗаполнено(Результат) Тогда
+
+ Категории = Результат["items"];
+
+ Если Не ЗначениеЗаполнено(Категории) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ Иначе
+ Возврат Ответ;
+ КонецЕсли;
+
+ СоответствиеКатегорий = Новый Соответствие;
+
+ Для Каждого Категория Из Категории Цикл
+ СоответствиеКатегорий.Вставить(Категория["id"], Категория["name"]);
+ КонецЦикла;
+
+ Возврат СоответствиеКатегорий;
+
+КонецФункции
+
+// Получить список товаров
+// Получает список товаров сообщества
+//
+// Параметры:
+// Подборка - Строка,Число - ID подборки, если нужен отбор - sel
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - Массив соответствий товаров
+Функция ПолучитьСписокТоваров(Знач Подборка = "", Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("count" , 200);
+ Параметры_.Вставить("extended" , 1);
+ Параметры_.Вставить("with_disabled", 1);
+
+ Если ЗначениеЗаполнено(Подборка) Тогда
+ Параметры_.Вставить("album_id", Подборка);
+ КонецЕсли;
+
+ МассивТоваров = Новый Массив;
+ ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры_);
+
+ Возврат МассивТоваров;
+
+КонецФункции
+
+// Получить товары по ID
+// Получает информацию о товарах по массиву ID
+//
+// Параметры:
+// Товары - Строка, Массив Из Строка - Массив ID товаров - items
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ПолучитьТоварыПоИД(Знач Товары, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Товары);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ СтрокаТоваров = "";
+ Owner = "owner_id";
+
+ Для Каждого Товар Из Товары Цикл
+ ТекущийТовар = Параметры_[Owner] + "_" + Товар;
+ ТекущийТовар = OPI_Инструменты.ЧислоВСтроку(ТекущийТовар);
+ СтрокаТоваров = СтрокаТоваров + ТекущийТовар + ",";
+ КонецЦикла;
+
+ СтрокаТоваров = Лев(СтрокаТоваров, СтрДлина(СтрокаТоваров) - 1);
+ Параметры_.Вставить("item_ids", СтрокаТоваров);
+ Параметры_.Вставить("extended", 1);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getById", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Добавить товар
+// Добавляет новый товар в каталог сообщества
+//
+// Параметры:
+// ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь
+// Подборка - Строка - ID подборка для помещения товара, если необходимо - sel
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ДобавитьТовар(Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт
+ Возврат УправлениеТоваром(ОписаниеТовара, , Подборка, Параметры);
+КонецФункции
+
+// Изменить товар
+// Изменяет ранее созданный товар
+//
+// Параметры:
+// Товар - Число,Строка - Идентификатор изменяемого товара - item
+// ОписаниеТовара - Соответствие Из КлючИЗначение - См.ПолучитьОписаниеТовара - product - JSON описание товара или путь
+// Подборка - Строка - Идентификатор новой подборки, если необходимо - sel
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ИзменитьТовар(Знач Товар, Знач ОписаниеТовара, Знач Подборка = "", Знач Параметры = "") Экспорт
+ Возврат УправлениеТоваром(ОписаниеТовара, Товар, Подборка, Параметры);
+КонецФункции
+
+// Удалить товар
+// Удаляет ранее созданный товар
+//
+// Параметры:
+// Товар - Строка,Число - ID товара - item
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция УдалитьТовар(Знач Товар, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("item_id", Товар);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.delete", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Сгруппировать товары
+// Группирует товары на основе одинаковых наборов свойств
+//
+// Параметры:
+// МассивТоваров - Массив Из Строка - Массив ID товаров - items
+// СуществующаяГруппа - Строка - ID существующей группы, если необходимо - sellgroup
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СгруппироватьТовары(Знач МассивТоваров, Знач СуществующаяГруппа = "", Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(СуществующаяГруппа);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ МассивТоваров_ = Новый Массив;
+
+ Для Каждого Товар Из МассивТоваров Цикл
+ МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар));
+ КонецЦикла;
+
+ Товары = СтрСоединить(МассивТоваров_, ",");
+
+ Параметры_.Вставить("item_ids", Товары);
+
+ Если ЗначениеЗаполнено(СуществующаяГруппа) Тогда
+ Параметры_.Вставить("item_group_id", СуществующаяГруппа);
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.groupItems", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить описание товара. !NOCLI
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - Пустое описание товара:
+// *Имя - Строка - Имя товара
+// *Описание - Строка - Описание товара
+// *Категория - Строка - См. ПолучитьСписокКатегорийТоваров
+// *Цена - Число - Цена товара
+// *СтараяЦена - Число - Для отображения скидки/изменения цены
+// *ОсновноеФото - Строка,ДвоичныеДанные - Двоичные данные или путь к фото
+// *URL - Строка - Ссылка на страницу сайта магазина
+// *ДополнительныеФото - Массив Из Строка - Двоичные данные или пути к фото
+// *ЗначенияСвойств - Массив Из Строка - См.ДобавитьВариантСвойстваТовара
+// *ГлавныйВГруппе - Булево - Главный в группе, если есть в группе
+// *Ширина - Число - Ширина товара в мм.
+// *Высота - Число - Высота товара в мм.
+// *Глубина - Число - Глубина товара в мм.
+// *Вес - Число - Вес в гр.
+// *SKU - Строка - SKU
+// *ДоступныйОстаток - Число - Остаток. -1 - не ограничено
+Функция ПолучитьОписаниеТовара() Экспорт
+
+ Товар = Новый Соответствие();
+ Товар.Вставить("Имя" , "Новый товар"); // Имя товара
+ Товар.Вставить("Описание" , "Описание товара"); // Описание товара
+ Товар.Вставить("Категория" , "20173"); // См ПолучитьСписокКатегорийТоваров()
+ Товар.Вставить("Цена" , 1); // Цена.
+ Товар.Вставить("СтараяЦена" , Неопределено); // Для отражения изменения цены
+ Товар.Вставить("ОсновноеФото" , Неопределено); // ДД или путь к осн. фото
+ Товар.Вставить("URL" , Неопределено); // Ссылка на страницу магазина
+ Товар.Вставить("ДополнительныеФото" , Новый Массив); // Массив путей или ДД для доп. фото
+ Товар.Вставить("ЗначенияСвойств" , Новый Массив); // Значения свойств (варианты). Максимум 2
+ Товар.Вставить("ГлавныйВГруппе" , Ложь); // Сделать главным в своей группе
+ Товар.Вставить("Ширина" , Неопределено); // В миллиметрах
+ Товар.Вставить("Высота" , Неопределено); // В миллиметрах
+ Товар.Вставить("Глубина" , Неопределено); // В миллиметрах
+ Товар.Вставить("Вес" , Неопределено); // В граммах
+ Товар.Вставить("SKU" , Неопределено); // Артикул
+ Товар.Вставить("ДоступныйОстаток" , 1);
+
+ Возврат Товар;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСПодборкамиТоваров
+
+// Получить список подборок
+// Получает список подборок товаров
+//
+// Параметры:
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - Массив соответствий подборок
+Функция ПолучитьСписокПодборок(Знач Параметры = "") Экспорт
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("count", 100);
+
+ МассивАльбомов = Новый Массив;
+ ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры_);
+
+ Возврат МассивАльбомов;
+
+КонецФункции
+
+// Получить подборки по ID
+// Получить список подборок по массиву ID
+//
+// Параметры:
+// Подборки - Строка, Массив Из Строка - ID подборок - sels
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ПолучитьПодборкиПоИД(Знач Подборки, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Подборки);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Подборки_ = Новый Массив;
+ СтрокаПодборок = "";
+
+ Для Каждого Подборка Из Подборки Цикл
+ Подборки_.Добавить(OPI_Инструменты.ЧислоВСтроку(Подборка));
+ КонецЦикла;
+
+ СтрокаПодборок = СтрСоединить(Подборки_, ",");
+
+ Параметры_.Вставить("album_ids", СтрокаПодборок);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getAlbumById", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Создать подборку товаров
+// Создает пустую подборку товаров
+//
+// Параметры:
+// Название - Строка - Название подборки - title
+// Картинка - Строка,ДвоичныеДанные - Файл картинки - picture
+// Основная - Булево - Основная - main
+// Скрытая - Булево - Скрытая - hidden
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьПодборкуТоваров(Знач Название
+ , Знач Картинка
+ , Знач Основная = Ложь
+ , Знач Скрытая = Ложь
+ , Знач Параметры = "") Экспорт
+
+ Возврат УправлениеПодборкой(Название, Картинка, , Основная, Скрытая, Параметры);
+
+КонецФункции
+
+// Изменить подборку товаров
+// Изменяет свойства подборки товаров
+//
+// Параметры:
+// Название - Строка - Новое название подборки - title
+// Подборка - Строка - ID подборки - sel
+// Картинка - Строка,ДвоичныеДанные - Новая картинка подборки - picture
+// Основная - Булево - Основная - main
+// Скрытая - Булево - Скрытая - hidden
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ИзменитьПодборкуТоваров(Знач Название
+ , Знач Подборка
+ , Знач Картинка = ""
+ , Знач Основная = Ложь
+ , Знач Скрытая = Ложь
+ , Знач Параметры = "") Экспорт
+
+ Возврат УправлениеПодборкой(Название, Картинка, Подборка, Основная, Скрытая, Параметры);
+
+КонецФункции
+
+// Добавить товар в подборку
+// Добавляет товар в подборку
+//
+// Параметры:
+// МассивТоваров - Массив из Строка, Число - Массив товаров или товар - items
+// Подборка - Строка - ID подборки - sel
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ДобавитьТоварВПодборку(Знач МассивТоваров, Знач Подборка, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивТоваров);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ МассивТоваров_ = Новый Массив;
+
+ Для Каждого Товар Из МассивТоваров Цикл
+ МассивТоваров_.Добавить(OPI_Инструменты.ЧислоВСтроку(Товар));
+ КонецЦикла;
+
+ СписокТоваров = СтрСоединить(МассивТоваров_, ",");
+
+ Параметры_.Вставить("item_ids" , СписокТоваров);
+ Параметры_.Вставить("album_ids", Подборка);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addToAlbum", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить товар из подборки
+// Удаляет ранее добавленный товар из подборки
+//
+// Параметры:
+// Товар - Строка - ID товара - item
+// Подборка - Строка - ID подборки - sel
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция УдалитьТоварИзПодборки(Знач Товар, Знач Подборка, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Товар);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+
+ Параметры_.Вставить("item_id" , Товар);
+ Параметры_.Вставить("album_ids", Подборка);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.removeFromAlbum", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить подборку
+// Удаляет подборку по ID
+//
+// Параметры:
+// Подборка - Строка - ID подборки - sel
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция УдалитьПодборку(Знач Подборка, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("album_id", Подборка);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteAlbum", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСоСвойствамиТоваров
+
+// Получить список свойств
+// Получает список свойств товаров группы
+//
+// Параметры:
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ПолучитьСписокСвойств(Знач Параметры = "") Экспорт
+
+ Response = "response";
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getProperties", Параметры_);
+ Свойства = Ответ[Response]["items"];
+
+ Возврат Свойства;
+
+КонецФункции
+
+// Создать свойство товара
+// Создает новое свойство для использования в товарах
+//
+// Параметры:
+// Название - Строка - Название свойства - title
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция СоздатьСвойствоТовара(Знач Название, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Название);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("title", Название);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addProperty", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Изменить свойство товара
+// Изменяет существующее свойство товара
+//
+// Параметры:
+// Название - Строка - Новое название - title
+// Свойство - Строка,Число - ID свойства - prop
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ИзменитьСвойствоТовара(Знач Название, Знач Свойство, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Название);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("title" , Название);
+ Параметры_.Вставить("property_id", Свойство);
+ Параметры_.Вставить("type" , "text");
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editProperty", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить свойство товара
+// Удаляет существующее свойство товара
+//
+// Параметры:
+// Свойство - Строка,Число - ID свойства - prop
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция УдалитьСвойствоТовара(Знач Свойство, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("property_id", Свойство);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deleteProperty", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Добавить вариант свойства товара
+// Добавляет вариант для существующего свойства
+//
+// Параметры:
+// Значение - Строка - Значение свойства - value
+// Свойство - Строка,Число - ID свойства, куда добавляется вариант - prop
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ДобавитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("property_id", Свойство);
+ Параметры_.Вставить("title" , Значение);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.addPropertyVariant", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Изменить вариант свойства товара
+// Изменяет значение варианта существующего свойства товара
+//
+// Параметры:
+// Значение - Строка - Новое значение свойства - value
+// Свойство - Строка,Число - ID свойства - prop
+// Вариант - Строка,Число - ID варианта - option
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ИзменитьВариантСвойстваТовара(Знач Значение, Знач Свойство, Знач Вариант, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Свойство);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("property_id", Свойство);
+ Параметры_.Вставить("variant_id" , Вариант);
+ Параметры_.Вставить("title" , Значение);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.editPropertyVariant", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить вариант свойства товара
+// Удаляет ранее созданный вариант свойства
+//
+// Параметры:
+// Вариант - Строка,Число - ID варианта - option
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция УдалитьВариантСвойстваТовара(Знач Вариант, Знач Параметры = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Вариант);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("variant_id", Вариант);
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.deletePropertyVariant", Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область РаботаСЗаказами
+
+// Получить список заказов
+// Возвращает список заказов сообщества
+//
+// Параметры:
+// Параметры - Структура из Строка - См.ПолучитьСтандартныеПараметры - auth - JSON авторизации или путь к .json
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от VK
+Функция ПолучитьСписокЗаказов(Знач Параметры = "") Экспорт
+
+ Параметры = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры.Вставить("count", 50);
+
+ МассивЗаказов = Новый Массив;
+ ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры);
+
+ Возврат МассивЗаказов;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область Прочие
+
+// Сформировать клавиатуру
+// Формирует клавиатуру по массиву кнопок
+//
+// Параметры:
+// МассивКнопок - Массив из Строка - Массив заголовков кнопок - buttons
+//
+// Возвращаемое значение:
+// Строка - JSON клавиатуры
+Функция СформироватьКлавиатуру(Знач МассивКнопок) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок);
+
+ Клавиатура = Новый Структура;
+ МассивКлавиатуры = Новый Массив;
+ МассивБлока = Новый Массив;
+
+ Для Каждого Действие Из МассивКнопок Цикл
+
+ Кнопка = Новый Структура;
+ Выражение = Новый Структура;
+
+ Выражение.Вставить("type" , "text");
+ Выражение.Вставить("label", Действие);
+
+ Кнопка.Вставить("action", Выражение);
+ МассивБлока.Добавить(Кнопка);
+
+ КонецЦикла;
+
+ МассивКлавиатуры.Добавить(МассивБлока);
+
+ Клавиатура.Вставить("buttons" , МассивКлавиатуры);
+ Клавиатура.Вставить("one_time", Ложь);
+
+ Возврат OPI_Инструменты.JSONСтрокой(Клавиатура);
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ПолучитьСтандартныеПараметры(Знач Параметры = "")
+
+ // Здесь собрано определение данных для работы с VK API
+ // Вы можете переопределять их, передавая в качестве параметра
+ // Совпадающие поля будут перезаписаны с приоритетом параметра функции
+
+ Параметры_ = Новый Структура;
+
+ // access_token - можно получить в браузере по URL из функции СоздатьСсылкуПолученияТокена()
+ // from_group - действия будут выполняться от лица группы
+ // owner_id - id группы с "-" в начале. Можно найти в настройках группы ВК или в ее URL, если не был
+ // установлен свой
+ // app_id - id приложения, которое необходимо создать в профиле на странице для разработчиков
+ // group_id - owner_id, но без "-"
+
+ Параметры_.Вставить("access_token" , "");
+ Параметры_.Вставить("from_group" , "1");
+ Параметры_.Вставить("owner_id" , "");
+ Параметры_.Вставить("v" , "5.131");
+ Параметры_.Вставить("app_id" , "");
+ Параметры_.Вставить("group_id" , "");
+
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Параметры);
+
+ Если ТипЗнч(Параметры) = Тип("Структура") Или ТипЗнч(Параметры) = Тип("Соответствие") Тогда
+ Для Каждого ПереданныйПараметр Из Параметры Цикл
+ Параметры_.Вставить(ПереданныйПараметр.Ключ, OPI_Инструменты.ЧислоВСтроку(ПереданныйПараметр.Значение));
+ КонецЦикла;
+ КонецЕсли;
+
+ Возврат Параметры_;
+
+КонецФункции
+
+Функция ПолучитьИДКартинки(Знач Картинка, Знач Параметры, Знач Вид)
+
+ Response = "response";
+ Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид);
+ Результат = Ответ[Response];
+
+ Если ЗначениеЗаполнено(Результат) Тогда
+ ИДФото = Результат["photo_id"];
+
+ Если Не ЗначениеЗаполнено(ИДФото) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ Иначе
+ Возврат Ответ;
+ КонецЕсли;
+
+ ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото);
+ Возврат ИДФото;
+
+КонецФункции
+
+Функция ПолучитьСоответствиеКартинки(Знач Картинка, Знач Параметры, Знач Вид)
+
+ Ответ = ЗагрузитьФотоНаСервер(Картинка, Параметры, Вид);
+ ОтветМассив = Ответ.Получить("response");
+
+ Если Не ЗначениеЗаполнено(ОтветМассив) Или Не ТипЗнч(ОтветМассив) = Тип("Массив") Тогда
+ Возврат Ответ;
+ Иначе
+ Если ОтветМассив.Количество() = 0 Тогда
+ Возврат Ответ;
+ Иначе
+ ОтветСоответствие = ОтветМассив[0];
+ КонецЕсли;
+ КонецЕсли;
+
+ Возврат ОтветСоответствие;
+
+КонецФункции
+
+Функция ПолучитьМассивПодборок(Знач Подборки, Знач Параметры = "")
+
+ Response = "response";
+ Подборки = ПолучитьПодборкиПоИД(Подборки, Параметры);
+ Результат = Подборки[Response];
+
+ Если ЗначениеЗаполнено(Результат) Тогда
+
+ МассивПодборок = Результат["items"];
+
+ Если Не ЗначениеЗаполнено(МассивПодборок) Тогда
+ Возврат Подборки;
+ КонецЕсли;
+
+ Иначе
+ Возврат Подборки;
+ КонецЕсли;
+
+ Возврат МассивПодборок;
+
+КонецФункции
+
+Функция ОпределитьМетодЗагрузкиИзображений(Знач Вид)
+
+ СоответствиеМетодов = Новый Соответствие;
+ Загрузка = "Загрузка";
+ Сохранение = "Сохранение";
+ Способ = "Способ";
+ Фото = "Фото";
+
+ Если Вид = "Пост" Тогда
+
+ СоответствиеМетодов.Вставить(Загрузка , "photos.getWallUploadServer");
+ СоответствиеМетодов.Вставить(Сохранение, "photos.saveWallPhoto");
+ СоответствиеМетодов.Вставить(Фото , "photo");
+ СоответствиеМетодов.Вставить(Способ , 1);
+
+ ИначеЕсли Вид = "Товар" Тогда
+
+ СоответствиеМетодов.Вставить(Загрузка , "market.getProductPhotoUploadServer");
+ СоответствиеМетодов.Вставить(Сохранение, "market.saveProductPhoto");
+ СоответствиеМетодов.Вставить(Способ , 2);
+
+ ИначеЕсли Вид = "История" Тогда
+
+ СоответствиеМетодов.Вставить(Загрузка , "stories.getPhotoUploadServer");
+ СоответствиеМетодов.Вставить(Сохранение, "stories.save");
+ СоответствиеМетодов.Вставить(Способ , 3);
+
+ ИначеЕсли Вид = "Опрос" Тогда
+
+ СоответствиеМетодов.Вставить(Загрузка , "polls.getPhotoUploadServer");
+ СоответствиеМетодов.Вставить(Сохранение, "polls.savePhoto");
+ СоответствиеМетодов.Вставить(Фото , "photo");
+ СоответствиеМетодов.Вставить(Способ , 1);
+
+ Иначе
+
+ СоответствиеМетодов.Вставить(Загрузка , "photos.getUploadServer");
+ СоответствиеМетодов.Вставить(Сохранение, "photos.save");
+ СоответствиеМетодов.Вставить(Фото , "photos_list");
+ СоответствиеМетодов.Вставить(Способ , 1);
+
+ КонецЕсли;
+
+ Возврат СоответствиеМетодов;
+
+КонецФункции
+
+Функция ПолучитьСоответствиеПараметровТовара()
+
+ Поля = Новый Соответствие();
+ Поля.Вставить("Имя" , "name");
+ Поля.Вставить("Описание" , "description");
+ Поля.Вставить("Категория" , "category_id");
+ Поля.Вставить("Цена" , "price");
+ Поля.Вставить("СтараяЦена" , "old_price");
+ Поля.Вставить("URL" , "url");
+ Поля.Вставить("ГлавныйВГруппе" , "is_main_variant");
+ Поля.Вставить("Ширина" , "dimension_width");
+ Поля.Вставить("Высота" , "dimension_height");
+ Поля.Вставить("Глубина" , "dimension_length");
+ Поля.Вставить("Вес" , "weight");
+ Поля.Вставить("SKU" , "sku");
+ Поля.Вставить("ДоступныйОстаток" , "stock_amount");
+
+ Возврат Поля;
+
+КонецФункции
+
+Функция УправлениеТоваром(Знач ОписаниеТовара, Знач ИДТовара = "", Знач Подборка = "", Знач Параметры = "")
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДТовара);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Подборка);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(ОписаниеТовара);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Параметры_.Вставить("v", "5.199");
+
+ Response = "response";
+
+ ЗаполнитьПоляЗапросаТовара(ОписаниеТовара, Параметры_);
+
+ Если ЗначениеЗаполнено(ИДТовара) Тогда
+ Параметры_.Вставить("item_id", ИДТовара);
+ Метод = "edit";
+ Иначе
+ Метод = "add";
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_);
+ Результат = Ответ[Response];
+
+ Если Не ЗначениеЗаполнено(ИДТовара) И ЗначениеЗаполнено(Результат) Тогда
+
+ ИДТовара = Результат["market_item_id"];
+
+ Если Не ЗначениеЗаполнено(ИДТовара) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ Иначе
+ Возврат Ответ;
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(Подборка) И ЗначениеЗаполнено(ИДТовара) Тогда
+ ДобавитьТоварВПодборку(ИДТовара, Подборка, Параметры_);
+ КонецЕсли;
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция УправлениеПодборкой(Знач Название
+ , Знач Картинка = ""
+ , Знач ИДПодборки = ""
+ , Знач Основная = Ложь
+ , Знач Скрытая = Ложь
+ , Знач Параметры = "")
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Название);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДПодборки);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Основная);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Скрытая);
+
+ Параметры_ = ПолучитьСтандартныеПараметры(Параметры);
+ Ответ = ДобавитьПараметрКартинки(Картинка, ИДПодборки, Параметры_);
+
+ Если ЗначениеЗаполнено(Ответ) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ Параметры_.Вставить("title" , Название);
+ Параметры_.Вставить("main_album" , ?(Основная, 1, 0));
+ Параметры_.Вставить("is_hidden" , ?(Скрытая, 1, 0));
+
+ Если ЗначениеЗаполнено(ИДПодборки) Тогда
+ Параметры_.Вставить("album_id", ИДПодборки);
+ Метод = "editAlbum";
+ Иначе
+ Метод = "addAlbum";
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market." + Метод, Параметры_);
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ДобавитьПараметрКартинки(Знач Картинка, Знач ИДПодборки, Параметры)
+
+ PhotoID = "photo_id";
+
+ Если ЗначениеЗаполнено(Картинка) Тогда
+
+ ИДФото = ПолучитьИДКартинки(Картинка, Параметры, "Товар");
+
+ Если Не ТипЗнч(ИДФото) = Тип("Строка") Тогда
+ Возврат ИДФото;
+ КонецЕсли;
+
+ Параметры.Вставить(PhotoID, ИДФото);
+
+ Иначе
+
+ Если ЗначениеЗаполнено(ИДПодборки) Тогда
+
+ Подборки = ПолучитьМассивПодборок(ИДПодборки, Параметры);
+
+ Если Не ТипЗнч(Подборки) = Тип("Массив") Тогда
+ Возврат Подборки;
+ КонецЕсли;
+
+ Если Не Подборки.Количество() = 0 Тогда
+ ИДФото = Подборки[0]["photo"]["id"];
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ИДФото);
+ Параметры.Вставить(PhotoID, ИДФото);
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Возврат "";
+
+КонецФункции
+
+Процедура ЗаполнитьПараметрыЗагрузкиФото(Знач Метод, Знач Ответ, Параметры)
+
+ Response = "response";
+ Способ = Метод["Способ"];
+ СтандартныйСпособ = 1;
+ НовыйСпособ = 2;
+
+ Если Способ = СтандартныйСпособ Тогда
+
+ Hash = "hash";
+ Serv = "server";
+ Aid = "aid";
+ Фото = Метод["Фото"];
+
+ Параметры.Вставить(Hash, Ответ[Hash]);
+ Параметры.Вставить(Фото, Ответ[Фото]);
+
+ СерверФото = Ответ.Получить(Serv);
+
+ Если ЗначениеЗаполнено(СерверФото) Тогда
+ СерверФото = OPI_Инструменты.ЧислоВСтроку(СерверФото);
+ Параметры.Вставить(Serv, СерверФото);
+ КонецЕсли;
+
+ Идентификатор = Ответ.Получить(Aid);
+
+ Если ЗначениеЗаполнено(Идентификатор) Тогда
+ Идентификатор = OPI_Инструменты.ЧислоВСтроку(Идентификатор);
+ Параметры.Вставить(Aid , Идентификатор);
+ КонецЕсли;
+
+ ИначеЕсли Способ = НовыйСпособ Тогда
+
+ ОтветСтрокой = OPI_Инструменты.JSONСтрокой(Ответ);
+ Параметры.Вставить("upload_response", ОтветСтрокой);
+
+ Иначе
+
+ Параметры.Вставить("upload_results", Ответ[Response]["upload_result"]);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ЗаполнитьПоляЗапросаТовара(Знач ОписаниеТовара, Параметры)
+
+ Response = "response";
+ ОсновноеФото = ОписаниеТовара["ОсновноеФото"];
+ ДопФото = ОписаниеТовара["ДополнительныеФото"];
+ Свойства = ОписаниеТовара["ЗначенияСвойств"];
+
+ Если ЗначениеЗаполнено(ОсновноеФото) Тогда
+
+ Ответ = ЗагрузитьФотоНаСервер(ОсновноеФото, Параметры, "Товар");
+ Результат = Ответ[Response];
+
+ Если ЗначениеЗаполнено(Результат) Тогда
+ ИДФото = Результат["photo_id"];
+
+ Если Не ЗначениеЗаполнено(ИДФото) Тогда
+ Возврат;
+ КонецЕсли;
+
+ Иначе
+ Возврат;
+ КонецЕсли;
+
+ ИДФото = OPI_Инструменты.ЧислоВСтроку(ИДФото);
+ Параметры.Вставить("main_photo_id", ИДФото);
+
+ КонецЕсли;
+
+ Если ТипЗнч(Свойства) = Тип("Массив") Тогда
+
+ Свойства_ = Новый Массив;
+
+ Для Каждого Свойство Из Свойства Цикл
+ Свойства_.Добавить(OPI_Инструменты.ЧислоВСтроку(Свойство));
+ КонецЦикла;
+
+ Свойства = СтрСоединить(Свойства_, ",");
+
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(Свойства) Тогда
+ Параметры.Вставить("variant_ids", OPI_Инструменты.ЧислоВСтроку(Свойства));
+ КонецЕсли;
+
+ ДобавитьДополнительныеФотоТовара(ДопФото, Параметры);
+
+ Для Каждого Поле Из ПолучитьСоответствиеПараметровТовара() Цикл
+
+ Значение = ОписаниеТовара[Поле.Ключ];
+
+ Если Значение <> Неопределено Тогда
+ Параметры.Вставить(Поле.Значение, ОписаниеТовара[Поле.Ключ]);
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ДобавитьДополнительныеФотоТовара(Знач МассивФото, Параметры)
+
+ Если ТипЗнч(МассивФото) = Тип("Массив") Тогда
+ Если МассивФото.Количество() > 0 Тогда
+
+ СтрокаФотографий = "";
+
+ Для Каждого Фото Из МассивФото Цикл
+
+ ИДФото = ПолучитьИДКартинки(Фото, Параметры, "Товар");
+
+ Если Не ТипЗнч(ИДФото) = Тип("Строка") Тогда
+ Возврат;
+ КонецЕсли;
+
+ СтрокаФотографий = СтрокаФотографий + ИДФото + ",";
+
+ КонецЦикла;
+
+ СтрокаФотографий = Лев(СтрокаФотографий, СтрДлина(СтрокаФотографий) - 1);
+ Параметры.Вставить("photo_ids", СтрокаФотографий);
+ КонецЕсли;
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг = 0)
+
+ Response = "response";
+ МаксимумВЗапросе = 200;
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.get", Параметры);
+ Товары = Ответ[Response]["items"];
+
+ Если Товары.Количество() = 0 Тогда
+ Возврат;
+ КонецЕсли;
+
+ Для Каждого Товар Из Товары Цикл
+ МассивТоваров.Добавить(Товар);
+ КонецЦикла;
+
+ Сдвиг = Сдвиг + МаксимумВЗапросе;
+ Параметры.Вставить("offset", Сдвиг);
+ ПолучитьСписокТоваровРекурсивно(МассивТоваров, Параметры, Сдвиг);
+
+КонецПроцедуры
+
+Процедура ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг = 0)
+
+ Response = "response";
+ МаксимумВЗапросе = 100;
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getAlbums", Параметры);
+ Альбомы = Ответ[Response]["items"];
+
+ Если Альбомы.Количество() = 0 Тогда
+ Возврат;
+ КонецЕсли;
+
+ Для Каждого Альбом Из Альбомы Цикл
+ МассивАльбомов.Добавить(Альбом);
+ КонецЦикла;
+
+ Сдвиг = Сдвиг + МаксимумВЗапросе;
+ Параметры.Вставить("offset", Сдвиг);
+ ПолучитьСписокАльбомовРекурсивно(МассивАльбомов, Параметры, Сдвиг);
+
+КонецПроцедуры
+
+Процедура ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг = 0)
+
+ Response = "response";
+ МаксимумВЗапросе = 50;
+ Ответ = OPI_Инструменты.Get("api.vk.com/method/market.getGroupOrders", Параметры);
+ Заказы = Ответ[Response]["items"];
+
+ Если Заказы.Количество() = 0 Тогда
+ Возврат;
+ КонецЕсли;
+
+ Для Каждого Заказ Из Заказы Цикл
+ МассивЗаказов.Добавить(Заказ);
+ КонецЦикла;
+
+ Сдвиг = Сдвиг + МаксимумВЗапросе;
+ Параметры.Вставить("offset", Сдвиг);
+ ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг);
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_Viber.os b/ru/OInt/core/Modules/OPI_Viber.os
index 7443cbf692..1d2dd91c96 100644
--- a/ru/OInt/core/Modules/OPI_Viber.os
+++ b/ru/OInt/core/Modules/OPI_Viber.os
@@ -1,414 +1,414 @@
-// Расположение OS: ./OInt/core/Modules/OPI_Viber.os
-// Библиотека: Viber
-// Команда CLI: viber
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область НастройкиИИнформация
-
-// Установить Webhook
-// ВАЖНО: Установка Webhook обязательна по правилам Viber. Для этого надо иметь свободный URL,
-// который будет возвращать 200 и подлинный SSL сертификат. Если есть сертификат и база опубликована
-// на сервере - можно использовать http-сервис. Туда же будет приходить и информация о новых сообщениях
-// Viber периодически стучит по адресу Webhook, так что если он будет неактивен, то все перестанет работать
-//
-// Параметры:
-// Токен - Строка - Токен Viber - token
-// URL - Строка - URL для установки Webhook - url
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("url" , URL , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("auth_token" , Токен, "Строка", Параметры);
-
- Возврат OPI_Инструменты.Post("https://chatapi.viber.com/pa/set_webhook", Параметры);
-
-КонецФункции
-
-// Получить информацию о канале
-// Тут можно получить ID пользователей канала. ID для бота необходимо получать из прилетов на Webhook
-// ID пользователя из информации о канале не подойдет для отправки сообщений через бота - они разные
-//
-// Параметры:
-// Токен - Строка - Токен - token
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ПолучитьИнформациюОКанале(Знач Токен) Экспорт
-
- URL = "https://chatapi.viber.com/pa/get_account_info";
- Возврат OPI_Инструменты.Get(URL, , ТокенВЗаголовки(Токен));
-
-КонецФункции
-
-// Получить данные пользователя
-// Получает информацию о пользователе по ID
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// IDПользователя - Строка, Число - ID пользователя Viber - user
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ПолучитьДанныеПользователя(Знач Токен, Знач IDПользователя) Экспорт
-
- URL = "https://chatapi.viber.com/pa/get_user_details";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("id", IDПользователя, "Строка", Параметры);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен));
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить онлайн пользователей
-// Получает статус пользователя или нескольких пользователей по ID
-//
-// Параметры:
-// Токен - Строка - Токен Viber - token
-// IDПользователей - Строка,Число,Массив из Строка,Число - ID пользователей(я) Viber - users
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ПолучитьОнлайнПользователей(Знач Токен, Знач IDПользователей) Экспорт
-
- URL = "https://chatapi.viber.com/pa/get_online";
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("ids", IDПользователей, "Коллекция", Параметры);
-
- Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен));
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область ОтправкаСообщений
-
-// Отправить текстовое сообщение
-// Отправляет текстовое сообщение в чат или канал
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Текст - Строка - Текст сообщения - text
-// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
-// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
-// Клавиатура - Структура из Строка - См. СформироватьКлавиатуруИзМассиваКнопок - keyboard
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ОтправитьТекстовоеСообщение(Знач Токен
- , Знач Текст
- , Знач IDПользователя
- , Знач ОтправкаВКанал
- , Знач Клавиатура = "") Экспорт
-
- Возврат ОтправитьСообщение(Токен, "text", IDПользователя, ОтправкаВКанал, , Текст, Клавиатура);
-
-КонецФункции
-
-// Отправить картинку
-// Отправляет картинку в чат или канал
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// URL - Строка - URL картинки - picture
-// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
-// ОтправкаВКанал - булево - Отправка в канал или в чат бота - ischannel
-// Описание - Строка - Аннотация к картинке - description
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ОтправитьКартинку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал, Знач Описание = "") Экспорт
-
- Возврат ОтправитьСообщение(Токен, "picture", IDПользователя, ОтправкаВКанал, URL, Описание);
-
-КонецФункции
-
-// Отправить файл
-// Отправляет файл (документ) в чат или канал
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// URL - Строка - URL файла - file
-// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
-// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
-// Расширение - Строка - Расширение файла - ext
-// Размер - Число - Размер файла. Если не заполнен > определяется автоматически скачиванием файла - size
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ОтправитьФайл(Знач Токен
- , Знач URL
- , Знач IDПользователя
- , Знач ОтправкаВКанал
- , Знач Расширение
- , Знач Размер = "") Экспорт
-
- Если Не ЗначениеЗаполнено(Размер) Тогда
-
- Ответ = OPI_Инструменты.Get(URL);
- Размер = Ответ.Размер();
-
- КонецЕсли;
-
- Строка_ = "Строка";
- Расширение = СтрЗаменить(Расширение, ".", "");
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("URL" , URL , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("Размер" , Размер , Строка_, Параметры);
- OPI_Инструменты.ДобавитьПоле("Расширение", Расширение, Строка_, Параметры);
-
- Возврат ОтправитьСообщение(Токен, "file", IDПользователя, ОтправкаВКанал, Параметры);
-
-КонецФункции
-
-// Отправить контакт
-// Отправляет контакт с номером телефона в чат или канал
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// ИмяКонтакта - Строка - Имя контакта - name
-// НомерТелефона - Строка - Номер телефона - phone
-// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
-// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ОтправитьКонтакт(Знач Токен
- , Знач ИмяКонтакта
- , Знач НомерТелефона
- , Знач IDПользователя
- , Знач ОтправкаВКанал) Экспорт
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("name" , ИмяКонтакта , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("phone_number", НомерТелефона, "Строка", Параметры);
-
- Возврат ОтправитьСообщение(Токен, "contact", IDПользователя, ОтправкаВКанал, Параметры);
-
-КонецФункции
-
-// Отправить локацию
-// Отправляет географические координаты в чат или канал
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Широта - Строка,Число - Географическая широта - lat
-// Долгота - Строка,Число - Географическая долгота - long
-// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
-// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ОтправитьЛокацию(Знач Токен, Знач Широта, Знач Долгота, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
-
- Параметры = Новый Структура;
- OPI_Инструменты.ДобавитьПоле("lat", Широта , "Строка", Параметры);
- OPI_Инструменты.ДобавитьПоле("lon", Долгота, "Строка", Параметры);
-
- Возврат ОтправитьСообщение(Токен, "location", IDПользователя, ОтправкаВКанал, Параметры);
-
-КонецФункции
-
-// Отправить ссылку
-// Отправляет URL с предпросмотром в чат или канал
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// URL - Строка - Отправляемая ссылка - url
-// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
-// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
-Функция ОтправитьСсылку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
-
- Возврат ОтправитьСообщение(Токен, "url", IDПользователя, ОтправкаВКанал, URL);
-
-КонецФункции
-
-// Сформировать клавиатуру из массива кнопок
-// Возвращает структура клавиатуры для сообщений
-//
-// Параметры:
-// МассивКнопок - Массив из Строка - Массив кнопок - buttons
-// ЦветКнопок - Строка - HEX цвет кнопок с # в начале - color
-//
-// Возвращаемое значение:
-// Структура - Сформировать клавиатуру из массива кнопок:
-// * Buttons - Массив из Структура - Массив сформированных кнопок
-// * Type - Строка - Тип клавиатуры
-Функция СформироватьКлавиатуруИзМассиваКнопок(Знач МассивКнопок, Знач ЦветКнопок = "#2db9b9") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦветКнопок);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок);
-
- МассивСтруктурКнопок = Новый Массив;
- СтруктураКлавиатуры = Новый Структура;
-
- Для Каждого ТекстКнопки Из МассивКнопок Цикл
-
- СтруктураКнопки = Новый Структура;
- СтруктураКнопки.Вставить("ActionType", "reply");
- СтруктураКнопки.Вставить("ActionBody", ТекстКнопки);
- СтруктураКнопки.Вставить("Text" , ТекстКнопки);
- СтруктураКнопки.Вставить("BgColor" , ЦветКнопок);
- СтруктураКнопки.Вставить("Coloumns" , 3);
-
- МассивСтруктурКнопок.Добавить(СтруктураКнопки);
-
- КонецЦикла;
-
- СтруктураКлавиатуры.Вставить("Buttons", МассивСтруктурКнопок);
- СтруктураКлавиатуры.Вставить("Type" , "keyboard");
-
- Возврат СтруктураКлавиатуры;
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-// Отправить сообщение.
-//
-// Параметры:
-// Токен - Строка - Токен
-// Тип - Строка - Тип отправляемого сообщения
-// IDПользователя - Строка,Число - ID пользователя Viber
-// ЭтоКанал - Булево - Отправка в канал или чат с ботом
-// Значение - Строка, Структура - Значение:
-// * URL - Строка - При отправке URL
-// * Размер - Число, Строка - Размер файла в случае отправке
-// * Расширение - Строка - Расширение файла в случае отправки
-// Текст - Строка - Текст сообщения
-// Клавиатура - Структура из Строка - Клавиатура, если нужна, см. СформироватьКлавиатуруИзМассиваКнопок
-//
-// Возвращаемое значение:
-// Произвольный, HTTPОтвет - Отправить сообщение
-Функция ОтправитьСообщение(Знач Токен
- , Знач Тип
- , Знач IDПользователя
- , Знач ЭтоКанал
- , Знач Значение = ""
- , Знач Текст = ""
- , Знач Клавиатура = "")
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Тип);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
- OPI_ПреобразованиеТипов.ПолучитьБулево(ЭтоКанал);
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Клавиатура);
-
- СтруктураПараметров = ВернутьСтандартныеПараметры();
- СтруктураПараметров.Вставить("type", Тип);
-
- Если (Тип = "text" Или Тип = "picture") И ЗначениеЗаполнено(Текст) Тогда
- СтруктураПараметров.Вставить("text", Текст);
- КонецЕсли;
-
- Если ТипЗнч(Клавиатура) = Тип("Структура") Тогда
- СтруктураПараметров.Вставить("keyboard", Клавиатура);
- КонецЕсли;
-
- Если ЗначениеЗаполнено(Значение) Тогда
-
- Если Тип = "file" Тогда
- СтруктураПараметров.Вставить("media" , Значение["URL"]);
- СтруктураПараметров.Вставить("size" , Значение["Размер"]);
- СтруктураПараметров.Вставить("file_name", "Файл." + Значение["Расширение"]);
- ИначеЕсли Тип = "contact" Тогда
- СтруктураПараметров.Вставить("contact" , Значение);
- ИначеЕсли Тип = "location" Тогда
- СтруктураПараметров.Вставить("location" , Значение);
- Иначе
- СтруктураПараметров.Вставить("media" , Значение);
- КонецЕсли;
-
- КонецЕсли;
-
- Если ЭтоКанал Тогда
- СтруктураПараметров.Вставить("from", IDПользователя);
- URL = "https://chatapi.viber.com/pa/post";
- Иначе
- СтруктураПараметров.Вставить("receiver", IDПользователя);
- URL = "https://chatapi.viber.com/pa/send_message";
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Post(URL, СтруктураПараметров, ТокенВЗаголовки(Токен));
-
- Попытка
- Возврат OPI_Инструменты.JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
- Исключение
- Возврат Ответ;
- КонецПопытки;
-
-КонецФункции
-
-Функция ВернутьСтандартныеПараметры()
-
- СтруктураОтправителя = Новый Структура;
- СтруктураОтправителя.Вставить("name" , "Bot");
- СтруктураОтправителя.Вставить("avatar", "");
-
- СтруктураПараметров = Новый Структура;
- СтруктураПараметров.Вставить("sender", СтруктураОтправителя);
- СтруктураПараметров.Вставить("min_api_version", 1);
-
- Возврат СтруктураПараметров;
-
-КонецФункции
-
-Функция ТокенВЗаголовки(Знач Токен)
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- СтруктураЗаголовков = Новый Соответствие;
- СтруктураЗаголовков.Вставить("X-Viber-Auth-Token", Токен);
- Возврат СтруктураЗаголовков;
-
-КонецФункции
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_Viber.os
+// Библиотека: Viber
+// Команда CLI: viber
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область НастройкиИИнформация
+
+// Установить Webhook
+// ВАЖНО: Установка Webhook обязательна по правилам Viber. Для этого надо иметь свободный URL,
+// который будет возвращать 200 и подлинный SSL сертификат. Если есть сертификат и база опубликована
+// на сервере - можно использовать http-сервис. Туда же будет приходить и информация о новых сообщениях
+// Viber периодически стучит по адресу Webhook, так что если он будет неактивен, то все перестанет работать
+//
+// Параметры:
+// Токен - Строка - Токен Viber - token
+// URL - Строка - URL для установки Webhook - url
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция УстановитьWebhook(Знач Токен, Знач URL) Экспорт
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("url" , URL , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("auth_token" , Токен, "Строка", Параметры);
+
+ Возврат OPI_Инструменты.Post("https://chatapi.viber.com/pa/set_webhook", Параметры);
+
+КонецФункции
+
+// Получить информацию о канале
+// Тут можно получить ID пользователей канала. ID для бота необходимо получать из прилетов на Webhook
+// ID пользователя из информации о канале не подойдет для отправки сообщений через бота - они разные
+//
+// Параметры:
+// Токен - Строка - Токен - token
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ПолучитьИнформациюОКанале(Знач Токен) Экспорт
+
+ URL = "https://chatapi.viber.com/pa/get_account_info";
+ Возврат OPI_Инструменты.Get(URL, , ТокенВЗаголовки(Токен));
+
+КонецФункции
+
+// Получить данные пользователя
+// Получает информацию о пользователе по ID
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// IDПользователя - Строка, Число - ID пользователя Viber - user
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ПолучитьДанныеПользователя(Знач Токен, Знач IDПользователя) Экспорт
+
+ URL = "https://chatapi.viber.com/pa/get_user_details";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("id", IDПользователя, "Строка", Параметры);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен));
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить онлайн пользователей
+// Получает статус пользователя или нескольких пользователей по ID
+//
+// Параметры:
+// Токен - Строка - Токен Viber - token
+// IDПользователей - Строка,Число,Массив из Строка,Число - ID пользователей(я) Viber - users
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ПолучитьОнлайнПользователей(Знач Токен, Знач IDПользователей) Экспорт
+
+ URL = "https://chatapi.viber.com/pa/get_online";
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("ids", IDПользователей, "Коллекция", Параметры);
+
+ Ответ = OPI_Инструменты.Post(URL, Параметры, ТокенВЗаголовки(Токен));
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ОтправкаСообщений
+
+// Отправить текстовое сообщение
+// Отправляет текстовое сообщение в чат или канал
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Текст - Строка - Текст сообщения - text
+// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
+// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
+// Клавиатура - Структура из Строка - См. СформироватьКлавиатуруИзМассиваКнопок - keyboard
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ОтправитьТекстовоеСообщение(Знач Токен
+ , Знач Текст
+ , Знач IDПользователя
+ , Знач ОтправкаВКанал
+ , Знач Клавиатура = "") Экспорт
+
+ Возврат ОтправитьСообщение(Токен, "text", IDПользователя, ОтправкаВКанал, , Текст, Клавиатура);
+
+КонецФункции
+
+// Отправить картинку
+// Отправляет картинку в чат или канал
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// URL - Строка - URL картинки - picture
+// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
+// ОтправкаВКанал - булево - Отправка в канал или в чат бота - ischannel
+// Описание - Строка - Аннотация к картинке - description
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ОтправитьКартинку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал, Знач Описание = "") Экспорт
+
+ Возврат ОтправитьСообщение(Токен, "picture", IDПользователя, ОтправкаВКанал, URL, Описание);
+
+КонецФункции
+
+// Отправить файл
+// Отправляет файл (документ) в чат или канал
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// URL - Строка - URL файла - file
+// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
+// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
+// Расширение - Строка - Расширение файла - ext
+// Размер - Число - Размер файла. Если не заполнен > определяется автоматически скачиванием файла - size
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ОтправитьФайл(Знач Токен
+ , Знач URL
+ , Знач IDПользователя
+ , Знач ОтправкаВКанал
+ , Знач Расширение
+ , Знач Размер = "") Экспорт
+
+ Если Не ЗначениеЗаполнено(Размер) Тогда
+
+ Ответ = OPI_Инструменты.Get(URL);
+ Размер = Ответ.Размер();
+
+ КонецЕсли;
+
+ Строка_ = "Строка";
+ Расширение = СтрЗаменить(Расширение, ".", "");
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("URL" , URL , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("Размер" , Размер , Строка_, Параметры);
+ OPI_Инструменты.ДобавитьПоле("Расширение", Расширение, Строка_, Параметры);
+
+ Возврат ОтправитьСообщение(Токен, "file", IDПользователя, ОтправкаВКанал, Параметры);
+
+КонецФункции
+
+// Отправить контакт
+// Отправляет контакт с номером телефона в чат или канал
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// ИмяКонтакта - Строка - Имя контакта - name
+// НомерТелефона - Строка - Номер телефона - phone
+// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
+// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ОтправитьКонтакт(Знач Токен
+ , Знач ИмяКонтакта
+ , Знач НомерТелефона
+ , Знач IDПользователя
+ , Знач ОтправкаВКанал) Экспорт
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("name" , ИмяКонтакта , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("phone_number", НомерТелефона, "Строка", Параметры);
+
+ Возврат ОтправитьСообщение(Токен, "contact", IDПользователя, ОтправкаВКанал, Параметры);
+
+КонецФункции
+
+// Отправить локацию
+// Отправляет географические координаты в чат или канал
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Широта - Строка,Число - Географическая широта - lat
+// Долгота - Строка,Число - Географическая долгота - long
+// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
+// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ОтправитьЛокацию(Знач Токен, Знач Широта, Знач Долгота, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
+
+ Параметры = Новый Структура;
+ OPI_Инструменты.ДобавитьПоле("lat", Широта , "Строка", Параметры);
+ OPI_Инструменты.ДобавитьПоле("lon", Долгота, "Строка", Параметры);
+
+ Возврат ОтправитьСообщение(Токен, "location", IDПользователя, ОтправкаВКанал, Параметры);
+
+КонецФункции
+
+// Отправить ссылку
+// Отправляет URL с предпросмотром в чат или канал
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// URL - Строка - Отправляемая ссылка - url
+// IDПользователя - Строка,Число - ID пользователя. Для канала > администратора, для бота > получателя - user
+// ОтправкаВКанал - Булево - Отправка в канал или в чат бота - ischannel
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Viber
+Функция ОтправитьСсылку(Знач Токен, Знач URL, Знач IDПользователя, Знач ОтправкаВКанал) Экспорт
+
+ Возврат ОтправитьСообщение(Токен, "url", IDПользователя, ОтправкаВКанал, URL);
+
+КонецФункции
+
+// Сформировать клавиатуру из массива кнопок
+// Возвращает структура клавиатуры для сообщений
+//
+// Параметры:
+// МассивКнопок - Массив из Строка - Массив кнопок - buttons
+// ЦветКнопок - Строка - HEX цвет кнопок с # в начале - color
+//
+// Возвращаемое значение:
+// Структура - Сформировать клавиатуру из массива кнопок:
+// * Buttons - Массив из Структура - Массив сформированных кнопок
+// * Type - Строка - Тип клавиатуры
+Функция СформироватьКлавиатуруИзМассиваКнопок(Знач МассивКнопок, Знач ЦветКнопок = "#2db9b9") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ЦветКнопок);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(МассивКнопок);
+
+ МассивСтруктурКнопок = Новый Массив;
+ СтруктураКлавиатуры = Новый Структура;
+
+ Для Каждого ТекстКнопки Из МассивКнопок Цикл
+
+ СтруктураКнопки = Новый Структура;
+ СтруктураКнопки.Вставить("ActionType", "reply");
+ СтруктураКнопки.Вставить("ActionBody", ТекстКнопки);
+ СтруктураКнопки.Вставить("Text" , ТекстКнопки);
+ СтруктураКнопки.Вставить("BgColor" , ЦветКнопок);
+ СтруктураКнопки.Вставить("Coloumns" , 3);
+
+ МассивСтруктурКнопок.Добавить(СтруктураКнопки);
+
+ КонецЦикла;
+
+ СтруктураКлавиатуры.Вставить("Buttons", МассивСтруктурКнопок);
+ СтруктураКлавиатуры.Вставить("Type" , "keyboard");
+
+ Возврат СтруктураКлавиатуры;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+// Отправить сообщение.
+//
+// Параметры:
+// Токен - Строка - Токен
+// Тип - Строка - Тип отправляемого сообщения
+// IDПользователя - Строка,Число - ID пользователя Viber
+// ЭтоКанал - Булево - Отправка в канал или чат с ботом
+// Значение - Строка, Структура - Значение:
+// * URL - Строка - При отправке URL
+// * Размер - Число, Строка - Размер файла в случае отправке
+// * Расширение - Строка - Расширение файла в случае отправки
+// Текст - Строка - Текст сообщения
+// Клавиатура - Структура из Строка - Клавиатура, если нужна, см. СформироватьКлавиатуруИзМассиваКнопок
+//
+// Возвращаемое значение:
+// Произвольный, HTTPОтвет - Отправить сообщение
+Функция ОтправитьСообщение(Знач Токен
+ , Знач Тип
+ , Знач IDПользователя
+ , Знач ЭтоКанал
+ , Знач Значение = ""
+ , Знач Текст = ""
+ , Знач Клавиатура = "")
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Тип);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(IDПользователя);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Текст);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(ЭтоКанал);
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Клавиатура);
+
+ СтруктураПараметров = ВернутьСтандартныеПараметры();
+ СтруктураПараметров.Вставить("type", Тип);
+
+ Если (Тип = "text" Или Тип = "picture") И ЗначениеЗаполнено(Текст) Тогда
+ СтруктураПараметров.Вставить("text", Текст);
+ КонецЕсли;
+
+ Если ТипЗнч(Клавиатура) = Тип("Структура") Тогда
+ СтруктураПараметров.Вставить("keyboard", Клавиатура);
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(Значение) Тогда
+
+ Если Тип = "file" Тогда
+ СтруктураПараметров.Вставить("media" , Значение["URL"]);
+ СтруктураПараметров.Вставить("size" , Значение["Размер"]);
+ СтруктураПараметров.Вставить("file_name", "Файл." + Значение["Расширение"]);
+ ИначеЕсли Тип = "contact" Тогда
+ СтруктураПараметров.Вставить("contact" , Значение);
+ ИначеЕсли Тип = "location" Тогда
+ СтруктураПараметров.Вставить("location" , Значение);
+ Иначе
+ СтруктураПараметров.Вставить("media" , Значение);
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Если ЭтоКанал Тогда
+ СтруктураПараметров.Вставить("from", IDПользователя);
+ URL = "https://chatapi.viber.com/pa/post";
+ Иначе
+ СтруктураПараметров.Вставить("receiver", IDПользователя);
+ URL = "https://chatapi.viber.com/pa/send_message";
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Post(URL, СтруктураПараметров, ТокенВЗаголовки(Токен));
+
+ Попытка
+ Возврат OPI_Инструменты.JsonВСтруктуру(Ответ.ПолучитьТелоКакДвоичныеДанные());
+ Исключение
+ Возврат Ответ;
+ КонецПопытки;
+
+КонецФункции
+
+Функция ВернутьСтандартныеПараметры()
+
+ СтруктураОтправителя = Новый Структура;
+ СтруктураОтправителя.Вставить("name" , "Bot");
+ СтруктураОтправителя.Вставить("avatar", "");
+
+ СтруктураПараметров = Новый Структура;
+ СтруктураПараметров.Вставить("sender", СтруктураОтправителя);
+ СтруктураПараметров.Вставить("min_api_version", 1);
+
+ Возврат СтруктураПараметров;
+
+КонецФункции
+
+Функция ТокенВЗаголовки(Знач Токен)
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ СтруктураЗаголовков = Новый Соответствие;
+ СтруктураЗаголовков.Вставить("X-Viber-Auth-Token", Токен);
+ Возврат СтруктураЗаголовков;
+
+КонецФункции
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_YandexDisk.os b/ru/OInt/core/Modules/OPI_YandexDisk.os
index bdef59a75d..2b3d69eed2 100644
--- a/ru/OInt/core/Modules/OPI_YandexDisk.os
+++ b/ru/OInt/core/Modules/OPI_YandexDisk.os
@@ -1,635 +1,635 @@
-// Расположение OS: ./OInt/core/Modules/OPI_YandexDisk.os
-// Библиотека: Yandex Disk
-// Команда CLI: yadisk
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:NumberOfOptionalParams-off
-// BSLLS:UsingServiceTag-off
-
-//@skip-check method-too-many-params
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-#Область РаботаСФайламиИПапками
-
-// Получить информацию о диске
-// Получает информацию о текущем диске
-//
-// Параметры:
-// Токен - Строка - Токен - token
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПолучитьИнформациюОДиске(Знач Токен) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
-
- Заголовки = ЗаголовокАвторизации(Токен);
- Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk", , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Создать папку
-// Создает каталог на диске
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь к созаваемой папке - path
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция СоздатьПапку(Знач Токен, Знач Путь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
-
- Заголовки = ЗаголовокАвторизации(Токен);
- URL = "https://cloud-api.yandex.net/v1/disk/resources";
- Href = "href";
-
- Параметры = Новый Структура;
- Параметры.Вставить("path", Путь);
-
- Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
- Ответ = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь);
-
- URLОтвета = Ответ[Href];
-
- Если Не ЗначениеЗаполнено(URLОтвета) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить объект
-// Получает информацию об объекте диска по заданному пути
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь к папке или файлу - path
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПолучитьОбъект(Знач Токен, Знач Путь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
-
- Заголовки = ЗаголовокАвторизации(Токен);
- Параметры = Новый Структура;
- Параметры.Вставить("path", Путь);
-
- Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources", Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Удалить объект
-// Удаляет объект по заданному пути
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь к удаляемой папке или файлу - path
-// ВКорзину - Булево - В корзину - can
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция УдалитьОбъект(Знач Токен, Знач Путь, Знач ВКорзину = Истина) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
- OPI_ПреобразованиеТипов.ПолучитьБулево(ВКорзину);
-
- Заголовки = ЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- Параметры.Вставить("path" , Путь);
- Параметры.Вставить("permanently", Не ВКорзину);
-
- Ответ = OPI_Инструменты.Delete("https://cloud-api.yandex.net/v1/disk/resources", Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Создать копию объекта
-// Создает копию объекта по заданному пути и пути к оригиналу
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Оригинал - Строка - Путь к оригинальному файлу или каталогу - from
-// Путь - Строка - Путь назначения для копии - to
-// Перезаписывать - Булево - Перезаписывать если файл с таким именем уже существует - rewrite
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция СоздатьКопиюОбъекта(Знач Токен, Знач Оригинал, Знач Путь, Знач Перезаписывать = Ложь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Оригинал);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
- OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
-
- Заголовки = ЗаголовокАвторизации(Токен);
- URL = "https://cloud-api.yandex.net/v1/disk/resources/copy";
- Href = "href";
-
- Параметры = Новый Структура;
- Параметры.Вставить("from" , Оригинал);
- Параметры.Вставить("path" , Путь);
- Параметры.Вставить("overwrite" , Перезаписывать);
-
- Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
- Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь);
-
- URLОтвета = Ответ[Href];
-
- Если Не ЗначениеЗаполнено(URLОтвета) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить ссылку для скачивания
-// Получает ссылку для скачивания файла
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь к файлу для скачивания - path
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПолучитьСсылкуДляСкачивания(Знач Токен, Знач Путь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
-
- Заголовки = ЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
- Параметры.Вставить("path", Путь);
-
- Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/download", Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Скачать файл
-// Скачивает файл по указанному пути
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь к файлу для скачивания - path
-// ПутьСохранения - Строка - Путь сохранения файла - out
-//
-// Возвращаемое значение:
-// ДвоичныеДанные,Строка - Двоичные данные или путь к файлу при указании параметра ПутьСохранения
-Функция СкачатьФайл(Знач Токен, Знач Путь, Знач ПутьСохранения = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ПутьСохранения);
- Ответ = ПолучитьСсылкуДляСкачивания(Токен, Путь);
- URL = Ответ["href"];
-
- Если Не ЗначениеЗаполнено(URL) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Get(URL, , , ПутьСохранения);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить список файлов
-// Получает список файлов с или без отбора по типу
-// Список доступных типов: audio, backup, book, compressed, data, development,
-// diskimage, document, encoded, executable, flash, font,
-// mage, settings, spreadsheet, text, unknown, video, web
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Количество - Число,Строка - Количество возвращаемых объектов - amount
-// СмещениеОтНачала - Число - Смещение для получение объектов не из начала списка - offset
-// ОтборПоТипу - Строка - Отбор по типу файла - type
-// СортироватьПоДате - Булево - Истина > сортировать по дате, Ложь > по алфавиту - datesort
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПолучитьСписокФайлов(Знач Токен
- , Знач Количество = 0
- , Знач СмещениеОтНачала = 0
- , Знач ОтборПоТипу = ""
- , Знач СортироватьПоДате = Ложь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ОтборПоТипу);
- OPI_ПреобразованиеТипов.ПолучитьБулево(СортироватьПоДате);
-
- Заголовки = ЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
-
- Если ЗначениеЗаполнено(Количество) Тогда
- Параметры.Вставить("limit", OPI_Инструменты.ЧислоВСтроку(Количество));
- КонецЕсли;
-
- Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда
- Параметры.Вставить("offset", OPI_Инструменты.ЧислоВСтроку(СмещениеОтНачала));
- КонецЕсли;
-
- Если ЗначениеЗаполнено(ОтборПоТипу) Тогда
- Параметры.Вставить("media_type", ОтборПоТипу);
- КонецЕсли;
-
- Если СортироватьПоДате Тогда
- Назначение = "last-uploaded";
- Иначе
- Назначение = "files";
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/" + Назначение, Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Переместить объект
-// Перемещает объект по заданному пути и пути к оригиналу
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Оригинал - Строка - Путь к оригинальному файлу или папке - from
-// Путь - Строка - Путь назначение для перемещения - to
-// Перезаписывать - Булево - Перезаписывать если файл с таким именем уже существует - rewrite
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПереместитьОбъект(Знач Токен, Знач Оригинал, Знач Путь, Знач Перезаписывать = Ложь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Оригинал);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
- OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
-
- Заголовки = ЗаголовокАвторизации(Токен);
- URL = "https://cloud-api.yandex.net/v1/disk/resources/move";
- Href = "href";
-
- Параметры = Новый Структура;
- Параметры.Вставить("from" , Оригинал);
- Параметры.Вставить("path" , Путь);
- Параметры.Вставить("overwrite" , Перезаписывать);
-
- Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
- Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь);
- URLОтвета = Ответ[Href];
-
- Если Не ЗначениеЗаполнено(URLОтвета) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Загрузить файл
-// Загружает файл на диск по заданному пути
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь для сохранение файла на Диске - path
-// Файл - Строка,ДвоичныеДанные - Файл для загрузки - file
-// Перезаписывать - Булево - Перезаписывать, если файл с таким именем уже существует - rewrite
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ЗагрузитьФайл(Знач Токен, Знач Путь, Знач Файл, Знач Перезаписывать = Ложь) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
- OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
- OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
-
- Заголовки = ЗаголовокАвторизации(Токен);
- Href = "href";
- Файл = Новый Структура("file", Файл);
-
- Параметры = Новый Структура;
- Параметры.Вставить("path" , Путь);
- Параметры.Вставить("overwrite" , Перезаписывать);
-
- Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/upload", Параметры, Заголовки);
- URL = Ответ[Href];
-
- Если Не ЗначениеЗаполнено(URL) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- Ответ = OPI_Инструменты.PutMultipart(URL, Новый Структура(), Файл, "multipart", Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Загрузить файл по URL
-// Загружает файл на диск, забирая его по заданному URL
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь помещения загруженного файла - path
-// Адрес - Строка - URL файла - url
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ЗагрузитьФайлПоURL(Знач Токен, Знач Путь, Знач Адрес) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Адрес);
-
- Заголовки = ЗаголовокАвторизации(Токен);
- URL = "https://cloud-api.yandex.net/v1/disk/resources/upload";
-
- Параметры = Новый Структура;
- Параметры.Вставить("url" , КодироватьСтроку(Адрес, СпособКодированияСтроки.URLВКодировкеURL));
- Параметры.Вставить("path", Путь);
-
- Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
- Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#Область УправлениеПубличнымДоступом
-
-// Опубликовать объект
-// Публикует объект диска в публичный доступ
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь к публикуемому объекту - path
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ОпубликоватьОбъект(Знач Токен, Знач Путь) Экспорт
- Возврат ПереключениеОбщегоДоступа(Токен, Путь, Истина);
-КонецФункции
-
-// Отменить публикацию объекта
-// Отменяет публикацию ранее опубликованного объекта
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Путь - Строка - Путь к опубликованному ранее объекту - path
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ОтменитьПубликациюОбъекта(Знач Токен, Знач Путь) Экспорт
- Возврат ПереключениеОбщегоДоступа(Токен, Путь, Ложь);
-КонецФункции
-
-// Получить список опубликованных объектов.
-// Получает список опубликованных объектов
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// Количество - Число - Количество возвращаемых объектов - amount
-// СмещениеОтНачала - Число - Смещение для получение объектов не из начала списка - offset
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПолучитьСписокОпубликованныхОбъектов(Знач Токен, Знач Количество = 0, Знач СмещениеОтНачала = 0) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала);
-
- Заголовки = ЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
-
- Если ЗначениеЗаполнено(Количество) Тогда
- Параметры.Вставить("limit", Количество);
- КонецЕсли;
-
- Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда
- Параметры.Вставить("offset", СмещениеОтНачала);
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/public", Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить публичный объект
-// Получает информацию об опубликованном объекте по его URL
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// URL - Строка - Адрес объекта - url
-// Количество - Число - Количество возвращаемых вложенных объектов (для каталога) - amount
-// СмещениеОтНачала - Число - Смещение для получение вложенных объектов не из начала списка - offset
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПолучитьПубличныйОбъект(Знач Токен, Знач URL, Знач Количество = 0, Знач СмещениеОтНачала = 0) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала);
-
- Заголовки = ЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
-
- Если ЗначениеЗаполнено(Количество) Тогда
- Параметры.Вставить("limit", OPI_Инструменты.ЧислоВСтроку(Количество));
- КонецЕсли;
-
- Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда
- Параметры.Вставить("offset", OPI_Инструменты.ЧислоВСтроку(СмещениеОтНачала));
- КонецЕсли;
-
- Параметры.Вставить("public_key", URL);
-
- Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/public/resources", Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Получить ссылку скачивания публичного объекта
-// Получает прямую ссылку для скачивания публичного объекта
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// URL - Строка - Адрес объекта - url
-// Путь - Строка - Путь внутри объекта - path
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПолучитьСсылкуСкачиванияПубличногоОбъекта(Знач Токен, Знач URL, Знач Путь = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
-
- Заголовки = ЗаголовокАвторизации(Токен);
-
- Параметры = Новый Структура;
-
- Если ЗначениеЗаполнено(Путь) Тогда
- Параметры.Вставить("path", Путь);
- КонецЕсли;
-
- Параметры.Вставить("public_key", URL);
-
- Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/public/resources/download", Параметры, Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Сохранить публичный объект на диск
-// Сохраняет публичный объект на ваш диск
-//
-// Параметры:
-// Токен - Строка - Токен - token
-// URL - Строка - Адрес объекта - url
-// Откуда - Строка - Путь внутри публичного каталога (только для папок) - from
-// Куда - Строка - Путь сохранения файла - to
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция СохранитьПубличныйОбъектНаДиск(Знач Токен, Знач URL, Откуда = "", Куда = "") Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Откуда);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Куда);
-
- Заголовки = ЗаголовокАвторизации(Токен);
- Адрес = "https://cloud-api.yandex.net/v1/disk/public/resources/save-to-disk";
- Href = "href";
-
- Параметры = Новый Структура;
- Параметры.Вставить("public_key", URL);
-
- Если ЗначениеЗаполнено(Откуда) Тогда
- Параметры.Вставить("path", Откуда);
- КонецЕсли;
-
- Если ЗначениеЗаполнено(Куда) Тогда
- Параметры.Вставить("save_path", Куда);
- КонецЕсли;
-
- Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
- Ответ = OPI_Инструменты.Post(Адрес + Параметры, , Заголовки, Ложь);
-
- URLОтвета = Ответ[Href];
-
- Если Не ЗначениеЗаполнено(URLОтвета) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ЗаголовокАвторизации(Знач Токен)
-
- Заголовки = Новый Соответствие;
- Заголовки.Вставить("Authorization", "OAuth " + Токен);
-
- Возврат Заголовки;
-
-КонецФункции
-
-Функция ПереключениеОбщегоДоступа(Знач Токен, Знач Путь, Знач ОбщийДоступ)
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
- OPI_ПреобразованиеТипов.ПолучитьБулево(ОбщийДоступ);
-
- Заголовки = ЗаголовокАвторизации(Токен);
- Назначение = ?(ОбщийДоступ, "publish", "unpublish");
- Href = "href";
-
- URL = "https://cloud-api.yandex.net/v1/disk/resources/" + Назначение;
-
- Параметры = Новый Структура;
- Параметры.Вставить("path", Путь);
-
- Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
- Ответ = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь);
-
- URLОтвета = Ответ[Href];
-
- Если Не ЗначениеЗаполнено(URLОтвета) Тогда
- Возврат Ответ;
- КонецЕсли;
-
- Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_YandexDisk.os
+// Библиотека: Yandex Disk
+// Команда CLI: yadisk
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:NumberOfOptionalParams-off
+// BSLLS:UsingServiceTag-off
+
+//@skip-check method-too-many-params
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+#Область РаботаСФайламиИПапками
+
+// Получить информацию о диске
+// Получает информацию о текущем диске
+//
+// Параметры:
+// Токен - Строка - Токен - token
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПолучитьИнформациюОДиске(Знач Токен) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+
+ Заголовки = ЗаголовокАвторизации(Токен);
+ Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk", , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Создать папку
+// Создает каталог на диске
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь к созаваемой папке - path
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция СоздатьПапку(Знач Токен, Знач Путь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+
+ Заголовки = ЗаголовокАвторизации(Токен);
+ URL = "https://cloud-api.yandex.net/v1/disk/resources";
+ Href = "href";
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("path", Путь);
+
+ Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
+ Ответ = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь);
+
+ URLОтвета = Ответ[Href];
+
+ Если Не ЗначениеЗаполнено(URLОтвета) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить объект
+// Получает информацию об объекте диска по заданному пути
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь к папке или файлу - path
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПолучитьОбъект(Знач Токен, Знач Путь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+
+ Заголовки = ЗаголовокАвторизации(Токен);
+ Параметры = Новый Структура;
+ Параметры.Вставить("path", Путь);
+
+ Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources", Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Удалить объект
+// Удаляет объект по заданному пути
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь к удаляемой папке или файлу - path
+// ВКорзину - Булево - В корзину - can
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция УдалитьОбъект(Знач Токен, Знач Путь, Знач ВКорзину = Истина) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(ВКорзину);
+
+ Заголовки = ЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("path" , Путь);
+ Параметры.Вставить("permanently", Не ВКорзину);
+
+ Ответ = OPI_Инструменты.Delete("https://cloud-api.yandex.net/v1/disk/resources", Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Создать копию объекта
+// Создает копию объекта по заданному пути и пути к оригиналу
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Оригинал - Строка - Путь к оригинальному файлу или каталогу - from
+// Путь - Строка - Путь назначения для копии - to
+// Перезаписывать - Булево - Перезаписывать если файл с таким именем уже существует - rewrite
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция СоздатьКопиюОбъекта(Знач Токен, Знач Оригинал, Знач Путь, Знач Перезаписывать = Ложь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Оригинал);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
+
+ Заголовки = ЗаголовокАвторизации(Токен);
+ URL = "https://cloud-api.yandex.net/v1/disk/resources/copy";
+ Href = "href";
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("from" , Оригинал);
+ Параметры.Вставить("path" , Путь);
+ Параметры.Вставить("overwrite" , Перезаписывать);
+
+ Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
+ Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь);
+
+ URLОтвета = Ответ[Href];
+
+ Если Не ЗначениеЗаполнено(URLОтвета) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить ссылку для скачивания
+// Получает ссылку для скачивания файла
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь к файлу для скачивания - path
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПолучитьСсылкуДляСкачивания(Знач Токен, Знач Путь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+
+ Заголовки = ЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("path", Путь);
+
+ Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/download", Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Скачать файл
+// Скачивает файл по указанному пути
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь к файлу для скачивания - path
+// ПутьСохранения - Строка - Путь сохранения файла - out
+//
+// Возвращаемое значение:
+// ДвоичныеДанные,Строка - Двоичные данные или путь к файлу при указании параметра ПутьСохранения
+Функция СкачатьФайл(Знач Токен, Знач Путь, Знач ПутьСохранения = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ПутьСохранения);
+ Ответ = ПолучитьСсылкуДляСкачивания(Токен, Путь);
+ URL = Ответ["href"];
+
+ Если Не ЗначениеЗаполнено(URL) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Get(URL, , , ПутьСохранения);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить список файлов
+// Получает список файлов с или без отбора по типу
+// Список доступных типов: audio, backup, book, compressed, data, development,
+// diskimage, document, encoded, executable, flash, font,
+// mage, settings, spreadsheet, text, unknown, video, web
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Количество - Число,Строка - Количество возвращаемых объектов - amount
+// СмещениеОтНачала - Число - Смещение для получение объектов не из начала списка - offset
+// ОтборПоТипу - Строка - Отбор по типу файла - type
+// СортироватьПоДате - Булево - Истина > сортировать по дате, Ложь > по алфавиту - datesort
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПолучитьСписокФайлов(Знач Токен
+ , Знач Количество = 0
+ , Знач СмещениеОтНачала = 0
+ , Знач ОтборПоТипу = ""
+ , Знач СортироватьПоДате = Ложь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ОтборПоТипу);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(СортироватьПоДате);
+
+ Заголовки = ЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+
+ Если ЗначениеЗаполнено(Количество) Тогда
+ Параметры.Вставить("limit", OPI_Инструменты.ЧислоВСтроку(Количество));
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда
+ Параметры.Вставить("offset", OPI_Инструменты.ЧислоВСтроку(СмещениеОтНачала));
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(ОтборПоТипу) Тогда
+ Параметры.Вставить("media_type", ОтборПоТипу);
+ КонецЕсли;
+
+ Если СортироватьПоДате Тогда
+ Назначение = "last-uploaded";
+ Иначе
+ Назначение = "files";
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/" + Назначение, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Переместить объект
+// Перемещает объект по заданному пути и пути к оригиналу
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Оригинал - Строка - Путь к оригинальному файлу или папке - from
+// Путь - Строка - Путь назначение для перемещения - to
+// Перезаписывать - Булево - Перезаписывать если файл с таким именем уже существует - rewrite
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПереместитьОбъект(Знач Токен, Знач Оригинал, Знач Путь, Знач Перезаписывать = Ложь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Оригинал);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
+
+ Заголовки = ЗаголовокАвторизации(Токен);
+ URL = "https://cloud-api.yandex.net/v1/disk/resources/move";
+ Href = "href";
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("from" , Оригинал);
+ Параметры.Вставить("path" , Путь);
+ Параметры.Вставить("overwrite" , Перезаписывать);
+
+ Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
+ Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь);
+ URLОтвета = Ответ[Href];
+
+ Если Не ЗначениеЗаполнено(URLОтвета) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Загрузить файл
+// Загружает файл на диск по заданному пути
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь для сохранение файла на Диске - path
+// Файл - Строка,ДвоичныеДанные - Файл для загрузки - file
+// Перезаписывать - Булево - Перезаписывать, если файл с таким именем уже существует - rewrite
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ЗагрузитьФайл(Знач Токен, Знач Путь, Знач Файл, Знач Перезаписывать = Ложь) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Перезаписывать);
+ OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Файл);
+
+ Заголовки = ЗаголовокАвторизации(Токен);
+ Href = "href";
+ Файл = Новый Структура("file", Файл);
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("path" , Путь);
+ Параметры.Вставить("overwrite" , Перезаписывать);
+
+ Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/upload", Параметры, Заголовки);
+ URL = Ответ[Href];
+
+ Если Не ЗначениеЗаполнено(URL) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.PutMultipart(URL, Новый Структура(), Файл, "multipart", Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Загрузить файл по URL
+// Загружает файл на диск, забирая его по заданному URL
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь помещения загруженного файла - path
+// Адрес - Строка - URL файла - url
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ЗагрузитьФайлПоURL(Знач Токен, Знач Путь, Знач Адрес) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Адрес);
+
+ Заголовки = ЗаголовокАвторизации(Токен);
+ URL = "https://cloud-api.yandex.net/v1/disk/resources/upload";
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("url" , КодироватьСтроку(Адрес, СпособКодированияСтроки.URLВКодировкеURL));
+ Параметры.Вставить("path", Путь);
+
+ Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
+ Ответ = OPI_Инструменты.Post(URL + Параметры, , Заголовки, Ложь);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область УправлениеПубличнымДоступом
+
+// Опубликовать объект
+// Публикует объект диска в публичный доступ
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь к публикуемому объекту - path
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ОпубликоватьОбъект(Знач Токен, Знач Путь) Экспорт
+ Возврат ПереключениеОбщегоДоступа(Токен, Путь, Истина);
+КонецФункции
+
+// Отменить публикацию объекта
+// Отменяет публикацию ранее опубликованного объекта
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Путь - Строка - Путь к опубликованному ранее объекту - path
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ОтменитьПубликациюОбъекта(Знач Токен, Знач Путь) Экспорт
+ Возврат ПереключениеОбщегоДоступа(Токен, Путь, Ложь);
+КонецФункции
+
+// Получить список опубликованных объектов.
+// Получает список опубликованных объектов
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// Количество - Число - Количество возвращаемых объектов - amount
+// СмещениеОтНачала - Число - Смещение для получение объектов не из начала списка - offset
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПолучитьСписокОпубликованныхОбъектов(Знач Токен, Знач Количество = 0, Знач СмещениеОтНачала = 0) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала);
+
+ Заголовки = ЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+
+ Если ЗначениеЗаполнено(Количество) Тогда
+ Параметры.Вставить("limit", Количество);
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда
+ Параметры.Вставить("offset", СмещениеОтНачала);
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/resources/public", Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить публичный объект
+// Получает информацию об опубликованном объекте по его URL
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// URL - Строка - Адрес объекта - url
+// Количество - Число - Количество возвращаемых вложенных объектов (для каталога) - amount
+// СмещениеОтНачала - Число - Смещение для получение вложенных объектов не из начала списка - offset
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПолучитьПубличныйОбъект(Знач Токен, Знач URL, Знач Количество = 0, Знач СмещениеОтНачала = 0) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Количество);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(СмещениеОтНачала);
+
+ Заголовки = ЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+
+ Если ЗначениеЗаполнено(Количество) Тогда
+ Параметры.Вставить("limit", OPI_Инструменты.ЧислоВСтроку(Количество));
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(СмещениеОтНачала) Тогда
+ Параметры.Вставить("offset", OPI_Инструменты.ЧислоВСтроку(СмещениеОтНачала));
+ КонецЕсли;
+
+ Параметры.Вставить("public_key", URL);
+
+ Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/public/resources", Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Получить ссылку скачивания публичного объекта
+// Получает прямую ссылку для скачивания публичного объекта
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// URL - Строка - Адрес объекта - url
+// Путь - Строка - Путь внутри объекта - path
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПолучитьСсылкуСкачиванияПубличногоОбъекта(Знач Токен, Знач URL, Знач Путь = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+
+ Заголовки = ЗаголовокАвторизации(Токен);
+
+ Параметры = Новый Структура;
+
+ Если ЗначениеЗаполнено(Путь) Тогда
+ Параметры.Вставить("path", Путь);
+ КонецЕсли;
+
+ Параметры.Вставить("public_key", URL);
+
+ Ответ = OPI_Инструменты.Get("https://cloud-api.yandex.net/v1/disk/public/resources/download", Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Сохранить публичный объект на диск
+// Сохраняет публичный объект на ваш диск
+//
+// Параметры:
+// Токен - Строка - Токен - token
+// URL - Строка - Адрес объекта - url
+// Откуда - Строка - Путь внутри публичного каталога (только для папок) - from
+// Куда - Строка - Путь сохранения файла - to
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция СохранитьПубличныйОбъектНаДиск(Знач Токен, Знач URL, Откуда = "", Куда = "") Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Откуда);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Куда);
+
+ Заголовки = ЗаголовокАвторизации(Токен);
+ Адрес = "https://cloud-api.yandex.net/v1/disk/public/resources/save-to-disk";
+ Href = "href";
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("public_key", URL);
+
+ Если ЗначениеЗаполнено(Откуда) Тогда
+ Параметры.Вставить("path", Откуда);
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(Куда) Тогда
+ Параметры.Вставить("save_path", Куда);
+ КонецЕсли;
+
+ Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
+ Ответ = OPI_Инструменты.Post(Адрес + Параметры, , Заголовки, Ложь);
+
+ URLОтвета = Ответ[Href];
+
+ Если Не ЗначениеЗаполнено(URLОтвета) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ЗаголовокАвторизации(Знач Токен)
+
+ Заголовки = Новый Соответствие;
+ Заголовки.Вставить("Authorization", "OAuth " + Токен);
+
+ Возврат Заголовки;
+
+КонецФункции
+
+Функция ПереключениеОбщегоДоступа(Знач Токен, Знач Путь, Знач ОбщийДоступ)
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
+ OPI_ПреобразованиеТипов.ПолучитьБулево(ОбщийДоступ);
+
+ Заголовки = ЗаголовокАвторизации(Токен);
+ Назначение = ?(ОбщийДоступ, "publish", "unpublish");
+ Href = "href";
+
+ URL = "https://cloud-api.yandex.net/v1/disk/resources/" + Назначение;
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("path", Путь);
+
+ Параметры = OPI_Инструменты.ПараметрыЗапросаВСтроку(Параметры);
+ Ответ = OPI_Инструменты.Put(URL + Параметры, , Заголовки, Ложь);
+
+ URLОтвета = Ответ[Href];
+
+ Если Не ЗначениеЗаполнено(URLОтвета) Тогда
+ Возврат Ответ;
+ КонецЕсли;
+
+ Ответ = OPI_Инструменты.Get(URLОтвета, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
diff --git a/ru/OInt/core/Modules/OPI_YandexID.os b/ru/OInt/core/Modules/OPI_YandexID.os
index 10d9cc743b..053dc4e64e 100644
--- a/ru/OInt/core/Modules/OPI_YandexID.os
+++ b/ru/OInt/core/Modules/OPI_YandexID.os
@@ -1,112 +1,112 @@
-// Расположение OS: ./OInt/core/Modules/OPI_YandexID.os
-// Библиотека: Yandex ID
-// Команда CLI: yandex
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "../../tools"
-
-#Область ПрограммныйИнтерфейс
-
-// Получить код подтверждения
-// Получает код подтверждения и адрес страницы, на которой его необходимо ввести
-//
-// Параметры:
-// ClientId - Строка - Client id - id
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПолучитьКодПодтверждения(Знач ClientId) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
-
- Параметры = Новый Структура("client_id", ClientId);
- Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/device/code", Параметры, , Ложь);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Преобразовать код в токен
-// Преобразовывает код в токен после ввода кода при выполнении ПолучитьКодПодтверждения
-//
-// Параметры:
-// ClientId - Строка - Client id - id
-// ClientSecret - Строка - Client secret - secret
-// КодУстройства - Строка - device_code из ПолучитьКодПодтверждения() - device
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ПреобразоватьКодВТокен(Знач ClientId, Знач ClientSecret, Знач КодУстройства) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(КодУстройства);
-
- Параметры = Новый Структура;
- Параметры.Вставить("grant_type" , "device_code");
- Параметры.Вставить("code" , КодУстройства);
- Параметры.Вставить("client_id" , ClientId);
- Параметры.Вставить("client_secret" , ClientSecret);
-
- Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь);
-
- Возврат Ответ;
-
-КонецФункции
-
-// Обновить токен
-// Обновляет токен по Refresh token
-//
-// Параметры:
-// ClientId - Строка - Client id - id
-// ClientSecret - Строка - Client secret - secret
-// RefreshToken - Строка - Refresh token - refresh
-//
-// Возвращаемое значение:
-// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
-Функция ОбновитьТокен(Знач ClientId, Знач ClientSecret, Знач RefreshToken) Экспорт
-
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
- OPI_ПреобразованиеТипов.ПолучитьСтроку(RefreshToken);
-
- Параметры = Новый Структура;
- Параметры.Вставить("grant_type" , "refresh_token");
- Параметры.Вставить("refresh_token" , RefreshToken);
- Параметры.Вставить("client_id" , ClientId);
- Параметры.Вставить("client_secret" , ClientSecret);
-
- Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь);
-
- Возврат Ответ;
-
-КонецФункции
-
-#КонецОбласти
+// Расположение OS: ./OInt/core/Modules/OPI_YandexID.os
+// Библиотека: Yandex ID
+// Команда CLI: yandex
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "../../tools"
+
+#Область ПрограммныйИнтерфейс
+
+// Получить код подтверждения
+// Получает код подтверждения и адрес страницы, на которой его необходимо ввести
+//
+// Параметры:
+// ClientId - Строка - Client id - id
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПолучитьКодПодтверждения(Знач ClientId) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
+
+ Параметры = Новый Структура("client_id", ClientId);
+ Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/device/code", Параметры, , Ложь);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Преобразовать код в токен
+// Преобразовывает код в токен после ввода кода при выполнении ПолучитьКодПодтверждения
+//
+// Параметры:
+// ClientId - Строка - Client id - id
+// ClientSecret - Строка - Client secret - secret
+// КодУстройства - Строка - device_code из ПолучитьКодПодтверждения() - device
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ПреобразоватьКодВТокен(Знач ClientId, Знач ClientSecret, Знач КодУстройства) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(КодУстройства);
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("grant_type" , "device_code");
+ Параметры.Вставить("code" , КодУстройства);
+ Параметры.Вставить("client_id" , ClientId);
+ Параметры.Вставить("client_secret" , ClientSecret);
+
+ Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь);
+
+ Возврат Ответ;
+
+КонецФункции
+
+// Обновить токен
+// Обновляет токен по Refresh token
+//
+// Параметры:
+// ClientId - Строка - Client id - id
+// ClientSecret - Строка - Client secret - secret
+// RefreshToken - Строка - Refresh token - refresh
+//
+// Возвращаемое значение:
+// Соответствие Из КлючИЗначение - сериализованный JSON ответа от Yandex
+Функция ОбновитьТокен(Знач ClientId, Знач ClientSecret, Знач RefreshToken) Экспорт
+
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientId);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientSecret);
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(RefreshToken);
+
+ Параметры = Новый Структура;
+ Параметры.Вставить("grant_type" , "refresh_token");
+ Параметры.Вставить("refresh_token" , RefreshToken);
+ Параметры.Вставить("client_id" , ClientId);
+ Параметры.Вставить("client_secret" , ClientSecret);
+
+ Ответ = OPI_Инструменты.Post("https://oauth.yandex.ru/token", Параметры, , Ложь);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
diff --git a/ru/OInt/lib.config b/ru/OInt/lib.config
index 90d17cd272..6747b15fc1 100644
--- a/ru/OInt/lib.config
+++ b/ru/OInt/lib.config
@@ -1,20 +1,20 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ru/OInt/packagedef b/ru/OInt/packagedef
index 9c0ce97c17..24c3199fdc 100644
--- a/ru/OInt/packagedef
+++ b/ru/OInt/packagedef
@@ -1,13 +1,13 @@
-Описание.Имя("oint")
- .Версия("1.9.0")
- .Автор("bayselonarrend")
- .АдресАвтора("bayselonarrend@gmail.com")
- .Описание("Открытый пакет интеграций с популярными API")
- .ВерсияСреды("1.0.7")
- .ВключитьФайл("core")
- .ВключитьФайл("tools")
- .ВключитьФайл("tests")
- .ВключитьФайл("lib.config")
- .ВключитьФайл("../README.MD")
- .ВключитьФайл("../LICENSE")
- .ЗависитОт("asserts", "1.3.0")
+Описание.Имя("oint")
+ .Версия("1.9.0")
+ .Автор("bayselonarrend")
+ .АдресАвтора("bayselonarrend@gmail.com")
+ .Описание("Открытый пакет интеграций с популярными API")
+ .ВерсияСреды("1.0.7")
+ .ВключитьФайл("core")
+ .ВключитьФайл("tools")
+ .ВключитьФайл("tests")
+ .ВключитьФайл("lib.config")
+ .ВключитьФайл("../README.MD")
+ .ВключитьФайл("../LICENSE")
+ .ЗависитОт("asserts", "1.3.0")
diff --git a/ru/OInt/tests/Modules/internal/OPI_Тесты.os b/ru/OInt/tests/Modules/internal/OPI_Тесты.os
index e9233bdb73..b47c90b90c 100644
--- a/ru/OInt/tests/Modules/internal/OPI_Тесты.os
+++ b/ru/OInt/tests/Modules/internal/OPI_Тесты.os
@@ -1,5307 +1,5307 @@
-// Расположение OS: ./OInt/tests/Modules/internal/OPI_Тесты.os
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// Набор тестов для YAxUnit
-
-// BSLLS:Typo-off
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:UsingServiceTag-off
-// BSLLS:UnusedParameters-off
-// BSLLS:DuplicateStringLiteral-off
-
-// @skip-check undefined-variable
-// @skip-check wrong-string-literal-content
-
-// Раскомментировать, если выполняется OneScript
-#Использовать oint
-#Использовать asserts
-
-#Область СлужебныйПрограммныйИнтерфейс
-
-// Для YaxUnit
-
-Процедура ИсполняемыеСценарии() Экспорт
-
- OPI_ПолучениеДанныхТестов.СформироватьТестыЯкс();
-
-КонецПроцедуры
-
-// Для Asserts
-
-Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
-
- Возврат OPI_ПолучениеДанныхТестов.СформироватьТестыАссертс();
-
-КонецФункции
-
-#Область ЗапускаемыеТесты
-
-#Область Telegram
-
-Процедура Телеграм_ПолучитьИнформациюБота() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста);
-
- Telegram_ПолучитьИнформациюБота(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ПолучитьОбновления() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста);
-
- Telegram_УдалитьWebhook(ПараметрыТеста);
- Telegram_ПолучитьОбновления(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_УстановитьWebhook() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_URL" , ПараметрыТеста);
-
- Telegram_УстановитьWebhook(ПараметрыТеста);
- Telegram_УдалитьWebhook(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьТекстовоеСообщение() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста);
-
- Telegram_ОтправитьТекстовоеСообщение(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьКартинку() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
-
- Telegram_ОтправитьКартинку(ПараметрыТеста);
- Telegram_СкачатьФайл(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьВидео() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста);
-
- Telegram_ОтправитьВидео(ПараметрыТеста);
- Telegram_СкачатьФайл(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьАудио() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Audio" , ПараметрыТеста);
-
- Telegram_ОтправитьАудио(ПараметрыТеста);
- Telegram_СкачатьФайл(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьДокумент() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Document" , ПараметрыТеста);
-
- Telegram_ОтправитьДокумент(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьГифку() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GIF" , ПараметрыТеста);
-
- Telegram_ОтправитьГифку(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьМедиагруппу() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста);
-
- Telegram_ОтправитьМеидагруппу(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьМестоположение() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Long" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Lat" , ПараметрыТеста);
-
- Telegram_ОтправитьМестоположение(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьКонтакт() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Name" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Surname" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Phone" , ПараметрыТеста);
-
- Telegram_ОтправитьКонтакт(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ОтправитьОпрос() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
-
- Telegram_ОтправитьОпрос(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ПереслатьСообщение() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelMessageID", ПараметрыТеста);
-
- Telegram_ПереслатьСообщение(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_БанРазбан() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста);
-
- Telegram_Бан(ПараметрыТеста);
- Telegram_Разбан(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_СоздатьСсылкуПриглашение() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
-
- Telegram_СоздатьСсылкуПриглашение(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ЗакрепитьОткрепитьСообщение() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelMessageID", ПараметрыТеста);
-
- Telegram_ЗакрепитьСообщение(ПараметрыТеста);
- Telegram_ОткрепитьСообщение(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ПолучитьЧислоУчастников() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
-
- Telegram_ПолучитьЧислоУчастников(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ПолучитьСписокАватаровФорума() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста);
-
- Telegram_ПолучитьСписокАватаровФорума(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_СоздатьУдалитьТемуФорума() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста);
-
- Telegram_СоздатьТемуФорума(ПараметрыТеста);
- Telegram_ИзменитьТемуФорума(ПараметрыТеста);
- Telegram_ЗакрытьТемуФорума(ПараметрыТеста);
- Telegram_ОткрытьТемуФорума(ПараметрыТеста);
- Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы(ПараметрыТеста);
- Telegram_УдалитьТемуФорума(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_СкрытьПоказатьГлавнуюТему() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста);
-
- Telegram_СкрытьГлавнуюТемуФорума(ПараметрыТеста);
- Telegram_ПоказатьГлавнуюТемуФорума(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура Телеграм_ИзменитьИмяГлавнойТемы() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста);
-
- Telegram_ИзменитьИмяГлавнойТемыФорума(ПараметрыТеста);
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область VK
-
-Процедура ВК_СоздатьСсылкуТокена() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("VK_AppID", ПараметрыТеста);
-
- VK_СоздатьСсылкуПолученияТокена(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура ВК_СоздатьУдалитьПост() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture2", ПараметрыТеста);
-
- VK_СоздатьПост(ПараметрыТеста);
- VK_УдалитьПост(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура ВК_СоздатьСоставнойПост() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста);
-
- VK_СоздатьСоставнойПост(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура ВК_СоздатьОпрос() Экспорт
-
- VK_СоздатьОпрос();
-
-КонецПроцедуры
-
-Процедура ВК_СохранитьУдалитьКартинку() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
-
- VK_СоздатьАльбом(ПараметрыТеста);
- VK_СохранитьКартинкуВАльбом(ПараметрыТеста);
- VK_УдалитьКартинку(ПараметрыТеста);
- VK_УдалитьАльбом(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура ВК_СоздатьИсторию() Экспорт
-
- ПараметрыТеста = Новый Соответствие;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
-
- VK_СоздатьИсторию(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура ВК_МетодыОбсуждений() Экспорт
-
- ПараметрыТеста = Новый Структура;
- Параметры = ПолучитьПараметрыВК();
-
- VK_СоздатьОбсуждение(ПараметрыТеста);
- VK_ЗакрытьОбсуждение(ПараметрыТеста);
- VK_ОткрытьОбсуждение(ПараметрыТеста);
- VK_НаписатьВОбсуждение(ПараметрыТеста);
-
- OPI_VK.ЗакрытьОбсуждение(ПараметрыТеста["VK_ConvID"], Истина, Параметры);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ВК_ЛайкРепостКоммент() Экспорт
-
- Параметры = ПолучитьПараметрыВК();
- Текст = "Пост из автотеста";
- Сообщение = "Сообщение из автотеста";
- ТипСоответствие = Тип("Соответствие");
- ТипЧисло = Тип("Число");
- Response = "response";
-
- Результат = OPI_VK.СоздатьПост(Текст, Новый Массив, , , Параметры);
-
- ИДПоста = Результат[Response]["post_id"];
- Результат = OPI_VK.ПоставитьЛайк(ИДПоста, , Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоставитьЛайк");
-
- OPI_Инструменты.Пауза(5);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["likes"]).ИмеетТип(ТипЧисло).Заполнено();
-
- ВнешнийПост = 2571;
- ВнешняяСтена = -218704372;
-
- Результат = OPI_VK.СделатьРепост(ВнешнийПост, ВнешняяСтена, , , Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СделатьРепост");
-
- OPI_Инструменты.Пауза(5);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["success"]).ИмеетТип(ТипЧисло).Равно(1);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["wall_repost_count"]).ИмеетТип(ТипЧисло).Равно(1);
-
- Результат = OPI_VK.НаписатьКомментарий(ИДПоста, Параметры["owner_id"], Сообщение, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьКомментарий");
-
- OPI_Инструменты.Пауза(5);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["comment_id"]).ИмеетТип(ТипЧисло).Заполнено();
-
- OPI_VK.УдалитьПост(ИДПоста, Параметры);
- OPI_VK.УдалитьПост(Результат[Response]["post_id"], Параметры);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ВК_ПолучитьСтатистику() Экспорт
-
- ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
- Параметры = ПолучитьПараметрыВК();
- Дата0 = НачалоДня(ТекущаяДата);
- Дата1 = КонецДня(Дата0);
- ТипСоответствие = Тип("Соответствие");
-
- Результат = OPI_VK.ПолучитьСтатистику(Дата0, Дата1, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистику");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["visitors"]).ИмеетТип(ТипСоответствие).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["reach"]).ИмеетТип(ТипСоответствие).Заполнено();
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ВК_ПолучитьСтатистикуПостов() Экспорт
-
- Параметры = ПолучитьПараметрыВК();
-
- МассивПостов = Новый Массив;
- МассивПостов.Добавить(214);
- МассивПостов.Добавить(215);
-
- Результат = OPI_VK.ПолучитьСтатистикуПостов(МассивПостов, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистикуПостов");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив").ИмеетДлину(2);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ВК_СоздатьРекламнуюКампанию() Экспорт
-
- Параметры = ПолучитьПараметрыВК();
- ИДКабинета = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_AdsCabinetID");
- Наименование = "Тестовая кампания";
- ТипСоответствие = Тип("Соответствие");
- ТипЧисло = Тип("Число");
- Response = "response";
- UID = "id";
-
- Результат = OPI_VK.СоздатьРекламнуюКампанию(ИДКабинета, Наименование, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламнуюКампанию");
-
- Результат = Результат[Response][0];
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено();
-
- ИДКампании = Результат[UID];
- ИДКатегории = 126;
- Лимит = 150;
-
- Результат = OPI_VK.СоздатьПост(Наименование, Новый Массив, , , Параметры);
- ИДПоста = Результат[Response]["post_id"];
-
- Результат = OPI_VK.СоздатьРекламноеОбъявление(ИДКампании
- , Лимит
- , ИДКатегории
- , ИДПоста
- , ИДКабинета
- , Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламноеОбъявление");
-
- Результат = Результат[Response][0];
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено();
-
- ИДОбъявления = Результат[UID];
- Результат = OPI_VK.ПриостановитьРекламноеОбъявление(ИДКабинета, ИДОбъявления, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПриостановитьРекламноеОбъявление");
-
- Результат = Результат[Response][0];
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено();
-
- OPI_VK.УдалитьПост(ИДПоста, Параметры);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ВК_ОтправитьСообщение() Экспорт
-
- Параметры = ПолучитьПараметрыВК();
- Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_UserID");
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_CommunityToken");
- Текст = "Сообщение из автотеста";
-
- МассивКнопок = Новый Массив;
- МассивКнопок.Добавить("Кнопка 1");
- МассивКнопок.Добавить("Кнопка 2");
-
- Клавиатура = OPI_VK.СформироватьКлавиатуру(МассивКнопок);
- Результат = OPI_VK.НаписатьСообщение(Текст, Пользователь, Токен, Клавиатура, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьСообщение");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Заполнено();
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ВК_ПолучитьКатегорииТоваров() Экспорт
-
- Параметры = ПолучитьПараметрыВК();
- Результат = OPI_VK.ПолучитьСписокКатегорийТоваров(Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКатегорийТоваров");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
- .ИмеетТип("Соответствие")
- .Заполнено();
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ВК_СоздатьТоварПодборку() Экспорт
-
- Параметры = ПолучитьПараметрыВК();
- ТипСоответствие = Тип("Соответствие");
- ТипЧисло = Тип("Число");
- Response = "response";
- Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
- ИВФ = ПолучитьИмяВременногоФайла("png");
- Картинка.Записать(ИВФ);
-
- Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка"
- , Картинка
- , Истина
- , Ложь
- , Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров");
-
- OPI_Инструменты.Пауза(5);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["albums_count"]).ИмеетТип(ТипЧисло).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_album_id"]).ИмеетТип(ТипЧисло).Заполнено();
-
- ИДПодборки = Результат[Response]["market_album_id"];
-
- Результат = OPI_VK.ИзменитьПодборкуТоваров("Измененная подборка", ИДПодборки, , , , Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПодборкуТоваров");
-
- OPI_Инструменты.Пауза(5);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]).ИмеетТип(ТипЧисло).Равно(1);
-
- МассивКартинок = Новый Массив;
- МассивКартинок.Добавить(OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"));
- МассивКартинок.Добавить(OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture2"));
-
- Товар = Новый Соответствие();
- Товар.Вставить("Имя" , "Тестовый товар");
- Товар.Вставить("Описание" , "Описание товара");
- Товар.Вставить("Категория" , "20173");
- Товар.Вставить("Цена" , 1);
- Товар.Вставить("СтараяЦена" , 15);
- Товар.Вставить("ОсновноеФото" , Картинка);
- Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations");
- Товар.Вставить("ДополнительныеФото" , МассивКартинок);
- Товар.Вставить("ГлавныйВГруппе" , Истина);
- Товар.Вставить("Ширина" , 20);
- Товар.Вставить("Высота" , 30);
- Товар.Вставить("Глубина" , 40);
- Товар.Вставить("Вес" , 100);
- Товар.Вставить("SKU" , "12345");
- Товар.Вставить("ДоступныйОстаток" , "10");
-
- Результат = OPI_VK.ДобавитьТовар(Товар, ИДПодборки, Параметры); // Добавление товара
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_item_id"]).ИмеетТип(ТипЧисло).Заполнено();
-
- ИДТовара = Результат[Response]["market_item_id"];
-
- Товар = Новый Соответствие;
- Товар.Вставить("Имя", "Тестовый товар измененный");
-
- Результат = OPI_VK.ИзменитьТовар(ИДТовара, Товар, , Параметры); // Изменение товара
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТовар");
-
- Проверка_ВКИстина(Результат);
-
- Результат = OPI_VK.ДобавитьТоварВПодборку(ИДТовара, ИДПодборки, Параметры); // Добавление в подборку
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТоварВПодборку");
-
- OPI_Инструменты.Пауза(5);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]).ИмеетТип(ТипЧисло).Заполнено();
-
- Результат = OPI_VK.УдалитьТоварИзПодборки(ИДТовара, ИДПодборки, Параметры); // Удаляет из подборки
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТоварИзПодборки");
-
- OPI_Инструменты.Пауза(5);
- Проверка_ВКИстина(Результат);
-
- Результат = OPI_VK.УдалитьТовар(ИДТовара, Параметры); // Удаление товара
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТовар");
-
- OPI_Инструменты.Пауза(5);
- Проверка_ВКИстина(Результат);
-
- Результат = OPI_VK.УдалитьПодборку(ИДПодборки, Параметры); // Уадление подборки
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьПодборку");
-
- OPI_Инструменты.Пауза(5);
- Проверка_ВКИстина(Результат);
-
- УдалитьФайлы(ИВФ);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ВК_СоздатьТоварСоСвойствами() Экспорт
-
- Параметры = ПолучитьПараметрыВК();
- ТипСоответствие = Тип("Соответствие");
- ТипЧисло = Тип("Число");
- MII = "market_item_id";
- Response = "response";
- Желтый = "Желтый";
- Красный = "Красный";
- Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
- ИВФ = ПолучитьИмяВременногоФайла("png");
- Картинка.Записать(ИВФ);
-
- МассивВариантов = Новый Массив;
- МассивВариантов.Добавить(Желтый);
- МассивВариантов.Добавить("Синий");
- МассивВариантов.Добавить(Красный);
-
- Результат = OPI_VK.СоздатьСвойствоТовара("Цвет", Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСвойствоТовара");
-
- OPI_Инструменты.Пауза(5);
-
- Свойство = Результат[Response]["property_id"];
- Свойство = OPI_Инструменты.ЧислоВСтроку(Свойство);
-
- СоответствиеСвойств = Новый Соответствие;
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["property_id"]).ИмеетТип(ТипЧисло).Заполнено();
-
- Результат = OPI_VK.ИзменитьСвойствоТовара("Цвет (изм.)", Свойство, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойствоТовара");
-
- OPI_Инструменты.Пауза(5);
-
- Проверка_ВКИстина(Результат);
-
- Для Каждого Вариант Из МассивВариантов Цикл
-
- Результат = OPI_VK.ДобавитьВариантСвойстваТовара(Вариант, Свойство, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВариантСвойстваТовара");
-
- OPI_Инструменты.Пауза(5);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["variant_id"]).ИмеетТип(ТипЧисло).Заполнено();
-
- ИДВарианта = Результат[Response]["variant_id"];
- СоответствиеСвойств.Вставить(Вариант, ИДВарианта);
-
- Результат = OPI_VK.ИзменитьВариантСвойстваТовара(Вариант + Строка(Новый УникальныйИдентификатор())
- , Свойство
- , ИДВарианта
- , Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьВариантСвойстваТовара");
-
- Проверка_ВКИстина(Результат);
-
- КонецЦикла;
-
- МассивКартинок = Новый Массив;
- МассивКартинок.Добавить(ИВФ);
- МассивКартинок.Добавить(Картинка);
-
- Товар = Новый Соответствие();
- Товар.Вставить("Имя" , "Тестовый товар (" + Желтый + ")");
- Товар.Вставить("Описание" , "Описание товара");
- Товар.Вставить("Категория" , "20173");
- Товар.Вставить("Цена" , 1);
- Товар.Вставить("СтараяЦена" , 15);
- Товар.Вставить("ОсновноеФото" , Картинка);
- Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations");
- Товар.Вставить("ДополнительныеФото" , МассивКартинок);
- Товар.Вставить("ГлавныйВГруппе" , Истина);
- Товар.Вставить("НомерГруппы" , Неопределено);
- Товар.Вставить("Ширина" , 20);
- Товар.Вставить("Высота" , 30);
- Товар.Вставить("Глубина" , 40);
- Товар.Вставить("Вес" , 100);
- Товар.Вставить("SKU" , 12345);
- Товар.Вставить("ДоступныйОстаток" , "10");
- Товар.Вставить("ЗначенияСвойств" , СоответствиеСвойств[Желтый]);
-
- Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); // Добавление товара
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар");
-
- OPI_Инструменты.Пауза(5);
-
- ИДЖелтого = Результат[Response]["market_item_id"];
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено();
-
- Товар.Вставить("Имя" , "Тестовый товар (" + Красный + ")");
- Товар.Вставить("ЗначенияСвойств", СоответствиеСвойств[Красный]);
-
- Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); // Добавление товара
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар");
-
- OPI_Инструменты.Пауза(5);
-
- ИДКрасного = Результат[Response][MII];
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено();
-
- МассивТоваров = Новый Массив;
- МассивТоваров.Добавить(ИДЖелтого);
- МассивТоваров.Добавить(ИДКрасного);
-
- Результат = OPI_VK.ПолучитьТоварыПоИД(МассивТоваров, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТоварыПоИД");
-
- OPI_Инструменты.Пауза(5);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["items"]).ИмеетТип("Массив").ИмеетДлину(2);
-
- Результат = OPI_VK.СгруппироватьТовары(МассивТоваров, , Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СгруппироватьТовары");
-
- OPI_Инструменты.Пауза(5);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["item_group_id"]).ИмеетТип(ТипЧисло).Заполнено();
-
- OPI_VK.УдалитьТовар(ИДЖелтого , Параметры);
- OPI_VK.УдалитьТовар(ИДКрасного, Параметры);
-
- Для Каждого Вариант Из СоответствиеСвойств Цикл
-
- Удаление = OPI_VK.УдалитьВариантСвойстваТовара(Вариант.Значение, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьВариантСвойстваТовара");
-
- OPI_Инструменты.Пауза(5);
- Проверка_ВКИстина(Удаление);
-
- КонецЦикла;
-
- Удаление = OPI_VK.УдалитьСвойствоТовара(Свойство, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСвойствоТовара");
-
- OPI_Инструменты.Пауза(5);
-
- Проверка_ВКИстина(Удаление);
-
- УдалитьФайлы(ИВФ);
-
-КонецПроцедуры
-
-Процедура ВК_ПолучитьСписокТоваров() Экспорт
-
- Параметры = ПолучитьПараметрыВК();
- Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
-
- МассивКартинок = Новый Массив;
- МассивКартинок.Добавить(Картинка);
-
- Товар = Новый Соответствие();
- Товар.Вставить("Имя" , "Тестовый товар 2");
- Товар.Вставить("Описание" , "Описание товара");
- Товар.Вставить("Категория" , "20173");
- Товар.Вставить("Цена" , 1);
- Товар.Вставить("СтараяЦена" , 15);
- Товар.Вставить("ОсновноеФото" , Картинка);
- Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations");
- Товар.Вставить("ДополнительныеФото" , МассивКартинок);
- Товар.Вставить("ГлавныйВГруппе" , Истина);
- Товар.Вставить("НомерГруппы" , Неопределено);
- Товар.Вставить("Ширина" , 20);
- Товар.Вставить("Высота" , 30);
- Товар.Вставить("Глубина" , 40);
- Товар.Вставить("Вес" , 100);
- Товар.Вставить("SKU" , 12345);
- Товар.Вставить("ДоступныйОстаток" , "10");
-
- Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры);
- ИДТовара = Результат["response"]["market_item_id"];
- OPI_Инструменты.Пауза(5);
-
- Результат = OPI_VK.ПолучитьСписокТоваров(, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТоваров");
-
- OPI_Инструменты.Пауза(5);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
- .ИмеетТип("Массив").Заполнено();
-
- OPI_VK.УдалитьТовар(ИДТовара, Параметры);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ВК_ПолучитьСписокПодборок() Экспорт
-
- Параметры = ПолучитьПараметрыВК();
- Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
- Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка"
- , Картинка
- , Истина
- , Ложь
- , Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров");
-
- ИДПодборки = Результат["response"]["market_album_id"];
- Результат = OPI_VK.ПолучитьСписокПодборок(Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПодборок");
-
- OPI_Инструменты.Пауза(5);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
- .ИмеетТип("Массив").Заполнено();
-
- OPI_VK.УдалитьПодборку(ИДПодборки, Параметры);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ВК_ПолучитьСписокСвойств() Экспорт
-
- Параметры = ПолучитьПараметрыВК();
- Результат = OPI_VK.ПолучитьСписокСвойств(Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСвойств");
-
- OPI_Инструменты.Пауза(5);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
- .ИмеетТип("Массив").Заполнено();
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ВК_ПолучитьСписокЗаказов() Экспорт
-
- Параметры = ПолучитьПараметрыВК();
- Результат = OPI_VK.ПолучитьСписокЗаказов(Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов");
-
- OPI_Инструменты.Пауза(5);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
- .ИмеетТип("Массив").Заполнено();
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ВК_ЗагрузитьВидео() Экспорт
-
- Параметры = ПолучитьПараметрыВК();
- Видео = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Video");
- Наименование = "Новое видео";
- Описание = "Описание видео";
-
- Результат = OPI_VK.ЗагрузитьВидеоНаСервер(Видео, Наименование, Описание, , Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_id"]).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_hash"]).Заполнено();
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область YandexDisk
-
-Процедура ЯДиск_ПолучитьИнформациюОДиске() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
- Соответствие = "Соответствие";
-
- Результат = OPI_YandexDisk.ПолучитьИнформациюОДиске(Токен);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОДиске");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["system_folders"]).ИмеетТип(Соответствие);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user"]).ИмеетТип(Соответствие);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ЯДиск_СоздатьПапку() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
- Путь = "/" + Строка(Новый УникальныйИдентификатор);
-
- Результат = OPI_YandexDisk.СоздатьПапку(Токен, Путь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("dir");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + Путь);
-
- OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
- Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
- URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png";
-
- OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL);
- OPI_Инструменты.Пауза(5);
-
- Результат = OPI_YandexDisk.ПолучитьОбъект(Токен, Путь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбъект");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + Путь);
-
- OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ЯДиск_ЗагрузитьУдалитьФайл() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
- Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
- Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
- ИВФ = ПолучитьИмяВременногоФайла("png");
- Картинка.Записать(ИВФ);
-
- Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, Картинка, Истина);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
-
- Проверка_Пусто(Результат);
- OPI_Инструменты.Пауза(5);
-
- Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект");
-
- Проверка_Пусто(Результат);
-
- Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, ИВФ, Истина);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
-
- Проверка_Пусто(Результат);
- OPI_Инструменты.Пауза(5);
-
- Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект");
-
- Проверка_Пусто(Результат);
-
- УдалитьФайлы(ИВФ);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ЯДиск_СоздатьКопиюОбъекта() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
- ПутьОригинала = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
- ПутьКопии = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
- URL = "https://raw.githubusercontent.com/Bayselonarrend/"
- + "OpenIntegrations/main/Media/logo.png";
-
- OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, ПутьОригинала, URL);
- OPI_Инструменты.Пауза(5);
-
- Результат = OPI_YandexDisk.СоздатьКопиюОбъекта(Токен, ПутьОригинала, ПутьКопии, Истина);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКопиюОбъекта");
-
- OPI_Инструменты.Пауза(5);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + ПутьКопии);
-
- OPI_YandexDisk.УдалитьОбъект(Токен, ПутьОригинала, Ложь);
- OPI_YandexDisk.УдалитьОбъект(Токен, ПутьКопии, Ложь);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ЯДиск_ПолучитьСсылкуНаСкачивание() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
- Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
- URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png";
-
- OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL);
- OPI_Инструменты.Пауза(5);
-
- Результат = OPI_YandexDisk.ПолучитьСсылкуДляСкачивания(Токен, Путь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуДляСкачивания");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено();
-
- URL = Результат["href"];
-
- Результат = OPI_YandexDisk.СкачатьФайл(Токен, Путь);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные").Заполнено();
-
- OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
-
-КонецПроцедуры
-
-Процедура ЯДиск_ПолучитьСписокФайлов() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
- Количество = 2;
- Отступ = 1;
-
- Результат = OPI_YandexDisk.ПолучитьСписокФайлов(Токен, Количество, Отступ, "image");
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["limit"]).Равно(Количество);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["offset"]).Равно(Отступ);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"]).ИмеетТип("Массив");
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ЯДиск_ПереместитьОбъект() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
- ПутьОригинала = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
- ПутьКопии = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
- URL = "https://raw.githubusercontent.com/Bayselonarrend/"
- + "OpenIntegrations/main/Media/logo.png";
-
- OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, ПутьОригинала, URL);
- OPI_Инструменты.Пауза(15);
-
- Результат = OPI_YandexDisk.ПереместитьОбъект(Токен, ПутьОригинала, ПутьКопии, Истина);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереместитьОбъект");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + ПутьКопии);
-
- OPI_YandexDisk.УдалитьОбъект(Токен, ПутьОригинала, Ложь);
- OPI_YandexDisk.УдалитьОбъект(Токен, ПутьКопии, Ложь);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ЯДиск_ДействияПубличныхОбъектов() Экспорт
-
- PUrl = "public_url";
- Соответствие = "Соответствие";
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
- Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
- URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png";
-
- OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL);
- OPI_Инструменты.Пауза(5);
-
- МассивРезультатов = Новый Массив;
-
- МассивРезультатов.Добавить(OPI_YandexDisk.ОпубликоватьОбъект(Токен, Путь));
- ПубличныйURL = МассивРезультатов[0][PUrl];
-
- Результат = OPI_YandexDisk.ПолучитьСсылкуСкачиванияПубличногоОбъекта(Токен, ПубличныйURL);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуСкачиванияПубличногоОбъекта");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено();
-
- Результат = OPI_YandexDisk.ПолучитьПубличныйОбъект(Токен, ПубличныйURL);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПубличныйОбъект");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("/");
-
- МассивРезультатов.Добавить(OPI_YandexDisk.СохранитьПубличныйОбъектНаДиск(Токен, ПубличныйURL));
-
- МассивРезультатов.Добавить(OPI_YandexDisk.ОтменитьПубликациюОбъекта(Токен, Путь));
-
- Счетчик = 0;
- Для Каждого Результат Из МассивРезультатов Цикл
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Изменение публикации");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Заполнено();
-
- Если Счетчик = 0 Тогда
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Строка").Заполнено();
- Иначе
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Неопределено");
- КонецЕсли;
-
- Счетчик = Счетчик + 1;
-
- КонецЦикла;
-
- OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ЯДиск_ПолучитьСписокОпубликованных() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
- Количество = 2;
- Отступ = 1;
-
- Результат = OPI_YandexDisk.ПолучитьСписокОпубликованныхОбъектов(Токен, Количество, Отступ);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОпубликованныхОбъектов");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["limit"]).Равно(Количество);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["offset"]).Равно(Отступ);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"]).ИмеетТип("Массив");
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область Viber
-
-Процедура Вайбер_ПолучитьИнформациюОКанале() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
- Результат = OPI_Viber.ПолучитьИнформациюОКанале(Токен);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОКанале");
-
- Проверка_ВайберОк(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Вайбер_ПолучитьДанныеПользователя() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
- Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
- Результат = OPI_Viber.ПолучитьДанныеПользователя(Токен, Пользователь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["chat_hostname"]).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status_message"]).Заполнено();
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Вайбер_ПолучитьОнлайнПользователей() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
- Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
- Результат = OPI_Viber.ПолучитьОнлайнПользователей(Токен, Пользователь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОнлайнПользователей");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["users"]).ИмеетТип("Массив");
- Проверка_ВайберОк(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Вайбер_ОтправитьТекстовоеСообщение() Экспорт
-
- Текст = "Тестовое сообщение";
- ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
- ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");
- Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
- Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
-
- МассивКнопок = Новый Массив;
- МассивКнопок.Добавить("Кнопка 1");
- МассивКнопок.Добавить("Кнопка 2");
- МассивКнопок.Добавить("Кнопка 3");
-
- Клавиатура = OPI_Viber.СформироватьКлавиатуруИзМассиваКнопок(МассивКнопок);
-
- Результат = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенБота, Текст, Пользователь, Ложь, Клавиатура);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
- Проверка_ВайберОк(Результат);
-
- Результат = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенКанал, Текст, Администратор, Истина, Клавиатура);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
- Проверка_ВайберОк(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Вайбер_ОтправитьКартинку() Экспорт
-
- Текст = "Тестовое сообщение";
- Картинка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture");
- ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
- ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");
- Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
- Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
-
- Результат = OPI_Viber.ОтправитьКартинку(ТокенБота, Картинка, Пользователь, Ложь, Текст);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
- Проверка_ВайберОк(Результат);
-
- Результат = OPI_Viber.ОтправитьКартинку(ТокенКанал, Картинка, Администратор, Истина, Текст);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
- Проверка_ВайберОк(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Вайбер_ОтправитьФайл() Экспорт
-
- Документ = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document");
- ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
- ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");
- Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
- Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
-
- Результат = OPI_Viber.ОтправитьФайл(ТокенБота, Документ, Пользователь, Ложь, "docx");
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
- Проверка_ВайберОк(Результат);
-
- Результат = OPI_Viber.ОтправитьФайл(ТокенКанал, Документ, Администратор, Истина, "docx");
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
- Проверка_ВайберОк(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Вайбер_ОтправитьКонтакт() Экспорт
-
- Имя = "Петр Петров";
- Телефон = "+123456789";
- ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
- ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");
- Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
- Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
-
- Результат = OPI_Viber.ОтправитьКонтакт(ТокенБота, Имя, Телефон, Пользователь, Ложь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
- Проверка_ВайберОк(Результат);
-
- Результат = OPI_Viber.ОтправитьКонтакт(ТокенКанал, Имя, Телефон, Администратор, Истина);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
- Проверка_ВайберОк(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Вайбер_ОтправитьЛокацию() Экспорт
-
- Широта = "48.87373649724122";
- Долгота = "2.2954639195323967";
- ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
- ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");
- Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
- Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
-
- Результат = OPI_Viber.ОтправитьЛокацию(ТокенБота, Широта, Долгота, Пользователь, Ложь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьЛокацию");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
- Проверка_ВайберОк(Результат);
-
- Результат = OPI_Viber.ОтправитьЛокацию(ТокенКанал, Широта, Долгота, Администратор, Истина);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьЛокацию");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
- Проверка_ВайберОк(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Вайбер_ОтправитьСсылку() Экспорт
-
- URL = "https://github.com/Bayselonarrend/OpenIntegrations";
- ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
- ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");
- Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
- Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
-
- Результат = OPI_Viber.ОтправитьСсылку(ТокенБота, URL, Пользователь, Ложь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСсылку");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
- Проверка_ВайберОк(Результат);
-
- Результат = OPI_Viber.ОтправитьСсылку(ТокенКанал, URL, Администратор, Истина);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСсылку");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
- Проверка_ВайберОк(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область GoogleWorkspace
-
-Процедура ГВ_ПолучитьСсылкуАвторизации() Экспорт
-
- ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID");
- Результат = OPI_GoogleWorkspace.СформироватьСсылкуПолученияКода(ClientID);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
- .ИмеетТип("Строка")
- .Заполнено();
-
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Link", Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ГВ_ПолучитьТокен() Экспорт
-
- ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID");
- ClientSecret = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientSecret");
- Code = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Code");
-
- Результат = OPI_GoogleWorkspace.ПолучитьТокенПоКоду(ClientID, ClientSecret, Code);
-
- Если ЗначениеЗаполнено(Результат["access_token"])
- И ЗначениеЗаполнено(Результат["refresh_token"]) Тогда
-
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Token" , Результат["access_token"]);
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Refresh", Результат["refresh_token"]);
-
- КонецЕсли;
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ГВ_ОбновитьТокен() Экспорт
-
- ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID");
- ClientSecret = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientSecret");
- RefreshToken = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Refresh");
-
- Результат = OPI_GoogleWorkspace.ОбновитьТокен(ClientID, ClientSecret, RefreshToken);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["access_token"]).Заполнено();
-
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Token", Результат["access_token"]);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область GoogleCalendar
-
-Процедура ГК_ПолучитьСписокКалендарей() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
- Результат = OPI_GoogleCalendar.ПолучитьСписокКалендарей(Токен);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКалендарей");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
- .ИмеетТип("Массив");
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ГК_СоздатьУдалитьКалендарь() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
- Наименование = "Тестовый календарь";
- Описание = "Тестовое описание";
- НаименованиеИзмененное = Наименование + " (изм.)";
- ТипСоответствие = Тип("Соответствие");
- ТипСтрока = Тип("Строка");
- Summary = "summary";
- Черный = "#000000";
- Желтый = "#ffd800";
-
- Результат = OPI_GoogleCalendar.СоздатьКалендарь(Токен, Наименование);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКалендарь");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(Наименование);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).ИмеетТип(ТипСтрока).Заполнено();
-
- Календарь = Результат["id"];
-
- Результат = OPI_GoogleCalendar.ИзменитьМетаданныеКалендаря(Токен
- , Календарь
- , НаименованиеИзмененное
- , Описание);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьМетаданныеКалендаря");
-
- Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание);
-
- Результат = OPI_GoogleCalendar.ПолучитьМетаданныеКалендаря(Токен, Календарь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьМетаданныеКалендаря");
-
- Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание);
-
- Результат = OPI_GoogleCalendar.ДобавитьКалендарьВСписок(Токен, Календарь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьКалендарьВСписок");
-
- Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание);
-
- Результат = OPI_GoogleCalendar.ИзменитьКалендарьСписка(Токен, Календарь, Черный, Желтый, Ложь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКалендарьСписка");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый);
-
- Результат = OPI_GoogleCalendar.ПолучитьКалендарьСписка(Токен, Календарь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКалендарьСписка");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый);
-
- Результат = OPI_GoogleCalendar.ОчиститьОсновнойКалендарь(Токен);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьОсновнойКалендарь");
-
- Проверка_Пусто(Результат);
-
- Результат = OPI_GoogleCalendar.УдалитьКалендарьИзСписка(Токен, Календарь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКалендарьИзСписка");
-
- Проверка_Пусто(Результат);
-
- Результат = OPI_GoogleCalendar.УдалитьКалендарь(Токен, Календарь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКалендарь");
-
- Проверка_Пусто(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ГК_СоздатьУдалитьСобытие() Экспорт
-
- ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
- Календарь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_CalendarID");
- Наименование = "Новое событие";
- Описание = "Описание тестового события";
- ОписаниеИзм = "Описание тестового события (изм.)";
- UID = "id";
- Час = 3600;
-
- Вложения = Новый Соответствие;
-
- Вложения.Вставить("Картинка1"
- , "https://opi.neocities.org/assets/images/logo_long-e8fdcca6ff8b32e679ea49a1ccdd3eac.png");
- Вложения.Вставить("Картинка2"
- , "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1");
-
- СоответствиеСобытия = Новый Соответствие;
- СоответствиеСобытия.Вставить("Описание" , Описание);
- СоответствиеСобытия.Вставить("Заголовок" , Наименование);
- СоответствиеСобытия.Вставить("МестоПроведения" , "В офисе");
- СоответствиеСобытия.Вставить("ДатаНачала" , ТекущаяДата);
- СоответствиеСобытия.Вставить("ДатаОкончания" , СоответствиеСобытия["ДатаНачала"] + Час);
- СоответствиеСобытия.Вставить("МассивURLФайловВложений" , Вложения);
- СоответствиеСобытия.Вставить("ОтправлятьУведомления" , Истина);
-
- Результат = OPI_GoogleCalendar.СоздатьСобытие(Токен, Календарь, СоответствиеСобытия);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСобытие");
-
- Событие = Результат[UID];
-
- Проверка_ГКОбъект(Результат, Наименование, Описание);
-
- СоответствиеСобытия = Новый Соответствие;
- СоответствиеСобытия.Вставить("Описание", ОписаниеИзм);
-
- Результат = OPI_GoogleCalendar.ИзменитьСобытие(Токен, Календарь, СоответствиеСобытия, Событие);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСобытие");
-
- Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм);
-
- Результат = OPI_GoogleCalendar.ПолучитьСобытие(Токен, Календарь, Событие);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСобытие");
-
- Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм);
-
- Результат = OPI_GoogleCalendar.ПереместитьСобытие(Токен, Календарь, Календарь, Событие);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереместитьСобытие");
-
- Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм);
-
- Результат = OPI_GoogleCalendar.УдалитьСобытие(Токен, Календарь, Событие);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСобытие");
-
- Проверка_Пусто(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ГК_ПолучитьСписокСобытий() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
- Календарь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_CalendarID");
-
- Результат = OPI_GoogleCalendar.ПолучитьСписокСобытий(Токен, Календарь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСобытий");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив");
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область GoogleDrive
-
-Процедура ГД_ПолучитьСписокКаталогов() Экспорт
-
- MimeType = "mimeType";
- Name = "name";
- Имя = "Тестовая папка";
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
- Результат = OPI_GoogleDrive.ПолучитьСписокКаталогов(Токен, Имя, Истина);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаталогов");
-
- Результат = Результат[0];
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно("application/vnd.google-apps.folder");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Заполнено();
-
- OPI_Инструменты.Пауза(5);
- Идентификатор = Результат["id"];
-
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GD_Catalog", Идентификатор);
-
- Результат = OPI_GoogleDrive.ПолучитьИнформациюОбОбъекте(Токен, Идентификатор);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбОбъекте");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно("application/vnd.google-apps.folder");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Заполнено();
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ГД_ЗагрузитьУдалитьФайл() Экспорт
-
- ЛишниеБайты = 2;
-
- Kind = "kind";
- Content = "content";
- MIME = "MIME";
- MimeType = "mimeType";
- Name = "name";
- Id_ = "id";
-
- МассивУдаляемых = Новый Массив;
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
- Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
- КартинкаЗамены = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture2");
- Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog");
-
- Описание = OPI_GoogleDrive.ПолучитьОписаниеФайла();
- Описание.Вставить("Родитель", Каталог);
-
- Результат = OPI_GoogleDrive.ЗагрузитьФайл(Токен, Картинка, Описание);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Описание["Имя"]);
-
- Идентификатор = Результат[Id_];
- МассивУдаляемых.Добавить(Идентификатор);
-
- НовоеИмя = "Скопированный файл.jpeg";
- Результат = OPI_GoogleDrive.СкопироватьОбъект(Токен, Идентификатор, НовоеИмя, "root");
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкоприроватьОбъект");
-
- OPI_Инструменты.Пауза(5);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя);
-
- МассивУдаляемых.Добавить(Результат[Id_]);
-
- Результат = OPI_GoogleDrive.СкачатьФайл(Токен, Идентификатор);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер()).Равно(Картинка.Размер() + ЛишниеБайты);
- OPI_Инструменты.Пауза(5);
-
- НовоеИмя = "Обновленный файл.jpg";
- Результат = OPI_GoogleDrive.ОбновитьФайл(Токен, Идентификатор, КартинкаЗамены, НовоеИмя);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьФайл");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя);
-
- OPI_Инструменты.Пауза(5);
-
- Комментарий = "Yo";
- Результат = OPI_GoogleDrive.СоздатьКомментарий(Токен, Идентификатор, Комментарий);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment");
-
- OPI_Инструменты.Пауза(5);
-
- Для Каждого Удаляемый Из МассивУдаляемых Цикл
- Результат = OPI_GoogleDrive.УдалитьОбъект(Токен, Удаляемый);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь);
- OPI_Инструменты.Пауза(2);
- КонецЦикла;
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура ГД_СоздатьУдалитьКомментарий() Экспорт
-
- Kind = "kind";
- Content = "content";
- Id_ = "id";
- Comments = "comments";
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
- Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog");
- Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
-
- Описание = OPI_GoogleDrive.ПолучитьОписаниеФайла();
- Описание.Вставить("Родитель", Каталог);
-
- Результат = OPI_GoogleDrive.ЗагрузитьФайл(Токен, Картинка, Описание);
- Идентификатор = Результат[Id_];
-
- Комментарий = "Новый комментарий";
- МассивРезультатов = Новый Массив;
- Результат = OPI_GoogleDrive.СоздатьКомментарий(Токен, Идентификатор, Комментарий);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий");
-
- ИДКомментария = Результат[Id_];
-
- МассивРезультатов.Добавить(Результат);
-
- Результат = OPI_GoogleDrive.ПолучитьКомментарий(Токен, Идентификатор, ИДКомментария);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарий");
-
- МассивРезультатов.Добавить(Результат);
-
- Результат = OPI_GoogleDrive.ПолучитьСписокКомментариев(Токен, Идентификатор);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКомментариев");
-
- Комментарии = Результат[Comments];
- ОбъектКомментарий = Комментарии[Комментарии.ВГраница()];
-
- МассивРезультатов.Добавить(ОбъектКомментарий);
-
- Для Каждого Результат Из МассивРезультатов Цикл
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment");
- КонецЦикла;
-
- Результат = OPI_GoogleDrive.УдалитьКомментарий(Токен, Идентификатор, ИДКомментария);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь);
-
- OPI_GoogleDrive.УдалитьОбъект(Токен, Идентификатор);
-
-КонецПроцедуры
-
-Процедура ГД_СоздатьКаталог() Экспорт
-
- Name = "name";
- Имя = "Тестовая папка";
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
- Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog");
-
- МассивРезультатов = Новый Массив;
-
- МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя));
- МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя, Каталог));
-
- Для Каждого Результат Из МассивРезультатов Цикл
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку");
-
- ИДКаталога = Результат["id"];
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Имя);
-
- OPI_GoogleDrive.УдалитьОбъект(Токен, ИДКаталога);
-
- КонецЦикла;
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область GoogleSheets
-
-Процедура ГТ_СоздатьТаблицу() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
- Наименование = "Тестовая таблица";
-
- МассивЛистов = Новый Массив;
- МассивЛистов.Добавить("Лист1");
- МассивЛистов.Добавить("Лист2");
-
- Результат = OPI_GoogleSheets.СоздатьКнигу(Токен, Наименование, МассивЛистов);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКнигу");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["properties"]["title"]).Равно(Наименование);
-
- Для Н = 0 По МассивЛистов.ВГраница() Цикл
-
- ИмяЛиста = Результат["sheets"][Н]["properties"]["title"];
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(ИмяЛиста).Равно(МассивЛистов[Н]);
- Лист = Результат["sheets"][Н]["properties"]["sheetId"];
- Лист = OPI_Инструменты.ЧислоВСтроку(Лист);
-
- КонецЦикла;
-
- Книга = Результат["spreadsheetId"];
-
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GS_Spreadsheet", Книга);
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GS_Sheet" , Лист);
-
- Результат = OPI_GoogleSheets.СоздатьКнигу(Токен, Наименование, МассивЛистов);
- Книга2 = Результат["spreadsheetId"];
-
- Результат = OPI_GoogleSheets.КопироватьЛист(Токен, Книга, Книга2, Лист);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьЛист");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["title"]).Равно(ИмяЛиста + " (копия)");
-
- Наименование = "Тестовый лист";
-
- Результат = OPI_GoogleSheets.ДобавитьЛист(Токен, Книга, Наименование);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьЛист");
-
- НовыйЛист = Результат["replies"][0]["addSheet"]["properties"]["sheetId"];
- НовыйЛист = OPI_Инструменты.ЧислоВСтроку(НовыйЛист);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
-
- Результат = OPI_GoogleSheets.УдалитьЛист(Токен, Книга, НовыйЛист);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЛист");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
-
- Наименование = "Тестовая таблица (изм.)";
-
- Результат = OPI_GoogleSheets.ИзменитьНаименованиеКниги(Токен, Книга, Наименование);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьНаименованиеКниги");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
-
-КонецПроцедуры
-
-Процедура ГТ_ПолучитьТаблицу() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
- Книга = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GS_Spreadsheet");
- Наименование = "Тестовая таблица (изм.)";
-
- Результат = OPI_GoogleSheets.ПолучитьКнигу(Токен, Книга);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицу");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["properties"]["title"]).Равно(Наименование);
-
-КонецПроцедуры
-
-Процедура ГТ_ЗаполнитьОчиститьЯчейки() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
- Книга = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GS_Spreadsheet");
- Лист = "Лист2";
-
- СтруктураЯчеек = Новый Соответствие;
- СтруктураЯчеек.Вставить("A1", "Это A1");
- СтруктураЯчеек.Вставить("A2", "Это A2");
- СтруктураЯчеек.Вставить("B2", "Это B2");
- СтруктураЯчеек.Вставить("B3", "Это B3");
- СтруктураЯчеек.Вставить("A3", "Это A3");
- СтруктураЯчеек.Вставить("A4", "Это A4");
- СтруктураЯчеек.Вставить("B1", "Это B1");
- СтруктураЯчеек.Вставить("B4", "Это B4");
-
- МассивЯчеек = Новый Массив;
- МассивЯчеек.Добавить("B2");
- МассивЯчеек.Добавить("A3");
- МассивЯчеек.Добавить("B4");
-
- Результат = OPI_GoogleSheets.УстановитьЗначенияЯчеек(Токен, Книга, СтруктураЯчеек, Лист);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЗначенияЯчеек");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["totalUpdatedCells"]).Равно(СтруктураЯчеек.Количество());
-
- Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, МассивЯчеек, Лист);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["valueRanges"].Количество()).Равно(МассивЯчеек.Количество());
-
- Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, , Лист);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
-
- МассивЯчеек = Новый Массив;
- МассивЯчеек.Добавить("B2");
- МассивЯчеек.Добавить("A3");
- МассивЯчеек.Добавить("B4");
-
- Результат = OPI_GoogleSheets.ОчиститьЯчейки(Токен, Книга, МассивЯчеек, Лист);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьЯчейки");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["clearedRanges"].Количество()).Равно(МассивЯчеек.Количество());
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область Twitter
-
-Процедура Твиттер_ПолучитьСсылкуАвторизации() Экспорт
-
- Параметры = ПолучитьПараметрыТвиттер();
- Результат = OPI_Twitter.ПолучитьСсылкуАвторизации(Параметры);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено();
-
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_URL", Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Твиттер_ОбновитьТокен() Экспорт
-
- Параметры = ПолучитьПараметрыТвиттер();
- Результат = OPI_Twitter.ОбновитьТокен(Параметры);
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["access_token"]).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["refresh_token"]).Заполнено();
-
- Рефреш = Результат["refresh_token"];
- Токен = Результат["access_token"];
-
- Если ЗначениеЗаполнено(Рефреш) И Не Рефреш = "null" Тогда
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_Refresh", Рефреш);
- КонецЕсли;
-
- Если ЗначениеЗаполнено(Токен) И Не Токен = "null" Тогда
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_Token" , Токен);
- КонецЕсли;
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Твиттер_СоздатьТекстовыйТвит() Экспорт
-
- Параметры = ПолучитьПараметрыТвиттер();
- Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
-
- Результат = OPI_Twitter.СоздатьТекстовыйТвит(Текст, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТекстовыйТвит");
-
- Проверка_ТвиттерТекст(Результат, Текст);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Твиттер_СоздатьТвитСКартинкой() Экспорт
-
- Параметры = ПолучитьПараметрыТвиттер();
- Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
- Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
- ИВФ = ПолучитьИмяВременногоФайла("png");
- Картинка.Записать(ИВФ);
-
- Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, Картинка, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки");
-
- Проверка_ТвиттерТекст(Результат, Текст);
-
- Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, ИВФ, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки");
-
- Проверка_ТвиттерТекст(Результат, Текст);
-
- УдалитьФайлы(ИВФ);
-
- OPI_Инструменты.Пауза(20);
-
-КонецПроцедуры
-
-Процедура Твиттер_СоздатьТвитСВидео() Экспорт
-
- Параметры = ПолучитьПараметрыТвиттер();
- Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
- Видео = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Video");
- ИВФ = ПолучитьИмяВременногоФайла("mp4");
- Видео.Записать(ИВФ);
-
- Результат = OPI_Twitter.СоздатьТвитВидео(Текст, Видео, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео");
-
- Проверка_ТвиттерТекст(Результат, Текст);
-
- Результат = OPI_Twitter.СоздатьТвитВидео(Текст, ИВФ, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео");
-
- Проверка_ТвиттерТекст(Результат, Текст);
-
- УдалитьФайлы(ИВФ);
-
- OPI_Инструменты.Пауза(20);
-
-КонецПроцедуры
-
-Процедура Твиттер_СоздатьТвитСГиф() Экспорт
-
- Параметры = ПолучитьПараметрыТвиттер();
- Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
- Гифка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("GIF");
- ИВФ = ПолучитьИмяВременногоФайла("gif");
- Гифка.Записать(ИВФ);
-
- Результат = OPI_Twitter.СоздатьТвитГифки(Текст, Гифка, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки");
-
- Проверка_ТвиттерТекст(Результат, Текст);
-
- Результат = OPI_Twitter.СоздатьТвитГифки(Текст, ИВФ, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки");
-
- Проверка_ТвиттерТекст(Результат, Текст);
-
- УдалитьФайлы(ИВФ);
-
- OPI_Инструменты.Пауза(20);
-
-КонецПроцедуры
-
-Процедура Твиттер_СоздатьТвитСОпросом() Экспорт
-
- Параметры = ПолучитьПараметрыТвиттер();
- Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
- МассивОтветов = Новый Массив;
- МассивОтветов.Добавить("Вариант 1");
- МассивОтветов.Добавить("Вариант 2");
-
- Результат = OPI_Twitter.СоздатьТвитОпрос(Текст, МассивОтветов, 60, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитОпрос");
-
- Проверка_ТвиттерТекст(Результат, Текст);
-
- OPI_Инструменты.Пауза(20);
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область Notion
-
-Процедура Ноушн_СоздатьСтраницу() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
- Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent");
- Заголовок = "Тестовый заголовок";
-
- Результат = OPI_Notion.СоздатьСтраницу(Токен, Родитель, Заголовок);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСтраницу");
-
- Проверка_НоушнОбъект(Результат);
-
-КонецПроцедуры
-
-Процедура Ноушн_СоздатьИзменитьБазу() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
- Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent");
- Заголовок = "Тестовый заголовок";
-
- Свойства = Новый Соответствие;
- Свойства.Вставить("Имя" , "title");
- Свойства.Вставить("Описание" , "rich_text");
- Свойства.Вставить("Номер" , "number");
- Свойства.Вставить("Статус" , "status");
- Свойства.Вставить("Дата создания" , "date");
- Свойства.Вставить("Картинка" , "files");
- Свойства.Вставить("Активен" , "checkbox");
- Свойства.Вставить("Сайт" , "url");
- Свойства.Вставить("Почта" , "email");
- Свойства.Вставить("Телефон" , "phone_number");
- Свойства.Вставить("Пользователь" , "people");
-
- ВыборЗначения = Новый Соответствие;
- ВыборЗначения.Вставить("Новый", "green");
- ВыборЗначения.Вставить("В работе", "yellow");
- ВыборЗначения.Вставить("Удаленный", "red");
- Свойства.Вставить("Статус", ВыборЗначения);
-
- Результат = OPI_Notion.СоздатьБазуДанных(Токен, Родитель, Заголовок, Свойства);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных");
-
- Проверка_НоушнОбъект(Результат, "database");
-
- База = Результат["id"];
- Заголовок = "Тестовый заголовок";
- Описание = "Тестовое описание";
-
- Свойства = Новый Соответствие;
- Свойства.Вставить("Почта", "rich_text"); // Тип поля "Почта" будет изменен с email на текст
- Свойства.Вставить("Сайт"); // Поле "Сайт" будет удалено
-
- Результат = OPI_Notion.ИзменитьСвойстваБазы(Токен, База, Свойства, Заголовок, Описание);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваБазы");
-
- Проверка_НоушнОбъект(Результат, "database");
-
-КонецПроцедуры
-
-Процедура Ноушн_ПолучитьИнформациюОСтранице() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
- Страница = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page");
-
- Результат = OPI_Notion.ПолучитьСтраницу(Токен, Страница);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтраницу");
-
- Проверка_НоушнОбъект(Результат);
-
-КонецПроцедуры
-
-Процедура Ноушн_ПолучитьИнформациюОБазе() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
- База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base");
-
- Результат = OPI_Notion.ПолучитьБазуДанных(Токен, База);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьБазуДанных");
-
- Проверка_НоушнОбъект(Результат, "database");
-
-КонецПроцедуры
-
-Процедура Ноушн_СоздатьСтраницуВБазу() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
- База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base");
-
- Картинка = Новый Соответствие;
- Картинка.Вставить("Лого", OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture"));
-
- Свойства = Новый Соответствие;
- Свойства.Вставить("Имя" , "ООО Вектор");
- Свойства.Вставить("Описание" , "Наш первый клиент");
- Свойства.Вставить("Номер" , 1);
- Свойства.Вставить("Статус" , "Обычный");
- Свойства.Вставить("Дата создания" , OPI_Инструменты.ПолучитьТекущуюДату());
- Свойства.Вставить("Картинка" , Картинка);
- Свойства.Вставить("Активен" , Истина);
- Свойства.Вставить("Сайт" , "https://vector.ru");
- Свойства.Вставить("Почта" , "mail@vector.ru");
- Свойства.Вставить("Телефон" , "88005553535");
- Свойства.Вставить("Статус" , "Новый");
-
- Результат = OPI_Notion.СоздатьСтраницуВБазу(Токен, База, Свойства);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСтраницуВБазу");
-
- Проверка_НоушнОбъект(Результат);
-
- Родитель = СтрЗаменить(Результат["parent"]["database_id"], "-", "");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Родитель).Равно(База);
-
-КонецПроцедуры
-
-Процедура Ноушн_ИзменитьСвойстваСтраницы() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
- Страница = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page");
- Иконка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture");
- Обложка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture2");
- Архивировать = Ложь;
-
- Свойства = Новый Соответствие;
- Свойства.Вставить("Активен" , Ложь);
- Свойства.Вставить("Почта" , "vector@mail.ru");
-
- Результат = OPI_Notion.ИзменитьСвойстваСтраницы(Токен
- , Страница
- , Свойства
- , Иконка
- , Обложка
- , Архивировать);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваСтраницы");
-
- Проверка_НоушнОбъект(Результат);
-
-КонецПроцедуры
-
-Процедура Ноушн_СоздатьУдалитьБлок() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
- Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent");
- Блок = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Block");
-
- Результат = OPI_Notion.ВернутьБлок(Токен, Блок);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьБлок");
-
- Проверка_НоушнОбъект(Результат, "block");
-
- Результат = OPI_Notion.СоздатьБлок(Токен, Родитель, Результат);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБлок");
-
- Проверка_НоушнОбъект(Результат, "list");
-
- Блок = Результат["results"][0]["id"];
- Результат = OPI_Notion.ВернутьДочерниеБлоки(Токен, Блок);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьДочерниеБлоки");
-
- Проверка_НоушнОбъект(Результат, "list");
-
- Результат = OPI_Notion.УдалитьБлок(Токен, Блок);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБлок");
-
- Проверка_НоушнОбъект(Результат, "block");
-
-КонецПроцедуры
-
-Процедура Ноушн_ПолучитьПользователей() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
- Результат = OPI_Notion.СписокПользователей(Токен);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СписокПользователей");
-
- Проверка_НоушнОбъект(Результат, "list");
-
-КонецПроцедуры
-
-Процедура Ноушн_ПолучитьДанныеПользователя() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
- Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_User");
- Результат = OPI_Notion.ПолучитьДанныеПользователя(Токен, Пользователь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя");
-
- Проверка_НоушнОбъект(Результат, "user");
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область Slack
-
-Процедура Слак_ПолучитьИнформациюОБоте() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
- Результат = OPI_Slack.ПолучитьИнформациюОБоте(Токен);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОБоте");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bot_id"]).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user_id"]).Заполнено();
-
-КонецПроцедуры
-
-Процедура Слак_ПолучитьСписокПользователей() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
- Результат = OPI_Slack.ПолучитьСписокПользователей(Токен);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователей");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив");
-
-КонецПроцедуры
-
-Процедура Слак_ПолучитьСписокОбластей() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
- Результат = OPI_Slack.ПолучитьСписокРабочихОбластей(Токен);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокРабочихОбластей");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["teams"]).ИмеетТип("Массив");
-
-КонецПроцедуры
-
-Процедура Слак_ОтправитьУдалитьСообщение() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
- Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
- Текст = "Тестовое сообщение 1";
- Текст2 = "Тестовое сообщение 2";
- Отметки = Новый Массив;
- Картинка = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1";
-
- Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст);
-
- Отметка = Результат["ts"];
-
- Результат = OPI_Slack.ИзменитьСообщение(Токен, Канал, Отметка, Текст2);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСообщение");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст2);
-
- Результат = OPI_Slack.ПолучитьСписокОтветовНаСообщение(Токен, Канал, Отметка);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтветовНаСообщение");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив");
-
- Результат = OPI_Slack.ПолучитьСсылкуНаСообщение(Токен, Канал, Отметка);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуНаСообщение");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["permalink"]).Заполнено();
-
- Проверка_СлакОк(Результат);
-
- Отметки.Добавить(Отметка);
-
- МассивБлоков = Новый Массив;
- Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo");
- МассивБлоков.Добавить(Блок);
-
- Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , МассивБлоков);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (картинка)");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
-
- Отметки.Добавить(Результат["ts"]);
-
- Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo");
- БлокJSON = OPI_Инструменты.JSONСтрокой(Блок);
-
- ИВФ = ПолучитьИмяВременногоФайла("json");
-
- ТекстовыйДокумент = Новый ТекстовыйДокумент();
- ТекстовыйДокумент.УстановитьТекст(БлокJSON);
- ТекстовыйДокумент.Записать(ИВФ);
-
- Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , ИВФ);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json)");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
-
- Отметки.Добавить(Результат["ts"]);
-
- Блоки = "['" + ИВФ + "','" + ИВФ + "']";
- Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , Блоки);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json массив)");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
-
- Отметки.Добавить(Результат["ts"]);
-
- УдалитьФайлы(ИВФ);
-
- Для Каждого Отметка Из Отметки Цикл
-
- Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
-
- КонецЦикла;
-
- Час = 3600;
- Сутки = 24;
- Отправка = OPI_Инструменты.ПолучитьТекущуюДату() + (Сутки * Час);
- Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, Отправка);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (отложенное)");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_message_id"]).Заполнено();
-
- Отметка = Результат["scheduled_message_id"];
- Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка, Истина);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение");
-
- Проверка_СлакОк(Результат);
-
-КонецПроцедуры
-
-Процедура Слак_ОтправитьУдалитьЭфемерное() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
- Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
- Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User");
- Картинка = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1";
- Текст = "Тестовое сообщение 1";
-
- Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo");
- Результат = OPI_Slack.ОтправитьЭфемерноеСообщение(Токен, Канал, Текст, Пользователь, Блок);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_ts"]).Заполнено();
-
-КонецПроцедуры
-
-Процедура Слак_ПолучитьОтложенныеСообщения() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
- Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
-
- Результат = OPI_Slack.ПолучитьСписокОтложенныхСообщений(Токен, Канал);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтложенныхСообщений");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_messages"]).ИмеетТип("Массив");
-
-КонецПроцедуры
-
-Процедура Слак_СоздатьАрхивироватьКанал() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
- Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User");
- Имя = "testconv" + Строка(Новый УникальныйИдентификатор);
- Тема = "Тестовая тема";
- Цель = "Тестовая цель";
-
- #Область СоздатьКанал
- Результат = OPI_Slack.СоздатьКанал(Токен, Имя);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКанал");
-
- Данные = Результат["channel"];
- Канал = Данные["id"];
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
- #КонецОбласти
-
- #Область УстановитьТемуКанала
- Результат = OPI_Slack.УстановитьТемуКанала(Токен, Канал, Тема);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьТемуКанала");
-
- Данные = Результат["channel"];
- Канал = Данные["id"];
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["topic"]["value"]).Равно(Тема);
- #КонецОбласти
-
- #Область УстановитьЦельКанала
- Результат = OPI_Slack.УстановитьЦельКанала(Токен, Канал, Цель);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЦельКанала");
-
- Проверка_СлакОк(Результат);
- #КонецОбласти
-
- #Область ПолучитьКанал
- Результат = OPI_Slack.ПолучитьКанал(Токен, Канал);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКанал");
-
- Данные = Результат["channel"];
- Канал = Данные["id"];
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
- #КонецОбласти
-
- #Область ПригласитьПользователейВКанал
- Результат = OPI_Slack.ПригласитьПользователейВКанал(Токен, Канал, Пользователь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПригласитьПользователейВКанал");
-
- Данные = Результат["channel"];
- Канал = Данные["id"];
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
- #КонецОбласти
-
- #Область ВыгнатьПользователяИзКанала
- Результат = OPI_Slack.ВыгнатьПользователяИзКанала(Токен, Канал, Пользователь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыгнатьПользователяИзКанала");
-
- Проверка_СлакОк(Результат);
- #КонецОбласти
-
- #Область ПолучитьИсториюКанала
- Результат = OPI_Slack.ПолучитьИсториюКанала(Токен, Канал);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИсториюКанала");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив");
- #КонецОбласти
-
- #Область ПолучитьСписокПользователейКанала
- Результат = OPI_Slack.ПолучитьСписокПользователейКанала(Токен, Канал);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователейКанала");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив");
- #КонецОбласти
-
- #Область ПокинутьКанал
- Результат = OPI_Slack.ПокинутьКанал(Токен, Канал);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПокинутьКанал");
-
- Проверка_СлакОк(Результат);
- #КонецОбласти
-
- #Область ВступитьВКанал
- Результат = OPI_Slack.ВступитьВКанал(Токен, Канал);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВступитьВКанал");
-
- Данные = Результат["channel"];
- Канал = Данные["id"];
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
- #КонецОбласти
-
- #Область ПереименоватьКанал
- НовоеИмя = "testconv" + Строка(Новый УникальныйИдентификатор);
- Результат = OPI_Slack.ПереименоватьКанал(Токен, Канал, НовоеИмя);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереименоватьКанал");
-
- Данные = Результат["channel"];
- Канал = Данные["id"];
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(НовоеИмя);
- #КонецОбласти
-
- #Область АрхивироватьКанал
- Результат = OPI_Slack.АрхивироватьКанал(Токен, Канал);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "АрхивироватьКанал");
-
- Проверка_СлакОк(Результат);
- #КонецОбласти
-
-КонецПроцедуры
-
-Процедура Слак_ПолучитьСписокКаналов() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
-
- Результат = OPI_Slack.ПолучитьСписокКаналов(Токен);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаналов");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channels"]).ИмеетТип("Массив");
-
-КонецПроцедуры
-
-Процедура Слак_ОткрытьЗакрытьДиалог() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
- Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User");
- Текст = "Yo, dude";
-
- Результат = OPI_Slack.ОткрытьДиалог(Токен, Пользователь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьДиалог");
-
- Диалог = Результат["channel"]["id"];
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).ИмеетТип("Соответствие");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Диалог).Заполнено();
-
- Результат = OPI_Slack.ОтправитьСообщение(Токен, Диалог, Текст);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
-
- Проверка_СлакОк(Результат);
-
- Результат = OPI_Slack.ЗакрытьДиалог(Токен, Диалог);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьДиалог");
-
- Проверка_СлакОк(Результат);
-
-КонецПроцедуры
-
-Процедура Слак_ПолучитьСписокФайлов() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
- Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
-
- Результат = OPI_Slack.ПолучитьСписокФайлов(Токен, Канал);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
-
-КонецПроцедуры
-
-Процедура Слак_ЗагрузитьУдалитьФайл() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
- Файл = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Document");
- Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
- МассивФайлов = Новый Массив;
- ИмяФайла = "megadoc.docx";
- Заголовок = "Новый файл";
-
- Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
-
- ЗагруженныйФайл = Результат["files"][0];
- МассивФайлов.Добавить(ЗагруженныйФайл["id"]);
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла);
-
- Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок, Канал);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл (в канал)");
-
- ЗагруженныйФайл = Результат["files"][0];
- МассивФайлов.Добавить(ЗагруженныйФайл["id"]);
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла);
-
- Результат = OPI_Slack.ПолучитьДанныеФайла(Токен, ЗагруженныйФайл["id"]);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьФайл");
-
- ЗагруженныйФайл = Результат["file"];
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла);
-
- Для Каждого ЗагруженныйФайл Из МассивФайлов Цикл
-
- Результат = OPI_Slack.УдалитьФайл(Токен, ЗагруженныйФайл);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьФайл");
-
- Проверка_СлакОк(Результат);
-
- КонецЦикла;
-
-КонецПроцедуры
-
-Процедура Слак_ПолучитьСписокВФ() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
- Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
-
- Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
-
- Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен, Канал);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов");
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
-
-КонецПроцедуры
-
-Процедура Слак_ЗагрузитьУдалитьВФ() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
- Файл = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document");
- Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
- Заголовок = "Новый файл";
-
- Результат = OPI_Slack.ДобавитьВнешнийФайл(Токен, Файл, Заголовок);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВнешнийФайл");
-
- ЗагруженныйФайл = Результат["file"];
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок);
-
- Результат = OPI_Slack.ПолучитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьВнешнийФайл");
-
- ЗагруженныйФайл = Результат["file"];
-
- Проверка_СлакОк(Результат);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок);
-
- Результат = OPI_Slack.ОтправитьВнешнийФайл(Токен, ЗагруженныйФайл["id"], Канал);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл");
-
- Проверка_СлакОк(Результат);
-
- Результат = OPI_Slack.УдалитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл");
-
- Проверка_СлакОк(Результат);
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область Airtable
-
-Процедура АТ_СоздатьБазу() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
- Область = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Workspace");
- Наименование = "Тестовая база";
-
- МассивПолей = Новый Массив;
- МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер"));
- МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое"));
-
- ИмяТаблицы = "Тестовая таблица";
-
- СоответствиеТаблиц = Новый Соответствие;
- СоответствиеТаблиц.Вставить(ИмяТаблицы, МассивПолей);
-
- Результат = OPI_Airtable.СоздатьБазу(Токен, Область, Наименование, СоответствиеТаблиц);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазу");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"][0]["name"]).Равно(ИмяТаблицы);
-
- База = Результат["id"];
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Base", База);
-
- Результат = OPI_Airtable.ПолучитьТаблицыБазы(Токен, База);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицыБазы");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).ИмеетТип("Массив");
-
- Результат = OPI_Airtable.ПолучитьСписокБаз(Токен);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокБаз");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).ИмеетТип("Массив");
-
-КонецПроцедуры
-
-Процедура АТ_СоздатьТаблицу() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
- База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base");
-
- МассивПолей = Новый Массив;
- МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер"));
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[0], "ПолучитьПолеНомера");
-
- МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое"));
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[1], "ПолучитьПолеСтроковое");
-
- МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеВложения("Вложение"));
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[2], "ПолучитьПолеВложения");
-
- МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеФлажка("Флажок"));
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[3], "ПолучитьПолеФлажка");
-
- МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеДаты("Дата"));
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[4], "ПолучитьПолеДаты");
-
- МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеТелефона("Телефон"));
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[5], "ПолучитьПолеТелефона");
-
- МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеПочты("Почта"));
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[6], "ПолучитьПолеПочты");
-
- МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСсылки("Ссылка"));
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[7], "ПолучитьПолеСсылки");
-
- ИмяТаблицы = "Тестовая таблица 2";
- Описание = "Новая таблица";
-
- Результат = OPI_Airtable.СоздатьТаблицу(Токен, База, ИмяТаблицы, МассивПолей, Описание);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТаблицу");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
-
- Таблица = Результат["id"];
- ИмяТаблицы = "Тестовая таблица 2 (изм.)";
- Описание = "Новая таблица (изм.)";
-
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Table", Таблица);
-
- Результат = OPI_Airtable.ИзменитьТаблицу(Токен, База, Таблица, ИмяТаблицы, Описание);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТаблицу");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
-
-КонецПроцедуры
-
-Процедура АТ_СоздатьПоле() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
- База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base");
- Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table");
- Имя = Строка(Новый УникальныйИдентификатор);
-
- Поле = OPI_Airtable.ПолучитьПолеНомера(Имя);
-
- Результат = OPI_Airtable.СоздатьПоле(Токен, База, Таблица, Поле);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПоле");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя);
-
- Поле = Результат["id"];
- Имя = Имя + "(изм.)";
- Описание = "Новое описание";
-
- Результат = OPI_Airtable.ИзменитьПоле(Токен, База, Таблица, Поле, Имя, Описание);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПоле");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
-
-КонецПроцедуры
-
-Процедура АТ_СоздатьУдалитьЗаписи() Экспорт
-
- Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
- База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base");
- Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table");
-
- Числовой = 10;
- Строчный = "Привет";
-
- ОписаниеСтроки1 = Новый Структура("Номер,Строковое", Числовой, Строчный);
- ОписаниеСтроки2 = Новый Структура("Номер,Строковое", Числовой, Строчный);
-
- МассивУдаляемых = Новый Массив;
- МассивОписаний = Новый Массив;
- МассивОписаний.Добавить(ОписаниеСтроки1);
- МассивОписаний.Добавить(ОписаниеСтроки2);
-
- Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, МассивОписаний);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"].Количество()).Равно(2);
-
- Для Каждого Запись Из Результат["records"] Цикл
- МассивУдаляемых.Добавить(Запись["id"]);
- КонецЦикла;
-
- Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, ОписаниеСтроки1);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи (одна)");
-
- ОдиночнаяЗапись = Результат["id"];
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(ОдиночнаяЗапись).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["createdTime"]).Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["fields"]["Номер"]).Равно(Числовой);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(СокрЛП(Результат["fields"]["Строковое"])).Равно(Строчный);
-
- Результат = OPI_Airtable.ПолучитьЗапись(Токен, База, Таблица, ОдиночнаяЗапись);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗапись");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(ОдиночнаяЗапись);
-
- Текст = "Тестовый комментарий";
- Результат = OPI_Airtable.СоздатьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Текст);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст);
-
- Коммент = Результат["id"];
- Текст = "Тестовый комментарий (изм.)";
- Результат = OPI_Airtable.ИзменитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент, Текст);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКомментарий");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст);
-
- Результат = OPI_Airtable.ПолучитьКомментарии(Токен, База, Таблица, ОдиночнаяЗапись);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарии");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["comments"]).ИмеетТип("Массив");
-
- Результат = OPI_Airtable.УдалитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["deleted"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(Коммент);
-
- Результат = OPI_Airtable.ПолучитьСписокЗаписей(Токен, База, Таблица);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаписей");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено();
-
- Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, МассивУдаляемых);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено();
-
- Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, ОдиночнаяЗапись);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи (одна)");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено();
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область Dropbox
-
-Процедура ДропБокс_ПолучитьОбновитьТокен() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Appkey" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Appsecret", ПараметрыТеста);
-
- Dropbox_ПолучитьСсылкуАвторизации(ПараметрыТеста);
-
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Code", ПараметрыТеста);
-
- Dropbox_ПолучитьТокен(ПараметрыТеста);
-
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Refresh", ПараметрыТеста);
-
- Dropbox_ОбновитьТокен(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура ДропБокс_ЗагрузитьФайл() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture", ПараметрыТеста);
-
- Dropbox_ЗагрузитьФайл(ПараметрыТеста);
- Dropbox_ПолучитьИнформациюОбОбъекте(ПараметрыТеста);
- Dropbox_ПолучитьСписокВерсийОбъекта(ПараметрыТеста);
- Dropbox_ВосстановитьОбъектКВерсии(ПараметрыТеста);
- Dropbox_ПолучитьПревью(ПараметрыТеста);
- Dropbox_СкачатьФайл(ПараметрыТеста);
- Dropbox_ПереместитьОбъект(ПараметрыТеста);
- Dropbox_КопироватьОбъект(ПараметрыТеста);
- Dropbox_УдалитьОбъект(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура ДропБокс_СоздатьКаталог() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
-
- Dropbox_СоздатьПапку(ПараметрыТеста);
- Dropbox_СкачатьПапку(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура ДропБокс_ПолучитьСписокФайловПапки() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
-
- Dropbox_ПолучитьСписокФайловПапки(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура ДропБокс_ЗагрузитьФайлПоURL() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Document", ПараметрыТеста);
-
- Dropbox_ЗагрузитьФайлПоURL(ПараметрыТеста);
- Dropbox_ПолучитьСтатусЗагрузкиПоURL(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура ДропБокс_СоздатьУдалитьТег() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
-
- Dropbox_ДобавитьТег(ПараметрыТеста);
- Dropbox_ПолчитьСписокТегов(ПараметрыТеста);
- Dropbox_УдалитьТег(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура ДропБокс_ПолучитьАккаунт() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
-
- Dropbox_ПолучитьИнформациюОбАккаунте(ПараметрыТеста);
- Dropbox_ПолучитьДанныеИспользованияПространства(ПараметрыТеста);
-
-КонецПроцедуры
-
-Процедура ДропБокс_РаботаСДоступами() Экспорт
-
- ПараметрыТеста = Новый Структура;
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token" , ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_OtherUser", ПараметрыТеста);
- OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_FileID" , ПараметрыТеста);
-
- Dropbox_ДобавитьПользователейКФайлу(ПараметрыТеста);
- Dropbox_ОпубликоватьПапку(ПараметрыТеста);
- Dropbox_ДобавитьПользователейКПапке(ПараметрыТеста);
- Dropbox_ОтменитьПубликациюПапки(ПараметрыТеста);
- Dropbox_ОтменитьПубликациюФайла(ПараметрыТеста);
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ПолучитьПараметрыВК()
-
- Параметры = Новый Структура;
- НомерГруппы = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_GroupID");
-
- Параметры.Вставить("access_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_Token"));
- Параметры.Вставить("owner_id" , "-" + НомерГруппы);
- Параметры.Вставить("app_id" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_AppID"));
- Параметры.Вставить("group_id" , НомерГруппы);
-
- Возврат Параметры;
-
-КонецФункции
-
-Функция ПолучитьПараметрыТвиттер()
-
- Параметры = Новый Соответствие;
-
- Параметры.Вставить("redirect_uri" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Redirect"));
- Параметры.Вставить("client_id" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_ClinetID"));
- Параметры.Вставить("client_secret" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_ClientSecret"));
- Параметры.Вставить("access_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Token"));
- Параметры.Вставить("refresh_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Refresh"));
- Параметры.Вставить("oauth_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthToken"));
- Параметры.Вставить("oauth_token_secret" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthSecret"));
-
- Параметры.Вставить("oauth_consumer_key"
- , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthConsumerKey"));
- Параметры.Вставить("oauth_consumer_secret"
- , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthConsumerSecret"));
-
- Возврат Параметры;
-
-КонецФункции
-
-#Область Проверки
-
-Процедура Проверка_Пусто(Знач Результат)
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь);
-КонецПроцедуры
-
-Процедура Проверка_ДвоичныеДанные(Знач Результат, Знач Размер = Неопределено)
-
- МинимальныйРазмер = 500000;
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные");
-
- Если Не Размер = Неопределено Тогда
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер()).Равно(Размер);
- Иначе
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер() > МинимальныйРазмер).Равно(Истина);
- КонецЕсли;
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмИстина(Знач Результат)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина);
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмИнформацияБота(Знач Результат)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["username"]).Заполнено();
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмМассив(Результат)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие") .Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Массив");
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмУстановкаВебхук(Знач Результат)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно("Webhook was set");
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмУдалениеВебхук(Знач Результат)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Заполнено();
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмСообщение(Знач Результат, Знач Текст)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["text"]).Равно(Текст);
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмКартинка(Знач Результат, Знач Текст)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие") .Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["photo"]).ИмеетТип("Массив");
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмВидео(Знач Результат, Знач Текст)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["video"]["mime_type"]).Равно("video/mp4");
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмАудио(Знач Результат, Знач Текст)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["audio"]["mime_type"]).Равно("audio/mpeg");
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмДокумент(Знач Результат, Знач Текст)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["document"]).ИмеетТип("Соответствие").Заполнено();
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмГифка(Знач Результат, Знач Текст)
-
- Result = "result";
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["caption"]).Равно(Текст);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["document"]).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["animation"]["mime_type"]).Равно("video/mp4");
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмМедиагруппа(Знач Результат)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Массив");
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмМестоположение(Знач Результат)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["location"]).ИмеетТип("Соответствие").Заполнено();
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмКонтакт(Знач Результат, Знач Имя)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["contact"]).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["contact"]["first_name"]).Равно(Имя);
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмОпрос(Знач Результат, Знач Вопрос)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["poll"]).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["poll"]["question"]).Равно(Вопрос);
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмПереслать(Знач Результат, Знач IDСообщения)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["forward_origin"]["message_id"]).Равно(Число(IDСообщения));
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмБан(Знач Результат)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно("Bad Request: can't remove chat owner");
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмПриглашение(Знач Результат, Знач Заголовок, Знач UnixИстечение)
-
- Result = "result";
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["member_limit"]).Равно(200);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["name"]).Равно(Заголовок);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["expire_date"]).Равно(Число(UnixИстечение));
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмЧисло(Знач Результат)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Число");
-
-КонецПроцедуры
-
-Процедура Проверка_ТелеграмСозданиеТемы(Знач Результат, Знач Имя, Иконка)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["name"]).Равно(Имя);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["icon_custom_emoji_id"]).Равно(Иконка);
-
-КонецПроцедуры
-
-Процедура Проверка_ВКПост(Знач Результат)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["post_id"]).ИмеетТип("Число").Заполнено();
-
-КонецПроцедуры
-
-Процедура Проверка_ВКИстина(Знач Результат)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Равно(1);
-
-КонецПроцедуры
-
-Процедура Проверка_ВКАльбом(Знач Результат, Знач Описание)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["description"]).Равно(Описание);
-
-КонецПроцедуры
-
-Процедура Проверка_ВККартинкаАльбома(Знач Результат, Знач ОписаниеКартинки, Знач ИДАльбома)
-
- Response = "response";
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][0]["text"]).Равно(ОписаниеКартинки);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][0]["album_id"]).Равно(ИДАльбома);
-
-КонецПроцедуры
-
-Процедура Проверка_ВКИстория(Знач Результат)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["count"]).ИмеетТип("Число").Равно(1);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["items"]).ИмеетТип("Массив").Заполнено();
-
-КонецПроцедуры
-
-Процедура Проверка_ВКОбсуждение(Знач Результат)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Заполнено();
-
-КонецПроцедуры
-
-Процедура Проверка_ГКОбъект(Знач Результат, Знач Наименование, Знач Описание)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["summary"]).Равно(Наименование);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).ИмеетТип("Строка").Заполнено();
-
-КонецПроцедуры
-
-Процедура Проверка_ТвиттерТекст(Знач Результат, Знач Текст)
-
- ТекстОтвета = Результат["data"]["text"];
- ТекстОтвета = Лев(ТекстОтвета, СтрДлина(Текст));
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(ТекстОтвета).Равно(Текст);
-
-КонецПроцедуры
-
-Процедура Проверка_ВайберОк(Знач Результат)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status_message"]).Равно("ok");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status"]).Равно(0);
-
-КонецПроцедуры
-
-Процедура Проверка_НоушнОбъект(Знач Результат, Знач Вид = "page")
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["object"]).Равно(Вид);
-
-КонецПроцедуры
-
-Процедура Проверка_СлакОк(Знач Результат)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
-
-КонецПроцедуры
-
-Процедура Проверка_ДропБоксФайл(Знач Результат, Знач Путь)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path_display"]).Равно(Путь);
-
-КонецПроцедуры
-
-Процедура Проверка_ДропБоксМетаданные(Знач Результат, Знач Путь)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["metadata"]["path_display"]).Равно(Путь);
-
-КонецПроцедуры
-
-Процедура Проверка_ДропБоксМассив(Знач Результат, Знач Количество = Неопределено)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["entries"]).ИмеетТип("Массив");
-
- Если Не Количество = Неопределено Тогда
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["entries"].Количество()).Равно(Количество);
- КонецЕсли;
-
-КонецПроцедуры
-
-Процедура Проверка_ДропБоксРабота(Знач Результат)
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["async_job_id"]).Заполнено();
-КонецПроцедуры
-
-Процедура Проверка_ДропБоксСтатус(Знач Результат)
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[".tag"]).Равно("complete");
-КонецПроцедуры
-
-Процедура Проверка_ДропБоксТеги(Знач Результат, Знач Количество)
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["paths_to_tags"]).ИмеетТип("Массив");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["paths_to_tags"].Количество()).Равно(Количество);
-
-КонецПроцедуры
-
-Процедура Проверка_ДропбоксАккаунт(Знач Результат)
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["account_id"]).Заполнено();
-КонецПроцедуры
-
-Процедура Проверка_ДропбоксПространство(Знач Результат)
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["used"]).Заполнено();
-КонецПроцедуры
-
-Процедура Проверка_ДропбоксУчастник(Знач Результат, Знач Почта, Знач ТолькоПросмотр)
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[0]["result"][".tag"]).Равно("success");
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[0]["member"]["email"]).Равно(Почта);
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(
- Результат[0]["result"]["success"][".tag"]).Равно(?(ТолькоПросмотр, "viewer", "editor"));
-КонецПроцедуры
-
-Процедура Проверка_ДропбоксПубличнаяПапка(Знач Результат)
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["shared_folder_id"]).Заполнено();
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область АтомарныеТесты
-
-#Область Telegram
-
-Процедура Telegram_ПолучитьИнформациюБота(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- Результат = OPI_Telegram.ПолучитьИнформациюБота(Токен);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюБота", "Telegram");
-
- Проверка_ТелеграмИнформацияБота(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ПолучитьОбновления(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- Результат = OPI_Telegram.ПолучитьОбновления(Токен);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбновления", "Telegram");
-
- Проверка_ТелеграмМассив(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_УстановитьWebhook(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- URL = ПараметрыФункции["Telegram_URL"];
-
- Результат = OPI_Telegram.УстановитьWebhook(Токен, URL);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьWebhook", "Telegram");
-
- Проверка_ТелеграмУстановкаВебхук(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_УдалитьWebhook(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- Результат = OPI_Telegram.УдалитьWebhook(Токен);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьWebhook", "Telegram");
-
- Проверка_ТелеграмУдалениеВебхук(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьТекстовоеСообщение(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- IDЧата = ПараметрыФункции["Telegram_ChatID"];
- IDКанала = ПараметрыФункции["Telegram_ChannelID"];
- Текст = ПараметрыФункции["String"];
-
- Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDЧата, Текст);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение", "Telegram");
-
- Проверка_ТелеграмСообщение(Результат, Текст); // SKIP
-
- Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDКанала, Текст);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение (канал)");
-
- Проверка_ТелеграмСообщение(Результат, Текст);
-
- IDСообщения = OPI_Инструменты.ЧислоВСтроку(Результат["result"]["message_id"]);
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_ChannelMessageID", IDСообщения);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьКартинку(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- IDЧата = ПараметрыФункции["Telegram_ChatID"];
- IDКанала = ПараметрыФункции["Telegram_ChannelID"];
- Текст = ПараметрыФункции["String"];
- Картинка = ПараметрыФункции["Picture"];
-
- КартинкаПуть = ПолучитьИмяВременногоФайла("png");
- КопироватьФайл(Картинка, КартинкаПуть);
-
- КартинкаДД = Новый ДвоичныеДанные(КартинкаПуть);
-
- Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDЧата, Текст, Картинка);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку", "Telegram");
-
- Проверка_ТелеграмКартинка(Результат, Текст); // SKIP
-
- Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаПуть);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку (Путь)");
-
- Проверка_ТелеграмКартинка(Результат, Текст); // SKIP
-
- Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаДД);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку (ДД)");
-
- Проверка_ТелеграмКартинка(Результат, Текст);
-
- УдалитьФайлы(КартинкаПуть);
-
- IDФайла = Результат["result"]["photo"][0]["file_id"];
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла);
-
- ПараметрыФункции.Вставить("Telegram_FileID", IDФайла);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьВидео(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- IDЧата = ПараметрыФункции["Telegram_ChatID"];
- IDКанала = ПараметрыФункции["Telegram_ChannelID"];
- Текст = ПараметрыФункции["String"];
- Видео = ПараметрыФункции["Video"];
-
- ВидеоПуть = ПолучитьИмяВременногоФайла("mp4");
- КопироватьФайл(Видео, ВидеоПуть);
-
- ВидеоДД = Новый ДвоичныеДанные(ВидеоПуть);
-
- Результат = OPI_Telegram.ОтправитьВидео(Токен, IDЧата, Текст, Видео);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео", "Telegram");
-
- Проверка_ТелеграмВидео(Результат, Текст); // SKIP
-
- Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоПуть);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео (Путь)");
-
- Проверка_ТелеграмВидео(Результат, Текст); // SKIP
-
- Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоДД);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео (ДД)");
-
- Проверка_ТелеграмВидео(Результат, Текст);
-
- УдалитьФайлы(ВидеоПуть);
-
- IDФайла = Результат["result"]["video"]["file_id"];
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла);
-
- ПараметрыФункции.Вставить("Telegram_FileID", IDФайла);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьАудио(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- IDЧата = ПараметрыФункции["Telegram_ChatID"];
- IDКанала = ПараметрыФункции["Telegram_ChannelID"];
- Текст = ПараметрыФункции["String"];
- Аудио = ПараметрыФункции["Audio"];
-
- АудиоПуть = ПолучитьИмяВременногоФайла("mp3");
- КопироватьФайл(Аудио, АудиоПуть);
-
- АудиоДД = Новый ДвоичныеДанные(АудиоПуть);
-
- Результат = OPI_Telegram.ОтправитьАудио(Токен, IDЧата, Текст, Аудио);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио", "Telegram");
-
- Проверка_ТелеграмАудио(Результат, Текст); // SKIP
-
- Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоПуть);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио (Путь)");
-
- Проверка_ТелеграмАудио(Результат, Текст); // SKIP
-
- Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоДД);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио (ДД)");
-
- Проверка_ТелеграмАудио(Результат, Текст);
-
- УдалитьФайлы(АудиоПуть);
-
- IDФайла = Результат["result"]["audio"]["file_id"];
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла);
-
- ПараметрыФункции.Вставить("Telegram_FileID", IDФайла);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьДокумент(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- IDЧата = ПараметрыФункции["Telegram_ChatID"];
- IDКанала = ПараметрыФункции["Telegram_ChannelID"];
- Текст = ПараметрыФункции["String"];
- Документ = ПараметрыФункции["Document"];
-
- ДокументПуть = ПолучитьИмяВременногоФайла("docx");
- КопироватьФайл(Документ, ДокументПуть);
-
- ДокументДД = Новый ДвоичныеДанные(ДокументПуть);
-
- Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDЧата, Текст, Документ);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент", "Telegram");
-
- Проверка_ТелеграмДокумент(Результат, Текст); // SKIP
-
- Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументПуть);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (Путь)");
-
- Проверка_ТелеграмДокумент(Результат, Текст); // SKIP
-
- Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументДД);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (ДД)");
-
- Проверка_ТелеграмДокумент(Результат, Текст);
-
- УдалитьФайлы(ДокументПуть);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьГифку(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- IDЧата = ПараметрыФункции["Telegram_ChatID"];
- IDКанала = ПараметрыФункции["Telegram_ChannelID"];
- Текст = ПараметрыФункции["String"];
- Гифка = ПараметрыФункции["GIF"];
-
- ГифкаПуть = ПолучитьИмяВременногоФайла("gif");
- КопироватьФайл(Гифка, ГифкаПуть);
-
- ГифкаДД = Новый ДвоичныеДанные(ГифкаПуть);
-
- Результат = OPI_Telegram.ОтправитьГифку(Токен, IDЧата, Текст, Гифка);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку", "Telegram");
-
- Проверка_ТелеграмГифка(Результат, Текст); // SKIP
-
- Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаПуть);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (Путь)");
-
- Проверка_ТелеграмГифка(Результат, Текст); // SKIP
-
- Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаДД);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (ДД)");
-
- Проверка_ТелеграмГифка(Результат, Текст);
-
- УдалитьФайлы(ГифкаПуть);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьМеидагруппу(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- IDЧата = ПараметрыФункции["Telegram_ChatID"];
- Текст = ПараметрыФункции["String"];
- Картинка = ПараметрыФункции["Picture"];
- Видео = ПараметрыФункции["Video"];
-
- КартинкаПуть = ПолучитьИмяВременногоФайла("png");
- КопироватьФайл(Картинка, КартинкаПуть);
-
- ВидеоПуть = ПолучитьИмяВременногоФайла("mp4");
- КопироватьФайл(Видео, ВидеоПуть);
-
- ВидеоДД = Новый ДвоичныеДанные(ВидеоПуть);
-
- Медиагруппа = Новый Соответствие;
- Медиагруппа.Вставить(КартинкаПуть, "photo");
- Медиагруппа.Вставить(ВидеоДД , "video");
-
- Результат = OPI_Telegram.ОтправитьМедиагруппу(Токен, IDЧата, Текст, Медиагруппа);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМедиагруппу", "Telegram");
-
- Проверка_ТелеграмМедиагруппа(Результат);
-
- УдалитьФайлы(ВидеоПуть);
- УдалитьФайлы(КартинкаПуть);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьМестоположение(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- IDЧата = ПараметрыФункции["Telegram_ChatID"];
- IDКанала = ПараметрыФункции["Telegram_ChannelID"];
- Ширина = ПараметрыФункции["Lat"];
- Долгота = ПараметрыФункции["Long"];
-
- Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDЧата, Ширина, Долгота);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение", "Telegram");
-
- Проверка_ТелеграмМестоположение(Результат); // SKIP
-
- Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDКанала, Ширина, Долгота);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение (канал)");
-
- Проверка_ТелеграмМестоположение(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьКонтакт(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- IDЧата = ПараметрыФункции["Telegram_ChatID"];
- IDКанала = ПараметрыФункции["Telegram_ChannelID"];
- Имя = ПараметрыФункции["Name"];
- Фамилия = ПараметрыФункции["Surname"];
- Телефон = ПараметрыФункции["Phone"];
-
- Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDЧата , Имя, Фамилия, Телефон);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт", "Telegram");
-
- Проверка_ТелеграмКонтакт(Результат, Имя); // SKIP
- OPI_Инструменты.Пауза(20); // SKIP
-
- Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDКанала, Имя, Фамилия, Телефон);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт (канал)");
-
- Проверка_ТелеграмКонтакт(Результат, Имя);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ОтправитьОпрос(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- IDЧата = ПараметрыФункции["Telegram_ChatID"];
- IDКанала = ПараметрыФункции["Telegram_ChannelID"];
- Вопрос = "Какой ваш любимый цвет?";
-
- МассивОтветов = Новый Массив;
- МассивОтветов.Добавить("Красный");
- МассивОтветов.Добавить("Желтый");
- МассивОтветов.Добавить("Зеленый");
- МассивОтветов.Добавить("Синий");
-
- Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDЧата , Вопрос, МассивОтветов, Ложь);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос", "Telegram");
-
- Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP
-
- Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, МассивОтветов, Истина);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (канал)");
-
- Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP
-
- // END
-
- СтрочныйМассив = "['Красный', 'Желтый','Зеленый' ,'Синий']";
-
- Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, СтрочныйМассив, Истина);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (строчный массив)");
-
- Проверка_ТелеграмОпрос(Результат, Вопрос);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_СкачатьФайл(ПараметрыФункции)
-
- IDФайла = ПараметрыФункции["Telegram_FileID"];
- Токен = ПараметрыФункции["Telegram_Token"];
-
- Результат = OPI_Telegram.СкачатьФайл(Токен, IDФайла);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Telegram");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные");
-
-КонецПроцедуры
-
-Процедура Telegram_ПереслатьСообщение(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- IDЧата = ПараметрыФункции["Telegram_ChatID"];
- IDКанала = ПараметрыФункции["Telegram_ChannelID"];
- IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"];
-
- Результат = OPI_Telegram.ПереслатьСообщение(Токен, IDСообщения, IDКанала, IDЧата);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереслатьСообщение", "Telegram");
-
- Проверка_ТелеграмПереслать(Результат, IDСообщения);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_Бан(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- IDПользователя = ПараметрыФункции["Telegram_ChatID"];
- IDКанала = ПараметрыФункции["Telegram_ChannelID"];
-
- Результат = OPI_Telegram.Бан(Токен, IDКанала, IDПользователя);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Бан", "Telegram");
-
- Проверка_ТелеграмБан(Результат);
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_Разбан(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- IDПользователя = ПараметрыФункции["Telegram_ChatID"];
- IDКанала = ПараметрыФункции["Telegram_ChannelID"];
-
- Результат = OPI_Telegram.Разбан(Токен, IDКанала, IDПользователя);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Разбан", "Telegram");
-
- Проверка_ТелеграмБан(Результат);
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_СоздатьСсылкуПриглашение(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- IDКанала = ПараметрыФункции["Telegram_ChannelID"];
- Сутки = 86400;
- ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
-
- Заголовок = "Ссылка " + Строка(ТекущаяДата);
- Истечение = ТекущаяДата + Сутки;
- UnixИстечение = OPI_Инструменты.UNIXTime(Истечение);
-
- Результат = OPI_Telegram.СоздатьСсылкуПриглашение(Токен, IDКанала, Заголовок, Истечение, 200);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПриглашение", "Telegram");
-
- Проверка_ТелеграмПриглашение(Результат, Заголовок, UnixИстечение);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ЗакрепитьСообщение(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- IDКанала = ПараметрыФункции["Telegram_ChannelID"];
- IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"];
-
- Результат = OPI_Telegram.ЗакрепитьСообщение(Токен, IDКанала, IDСообщения);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрепитьСообщение", "Telegram");
-
- Проверка_ТелеграмИстина(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ОткрепитьСообщение(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- IDКанала = ПараметрыФункции["Telegram_ChannelID"];
- IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"];
-
- Результат = OPI_Telegram.ОткрепитьСообщение(Токен, IDКанала, IDСообщения);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрепитьСообщение", "Telegram");
-
- Проверка_ТелеграмИстина(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ПолучитьЧислоУчастников(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- IDКанала = ПараметрыФункции["Telegram_ChannelID"];
-
- Результат = OPI_Telegram.ПолучитьЧислоУчастников(Токен, IDКанала);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЧислоУчастников", "Telegram");
-
- Проверка_ТелеграмЧисло(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ПолучитьСписокАватаровФорума(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- Результат = OPI_Telegram.ПолучитьСписокИконокАватаров(Токен);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокИконокАватаров", "Telegram");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_СоздатьТемуФорума(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- Чат = ПараметрыФункции["Telegram_ForumID"];
- Иконка = "5357419403325481346";
- Имя = "Тестовая тема " + Строка(Новый УникальныйИдентификатор);
-
- Результат = OPI_Telegram.СоздатьТемуФорума(Токен, Чат, Имя, Иконка);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТемуФорума", "Telegram");
-
- Тема = Результат["result"]["message_thread_id"];
-
- ПараметрыФункции.Вставить("Telegram_TopicID", Тема);
- OPI_Инструменты.ДобавитьПоле("Telegram_TopicID", Тема, "Строка", ПараметрыФункции);
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_TopicID", ПараметрыФункции["Telegram_TopicID"]);
-
- Проверка_ТелеграмСозданиеТемы(Результат, Имя, Иконка);
-
- ЧатТема = Чат + "*" + Тема;
- Текст = ПараметрыФункции["String"];
- Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, ЧатТема, Текст);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение (форум)");
-
- Проверка_ТелеграмСообщение(Результат, Текст);
-
-КонецПроцедуры
-
-Процедура Telegram_ИзменитьТемуФорума(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- Чат = ПараметрыФункции["Telegram_ForumID"];
- Тема = ПараметрыФункции["Telegram_TopicID"];
- НовоеИмя = "Новый тестовый заголовок";
- НовяИконка = "5310132165583840589";
-
- Результат = OPI_Telegram.ИзменитьТемуФорума(Токен, Чат, Тема, НовоеИмя, НовяИконка);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТемуФорума", "Telegram");
-
- Проверка_ТелеграмИстина(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ЗакрытьТемуФорума(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- Чат = ПараметрыФункции["Telegram_ForumID"];
- Тема = ПараметрыФункции["Telegram_TopicID"];
-
- OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // SKIP
-
- Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат); // Закрывает главную тему
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума (главная)");
-
- Проверка_ТелеграмИстина(Результат); // SKIP
-
- Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат, Тема);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума", "Telegram");
-
- Проверка_ТелеграмИстина(Результат);
-
- OPI_Инструменты.Пауза(25);
-
-КонецПроцедуры
-
-Процедура Telegram_ОткрытьТемуФорума(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- Чат = ПараметрыФункции["Telegram_ForumID"];
- Тема = ПараметрыФункции["Telegram_TopicID"];
-
- Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // Открывает главную тему
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума (главная)");
-
- Проверка_ТелеграмИстина(Результат); // SKIP
-
- Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат, Тема);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума", "Telegram");
-
- Проверка_ТелеграмИстина(Результат);
-
- OPI_Инструменты.Пауза(25);
-
-КонецПроцедуры
-
-Процедура Telegram_УдалитьТемуФорума(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- Чат = ПараметрыФункции["Telegram_ForumID"];
- Тема = ПараметрыФункции["Telegram_TopicID"];
-
- Результат = OPI_Telegram.УдалитьТемуФорума(Токен, Чат, Тема);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТемуФорума", "Telegram");
-
- Проверка_ТелеграмИстина(Результат);
-
- OPI_Инструменты.Пауза(25);
-
-КонецПроцедуры
-
-Процедура Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- Чат = ПараметрыФункции["Telegram_ForumID"];
- Тема = ПараметрыФункции["Telegram_TopicID"];
-
- Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы (главная)");
-
- Проверка_ТелеграмИстина(Результат); // SKIP
-
- Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат, Тема);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы", "Telegram");
-
- Проверка_ТелеграмИстина(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_СкрытьГлавнуюТемуФорума(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- Чат = ПараметрыФункции["Telegram_ForumID"];
-
- Результат = OPI_Telegram.СкрытьГлавнуюТемуФорума(Токен, Чат);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкрытьГлавнуюТемуФорума", "Telegram");
-
- Проверка_ТелеграмИстина(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ПоказатьГлавнуюТемуФорума(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Telegram_Token"];
- Чат = ПараметрыФункции["Telegram_ForumID"];
-
- Результат = OPI_Telegram.ПоказатьГлавнуюТемуФорума(Токен, Чат);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоказатьГлавнуюТемуФорума", "Telegram");
-
- Проверка_ТелеграмИстина(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Telegram_ИзменитьИмяГлавнойТемыФорума(ПараметрыФункции)
-
- Заголовок = "Новое имя главной темы " + Строка(Новый УникальныйИдентификатор);
- Токен = ПараметрыФункции["Telegram_Token"];
- Чат = ПараметрыФункции["Telegram_ForumID"];
-
- Результат = OPI_Telegram.ИзменитьИмяГлавнойТемыФорума(Токен, Чат, Заголовок);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьИмяГлавнойТемыФорума", "Telegram");
-
- Проверка_ТелеграмИстина(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область VK
-
-Процедура VK_СоздатьСсылкуПолученияТокена(ПараметрыФункции)
-
- Приложение = ПараметрыФункции["VK_AppID"];
- Результат = OPI_VK.СоздатьСсылкуПолученияТокена(Приложение);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПолученияТокена", "VK");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено();
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура VK_СоздатьПост(ПараметрыФункции)
-
- Параметры = ПолучитьПараметрыВК();
- Текст = "Пост из автотеста";
- URL = "https://github.com/Bayselonarrend/OpenIntegrations";
-
- Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные
- Картинка2 = ПараметрыФункции["Picture2"]; // URL, Путь или Двоичные данные
-
- ИВФ = ПолучитьИмяВременногоФайла("png");
- КопироватьФайл(Картинка2, ИВФ);
-
- МассивКартинок = Новый Массив;
- МассивКартинок.Добавить(Картинка);
- МассивКартинок.Добавить(ИВФ);
-
- Результат = OPI_VK.СоздатьПост(Текст, МассивКартинок, Истина, URL, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост", "VK");
-
- Проверка_ВКПост(Результат); // SKIP
- ИДПоста = Результат["response"]["post_id"]; // SKIP
- Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); // SKIP
-
- Результат = OPI_VK.СоздатьПост(Текст, Картинка, Ложь , , Параметры);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (одна картинка)");
-
- Проверка_ВКПост(Результат);
-
- ИДПоста = Результат["response"]["post_id"];
- Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры);
-
- OPI_Инструменты.Пауза(5);
-
- Результат = OPI_VK.СоздатьПост(Текст, ИВФ , Истина, URL, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (один путь)");
-
- Проверка_ВКПост(Результат);
-
- ИДПоста = Результат["response"]["post_id"];
- OPI_Инструменты.ДобавитьПоле("VK_PostID", ИДПоста, "Строка", ПараметрыФункции);
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PostID", ПараметрыФункции["VK_PostID"]);
-
- УдалитьФайлы(ИВФ);
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура VK_УдалитьПост(ПараметрыФункции)
-
- Параметры = ПолучитьПараметрыВК();
- ИДПоста = ПараметрыФункции["VK_PostID"];
-
- Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьПост", "VK");
-
- Проверка_ВКИстина(Результат);
-
-КонецПроцедуры
-
-Процедура VK_СоздатьСоставнойПост(ПараметрыФункции)
-
- Параметры = ПолучитьПараметрыВК();
- Текст = "Пост из автотеста";
- URL = "https://github.com/Bayselonarrend/OpenIntegrations";
-
- Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные
- Видео = ПараметрыФункции["Video"]; // URL, Путь или Двоичные данные
-
- ИВФ = ПолучитьИмяВременногоФайла("png");
- КопироватьФайл(Картинка, ИВФ);
-
- ЗагрузкаКартинки = OPI_VK.ЗагрузитьФотоНаСервер(ИВФ, Параметры)["response"][0];
- ЗагрузкаВидео = OPI_VK.ЗагрузитьВидеоНаСервер(Видео, "Новое видео", , , Параметры);
-
- ВладелецКартинки = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаКартинки["owner_id"]);
- ВладелецВидео = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаВидео["owner_id"]);
-
- IDКартинки = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаКартинки["id"]);
- IDВидео = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаВидео["video_id"]);
-
- МассивВложений = Новый Массив;
- МассивВложений.Добавить("photo" + ВладелецКартинки + "_" + IDКартинки);
- МассивВложений.Добавить("video" + ВладелецВидео + "_" + IDВидео);
-
- Результат = OPI_VK.СоздатьСоставнойПост(Текст, МассивВложений, Ложь, URL, Параметры);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСоставнойПост", "VK");
-
- Проверка_ВКПост(Результат);
- УдалитьФайлы(ИВФ);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура VK_СоздатьОпрос()
-
- Параметры = ПолучитьПараметрыВК();
- Вопрос = "Какой ваш любимый цвет?";
-
- МассивВариантов = Новый Массив;
- МассивВариантов.Добавить("Красный");
- МассивВариантов.Добавить("Желтый");
- МассивВариантов.Добавить("Зеленый");
-
- Результат = OPI_VK.СоздатьОпрос(Вопрос, МассивВариантов, , Параметры);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОпрос", "VK");
-
- Проверка_ВКПост(Результат);
-
- ИДПоста = Результат["response"]["post_id"];
- OPI_VK.УдалитьПост(ИДПоста, Параметры);
-
- OPI_Инструменты.Пауза(10);
-
-КонецПроцедуры
-
-Процедура VK_СоздатьАльбом(ПараметрыФункции)
-
- Параметры = ПолучитьПараметрыВК();
- Имя = "Альбом из автотеста";
- Описание = "Новый альбом из автотеста";
-
- Результат = OPI_VK.СоздатьАльбом(Имя, Описание, Параметры);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьАльбом", "VK");
-
- Проверка_ВКАльбом(Результат, Описание);
-
- ИДАльбома = Результат["response"]["id"];
- ПараметрыФункции.Вставить("VK_AlbumID", ИДАльбома);
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_AlbumID", ИДАльбома);
-
-КонецПроцедуры
-
-Процедура VK_СохранитьКартинкуВАльбом(ПараметрыФункции)
-
- Параметры = ПолучитьПараметрыВК();
- ОписаниеКартинки = "Картинка автотест";
- ИДАльбома = ПараметрыФункции["VK_AlbumID"];
-
- Картинка = ПараметрыФункции["Picture"]; // URL, Путь к файлу или Двоичные данные
- ИВФ = ПолучитьИмяВременногоФайла("png");
- КопироватьФайл(Картинка, ИВФ);
-
- Картинка = Новый ДвоичныеДанные(ИВФ);
-
- Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, Картинка, ОписаниеКартинки, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом", "VK");
-
- Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP
-
- ИДКартинки = Результат["response"][0]["id"]; // SKIP
- Результат = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры); // SKIP
-
- Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, ИВФ, ОписаниеКартинки, Параметры);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом (путь)");
-
- Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP
-
- ИДКартинки = Результат["response"][0]["id"];
- ПараметрыФункции.Вставить("VK_PictureID", ИДКартинки);
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PictureID", ИДКартинки);
-
- УдалитьФайлы(ИВФ);
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура VK_УдалитьКартинку(ПараметрыФункции)
-
- Параметры = ПолучитьПараметрыВК();
- ИДКартинки = ПараметрыФункции["VK_PictureID"];
-
- Результат = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКартинку", "VK");
-
- Проверка_ВКИстина(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура VK_УдалитьАльбом(ПараметрыФункции)
-
- Параметры = ПолучитьПараметрыВК();
- ИДАльбома = ПараметрыФункции["VK_AlbumID"];
-
- Результат = OPI_VK.УдалитьАльбом(ИДАльбома, Параметры);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьАльбом", "VK");
-
- Проверка_ВКИстина(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура VK_СоздатьИсторию(ПараметрыФункции)
-
- Параметры = ПолучитьПараметрыВК();
- URL = "https://github.com/Bayselonarrend/OpenIntegrations";
-
- Картинка = ПараметрыФункции["Picture"]; // URL, Путь к файлу или Двоичные данные
- ИВФ = ПолучитьИмяВременногоФайла("png");
- КопироватьФайл(Картинка, ИВФ);
- Картинка = Новый ДвоичныеДанные(ИВФ);
-
- Результат = OPI_VK.СоздатьИсторию(Картинка , URL, Параметры);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию", "VK");
-
- Проверка_ВКИстория(Результат); // SKIP
-
- Результат = OPI_VK.СоздатьИсторию(ИВФ, , Параметры);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию (путь)");
-
- Проверка_ВКИстория(Результат);
-
- УдалитьФайлы(ИВФ);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура VK_СоздатьОбсуждение(ПараметрыФункции)
-
- Параметры = ПолучитьПараметрыВК();
- Название = "Обсуждаем: какой цвет лучше?";
- Сообщение = "Красный, желтый, синий или какой-то другой?";
-
- Результат = OPI_VK.СоздатьОбсуждение(Название, Сообщение, Параметры);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОбсуждение", "VK");
-
- Проверка_ВКОбсуждение(Результат);
-
- ИДОбсуждения = Результат["response"];
- ПараметрыФункции.Вставить("VK_ConvID", ИДОбсуждения);
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_ConvID", ИДОбсуждения);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура VK_ЗакрытьОбсуждение(ПараметрыФункции)
-
- Параметры = ПолучитьПараметрыВК();
- ИДОбсуждения = ПараметрыФункции["VK_ConvID"];
- Результат = OPI_VK.ЗакрытьОбсуждение(ИДОбсуждения, Ложь, Параметры);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьОбсуждение", "VK");
-
- Проверка_ВКИстина(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура VK_ОткрытьОбсуждение(ПараметрыФункции)
-
- Параметры = ПолучитьПараметрыВК();
- ИДОбсуждения = ПараметрыФункции["VK_ConvID"];
- Результат = OPI_VK.ОткрытьОбсуждение(ИДОбсуждения, Параметры);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьОбсуждение", "VK");
-
- Проверка_ВКИстина(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура VK_НаписатьВОбсуждение(ПараметрыФункции)
-
- Параметры = ПолучитьПараметрыВК();
- ИДОбсуждения = ПараметрыФункции["VK_ConvID"];
- Сообщение = "Мне больше нравится желтый";
-
- Результат = OPI_VK.НаписатьВОбсуждение(ИДОбсуждения, Сообщение, Параметры);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьВОбсуждение", "VK");
-
- Проверка_ВКОбсуждение(Результат);
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область Dropbox
-
-Процедура Dropbox_ПолучитьСсылкуАвторизации(ПараметрыФункции)
-
- КлючПриложения = ПараметрыФункции["Dropbox_Appkey"];
- Результат = OPI_Dropbox.ПолучитьСсылкуАвторизации(КлючПриложения);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуАвторизации", "Dropbox");
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка");
-
-КонецПроцедуры
-
-Процедура Dropbox_ПолучитьТокен(ПараметрыФункции)
-
- КлючПриложения = ПараметрыФункции["Dropbox_Appkey"];
- СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"];
- Код = ПараметрыФункции["Dropbox_Code"];
-
- Результат = OPI_Dropbox.ПолучитьТокен(КлючПриложения, СекретПриложения, Код);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТокен");
-
- Токен = Результат["access_token"];
- Рефреш = Результат["refresh_token"];
-
- Если ЗначениеЗаполнено(Токен) Тогда
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен);
- КонецЕсли;
-
- Если ЗначениеЗаполнено(Рефреш) Тогда
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Refresh", Рефреш);
- КонецЕсли;
-
-КонецПроцедуры
-
-Процедура Dropbox_ОбновитьТокен(ПараметрыФункции)
-
- КлючПриложения = ПараметрыФункции["Dropbox_Appkey"];
- СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"];
- РефрешТокен = ПараметрыФункции["Dropbox_Refresh"];
-
- Результат = OPI_Dropbox.ОбновитьТокен(КлючПриложения, СекретПриложения, РефрешТокен);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьТокен");
-
- Токен = Результат["access_token"];
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(Токен).Заполнено();
-
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен);
-
-КонецПроцедуры
-
-Процедура Dropbox_ПолучитьИнформациюОбОбъекте(ПараметрыФункции)
-
- Путь = "/New/pic.png";
- Токен = ПараметрыФункции["Dropbox_Token"];
-
- Результат = OPI_Dropbox.ПолучитьИнформациюОбОбъекте(Токен, Путь, Истина);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбОбъекте", "Dropbox");
-
- Проверка_ДропБоксФайл(Результат, Путь);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_ПолучитьПревью(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Dropbox_Token"];
- Путь = "/New/mydoc.docx";
-
- Результат = OPI_Dropbox.ПолучитьПревью(Токен, Путь);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПревью", "Dropbox");
-
- Проверка_ДвоичныеДанные(Результат, 190834);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_ЗагрузитьФайл(ПараметрыФункции)
-
- Путь = "/New/pic.png";
- Токен = ПараметрыФункции["Dropbox_Token"];
- Картинка = ПараметрыФункции["Picture"];
-
- КартинкаПуть = ПолучитьИмяВременногоФайла("png");
- КопироватьФайл(Картинка, КартинкаПуть);
-
- Результат = OPI_Dropbox.ЗагрузитьФайл(Токен, КартинкаПуть, Путь, Истина);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл", "Dropbox");
-
- Проверка_ДропБоксФайл(Результат, Путь);
- УдалитьФайлы(КартинкаПуть);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_ЗагрузитьФайлПоURL(ПараметрыФункции)
-
- Путь = "/New/url_doc.docx";
- Токен = ПараметрыФункции["Dropbox_Token"];
- URL = ПараметрыФункции["Document"];
-
- Результат = OPI_Dropbox.ЗагрузитьФайлПоURL(Токен, URL, Путь);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайлПоURL", "Dropbox");
-
- Проверка_ДропБоксРабота(Результат);
-
- Работа = Результат["async_job_id"];
-
- ПараметрыФункции.Вставить("Dropbox_Job", Работа);
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Job", Работа);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_ПолучитьСтатусЗагрузкиПоURL(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Dropbox_Token"];
- ИДРаботы = ПараметрыФункции["Dropbox_Job"];
- Статус = "in_progress";
-
- Пока Статус = "in_progress" Цикл
-
- Результат = OPI_Dropbox.ПолучитьСтатусЗагрузкиПоURL(Токен, ИДРаботы);
- Статус = Результат[".tag"];
-
- OPI_Инструменты.Пауза(5);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатусЗагрузкиПоURL", "Dropbox");
-
- КонецЦикла;
-
- // END
-
- Проверка_ДропБоксСтатус(Результат);
-
- Путь = "/New/url_doc.docx";
- Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь);
-
- Проверка_ДропБоксМетаданные(Результат, Путь);
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_УдалитьОбъект(ПараметрыФункции)
-
- Путь = "/New/pic.png";
- Токен = ПараметрыФункции["Dropbox_Token"];
-
- Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект", "Dropbox");
-
- Проверка_ДропБоксМетаданные(Результат, Путь);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_КопироватьОбъект(ПараметрыФункции)
-
- Оригинал = "/New/pic.png";
- Копия = "/New/pic_copy.png";
- Токен = ПараметрыФункции["Dropbox_Token"];
-
- Результат = OPI_Dropbox.КопироватьОбъект(Токен, Оригинал, Копия);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьОбъект", "Dropbox");
-
- Проверка_ДропБоксМетаданные(Результат, Копия);
-
- Результат = OPI_Dropbox.УдалитьОбъект(Токен, Копия);
- Проверка_ДропБоксМетаданные(Результат, Копия);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_ПереместитьОбъект(ПараметрыФункции)
-
- ОригиналныйПуть = "/New/pic.png";
- ЦелевойПуть = "/pic.png";
- Токен = ПараметрыФункции["Dropbox_Token"];
-
- Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ОригиналныйПуть, ЦелевойПуть);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Dropbox_ПереместитьОбъект", "Dropbox");
-
- Проверка_ДропБоксМетаданные(Результат, ЦелевойПуть);
-
- Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ЦелевойПуть, ОригиналныйПуть);
- Проверка_ДропБоксМетаданные(Результат, ОригиналныйПуть);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_СоздатьПапку(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Dropbox_Token"];
- Путь = "/Новый каталог";
-
- Результат = OPI_Dropbox.СоздатьПапку(Токен, Путь);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку", "Dropbox");
-
- Проверка_ДропБоксМетаданные(Результат, Путь);
-
- Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь);
- Проверка_ДропБоксМетаданные(Результат, Путь);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_СкачатьФайл(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Dropbox_Token"];
- Путь = "/New/pic.png";
-
- Результат = OPI_Dropbox.СкачатьФайл(Токен, Путь);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Dropbox");
-
- Проверка_ДвоичныеДанные(Результат, 2114023);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_СкачатьПапку(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Dropbox_Token"];
- Путь = "/New";
-
- Результат = OPI_Dropbox.СкачатьПапку(Токен, Путь);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьПапку", "Dropbox");
-
- Проверка_ДвоичныеДанные(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_ПолучитьСписокФайловПапки(ПараметрыФункции)
-
- Путь = "/New";
- Токен = ПараметрыФункции["Dropbox_Token"];
-
- Результат = OPI_Dropbox.ПолучитьСписокФайловПапки(Токен, Путь, Истина);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайловПапки", "Dropbox");
-
- Проверка_ДропБоксМассив(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_ПолучитьСписокВерсийОбъекта(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Dropbox_Token"];
- Путь = "/New/pic.png";
-
- Результат = OPI_Dropbox.ПолучитьСписокВерсийОбъекта(Токен, Путь, 1);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВерсийОбъекта", "Dropbox");
-
- Проверка_ДропБоксМассив(Результат, 1);
-
- Ревизия = Результат["entries"][0]["rev"];
-
- ПараметрыФункции.Вставить("Dropbox_FileRevision", Ревизия);
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_FileRevision", Ревизия);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_ВосстановитьОбъектКВерсии(ПараметрыФункции)
-
- Версия = ПараметрыФункции["Dropbox_FileRevision"];
- Токен = ПараметрыФункции["Dropbox_Token"];
- Путь = "/New/pic.png";
-
- Результат = OPI_Dropbox.ВосстановитьОбъектКВерсии(Токен, Путь, Версия);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВосстановитьОбъектКВерсии", "Dropbox");
-
- Проверка_ДропБоксФайл(Результат, Путь);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_ПолчитьСписокТегов(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Dropbox_Token"];
-
- МассивПутей = Новый Массив;
- МассивПутей.Добавить("/New/Dogs.mp3");
- МассивПутей.Добавить("/New/mydoc.docx");
-
- Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, МассивПутей);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов", "Dropbox");
-
- Проверка_ДропБоксТеги(Результат, МассивПутей.Количество());
-
- Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, "/New/mydoc.docx");
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов (одиночный)");
-
- Проверка_ДропБоксТеги(Результат, 1);
-
- ЕстьТег = Ложь;
-
- Для Каждого Тег Из Результат["paths_to_tags"][0]["tags"] Цикл
- Если Тег["tag_text"] = "важное" Тогда
- ЕстьТег = Истина;
- КонецЕсли;
- КонецЦикла;
-
- OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЕстьТег).Равно(Истина);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_ДобавитьТег(ПараметрыФункции)
-
- Тег = "Важное";
- Токен = ПараметрыФункции["Dropbox_Token"];
- Путь = "/New/mydoc.docx";
-
- Результат = OPI_Dropbox.ДобавитьТег(Токен, Путь, Тег);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТег", "Dropbox");
-
- Проверка_Пусто(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_УдалитьТег(ПараметрыФункции)
-
- Тег = "Важное";
- Токен = ПараметрыФункции["Dropbox_Token"];
- Путь = "/New/mydoc.docx";
-
- Результат = OPI_Dropbox.УдалитьТег(Токен, Путь, Тег);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТег", "Dropbox");
-
- Проверка_Пусто(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_ПолучитьИнформациюОбАккаунте(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Dropbox_Token"];
-
- Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте", "Dropbox");
-
- Проверка_ДропбоксАккаунт(Результат);
-
- Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен, Результат["account_id"]);
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте (сторонний)");
-
- Проверка_ДропбоксАккаунт(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_ПолучитьДанныеИспользованияПространства(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Dropbox_Token"];
-
- Результат = OPI_Dropbox.ПолучитьДанныеИспользованияПространства(Токен);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеИспользованияПространства", "Dropbox");
-
- Проверка_ДропбоксПространство(Результат);
-
-КонецПроцедуры
-
-Процедура Dropbox_ДобавитьПользователейКФайлу(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Dropbox_Token"];
- Почта = ПараметрыФункции["Dropbox_OtherUser"];
- Файл = ПараметрыФункции["Dropbox_FileID"];
-
- Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почта, Ложь);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox");
-
- Проверка_ДропбоксУчастник(Результат, Почта, Ложь);
-
- Почты = Новый Массив;
- Почты.Добавить(Почта);
-
- Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почты, Истина);
-
- Проверка_ДропбоксУчастник(Результат, Почта, Истина);
-
-КонецПроцедуры
-
-Процедура Dropbox_ОпубликоватьПапку(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Dropbox_Token"];
- Путь = "/New";
-
- Результат = OPI_Dropbox.ОпубликоватьПапку(Токен, Путь);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОпубликоватьПапку", "Dropbox");
-
- Проверка_ДропБоксПубличнаяПапка(Результат);
-
- IDПапки = Результат["shared_folder_id"];
-
- ПараметрыФункции.Вставить("Dropbox_SharedFolder", IDПапки);
- OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_SharedFolder", IDПапки);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_ОтменитьПубликациюПапки(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Dropbox_Token"];
- Папка = ПараметрыФункции["Dropbox_SharedFolder"];
-
- Результат = OPI_Dropbox.ОтменитьПубликациюПапки(Токен, Папка);
- ТекущийСтатус = "in_progress";
- IDРаботы = Результат["async_job_id"];
-
- Пока ТекущийСтатус = "in_progress" Цикл
- Результат = OPI_Dropbox.ПолучитьСтатусАсинхронногоИзменения(Токен, IDРаботы);
- ТекущийСтатус = Результат[".tag"];
- OPI_Инструменты.Пауза(3);
- КонецЦикла;
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюПапки", "Dropbox");
-
- Проверка_ДропБоксСтатус(Результат);
-
- OPI_Инструменты.Пауза(5);
-
-КонецПроцедуры
-
-Процедура Dropbox_ДобавитьПользователейКПапке(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Dropbox_Token"];
- Почта = ПараметрыФункции["Dropbox_OtherUser"];
- Папка = ПараметрыФункции["Dropbox_SharedFolder"]; // shared_folder_id
-
- Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почта, Ложь);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox");
-
- Проверка_Пусто(Результат);
-
- Почты = Новый Массив;
- Почты.Добавить(Почта);
-
- Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почты, Истина);
-
- Проверка_Пусто(Результат);
-
-КонецПроцедуры
-
-Процедура Dropbox_ОтменитьПубликациюФайла(ПараметрыФункции)
-
- Токен = ПараметрыФункции["Dropbox_Token"];
- Файл = ПараметрыФункции["Dropbox_FileID"];
-
- Результат = OPI_Dropbox.ОтменитьПубликациюФайла(Токен, Файл);
-
- // END
-
- OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюФайла", "Dropbox");
-
- Проверка_Пусто(Результат);
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#КонецОбласти
-
-#КонецОбласти
+// Расположение OS: ./OInt/tests/Modules/internal/OPI_Тесты.os
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// Набор тестов для YAxUnit
+
+// BSLLS:Typo-off
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:UsingServiceTag-off
+// BSLLS:UnusedParameters-off
+// BSLLS:DuplicateStringLiteral-off
+
+// @skip-check undefined-variable
+// @skip-check wrong-string-literal-content
+
+// Раскомментировать, если выполняется OneScript
+#Использовать oint
+#Использовать asserts
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+// Для YaxUnit
+
+Процедура ИсполняемыеСценарии() Экспорт
+
+ OPI_ПолучениеДанныхТестов.СформироватьТестыЯкс();
+
+КонецПроцедуры
+
+// Для Asserts
+
+Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
+
+ Возврат OPI_ПолучениеДанныхТестов.СформироватьТестыАссертс();
+
+КонецФункции
+
+#Область ЗапускаемыеТесты
+
+#Область Telegram
+
+Процедура Телеграм_ПолучитьИнформациюБота() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста);
+
+ Telegram_ПолучитьИнформациюБота(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ПолучитьОбновления() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста);
+
+ Telegram_УдалитьWebhook(ПараметрыТеста);
+ Telegram_ПолучитьОбновления(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_УстановитьWebhook() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_URL" , ПараметрыТеста);
+
+ Telegram_УстановитьWebhook(ПараметрыТеста);
+ Telegram_УдалитьWebhook(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьТекстовоеСообщение() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста);
+
+ Telegram_ОтправитьТекстовоеСообщение(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьКартинку() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
+
+ Telegram_ОтправитьКартинку(ПараметрыТеста);
+ Telegram_СкачатьФайл(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьВидео() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста);
+
+ Telegram_ОтправитьВидео(ПараметрыТеста);
+ Telegram_СкачатьФайл(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьАудио() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Audio" , ПараметрыТеста);
+
+ Telegram_ОтправитьАудио(ПараметрыТеста);
+ Telegram_СкачатьФайл(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьДокумент() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Document" , ПараметрыТеста);
+
+ Telegram_ОтправитьДокумент(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьГифку() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("GIF" , ПараметрыТеста);
+
+ Telegram_ОтправитьГифку(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьМедиагруппу() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста);
+
+ Telegram_ОтправитьМеидагруппу(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьМестоположение() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Long" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Lat" , ПараметрыТеста);
+
+ Telegram_ОтправитьМестоположение(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьКонтакт() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Name" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Surname" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Phone" , ПараметрыТеста);
+
+ Telegram_ОтправитьКонтакт(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ОтправитьОпрос() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+
+ Telegram_ОтправитьОпрос(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ПереслатьСообщение() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelMessageID", ПараметрыТеста);
+
+ Telegram_ПереслатьСообщение(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_БанРазбан() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChatID" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста);
+
+ Telegram_Бан(ПараметрыТеста);
+ Telegram_Разбан(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_СоздатьСсылкуПриглашение() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+
+ Telegram_СоздатьСсылкуПриглашение(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ЗакрепитьОткрепитьСообщение() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelMessageID", ПараметрыТеста);
+
+ Telegram_ЗакрепитьСообщение(ПараметрыТеста);
+ Telegram_ОткрепитьСообщение(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ПолучитьЧислоУчастников() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ChannelID", ПараметрыТеста);
+
+ Telegram_ПолучитьЧислоУчастников(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ПолучитьСписокАватаровФорума() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token", ПараметрыТеста);
+
+ Telegram_ПолучитьСписокАватаровФорума(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_СоздатьУдалитьТемуФорума() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("String" , ПараметрыТеста);
+
+ Telegram_СоздатьТемуФорума(ПараметрыТеста);
+ Telegram_ИзменитьТемуФорума(ПараметрыТеста);
+ Telegram_ЗакрытьТемуФорума(ПараметрыТеста);
+ Telegram_ОткрытьТемуФорума(ПараметрыТеста);
+ Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы(ПараметрыТеста);
+ Telegram_УдалитьТемуФорума(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_СкрытьПоказатьГлавнуюТему() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста);
+
+ Telegram_СкрытьГлавнуюТемуФорума(ПараметрыТеста);
+ Telegram_ПоказатьГлавнуюТемуФорума(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура Телеграм_ИзменитьИмяГлавнойТемы() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Telegram_ForumID", ПараметрыТеста);
+
+ Telegram_ИзменитьИмяГлавнойТемыФорума(ПараметрыТеста);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область VK
+
+Процедура ВК_СоздатьСсылкуТокена() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("VK_AppID", ПараметрыТеста);
+
+ VK_СоздатьСсылкуПолученияТокена(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура ВК_СоздатьУдалитьПост() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture2", ПараметрыТеста);
+
+ VK_СоздатьПост(ПараметрыТеста);
+ VK_УдалитьПост(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура ВК_СоздатьСоставнойПост() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Video" , ПараметрыТеста);
+
+ VK_СоздатьСоставнойПост(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура ВК_СоздатьОпрос() Экспорт
+
+ VK_СоздатьОпрос();
+
+КонецПроцедуры
+
+Процедура ВК_СохранитьУдалитьКартинку() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
+
+ VK_СоздатьАльбом(ПараметрыТеста);
+ VK_СохранитьКартинкуВАльбом(ПараметрыТеста);
+ VK_УдалитьКартинку(ПараметрыТеста);
+ VK_УдалитьАльбом(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура ВК_СоздатьИсторию() Экспорт
+
+ ПараметрыТеста = Новый Соответствие;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture" , ПараметрыТеста);
+
+ VK_СоздатьИсторию(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура ВК_МетодыОбсуждений() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ Параметры = ПолучитьПараметрыВК();
+
+ VK_СоздатьОбсуждение(ПараметрыТеста);
+ VK_ЗакрытьОбсуждение(ПараметрыТеста);
+ VK_ОткрытьОбсуждение(ПараметрыТеста);
+ VK_НаписатьВОбсуждение(ПараметрыТеста);
+
+ OPI_VK.ЗакрытьОбсуждение(ПараметрыТеста["VK_ConvID"], Истина, Параметры);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ЛайкРепостКоммент() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ Текст = "Пост из автотеста";
+ Сообщение = "Сообщение из автотеста";
+ ТипСоответствие = Тип("Соответствие");
+ ТипЧисло = Тип("Число");
+ Response = "response";
+
+ Результат = OPI_VK.СоздатьПост(Текст, Новый Массив, , , Параметры);
+
+ ИДПоста = Результат[Response]["post_id"];
+ Результат = OPI_VK.ПоставитьЛайк(ИДПоста, , Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоставитьЛайк");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["likes"]).ИмеетТип(ТипЧисло).Заполнено();
+
+ ВнешнийПост = 2571;
+ ВнешняяСтена = -218704372;
+
+ Результат = OPI_VK.СделатьРепост(ВнешнийПост, ВнешняяСтена, , , Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СделатьРепост");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["success"]).ИмеетТип(ТипЧисло).Равно(1);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["wall_repost_count"]).ИмеетТип(ТипЧисло).Равно(1);
+
+ Результат = OPI_VK.НаписатьКомментарий(ИДПоста, Параметры["owner_id"], Сообщение, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьКомментарий");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["comment_id"]).ИмеетТип(ТипЧисло).Заполнено();
+
+ OPI_VK.УдалитьПост(ИДПоста, Параметры);
+ OPI_VK.УдалитьПост(Результат[Response]["post_id"], Параметры);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ПолучитьСтатистику() Экспорт
+
+ ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
+ Параметры = ПолучитьПараметрыВК();
+ Дата0 = НачалоДня(ТекущаяДата);
+ Дата1 = КонецДня(Дата0);
+ ТипСоответствие = Тип("Соответствие");
+
+ Результат = OPI_VK.ПолучитьСтатистику(Дата0, Дата1, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистику");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["visitors"]).ИмеетТип(ТипСоответствие).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["reach"]).ИмеетТип(ТипСоответствие).Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ПолучитьСтатистикуПостов() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+
+ МассивПостов = Новый Массив;
+ МассивПостов.Добавить(214);
+ МассивПостов.Добавить(215);
+
+ Результат = OPI_VK.ПолучитьСтатистикуПостов(МассивПостов, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистикуПостов");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив").ИмеетДлину(2);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_СоздатьРекламнуюКампанию() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ ИДКабинета = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_AdsCabinetID");
+ Наименование = "Тестовая кампания";
+ ТипСоответствие = Тип("Соответствие");
+ ТипЧисло = Тип("Число");
+ Response = "response";
+ UID = "id";
+
+ Результат = OPI_VK.СоздатьРекламнуюКампанию(ИДКабинета, Наименование, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламнуюКампанию");
+
+ Результат = Результат[Response][0];
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено();
+
+ ИДКампании = Результат[UID];
+ ИДКатегории = 126;
+ Лимит = 150;
+
+ Результат = OPI_VK.СоздатьПост(Наименование, Новый Массив, , , Параметры);
+ ИДПоста = Результат[Response]["post_id"];
+
+ Результат = OPI_VK.СоздатьРекламноеОбъявление(ИДКампании
+ , Лимит
+ , ИДКатегории
+ , ИДПоста
+ , ИДКабинета
+ , Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламноеОбъявление");
+
+ Результат = Результат[Response][0];
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено();
+
+ ИДОбъявления = Результат[UID];
+ Результат = OPI_VK.ПриостановитьРекламноеОбъявление(ИДКабинета, ИДОбъявления, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПриостановитьРекламноеОбъявление");
+
+ Результат = Результат[Response][0];
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено();
+
+ OPI_VK.УдалитьПост(ИДПоста, Параметры);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ОтправитьСообщение() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_UserID");
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_CommunityToken");
+ Текст = "Сообщение из автотеста";
+
+ МассивКнопок = Новый Массив;
+ МассивКнопок.Добавить("Кнопка 1");
+ МассивКнопок.Добавить("Кнопка 2");
+
+ Клавиатура = OPI_VK.СформироватьКлавиатуру(МассивКнопок);
+ Результат = OPI_VK.НаписатьСообщение(Текст, Пользователь, Токен, Клавиатура, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьСообщение");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ПолучитьКатегорииТоваров() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ Результат = OPI_VK.ПолучитьСписокКатегорийТоваров(Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКатегорийТоваров");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
+ .ИмеетТип("Соответствие")
+ .Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_СоздатьТоварПодборку() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ ТипСоответствие = Тип("Соответствие");
+ ТипЧисло = Тип("Число");
+ Response = "response";
+ Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+ ИВФ = ПолучитьИмяВременногоФайла("png");
+ Картинка.Записать(ИВФ);
+
+ Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка"
+ , Картинка
+ , Истина
+ , Ложь
+ , Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["albums_count"]).ИмеетТип(ТипЧисло).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_album_id"]).ИмеетТип(ТипЧисло).Заполнено();
+
+ ИДПодборки = Результат[Response]["market_album_id"];
+
+ Результат = OPI_VK.ИзменитьПодборкуТоваров("Измененная подборка", ИДПодборки, , , , Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПодборкуТоваров");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]).ИмеетТип(ТипЧисло).Равно(1);
+
+ МассивКартинок = Новый Массив;
+ МассивКартинок.Добавить(OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture"));
+ МассивКартинок.Добавить(OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture2"));
+
+ Товар = Новый Соответствие();
+ Товар.Вставить("Имя" , "Тестовый товар");
+ Товар.Вставить("Описание" , "Описание товара");
+ Товар.Вставить("Категория" , "20173");
+ Товар.Вставить("Цена" , 1);
+ Товар.Вставить("СтараяЦена" , 15);
+ Товар.Вставить("ОсновноеФото" , Картинка);
+ Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations");
+ Товар.Вставить("ДополнительныеФото" , МассивКартинок);
+ Товар.Вставить("ГлавныйВГруппе" , Истина);
+ Товар.Вставить("Ширина" , 20);
+ Товар.Вставить("Высота" , 30);
+ Товар.Вставить("Глубина" , 40);
+ Товар.Вставить("Вес" , 100);
+ Товар.Вставить("SKU" , "12345");
+ Товар.Вставить("ДоступныйОстаток" , "10");
+
+ Результат = OPI_VK.ДобавитьТовар(Товар, ИДПодборки, Параметры); // Добавление товара
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_item_id"]).ИмеетТип(ТипЧисло).Заполнено();
+
+ ИДТовара = Результат[Response]["market_item_id"];
+
+ Товар = Новый Соответствие;
+ Товар.Вставить("Имя", "Тестовый товар измененный");
+
+ Результат = OPI_VK.ИзменитьТовар(ИДТовара, Товар, , Параметры); // Изменение товара
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТовар");
+
+ Проверка_ВКИстина(Результат);
+
+ Результат = OPI_VK.ДобавитьТоварВПодборку(ИДТовара, ИДПодборки, Параметры); // Добавление в подборку
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТоварВПодборку");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]).ИмеетТип(ТипЧисло).Заполнено();
+
+ Результат = OPI_VK.УдалитьТоварИзПодборки(ИДТовара, ИДПодборки, Параметры); // Удаляет из подборки
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТоварИзПодборки");
+
+ OPI_Инструменты.Пауза(5);
+ Проверка_ВКИстина(Результат);
+
+ Результат = OPI_VK.УдалитьТовар(ИДТовара, Параметры); // Удаление товара
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТовар");
+
+ OPI_Инструменты.Пауза(5);
+ Проверка_ВКИстина(Результат);
+
+ Результат = OPI_VK.УдалитьПодборку(ИДПодборки, Параметры); // Уадление подборки
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьПодборку");
+
+ OPI_Инструменты.Пауза(5);
+ Проверка_ВКИстина(Результат);
+
+ УдалитьФайлы(ИВФ);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_СоздатьТоварСоСвойствами() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ ТипСоответствие = Тип("Соответствие");
+ ТипЧисло = Тип("Число");
+ MII = "market_item_id";
+ Response = "response";
+ Желтый = "Желтый";
+ Красный = "Красный";
+ Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+ ИВФ = ПолучитьИмяВременногоФайла("png");
+ Картинка.Записать(ИВФ);
+
+ МассивВариантов = Новый Массив;
+ МассивВариантов.Добавить(Желтый);
+ МассивВариантов.Добавить("Синий");
+ МассивВариантов.Добавить(Красный);
+
+ Результат = OPI_VK.СоздатьСвойствоТовара("Цвет", Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСвойствоТовара");
+
+ OPI_Инструменты.Пауза(5);
+
+ Свойство = Результат[Response]["property_id"];
+ Свойство = OPI_Инструменты.ЧислоВСтроку(Свойство);
+
+ СоответствиеСвойств = Новый Соответствие;
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["property_id"]).ИмеетТип(ТипЧисло).Заполнено();
+
+ Результат = OPI_VK.ИзменитьСвойствоТовара("Цвет (изм.)", Свойство, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойствоТовара");
+
+ OPI_Инструменты.Пауза(5);
+
+ Проверка_ВКИстина(Результат);
+
+ Для Каждого Вариант Из МассивВариантов Цикл
+
+ Результат = OPI_VK.ДобавитьВариантСвойстваТовара(Вариант, Свойство, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВариантСвойстваТовара");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["variant_id"]).ИмеетТип(ТипЧисло).Заполнено();
+
+ ИДВарианта = Результат[Response]["variant_id"];
+ СоответствиеСвойств.Вставить(Вариант, ИДВарианта);
+
+ Результат = OPI_VK.ИзменитьВариантСвойстваТовара(Вариант + Строка(Новый УникальныйИдентификатор())
+ , Свойство
+ , ИДВарианта
+ , Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьВариантСвойстваТовара");
+
+ Проверка_ВКИстина(Результат);
+
+ КонецЦикла;
+
+ МассивКартинок = Новый Массив;
+ МассивКартинок.Добавить(ИВФ);
+ МассивКартинок.Добавить(Картинка);
+
+ Товар = Новый Соответствие();
+ Товар.Вставить("Имя" , "Тестовый товар (" + Желтый + ")");
+ Товар.Вставить("Описание" , "Описание товара");
+ Товар.Вставить("Категория" , "20173");
+ Товар.Вставить("Цена" , 1);
+ Товар.Вставить("СтараяЦена" , 15);
+ Товар.Вставить("ОсновноеФото" , Картинка);
+ Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations");
+ Товар.Вставить("ДополнительныеФото" , МассивКартинок);
+ Товар.Вставить("ГлавныйВГруппе" , Истина);
+ Товар.Вставить("НомерГруппы" , Неопределено);
+ Товар.Вставить("Ширина" , 20);
+ Товар.Вставить("Высота" , 30);
+ Товар.Вставить("Глубина" , 40);
+ Товар.Вставить("Вес" , 100);
+ Товар.Вставить("SKU" , 12345);
+ Товар.Вставить("ДоступныйОстаток" , "10");
+ Товар.Вставить("ЗначенияСвойств" , СоответствиеСвойств[Желтый]);
+
+ Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); // Добавление товара
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар");
+
+ OPI_Инструменты.Пауза(5);
+
+ ИДЖелтого = Результат[Response]["market_item_id"];
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено();
+
+ Товар.Вставить("Имя" , "Тестовый товар (" + Красный + ")");
+ Товар.Вставить("ЗначенияСвойств", СоответствиеСвойств[Красный]);
+
+ Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); // Добавление товара
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар");
+
+ OPI_Инструменты.Пауза(5);
+
+ ИДКрасного = Результат[Response][MII];
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено();
+
+ МассивТоваров = Новый Массив;
+ МассивТоваров.Добавить(ИДЖелтого);
+ МассивТоваров.Добавить(ИДКрасного);
+
+ Результат = OPI_VK.ПолучитьТоварыПоИД(МассивТоваров, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТоварыПоИД");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["items"]).ИмеетТип("Массив").ИмеетДлину(2);
+
+ Результат = OPI_VK.СгруппироватьТовары(МассивТоваров, , Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СгруппироватьТовары");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["item_group_id"]).ИмеетТип(ТипЧисло).Заполнено();
+
+ OPI_VK.УдалитьТовар(ИДЖелтого , Параметры);
+ OPI_VK.УдалитьТовар(ИДКрасного, Параметры);
+
+ Для Каждого Вариант Из СоответствиеСвойств Цикл
+
+ Удаление = OPI_VK.УдалитьВариантСвойстваТовара(Вариант.Значение, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьВариантСвойстваТовара");
+
+ OPI_Инструменты.Пауза(5);
+ Проверка_ВКИстина(Удаление);
+
+ КонецЦикла;
+
+ Удаление = OPI_VK.УдалитьСвойствоТовара(Свойство, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСвойствоТовара");
+
+ OPI_Инструменты.Пауза(5);
+
+ Проверка_ВКИстина(Удаление);
+
+ УдалитьФайлы(ИВФ);
+
+КонецПроцедуры
+
+Процедура ВК_ПолучитьСписокТоваров() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+
+ МассивКартинок = Новый Массив;
+ МассивКартинок.Добавить(Картинка);
+
+ Товар = Новый Соответствие();
+ Товар.Вставить("Имя" , "Тестовый товар 2");
+ Товар.Вставить("Описание" , "Описание товара");
+ Товар.Вставить("Категория" , "20173");
+ Товар.Вставить("Цена" , 1);
+ Товар.Вставить("СтараяЦена" , 15);
+ Товар.Вставить("ОсновноеФото" , Картинка);
+ Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations");
+ Товар.Вставить("ДополнительныеФото" , МассивКартинок);
+ Товар.Вставить("ГлавныйВГруппе" , Истина);
+ Товар.Вставить("НомерГруппы" , Неопределено);
+ Товар.Вставить("Ширина" , 20);
+ Товар.Вставить("Высота" , 30);
+ Товар.Вставить("Глубина" , 40);
+ Товар.Вставить("Вес" , 100);
+ Товар.Вставить("SKU" , 12345);
+ Товар.Вставить("ДоступныйОстаток" , "10");
+
+ Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры);
+ ИДТовара = Результат["response"]["market_item_id"];
+ OPI_Инструменты.Пауза(5);
+
+ Результат = OPI_VK.ПолучитьСписокТоваров(, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТоваров");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
+ .ИмеетТип("Массив").Заполнено();
+
+ OPI_VK.УдалитьТовар(ИДТовара, Параметры);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ПолучитьСписокПодборок() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+ Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка"
+ , Картинка
+ , Истина
+ , Ложь
+ , Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров");
+
+ ИДПодборки = Результат["response"]["market_album_id"];
+ Результат = OPI_VK.ПолучитьСписокПодборок(Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПодборок");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
+ .ИмеетТип("Массив").Заполнено();
+
+ OPI_VK.УдалитьПодборку(ИДПодборки, Параметры);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ПолучитьСписокСвойств() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ Результат = OPI_VK.ПолучитьСписокСвойств(Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСвойств");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
+ .ИмеетТип("Массив").Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ПолучитьСписокЗаказов() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ Результат = OPI_VK.ПолучитьСписокЗаказов(Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
+ .ИмеетТип("Массив").Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ЗагрузитьВидео() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ Видео = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Video");
+ Наименование = "Новое видео";
+ Описание = "Описание видео";
+
+ Результат = OPI_VK.ЗагрузитьВидеоНаСервер(Видео, Наименование, Описание, , Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_id"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_hash"]).Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область YandexDisk
+
+Процедура ЯДиск_ПолучитьИнформациюОДиске() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+ Соответствие = "Соответствие";
+
+ Результат = OPI_YandexDisk.ПолучитьИнформациюОДиске(Токен);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОДиске");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["system_folders"]).ИмеетТип(Соответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user"]).ИмеетТип(Соответствие);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ЯДиск_СоздатьПапку() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+ Путь = "/" + Строка(Новый УникальныйИдентификатор);
+
+ Результат = OPI_YandexDisk.СоздатьПапку(Токен, Путь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("dir");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + Путь);
+
+ OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+ Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
+ URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png";
+
+ OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL);
+ OPI_Инструменты.Пауза(5);
+
+ Результат = OPI_YandexDisk.ПолучитьОбъект(Токен, Путь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбъект");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + Путь);
+
+ OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ЯДиск_ЗагрузитьУдалитьФайл() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+ Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
+ Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+ ИВФ = ПолучитьИмяВременногоФайла("png");
+ Картинка.Записать(ИВФ);
+
+ Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, Картинка, Истина);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
+
+ Проверка_Пусто(Результат);
+ OPI_Инструменты.Пауза(5);
+
+ Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект");
+
+ Проверка_Пусто(Результат);
+
+ Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, ИВФ, Истина);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
+
+ Проверка_Пусто(Результат);
+ OPI_Инструменты.Пауза(5);
+
+ Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект");
+
+ Проверка_Пусто(Результат);
+
+ УдалитьФайлы(ИВФ);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ЯДиск_СоздатьКопиюОбъекта() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+ ПутьОригинала = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
+ ПутьКопии = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
+ URL = "https://raw.githubusercontent.com/Bayselonarrend/"
+ + "OpenIntegrations/main/Media/logo.png";
+
+ OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, ПутьОригинала, URL);
+ OPI_Инструменты.Пауза(5);
+
+ Результат = OPI_YandexDisk.СоздатьКопиюОбъекта(Токен, ПутьОригинала, ПутьКопии, Истина);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКопиюОбъекта");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + ПутьКопии);
+
+ OPI_YandexDisk.УдалитьОбъект(Токен, ПутьОригинала, Ложь);
+ OPI_YandexDisk.УдалитьОбъект(Токен, ПутьКопии, Ложь);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ЯДиск_ПолучитьСсылкуНаСкачивание() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+ Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
+ URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png";
+
+ OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL);
+ OPI_Инструменты.Пауза(5);
+
+ Результат = OPI_YandexDisk.ПолучитьСсылкуДляСкачивания(Токен, Путь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуДляСкачивания");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено();
+
+ URL = Результат["href"];
+
+ Результат = OPI_YandexDisk.СкачатьФайл(Токен, Путь);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные").Заполнено();
+
+ OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
+
+КонецПроцедуры
+
+Процедура ЯДиск_ПолучитьСписокФайлов() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+ Количество = 2;
+ Отступ = 1;
+
+ Результат = OPI_YandexDisk.ПолучитьСписокФайлов(Токен, Количество, Отступ, "image");
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["limit"]).Равно(Количество);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["offset"]).Равно(Отступ);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"]).ИмеетТип("Массив");
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ЯДиск_ПереместитьОбъект() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+ ПутьОригинала = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
+ ПутьКопии = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
+ URL = "https://raw.githubusercontent.com/Bayselonarrend/"
+ + "OpenIntegrations/main/Media/logo.png";
+
+ OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, ПутьОригинала, URL);
+ OPI_Инструменты.Пауза(15);
+
+ Результат = OPI_YandexDisk.ПереместитьОбъект(Токен, ПутьОригинала, ПутьКопии, Истина);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереместитьОбъект");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + ПутьКопии);
+
+ OPI_YandexDisk.УдалитьОбъект(Токен, ПутьОригинала, Ложь);
+ OPI_YandexDisk.УдалитьОбъект(Токен, ПутьКопии, Ложь);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ЯДиск_ДействияПубличныхОбъектов() Экспорт
+
+ PUrl = "public_url";
+ Соответствие = "Соответствие";
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+ Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
+ URL = "https://raw.githubusercontent.com/Bayselonarrend/OpenIntegrations/main/Media/logo.png";
+
+ OPI_YandexDisk.ЗагрузитьФайлПоURL(Токен, Путь, URL);
+ OPI_Инструменты.Пауза(5);
+
+ МассивРезультатов = Новый Массив;
+
+ МассивРезультатов.Добавить(OPI_YandexDisk.ОпубликоватьОбъект(Токен, Путь));
+ ПубличныйURL = МассивРезультатов[0][PUrl];
+
+ Результат = OPI_YandexDisk.ПолучитьСсылкуСкачиванияПубличногоОбъекта(Токен, ПубличныйURL);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуСкачиванияПубличногоОбъекта");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено();
+
+ Результат = OPI_YandexDisk.ПолучитьПубличныйОбъект(Токен, ПубличныйURL);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПубличныйОбъект");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("/");
+
+ МассивРезультатов.Добавить(OPI_YandexDisk.СохранитьПубличныйОбъектНаДиск(Токен, ПубличныйURL));
+
+ МассивРезультатов.Добавить(OPI_YandexDisk.ОтменитьПубликациюОбъекта(Токен, Путь));
+
+ Счетчик = 0;
+ Для Каждого Результат Из МассивРезультатов Цикл
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Изменение публикации");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Заполнено();
+
+ Если Счетчик = 0 Тогда
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Строка").Заполнено();
+ Иначе
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Неопределено");
+ КонецЕсли;
+
+ Счетчик = Счетчик + 1;
+
+ КонецЦикла;
+
+ OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ЯДиск_ПолучитьСписокОпубликованных() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+ Количество = 2;
+ Отступ = 1;
+
+ Результат = OPI_YandexDisk.ПолучитьСписокОпубликованныхОбъектов(Токен, Количество, Отступ);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОпубликованныхОбъектов");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["limit"]).Равно(Количество);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["offset"]).Равно(Отступ);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"]).ИмеетТип("Массив");
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Viber
+
+Процедура Вайбер_ПолучитьИнформациюОКанале() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+ Результат = OPI_Viber.ПолучитьИнформациюОКанале(Токен);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОКанале");
+
+ Проверка_ВайберОк(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ПолучитьДанныеПользователя() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+ Результат = OPI_Viber.ПолучитьДанныеПользователя(Токен, Пользователь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["chat_hostname"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status_message"]).Заполнено();
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ПолучитьОнлайнПользователей() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+ Результат = OPI_Viber.ПолучитьОнлайнПользователей(Токен, Пользователь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОнлайнПользователей");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["users"]).ИмеетТип("Массив");
+ Проверка_ВайберОк(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ОтправитьТекстовоеСообщение() Экспорт
+
+ Текст = "Тестовое сообщение";
+ ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+ ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+ Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+
+ МассивКнопок = Новый Массив;
+ МассивКнопок.Добавить("Кнопка 1");
+ МассивКнопок.Добавить("Кнопка 2");
+ МассивКнопок.Добавить("Кнопка 3");
+
+ Клавиатура = OPI_Viber.СформироватьКлавиатуруИзМассиваКнопок(МассивКнопок);
+
+ Результат = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенБота, Текст, Пользователь, Ложь, Клавиатура);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ Результат = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенКанал, Текст, Администратор, Истина, Клавиатура);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ОтправитьКартинку() Экспорт
+
+ Текст = "Тестовое сообщение";
+ Картинка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture");
+ ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+ ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+ Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+
+ Результат = OPI_Viber.ОтправитьКартинку(ТокенБота, Картинка, Пользователь, Ложь, Текст);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ Результат = OPI_Viber.ОтправитьКартинку(ТокенКанал, Картинка, Администратор, Истина, Текст);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ОтправитьФайл() Экспорт
+
+ Документ = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document");
+ ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+ ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+ Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+
+ Результат = OPI_Viber.ОтправитьФайл(ТокенБота, Документ, Пользователь, Ложь, "docx");
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ Результат = OPI_Viber.ОтправитьФайл(ТокенКанал, Документ, Администратор, Истина, "docx");
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ОтправитьКонтакт() Экспорт
+
+ Имя = "Петр Петров";
+ Телефон = "+123456789";
+ ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+ ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+ Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+
+ Результат = OPI_Viber.ОтправитьКонтакт(ТокенБота, Имя, Телефон, Пользователь, Ложь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ Результат = OPI_Viber.ОтправитьКонтакт(ТокенКанал, Имя, Телефон, Администратор, Истина);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ОтправитьЛокацию() Экспорт
+
+ Широта = "48.87373649724122";
+ Долгота = "2.2954639195323967";
+ ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+ ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+ Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+
+ Результат = OPI_Viber.ОтправитьЛокацию(ТокенБота, Широта, Долгота, Пользователь, Ложь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьЛокацию");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ Результат = OPI_Viber.ОтправитьЛокацию(ТокенКанал, Широта, Долгота, Администратор, Истина);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьЛокацию");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ОтправитьСсылку() Экспорт
+
+ URL = "https://github.com/Bayselonarrend/OpenIntegrations";
+ ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+ ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+ Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+
+ Результат = OPI_Viber.ОтправитьСсылку(ТокенБота, URL, Пользователь, Ложь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСсылку");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ Результат = OPI_Viber.ОтправитьСсылку(ТокенКанал, URL, Администратор, Истина);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСсылку");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область GoogleWorkspace
+
+Процедура ГВ_ПолучитьСсылкуАвторизации() Экспорт
+
+ ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID");
+ Результат = OPI_GoogleWorkspace.СформироватьСсылкуПолученияКода(ClientID);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
+ .ИмеетТип("Строка")
+ .Заполнено();
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Link", Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ГВ_ПолучитьТокен() Экспорт
+
+ ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID");
+ ClientSecret = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientSecret");
+ Code = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Code");
+
+ Результат = OPI_GoogleWorkspace.ПолучитьТокенПоКоду(ClientID, ClientSecret, Code);
+
+ Если ЗначениеЗаполнено(Результат["access_token"])
+ И ЗначениеЗаполнено(Результат["refresh_token"]) Тогда
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Token" , Результат["access_token"]);
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Refresh", Результат["refresh_token"]);
+
+ КонецЕсли;
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ГВ_ОбновитьТокен() Экспорт
+
+ ClientID = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientID");
+ ClientSecret = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_ClientSecret");
+ RefreshToken = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Refresh");
+
+ Результат = OPI_GoogleWorkspace.ОбновитьТокен(ClientID, ClientSecret, RefreshToken);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["access_token"]).Заполнено();
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Google_Token", Результат["access_token"]);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область GoogleCalendar
+
+Процедура ГК_ПолучитьСписокКалендарей() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+ Результат = OPI_GoogleCalendar.ПолучитьСписокКалендарей(Токен);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКалендарей");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
+ .ИмеетТип("Массив");
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ГК_СоздатьУдалитьКалендарь() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+ Наименование = "Тестовый календарь";
+ Описание = "Тестовое описание";
+ НаименованиеИзмененное = Наименование + " (изм.)";
+ ТипСоответствие = Тип("Соответствие");
+ ТипСтрока = Тип("Строка");
+ Summary = "summary";
+ Черный = "#000000";
+ Желтый = "#ffd800";
+
+ Результат = OPI_GoogleCalendar.СоздатьКалендарь(Токен, Наименование);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКалендарь");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(Наименование);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).ИмеетТип(ТипСтрока).Заполнено();
+
+ Календарь = Результат["id"];
+
+ Результат = OPI_GoogleCalendar.ИзменитьМетаданныеКалендаря(Токен
+ , Календарь
+ , НаименованиеИзмененное
+ , Описание);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьМетаданныеКалендаря");
+
+ Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание);
+
+ Результат = OPI_GoogleCalendar.ПолучитьМетаданныеКалендаря(Токен, Календарь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьМетаданныеКалендаря");
+
+ Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание);
+
+ Результат = OPI_GoogleCalendar.ДобавитьКалендарьВСписок(Токен, Календарь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьКалендарьВСписок");
+
+ Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание);
+
+ Результат = OPI_GoogleCalendar.ИзменитьКалендарьСписка(Токен, Календарь, Черный, Желтый, Ложь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКалендарьСписка");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый);
+
+ Результат = OPI_GoogleCalendar.ПолучитьКалендарьСписка(Токен, Календарь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКалендарьСписка");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый);
+
+ Результат = OPI_GoogleCalendar.ОчиститьОсновнойКалендарь(Токен);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьОсновнойКалендарь");
+
+ Проверка_Пусто(Результат);
+
+ Результат = OPI_GoogleCalendar.УдалитьКалендарьИзСписка(Токен, Календарь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКалендарьИзСписка");
+
+ Проверка_Пусто(Результат);
+
+ Результат = OPI_GoogleCalendar.УдалитьКалендарь(Токен, Календарь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКалендарь");
+
+ Проверка_Пусто(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ГК_СоздатьУдалитьСобытие() Экспорт
+
+ ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+ Календарь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_CalendarID");
+ Наименование = "Новое событие";
+ Описание = "Описание тестового события";
+ ОписаниеИзм = "Описание тестового события (изм.)";
+ UID = "id";
+ Час = 3600;
+
+ Вложения = Новый Соответствие;
+
+ Вложения.Вставить("Картинка1"
+ , "https://opi.neocities.org/assets/images/logo_long-e8fdcca6ff8b32e679ea49a1ccdd3eac.png");
+ Вложения.Вставить("Картинка2"
+ , "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1");
+
+ СоответствиеСобытия = Новый Соответствие;
+ СоответствиеСобытия.Вставить("Описание" , Описание);
+ СоответствиеСобытия.Вставить("Заголовок" , Наименование);
+ СоответствиеСобытия.Вставить("МестоПроведения" , "В офисе");
+ СоответствиеСобытия.Вставить("ДатаНачала" , ТекущаяДата);
+ СоответствиеСобытия.Вставить("ДатаОкончания" , СоответствиеСобытия["ДатаНачала"] + Час);
+ СоответствиеСобытия.Вставить("МассивURLФайловВложений" , Вложения);
+ СоответствиеСобытия.Вставить("ОтправлятьУведомления" , Истина);
+
+ Результат = OPI_GoogleCalendar.СоздатьСобытие(Токен, Календарь, СоответствиеСобытия);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСобытие");
+
+ Событие = Результат[UID];
+
+ Проверка_ГКОбъект(Результат, Наименование, Описание);
+
+ СоответствиеСобытия = Новый Соответствие;
+ СоответствиеСобытия.Вставить("Описание", ОписаниеИзм);
+
+ Результат = OPI_GoogleCalendar.ИзменитьСобытие(Токен, Календарь, СоответствиеСобытия, Событие);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСобытие");
+
+ Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм);
+
+ Результат = OPI_GoogleCalendar.ПолучитьСобытие(Токен, Календарь, Событие);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСобытие");
+
+ Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм);
+
+ Результат = OPI_GoogleCalendar.ПереместитьСобытие(Токен, Календарь, Календарь, Событие);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереместитьСобытие");
+
+ Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм);
+
+ Результат = OPI_GoogleCalendar.УдалитьСобытие(Токен, Календарь, Событие);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСобытие");
+
+ Проверка_Пусто(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ГК_ПолучитьСписокСобытий() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+ Календарь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_CalendarID");
+
+ Результат = OPI_GoogleCalendar.ПолучитьСписокСобытий(Токен, Календарь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСобытий");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив");
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область GoogleDrive
+
+Процедура ГД_ПолучитьСписокКаталогов() Экспорт
+
+ MimeType = "mimeType";
+ Name = "name";
+ Имя = "Тестовая папка";
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+ Результат = OPI_GoogleDrive.ПолучитьСписокКаталогов(Токен, Имя, Истина);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаталогов");
+
+ Результат = Результат[0];
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно("application/vnd.google-apps.folder");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+ Идентификатор = Результат["id"];
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GD_Catalog", Идентификатор);
+
+ Результат = OPI_GoogleDrive.ПолучитьИнформациюОбОбъекте(Токен, Идентификатор);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбОбъекте");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно("application/vnd.google-apps.folder");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ГД_ЗагрузитьУдалитьФайл() Экспорт
+
+ ЛишниеБайты = 2;
+
+ Kind = "kind";
+ Content = "content";
+ MIME = "MIME";
+ MimeType = "mimeType";
+ Name = "name";
+ Id_ = "id";
+
+ МассивУдаляемых = Новый Массив;
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+ Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+ КартинкаЗамены = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture2");
+ Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog");
+
+ Описание = OPI_GoogleDrive.ПолучитьОписаниеФайла();
+ Описание.Вставить("Родитель", Каталог);
+
+ Результат = OPI_GoogleDrive.ЗагрузитьФайл(Токен, Картинка, Описание);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Описание["Имя"]);
+
+ Идентификатор = Результат[Id_];
+ МассивУдаляемых.Добавить(Идентификатор);
+
+ НовоеИмя = "Скопированный файл.jpeg";
+ Результат = OPI_GoogleDrive.СкопироватьОбъект(Токен, Идентификатор, НовоеИмя, "root");
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкоприроватьОбъект");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя);
+
+ МассивУдаляемых.Добавить(Результат[Id_]);
+
+ Результат = OPI_GoogleDrive.СкачатьФайл(Токен, Идентификатор);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер()).Равно(Картинка.Размер() + ЛишниеБайты);
+ OPI_Инструменты.Пауза(5);
+
+ НовоеИмя = "Обновленный файл.jpg";
+ Результат = OPI_GoogleDrive.ОбновитьФайл(Токен, Идентификатор, КартинкаЗамены, НовоеИмя);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьФайл");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя);
+
+ OPI_Инструменты.Пауза(5);
+
+ Комментарий = "Yo";
+ Результат = OPI_GoogleDrive.СоздатьКомментарий(Токен, Идентификатор, Комментарий);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment");
+
+ OPI_Инструменты.Пауза(5);
+
+ Для Каждого Удаляемый Из МассивУдаляемых Цикл
+ Результат = OPI_GoogleDrive.УдалитьОбъект(Токен, Удаляемый);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь);
+ OPI_Инструменты.Пауза(2);
+ КонецЦикла;
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ГД_СоздатьУдалитьКомментарий() Экспорт
+
+ Kind = "kind";
+ Content = "content";
+ Id_ = "id";
+ Comments = "comments";
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+ Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog");
+ Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+
+ Описание = OPI_GoogleDrive.ПолучитьОписаниеФайла();
+ Описание.Вставить("Родитель", Каталог);
+
+ Результат = OPI_GoogleDrive.ЗагрузитьФайл(Токен, Картинка, Описание);
+ Идентификатор = Результат[Id_];
+
+ Комментарий = "Новый комментарий";
+ МассивРезультатов = Новый Массив;
+ Результат = OPI_GoogleDrive.СоздатьКомментарий(Токен, Идентификатор, Комментарий);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий");
+
+ ИДКомментария = Результат[Id_];
+
+ МассивРезультатов.Добавить(Результат);
+
+ Результат = OPI_GoogleDrive.ПолучитьКомментарий(Токен, Идентификатор, ИДКомментария);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарий");
+
+ МассивРезультатов.Добавить(Результат);
+
+ Результат = OPI_GoogleDrive.ПолучитьСписокКомментариев(Токен, Идентификатор);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКомментариев");
+
+ Комментарии = Результат[Comments];
+ ОбъектКомментарий = Комментарии[Комментарии.ВГраница()];
+
+ МассивРезультатов.Добавить(ОбъектКомментарий);
+
+ Для Каждого Результат Из МассивРезультатов Цикл
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment");
+ КонецЦикла;
+
+ Результат = OPI_GoogleDrive.УдалитьКомментарий(Токен, Идентификатор, ИДКомментария);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь);
+
+ OPI_GoogleDrive.УдалитьОбъект(Токен, Идентификатор);
+
+КонецПроцедуры
+
+Процедура ГД_СоздатьКаталог() Экспорт
+
+ Name = "name";
+ Имя = "Тестовая папка";
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+ Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog");
+
+ МассивРезультатов = Новый Массив;
+
+ МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя));
+ МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя, Каталог));
+
+ Для Каждого Результат Из МассивРезультатов Цикл
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку");
+
+ ИДКаталога = Результат["id"];
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Имя);
+
+ OPI_GoogleDrive.УдалитьОбъект(Токен, ИДКаталога);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область GoogleSheets
+
+Процедура ГТ_СоздатьТаблицу() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+ Наименование = "Тестовая таблица";
+
+ МассивЛистов = Новый Массив;
+ МассивЛистов.Добавить("Лист1");
+ МассивЛистов.Добавить("Лист2");
+
+ Результат = OPI_GoogleSheets.СоздатьКнигу(Токен, Наименование, МассивЛистов);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКнигу");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["properties"]["title"]).Равно(Наименование);
+
+ Для Н = 0 По МассивЛистов.ВГраница() Цикл
+
+ ИмяЛиста = Результат["sheets"][Н]["properties"]["title"];
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ИмяЛиста).Равно(МассивЛистов[Н]);
+ Лист = Результат["sheets"][Н]["properties"]["sheetId"];
+ Лист = OPI_Инструменты.ЧислоВСтроку(Лист);
+
+ КонецЦикла;
+
+ Книга = Результат["spreadsheetId"];
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GS_Spreadsheet", Книга);
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GS_Sheet" , Лист);
+
+ Результат = OPI_GoogleSheets.СоздатьКнигу(Токен, Наименование, МассивЛистов);
+ Книга2 = Результат["spreadsheetId"];
+
+ Результат = OPI_GoogleSheets.КопироватьЛист(Токен, Книга, Книга2, Лист);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьЛист");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["title"]).Равно(ИмяЛиста + " (копия)");
+
+ Наименование = "Тестовый лист";
+
+ Результат = OPI_GoogleSheets.ДобавитьЛист(Токен, Книга, Наименование);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьЛист");
+
+ НовыйЛист = Результат["replies"][0]["addSheet"]["properties"]["sheetId"];
+ НовыйЛист = OPI_Инструменты.ЧислоВСтроку(НовыйЛист);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+
+ Результат = OPI_GoogleSheets.УдалитьЛист(Токен, Книга, НовыйЛист);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЛист");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+
+ Наименование = "Тестовая таблица (изм.)";
+
+ Результат = OPI_GoogleSheets.ИзменитьНаименованиеКниги(Токен, Книга, Наименование);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьНаименованиеКниги");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+
+КонецПроцедуры
+
+Процедура ГТ_ПолучитьТаблицу() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+ Книга = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GS_Spreadsheet");
+ Наименование = "Тестовая таблица (изм.)";
+
+ Результат = OPI_GoogleSheets.ПолучитьКнигу(Токен, Книга);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицу");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["properties"]["title"]).Равно(Наименование);
+
+КонецПроцедуры
+
+Процедура ГТ_ЗаполнитьОчиститьЯчейки() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+ Книга = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GS_Spreadsheet");
+ Лист = "Лист2";
+
+ СтруктураЯчеек = Новый Соответствие;
+ СтруктураЯчеек.Вставить("A1", "Это A1");
+ СтруктураЯчеек.Вставить("A2", "Это A2");
+ СтруктураЯчеек.Вставить("B2", "Это B2");
+ СтруктураЯчеек.Вставить("B3", "Это B3");
+ СтруктураЯчеек.Вставить("A3", "Это A3");
+ СтруктураЯчеек.Вставить("A4", "Это A4");
+ СтруктураЯчеек.Вставить("B1", "Это B1");
+ СтруктураЯчеек.Вставить("B4", "Это B4");
+
+ МассивЯчеек = Новый Массив;
+ МассивЯчеек.Добавить("B2");
+ МассивЯчеек.Добавить("A3");
+ МассивЯчеек.Добавить("B4");
+
+ Результат = OPI_GoogleSheets.УстановитьЗначенияЯчеек(Токен, Книга, СтруктураЯчеек, Лист);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЗначенияЯчеек");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["totalUpdatedCells"]).Равно(СтруктураЯчеек.Количество());
+
+ Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, МассивЯчеек, Лист);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["valueRanges"].Количество()).Равно(МассивЯчеек.Количество());
+
+ Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, , Лист);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+
+ МассивЯчеек = Новый Массив;
+ МассивЯчеек.Добавить("B2");
+ МассивЯчеек.Добавить("A3");
+ МассивЯчеек.Добавить("B4");
+
+ Результат = OPI_GoogleSheets.ОчиститьЯчейки(Токен, Книга, МассивЯчеек, Лист);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьЯчейки");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["clearedRanges"].Количество()).Равно(МассивЯчеек.Количество());
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Twitter
+
+Процедура Твиттер_ПолучитьСсылкуАвторизации() Экспорт
+
+ Параметры = ПолучитьПараметрыТвиттер();
+ Результат = OPI_Twitter.ПолучитьСсылкуАвторизации(Параметры);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено();
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_URL", Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Твиттер_ОбновитьТокен() Экспорт
+
+ Параметры = ПолучитьПараметрыТвиттер();
+ Результат = OPI_Twitter.ОбновитьТокен(Параметры);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["access_token"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["refresh_token"]).Заполнено();
+
+ Рефреш = Результат["refresh_token"];
+ Токен = Результат["access_token"];
+
+ Если ЗначениеЗаполнено(Рефреш) И Не Рефреш = "null" Тогда
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_Refresh", Рефреш);
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(Токен) И Не Токен = "null" Тогда
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Twitter_Token" , Токен);
+ КонецЕсли;
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Твиттер_СоздатьТекстовыйТвит() Экспорт
+
+ Параметры = ПолучитьПараметрыТвиттер();
+ Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
+
+ Результат = OPI_Twitter.СоздатьТекстовыйТвит(Текст, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТекстовыйТвит");
+
+ Проверка_ТвиттерТекст(Результат, Текст);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Твиттер_СоздатьТвитСКартинкой() Экспорт
+
+ Параметры = ПолучитьПараметрыТвиттер();
+ Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
+ Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+ ИВФ = ПолучитьИмяВременногоФайла("png");
+ Картинка.Записать(ИВФ);
+
+ Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, Картинка, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки");
+
+ Проверка_ТвиттерТекст(Результат, Текст);
+
+ Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, ИВФ, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки");
+
+ Проверка_ТвиттерТекст(Результат, Текст);
+
+ УдалитьФайлы(ИВФ);
+
+ OPI_Инструменты.Пауза(20);
+
+КонецПроцедуры
+
+Процедура Твиттер_СоздатьТвитСВидео() Экспорт
+
+ Параметры = ПолучитьПараметрыТвиттер();
+ Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
+ Видео = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Video");
+ ИВФ = ПолучитьИмяВременногоФайла("mp4");
+ Видео.Записать(ИВФ);
+
+ Результат = OPI_Twitter.СоздатьТвитВидео(Текст, Видео, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео");
+
+ Проверка_ТвиттерТекст(Результат, Текст);
+
+ Результат = OPI_Twitter.СоздатьТвитВидео(Текст, ИВФ, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео");
+
+ Проверка_ТвиттерТекст(Результат, Текст);
+
+ УдалитьФайлы(ИВФ);
+
+ OPI_Инструменты.Пауза(20);
+
+КонецПроцедуры
+
+Процедура Твиттер_СоздатьТвитСГиф() Экспорт
+
+ Параметры = ПолучитьПараметрыТвиттер();
+ Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
+ Гифка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("GIF");
+ ИВФ = ПолучитьИмяВременногоФайла("gif");
+ Гифка.Записать(ИВФ);
+
+ Результат = OPI_Twitter.СоздатьТвитГифки(Текст, Гифка, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки");
+
+ Проверка_ТвиттерТекст(Результат, Текст);
+
+ Результат = OPI_Twitter.СоздатьТвитГифки(Текст, ИВФ, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки");
+
+ Проверка_ТвиттерТекст(Результат, Текст);
+
+ УдалитьФайлы(ИВФ);
+
+ OPI_Инструменты.Пауза(20);
+
+КонецПроцедуры
+
+Процедура Твиттер_СоздатьТвитСОпросом() Экспорт
+
+ Параметры = ПолучитьПараметрыТвиттер();
+ Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
+ МассивОтветов = Новый Массив;
+ МассивОтветов.Добавить("Вариант 1");
+ МассивОтветов.Добавить("Вариант 2");
+
+ Результат = OPI_Twitter.СоздатьТвитОпрос(Текст, МассивОтветов, 60, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитОпрос");
+
+ Проверка_ТвиттерТекст(Результат, Текст);
+
+ OPI_Инструменты.Пауза(20);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Notion
+
+Процедура Ноушн_СоздатьСтраницу() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+ Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent");
+ Заголовок = "Тестовый заголовок";
+
+ Результат = OPI_Notion.СоздатьСтраницу(Токен, Родитель, Заголовок);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСтраницу");
+
+ Проверка_НоушнОбъект(Результат);
+
+КонецПроцедуры
+
+Процедура Ноушн_СоздатьИзменитьБазу() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+ Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent");
+ Заголовок = "Тестовый заголовок";
+
+ Свойства = Новый Соответствие;
+ Свойства.Вставить("Имя" , "title");
+ Свойства.Вставить("Описание" , "rich_text");
+ Свойства.Вставить("Номер" , "number");
+ Свойства.Вставить("Статус" , "status");
+ Свойства.Вставить("Дата создания" , "date");
+ Свойства.Вставить("Картинка" , "files");
+ Свойства.Вставить("Активен" , "checkbox");
+ Свойства.Вставить("Сайт" , "url");
+ Свойства.Вставить("Почта" , "email");
+ Свойства.Вставить("Телефон" , "phone_number");
+ Свойства.Вставить("Пользователь" , "people");
+
+ ВыборЗначения = Новый Соответствие;
+ ВыборЗначения.Вставить("Новый", "green");
+ ВыборЗначения.Вставить("В работе", "yellow");
+ ВыборЗначения.Вставить("Удаленный", "red");
+ Свойства.Вставить("Статус", ВыборЗначения);
+
+ Результат = OPI_Notion.СоздатьБазуДанных(Токен, Родитель, Заголовок, Свойства);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных");
+
+ Проверка_НоушнОбъект(Результат, "database");
+
+ База = Результат["id"];
+ Заголовок = "Тестовый заголовок";
+ Описание = "Тестовое описание";
+
+ Свойства = Новый Соответствие;
+ Свойства.Вставить("Почта", "rich_text"); // Тип поля "Почта" будет изменен с email на текст
+ Свойства.Вставить("Сайт"); // Поле "Сайт" будет удалено
+
+ Результат = OPI_Notion.ИзменитьСвойстваБазы(Токен, База, Свойства, Заголовок, Описание);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваБазы");
+
+ Проверка_НоушнОбъект(Результат, "database");
+
+КонецПроцедуры
+
+Процедура Ноушн_ПолучитьИнформациюОСтранице() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+ Страница = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page");
+
+ Результат = OPI_Notion.ПолучитьСтраницу(Токен, Страница);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтраницу");
+
+ Проверка_НоушнОбъект(Результат);
+
+КонецПроцедуры
+
+Процедура Ноушн_ПолучитьИнформациюОБазе() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+ База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base");
+
+ Результат = OPI_Notion.ПолучитьБазуДанных(Токен, База);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьБазуДанных");
+
+ Проверка_НоушнОбъект(Результат, "database");
+
+КонецПроцедуры
+
+Процедура Ноушн_СоздатьСтраницуВБазу() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+ База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base");
+
+ Картинка = Новый Соответствие;
+ Картинка.Вставить("Лого", OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture"));
+
+ Свойства = Новый Соответствие;
+ Свойства.Вставить("Имя" , "ООО Вектор");
+ Свойства.Вставить("Описание" , "Наш первый клиент");
+ Свойства.Вставить("Номер" , 1);
+ Свойства.Вставить("Статус" , "Обычный");
+ Свойства.Вставить("Дата создания" , OPI_Инструменты.ПолучитьТекущуюДату());
+ Свойства.Вставить("Картинка" , Картинка);
+ Свойства.Вставить("Активен" , Истина);
+ Свойства.Вставить("Сайт" , "https://vector.ru");
+ Свойства.Вставить("Почта" , "mail@vector.ru");
+ Свойства.Вставить("Телефон" , "88005553535");
+ Свойства.Вставить("Статус" , "Новый");
+
+ Результат = OPI_Notion.СоздатьСтраницуВБазу(Токен, База, Свойства);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСтраницуВБазу");
+
+ Проверка_НоушнОбъект(Результат);
+
+ Родитель = СтрЗаменить(Результат["parent"]["database_id"], "-", "");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Родитель).Равно(База);
+
+КонецПроцедуры
+
+Процедура Ноушн_ИзменитьСвойстваСтраницы() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+ Страница = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page");
+ Иконка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture");
+ Обложка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture2");
+ Архивировать = Ложь;
+
+ Свойства = Новый Соответствие;
+ Свойства.Вставить("Активен" , Ложь);
+ Свойства.Вставить("Почта" , "vector@mail.ru");
+
+ Результат = OPI_Notion.ИзменитьСвойстваСтраницы(Токен
+ , Страница
+ , Свойства
+ , Иконка
+ , Обложка
+ , Архивировать);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваСтраницы");
+
+ Проверка_НоушнОбъект(Результат);
+
+КонецПроцедуры
+
+Процедура Ноушн_СоздатьУдалитьБлок() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+ Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent");
+ Блок = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Block");
+
+ Результат = OPI_Notion.ВернутьБлок(Токен, Блок);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьБлок");
+
+ Проверка_НоушнОбъект(Результат, "block");
+
+ Результат = OPI_Notion.СоздатьБлок(Токен, Родитель, Результат);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБлок");
+
+ Проверка_НоушнОбъект(Результат, "list");
+
+ Блок = Результат["results"][0]["id"];
+ Результат = OPI_Notion.ВернутьДочерниеБлоки(Токен, Блок);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьДочерниеБлоки");
+
+ Проверка_НоушнОбъект(Результат, "list");
+
+ Результат = OPI_Notion.УдалитьБлок(Токен, Блок);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБлок");
+
+ Проверка_НоушнОбъект(Результат, "block");
+
+КонецПроцедуры
+
+Процедура Ноушн_ПолучитьПользователей() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+ Результат = OPI_Notion.СписокПользователей(Токен);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СписокПользователей");
+
+ Проверка_НоушнОбъект(Результат, "list");
+
+КонецПроцедуры
+
+Процедура Ноушн_ПолучитьДанныеПользователя() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_User");
+ Результат = OPI_Notion.ПолучитьДанныеПользователя(Токен, Пользователь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя");
+
+ Проверка_НоушнОбъект(Результат, "user");
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Slack
+
+Процедура Слак_ПолучитьИнформациюОБоте() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Результат = OPI_Slack.ПолучитьИнформациюОБоте(Токен);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОБоте");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bot_id"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user_id"]).Заполнено();
+
+КонецПроцедуры
+
+Процедура Слак_ПолучитьСписокПользователей() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Результат = OPI_Slack.ПолучитьСписокПользователей(Токен);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователей");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив");
+
+КонецПроцедуры
+
+Процедура Слак_ПолучитьСписокОбластей() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Результат = OPI_Slack.ПолучитьСписокРабочихОбластей(Токен);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокРабочихОбластей");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["teams"]).ИмеетТип("Массив");
+
+КонецПроцедуры
+
+Процедура Слак_ОтправитьУдалитьСообщение() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+ Текст = "Тестовое сообщение 1";
+ Текст2 = "Тестовое сообщение 2";
+ Отметки = Новый Массив;
+ Картинка = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1";
+
+ Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст);
+
+ Отметка = Результат["ts"];
+
+ Результат = OPI_Slack.ИзменитьСообщение(Токен, Канал, Отметка, Текст2);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСообщение");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст2);
+
+ Результат = OPI_Slack.ПолучитьСписокОтветовНаСообщение(Токен, Канал, Отметка);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтветовНаСообщение");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив");
+
+ Результат = OPI_Slack.ПолучитьСсылкуНаСообщение(Токен, Канал, Отметка);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуНаСообщение");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["permalink"]).Заполнено();
+
+ Проверка_СлакОк(Результат);
+
+ Отметки.Добавить(Отметка);
+
+ МассивБлоков = Новый Массив;
+ Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo");
+ МассивБлоков.Добавить(Блок);
+
+ Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , МассивБлоков);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (картинка)");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+
+ Отметки.Добавить(Результат["ts"]);
+
+ Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo");
+ БлокJSON = OPI_Инструменты.JSONСтрокой(Блок);
+
+ ИВФ = ПолучитьИмяВременногоФайла("json");
+
+ ТекстовыйДокумент = Новый ТекстовыйДокумент();
+ ТекстовыйДокумент.УстановитьТекст(БлокJSON);
+ ТекстовыйДокумент.Записать(ИВФ);
+
+ Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , ИВФ);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json)");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+
+ Отметки.Добавить(Результат["ts"]);
+
+ Блоки = "['" + ИВФ + "','" + ИВФ + "']";
+ Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , Блоки);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json массив)");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+
+ Отметки.Добавить(Результат["ts"]);
+
+ УдалитьФайлы(ИВФ);
+
+ Для Каждого Отметка Из Отметки Цикл
+
+ Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+
+ КонецЦикла;
+
+ Час = 3600;
+ Сутки = 24;
+ Отправка = OPI_Инструменты.ПолучитьТекущуюДату() + (Сутки * Час);
+ Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, Отправка);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (отложенное)");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_message_id"]).Заполнено();
+
+ Отметка = Результат["scheduled_message_id"];
+ Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка, Истина);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение");
+
+ Проверка_СлакОк(Результат);
+
+КонецПроцедуры
+
+Процедура Слак_ОтправитьУдалитьЭфемерное() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User");
+ Картинка = "https://github.com/Bayselonarrend/OpenIntegrations/raw/main/Media/logo.png?v1";
+ Текст = "Тестовое сообщение 1";
+
+ Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo");
+ Результат = OPI_Slack.ОтправитьЭфемерноеСообщение(Токен, Канал, Текст, Пользователь, Блок);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_ts"]).Заполнено();
+
+КонецПроцедуры
+
+Процедура Слак_ПолучитьОтложенныеСообщения() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+
+ Результат = OPI_Slack.ПолучитьСписокОтложенныхСообщений(Токен, Канал);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтложенныхСообщений");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_messages"]).ИмеетТип("Массив");
+
+КонецПроцедуры
+
+Процедура Слак_СоздатьАрхивироватьКанал() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User");
+ Имя = "testconv" + Строка(Новый УникальныйИдентификатор);
+ Тема = "Тестовая тема";
+ Цель = "Тестовая цель";
+
+ #Область СоздатьКанал
+ Результат = OPI_Slack.СоздатьКанал(Токен, Имя);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКанал");
+
+ Данные = Результат["channel"];
+ Канал = Данные["id"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
+ #КонецОбласти
+
+ #Область УстановитьТемуКанала
+ Результат = OPI_Slack.УстановитьТемуКанала(Токен, Канал, Тема);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьТемуКанала");
+
+ Данные = Результат["channel"];
+ Канал = Данные["id"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["topic"]["value"]).Равно(Тема);
+ #КонецОбласти
+
+ #Область УстановитьЦельКанала
+ Результат = OPI_Slack.УстановитьЦельКанала(Токен, Канал, Цель);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЦельКанала");
+
+ Проверка_СлакОк(Результат);
+ #КонецОбласти
+
+ #Область ПолучитьКанал
+ Результат = OPI_Slack.ПолучитьКанал(Токен, Канал);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКанал");
+
+ Данные = Результат["channel"];
+ Канал = Данные["id"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
+ #КонецОбласти
+
+ #Область ПригласитьПользователейВКанал
+ Результат = OPI_Slack.ПригласитьПользователейВКанал(Токен, Канал, Пользователь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПригласитьПользователейВКанал");
+
+ Данные = Результат["channel"];
+ Канал = Данные["id"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
+ #КонецОбласти
+
+ #Область ВыгнатьПользователяИзКанала
+ Результат = OPI_Slack.ВыгнатьПользователяИзКанала(Токен, Канал, Пользователь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыгнатьПользователяИзКанала");
+
+ Проверка_СлакОк(Результат);
+ #КонецОбласти
+
+ #Область ПолучитьИсториюКанала
+ Результат = OPI_Slack.ПолучитьИсториюКанала(Токен, Канал);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИсториюКанала");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив");
+ #КонецОбласти
+
+ #Область ПолучитьСписокПользователейКанала
+ Результат = OPI_Slack.ПолучитьСписокПользователейКанала(Токен, Канал);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователейКанала");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив");
+ #КонецОбласти
+
+ #Область ПокинутьКанал
+ Результат = OPI_Slack.ПокинутьКанал(Токен, Канал);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПокинутьКанал");
+
+ Проверка_СлакОк(Результат);
+ #КонецОбласти
+
+ #Область ВступитьВКанал
+ Результат = OPI_Slack.ВступитьВКанал(Токен, Канал);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВступитьВКанал");
+
+ Данные = Результат["channel"];
+ Канал = Данные["id"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
+ #КонецОбласти
+
+ #Область ПереименоватьКанал
+ НовоеИмя = "testconv" + Строка(Новый УникальныйИдентификатор);
+ Результат = OPI_Slack.ПереименоватьКанал(Токен, Канал, НовоеИмя);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереименоватьКанал");
+
+ Данные = Результат["channel"];
+ Канал = Данные["id"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(НовоеИмя);
+ #КонецОбласти
+
+ #Область АрхивироватьКанал
+ Результат = OPI_Slack.АрхивироватьКанал(Токен, Канал);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "АрхивироватьКанал");
+
+ Проверка_СлакОк(Результат);
+ #КонецОбласти
+
+КонецПроцедуры
+
+Процедура Слак_ПолучитьСписокКаналов() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+
+ Результат = OPI_Slack.ПолучитьСписокКаналов(Токен);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаналов");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channels"]).ИмеетТип("Массив");
+
+КонецПроцедуры
+
+Процедура Слак_ОткрытьЗакрытьДиалог() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User");
+ Текст = "Yo, dude";
+
+ Результат = OPI_Slack.ОткрытьДиалог(Токен, Пользователь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьДиалог");
+
+ Диалог = Результат["channel"]["id"];
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).ИмеетТип("Соответствие");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Диалог).Заполнено();
+
+ Результат = OPI_Slack.ОтправитьСообщение(Токен, Диалог, Текст);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
+
+ Проверка_СлакОк(Результат);
+
+ Результат = OPI_Slack.ЗакрытьДиалог(Токен, Диалог);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьДиалог");
+
+ Проверка_СлакОк(Результат);
+
+КонецПроцедуры
+
+Процедура Слак_ПолучитьСписокФайлов() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+
+ Результат = OPI_Slack.ПолучитьСписокФайлов(Токен, Канал);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
+
+КонецПроцедуры
+
+Процедура Слак_ЗагрузитьУдалитьФайл() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Файл = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Document");
+ Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+ МассивФайлов = Новый Массив;
+ ИмяФайла = "megadoc.docx";
+ Заголовок = "Новый файл";
+
+ Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
+
+ ЗагруженныйФайл = Результат["files"][0];
+ МассивФайлов.Добавить(ЗагруженныйФайл["id"]);
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла);
+
+ Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок, Канал);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл (в канал)");
+
+ ЗагруженныйФайл = Результат["files"][0];
+ МассивФайлов.Добавить(ЗагруженныйФайл["id"]);
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла);
+
+ Результат = OPI_Slack.ПолучитьДанныеФайла(Токен, ЗагруженныйФайл["id"]);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьФайл");
+
+ ЗагруженныйФайл = Результат["file"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла);
+
+ Для Каждого ЗагруженныйФайл Из МассивФайлов Цикл
+
+ Результат = OPI_Slack.УдалитьФайл(Токен, ЗагруженныйФайл);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьФайл");
+
+ Проверка_СлакОк(Результат);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура Слак_ПолучитьСписокВФ() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+
+ Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
+
+ Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен, Канал);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
+
+КонецПроцедуры
+
+Процедура Слак_ЗагрузитьУдалитьВФ() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Файл = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document");
+ Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+ Заголовок = "Новый файл";
+
+ Результат = OPI_Slack.ДобавитьВнешнийФайл(Токен, Файл, Заголовок);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВнешнийФайл");
+
+ ЗагруженныйФайл = Результат["file"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок);
+
+ Результат = OPI_Slack.ПолучитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьВнешнийФайл");
+
+ ЗагруженныйФайл = Результат["file"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок);
+
+ Результат = OPI_Slack.ОтправитьВнешнийФайл(Токен, ЗагруженныйФайл["id"], Канал);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл");
+
+ Проверка_СлакОк(Результат);
+
+ Результат = OPI_Slack.УдалитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл");
+
+ Проверка_СлакОк(Результат);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Airtable
+
+Процедура АТ_СоздатьБазу() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
+ Область = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Workspace");
+ Наименование = "Тестовая база";
+
+ МассивПолей = Новый Массив;
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер"));
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое"));
+
+ ИмяТаблицы = "Тестовая таблица";
+
+ СоответствиеТаблиц = Новый Соответствие;
+ СоответствиеТаблиц.Вставить(ИмяТаблицы, МассивПолей);
+
+ Результат = OPI_Airtable.СоздатьБазу(Токен, Область, Наименование, СоответствиеТаблиц);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазу");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"][0]["name"]).Равно(ИмяТаблицы);
+
+ База = Результат["id"];
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Base", База);
+
+ Результат = OPI_Airtable.ПолучитьТаблицыБазы(Токен, База);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицыБазы");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).ИмеетТип("Массив");
+
+ Результат = OPI_Airtable.ПолучитьСписокБаз(Токен);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокБаз");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).ИмеетТип("Массив");
+
+КонецПроцедуры
+
+Процедура АТ_СоздатьТаблицу() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
+ База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base");
+
+ МассивПолей = Новый Массив;
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер"));
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[0], "ПолучитьПолеНомера");
+
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое"));
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[1], "ПолучитьПолеСтроковое");
+
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеВложения("Вложение"));
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[2], "ПолучитьПолеВложения");
+
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеФлажка("Флажок"));
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[3], "ПолучитьПолеФлажка");
+
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеДаты("Дата"));
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[4], "ПолучитьПолеДаты");
+
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеТелефона("Телефон"));
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[5], "ПолучитьПолеТелефона");
+
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеПочты("Почта"));
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[6], "ПолучитьПолеПочты");
+
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСсылки("Ссылка"));
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[7], "ПолучитьПолеСсылки");
+
+ ИмяТаблицы = "Тестовая таблица 2";
+ Описание = "Новая таблица";
+
+ Результат = OPI_Airtable.СоздатьТаблицу(Токен, База, ИмяТаблицы, МассивПолей, Описание);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТаблицу");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
+
+ Таблица = Результат["id"];
+ ИмяТаблицы = "Тестовая таблица 2 (изм.)";
+ Описание = "Новая таблица (изм.)";
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Table", Таблица);
+
+ Результат = OPI_Airtable.ИзменитьТаблицу(Токен, База, Таблица, ИмяТаблицы, Описание);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТаблицу");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
+
+КонецПроцедуры
+
+Процедура АТ_СоздатьПоле() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
+ База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base");
+ Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table");
+ Имя = Строка(Новый УникальныйИдентификатор);
+
+ Поле = OPI_Airtable.ПолучитьПолеНомера(Имя);
+
+ Результат = OPI_Airtable.СоздатьПоле(Токен, База, Таблица, Поле);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПоле");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя);
+
+ Поле = Результат["id"];
+ Имя = Имя + "(изм.)";
+ Описание = "Новое описание";
+
+ Результат = OPI_Airtable.ИзменитьПоле(Токен, База, Таблица, Поле, Имя, Описание);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПоле");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
+
+КонецПроцедуры
+
+Процедура АТ_СоздатьУдалитьЗаписи() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
+ База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base");
+ Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table");
+
+ Числовой = 10;
+ Строчный = "Привет";
+
+ ОписаниеСтроки1 = Новый Структура("Номер,Строковое", Числовой, Строчный);
+ ОписаниеСтроки2 = Новый Структура("Номер,Строковое", Числовой, Строчный);
+
+ МассивУдаляемых = Новый Массив;
+ МассивОписаний = Новый Массив;
+ МассивОписаний.Добавить(ОписаниеСтроки1);
+ МассивОписаний.Добавить(ОписаниеСтроки2);
+
+ Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, МассивОписаний);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"].Количество()).Равно(2);
+
+ Для Каждого Запись Из Результат["records"] Цикл
+ МассивУдаляемых.Добавить(Запись["id"]);
+ КонецЦикла;
+
+ Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, ОписаниеСтроки1);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи (одна)");
+
+ ОдиночнаяЗапись = Результат["id"];
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ОдиночнаяЗапись).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["createdTime"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["fields"]["Номер"]).Равно(Числовой);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(СокрЛП(Результат["fields"]["Строковое"])).Равно(Строчный);
+
+ Результат = OPI_Airtable.ПолучитьЗапись(Токен, База, Таблица, ОдиночнаяЗапись);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗапись");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(ОдиночнаяЗапись);
+
+ Текст = "Тестовый комментарий";
+ Результат = OPI_Airtable.СоздатьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Текст);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст);
+
+ Коммент = Результат["id"];
+ Текст = "Тестовый комментарий (изм.)";
+ Результат = OPI_Airtable.ИзменитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент, Текст);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКомментарий");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст);
+
+ Результат = OPI_Airtable.ПолучитьКомментарии(Токен, База, Таблица, ОдиночнаяЗапись);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарии");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["comments"]).ИмеетТип("Массив");
+
+ Результат = OPI_Airtable.УдалитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["deleted"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(Коммент);
+
+ Результат = OPI_Airtable.ПолучитьСписокЗаписей(Токен, База, Таблица);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаписей");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено();
+
+ Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, МассивУдаляемых);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено();
+
+ Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, ОдиночнаяЗапись);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи (одна)");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено();
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Dropbox
+
+Процедура ДропБокс_ПолучитьОбновитьТокен() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Appkey" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Appsecret", ПараметрыТеста);
+
+ Dropbox_ПолучитьСсылкуАвторизации(ПараметрыТеста);
+
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Code", ПараметрыТеста);
+
+ Dropbox_ПолучитьТокен(ПараметрыТеста);
+
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Refresh", ПараметрыТеста);
+
+ Dropbox_ОбновитьТокен(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура ДропБокс_ЗагрузитьФайл() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Picture", ПараметрыТеста);
+
+ Dropbox_ЗагрузитьФайл(ПараметрыТеста);
+ Dropbox_ПолучитьИнформациюОбОбъекте(ПараметрыТеста);
+ Dropbox_ПолучитьСписокВерсийОбъекта(ПараметрыТеста);
+ Dropbox_ВосстановитьОбъектКВерсии(ПараметрыТеста);
+ Dropbox_ПолучитьПревью(ПараметрыТеста);
+ Dropbox_СкачатьФайл(ПараметрыТеста);
+ Dropbox_ПереместитьОбъект(ПараметрыТеста);
+ Dropbox_КопироватьОбъект(ПараметрыТеста);
+ Dropbox_УдалитьОбъект(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура ДропБокс_СоздатьКаталог() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
+
+ Dropbox_СоздатьПапку(ПараметрыТеста);
+ Dropbox_СкачатьПапку(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура ДропБокс_ПолучитьСписокФайловПапки() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
+
+ Dropbox_ПолучитьСписокФайловПапки(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура ДропБокс_ЗагрузитьФайлПоURL() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Document", ПараметрыТеста);
+
+ Dropbox_ЗагрузитьФайлПоURL(ПараметрыТеста);
+ Dropbox_ПолучитьСтатусЗагрузкиПоURL(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура ДропБокс_СоздатьУдалитьТег() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
+
+ Dropbox_ДобавитьТег(ПараметрыТеста);
+ Dropbox_ПолчитьСписокТегов(ПараметрыТеста);
+ Dropbox_УдалитьТег(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура ДропБокс_ПолучитьАккаунт() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token", ПараметрыТеста);
+
+ Dropbox_ПолучитьИнформациюОбАккаунте(ПараметрыТеста);
+ Dropbox_ПолучитьДанныеИспользованияПространства(ПараметрыТеста);
+
+КонецПроцедуры
+
+Процедура ДропБокс_РаботаСДоступами() Экспорт
+
+ ПараметрыТеста = Новый Структура;
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_Token" , ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_OtherUser", ПараметрыТеста);
+ OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("Dropbox_FileID" , ПараметрыТеста);
+
+ Dropbox_ДобавитьПользователейКФайлу(ПараметрыТеста);
+ Dropbox_ОпубликоватьПапку(ПараметрыТеста);
+ Dropbox_ДобавитьПользователейКПапке(ПараметрыТеста);
+ Dropbox_ОтменитьПубликациюПапки(ПараметрыТеста);
+ Dropbox_ОтменитьПубликациюФайла(ПараметрыТеста);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ПолучитьПараметрыВК()
+
+ Параметры = Новый Структура;
+ НомерГруппы = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_GroupID");
+
+ Параметры.Вставить("access_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_Token"));
+ Параметры.Вставить("owner_id" , "-" + НомерГруппы);
+ Параметры.Вставить("app_id" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_AppID"));
+ Параметры.Вставить("group_id" , НомерГруппы);
+
+ Возврат Параметры;
+
+КонецФункции
+
+Функция ПолучитьПараметрыТвиттер()
+
+ Параметры = Новый Соответствие;
+
+ Параметры.Вставить("redirect_uri" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Redirect"));
+ Параметры.Вставить("client_id" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_ClinetID"));
+ Параметры.Вставить("client_secret" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_ClientSecret"));
+ Параметры.Вставить("access_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Token"));
+ Параметры.Вставить("refresh_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_Refresh"));
+ Параметры.Вставить("oauth_token" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthToken"));
+ Параметры.Вставить("oauth_token_secret" , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthSecret"));
+
+ Параметры.Вставить("oauth_consumer_key"
+ , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthConsumerKey"));
+ Параметры.Вставить("oauth_consumer_secret"
+ , OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Twitter_OAuthConsumerSecret"));
+
+ Возврат Параметры;
+
+КонецФункции
+
+#Область Проверки
+
+Процедура Проверка_Пусто(Знач Результат)
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь);
+КонецПроцедуры
+
+Процедура Проверка_ДвоичныеДанные(Знач Результат, Знач Размер = Неопределено)
+
+ МинимальныйРазмер = 500000;
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные");
+
+ Если Не Размер = Неопределено Тогда
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер()).Равно(Размер);
+ Иначе
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер() > МинимальныйРазмер).Равно(Истина);
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмИстина(Знач Результат)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина);
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмИнформацияБота(Знач Результат)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["username"]).Заполнено();
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмМассив(Результат)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие") .Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Массив");
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмУстановкаВебхук(Знач Результат)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно("Webhook was set");
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмУдалениеВебхук(Знач Результат)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Заполнено();
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмСообщение(Знач Результат, Знач Текст)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["text"]).Равно(Текст);
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмКартинка(Знач Результат, Знач Текст)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие") .Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["photo"]).ИмеетТип("Массив");
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмВидео(Знач Результат, Знач Текст)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["video"]["mime_type"]).Равно("video/mp4");
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмАудио(Знач Результат, Знач Текст)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["audio"]["mime_type"]).Равно("audio/mpeg");
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмДокумент(Знач Результат, Знач Текст)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["caption"]).Равно(Текст);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["document"]).ИмеетТип("Соответствие").Заполнено();
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмГифка(Знач Результат, Знач Текст)
+
+ Result = "result";
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["caption"]).Равно(Текст);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["document"]).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["animation"]["mime_type"]).Равно("video/mp4");
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмМедиагруппа(Знач Результат)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Массив");
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмМестоположение(Знач Результат)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["location"]).ИмеетТип("Соответствие").Заполнено();
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмКонтакт(Знач Результат, Знач Имя)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["contact"]).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["contact"]["first_name"]).Равно(Имя);
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмОпрос(Знач Результат, Знач Вопрос)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["poll"]).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["poll"]["question"]).Равно(Вопрос);
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмПереслать(Знач Результат, Знач IDСообщения)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["forward_origin"]["message_id"]).Равно(Число(IDСообщения));
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмБан(Знач Результат)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно("Bad Request: can't remove chat owner");
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмПриглашение(Знач Результат, Знач Заголовок, Знач UnixИстечение)
+
+ Result = "result";
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["member_limit"]).Равно(200);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["name"]).Равно(Заголовок);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Result]["expire_date"]).Равно(Число(UnixИстечение));
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмЧисло(Знач Результат)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]).ИмеетТип("Число");
+
+КонецПроцедуры
+
+Процедура Проверка_ТелеграмСозданиеТемы(Знач Результат, Знач Имя, Иконка)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["name"]).Равно(Имя);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["result"]["icon_custom_emoji_id"]).Равно(Иконка);
+
+КонецПроцедуры
+
+Процедура Проверка_ВКПост(Знач Результат)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["post_id"]).ИмеетТип("Число").Заполнено();
+
+КонецПроцедуры
+
+Процедура Проверка_ВКИстина(Знач Результат)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Равно(1);
+
+КонецПроцедуры
+
+Процедура Проверка_ВКАльбом(Знач Результат, Знач Описание)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["description"]).Равно(Описание);
+
+КонецПроцедуры
+
+Процедура Проверка_ВККартинкаАльбома(Знач Результат, Знач ОписаниеКартинки, Знач ИДАльбома)
+
+ Response = "response";
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][0]["text"]).Равно(ОписаниеКартинки);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][0]["album_id"]).Равно(ИДАльбома);
+
+КонецПроцедуры
+
+Процедура Проверка_ВКИстория(Знач Результат)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["count"]).ИмеетТип("Число").Равно(1);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]["items"]).ИмеетТип("Массив").Заполнено();
+
+КонецПроцедуры
+
+Процедура Проверка_ВКОбсуждение(Знач Результат)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Заполнено();
+
+КонецПроцедуры
+
+Процедура Проверка_ГКОбъект(Знач Результат, Знач Наименование, Знач Описание)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["summary"]).Равно(Наименование);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).ИмеетТип("Строка").Заполнено();
+
+КонецПроцедуры
+
+Процедура Проверка_ТвиттерТекст(Знач Результат, Знач Текст)
+
+ ТекстОтвета = Результат["data"]["text"];
+ ТекстОтвета = Лев(ТекстОтвета, СтрДлина(Текст));
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ТекстОтвета).Равно(Текст);
+
+КонецПроцедуры
+
+Процедура Проверка_ВайберОк(Знач Результат)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status_message"]).Равно("ok");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status"]).Равно(0);
+
+КонецПроцедуры
+
+Процедура Проверка_НоушнОбъект(Знач Результат, Знач Вид = "page")
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["object"]).Равно(Вид);
+
+КонецПроцедуры
+
+Процедура Проверка_СлакОк(Знач Результат)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ok"]).Равно(Истина);
+
+КонецПроцедуры
+
+Процедура Проверка_ДропБоксФайл(Знач Результат, Знач Путь)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path_display"]).Равно(Путь);
+
+КонецПроцедуры
+
+Процедура Проверка_ДропБоксМетаданные(Знач Результат, Знач Путь)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["metadata"]["path_display"]).Равно(Путь);
+
+КонецПроцедуры
+
+Процедура Проверка_ДропБоксМассив(Знач Результат, Знач Количество = Неопределено)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["entries"]).ИмеетТип("Массив");
+
+ Если Не Количество = Неопределено Тогда
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["entries"].Количество()).Равно(Количество);
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура Проверка_ДропБоксРабота(Знач Результат)
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["async_job_id"]).Заполнено();
+КонецПроцедуры
+
+Процедура Проверка_ДропБоксСтатус(Знач Результат)
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[".tag"]).Равно("complete");
+КонецПроцедуры
+
+Процедура Проверка_ДропБоксТеги(Знач Результат, Знач Количество)
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["paths_to_tags"]).ИмеетТип("Массив");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["paths_to_tags"].Количество()).Равно(Количество);
+
+КонецПроцедуры
+
+Процедура Проверка_ДропбоксАккаунт(Знач Результат)
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["account_id"]).Заполнено();
+КонецПроцедуры
+
+Процедура Проверка_ДропбоксПространство(Знач Результат)
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["used"]).Заполнено();
+КонецПроцедуры
+
+Процедура Проверка_ДропбоксУчастник(Знач Результат, Знач Почта, Знач ТолькоПросмотр)
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[0]["result"][".tag"]).Равно("success");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[0]["member"]["email"]).Равно(Почта);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(
+ Результат[0]["result"]["success"][".tag"]).Равно(?(ТолькоПросмотр, "viewer", "editor"));
+КонецПроцедуры
+
+Процедура Проверка_ДропбоксПубличнаяПапка(Знач Результат)
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["shared_folder_id"]).Заполнено();
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область АтомарныеТесты
+
+#Область Telegram
+
+Процедура Telegram_ПолучитьИнформациюБота(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Результат = OPI_Telegram.ПолучитьИнформациюБота(Токен);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюБота", "Telegram");
+
+ Проверка_ТелеграмИнформацияБота(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ПолучитьОбновления(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Результат = OPI_Telegram.ПолучитьОбновления(Токен);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбновления", "Telegram");
+
+ Проверка_ТелеграмМассив(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_УстановитьWebhook(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ URL = ПараметрыФункции["Telegram_URL"];
+
+ Результат = OPI_Telegram.УстановитьWebhook(Токен, URL);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьWebhook", "Telegram");
+
+ Проверка_ТелеграмУстановкаВебхук(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_УдалитьWebhook(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Результат = OPI_Telegram.УдалитьWebhook(Токен);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьWebhook", "Telegram");
+
+ Проверка_ТелеграмУдалениеВебхук(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьТекстовоеСообщение(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ Текст = ПараметрыФункции["String"];
+
+ Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDЧата, Текст);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение", "Telegram");
+
+ Проверка_ТелеграмСообщение(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDКанала, Текст);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение (канал)");
+
+ Проверка_ТелеграмСообщение(Результат, Текст);
+
+ IDСообщения = OPI_Инструменты.ЧислоВСтроку(Результат["result"]["message_id"]);
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_ChannelMessageID", IDСообщения);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьКартинку(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ Текст = ПараметрыФункции["String"];
+ Картинка = ПараметрыФункции["Picture"];
+
+ КартинкаПуть = ПолучитьИмяВременногоФайла("png");
+ КопироватьФайл(Картинка, КартинкаПуть);
+
+ КартинкаДД = Новый ДвоичныеДанные(КартинкаПуть);
+
+ Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDЧата, Текст, Картинка);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку", "Telegram");
+
+ Проверка_ТелеграмКартинка(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаПуть);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку (Путь)");
+
+ Проверка_ТелеграмКартинка(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаДД);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку (ДД)");
+
+ Проверка_ТелеграмКартинка(Результат, Текст);
+
+ УдалитьФайлы(КартинкаПуть);
+
+ IDФайла = Результат["result"]["photo"][0]["file_id"];
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла);
+
+ ПараметрыФункции.Вставить("Telegram_FileID", IDФайла);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьВидео(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ Текст = ПараметрыФункции["String"];
+ Видео = ПараметрыФункции["Video"];
+
+ ВидеоПуть = ПолучитьИмяВременногоФайла("mp4");
+ КопироватьФайл(Видео, ВидеоПуть);
+
+ ВидеоДД = Новый ДвоичныеДанные(ВидеоПуть);
+
+ Результат = OPI_Telegram.ОтправитьВидео(Токен, IDЧата, Текст, Видео);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео", "Telegram");
+
+ Проверка_ТелеграмВидео(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоПуть);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео (Путь)");
+
+ Проверка_ТелеграмВидео(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоДД);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео (ДД)");
+
+ Проверка_ТелеграмВидео(Результат, Текст);
+
+ УдалитьФайлы(ВидеоПуть);
+
+ IDФайла = Результат["result"]["video"]["file_id"];
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла);
+
+ ПараметрыФункции.Вставить("Telegram_FileID", IDФайла);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьАудио(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ Текст = ПараметрыФункции["String"];
+ Аудио = ПараметрыФункции["Audio"];
+
+ АудиоПуть = ПолучитьИмяВременногоФайла("mp3");
+ КопироватьФайл(Аудио, АудиоПуть);
+
+ АудиоДД = Новый ДвоичныеДанные(АудиоПуть);
+
+ Результат = OPI_Telegram.ОтправитьАудио(Токен, IDЧата, Текст, Аудио);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио", "Telegram");
+
+ Проверка_ТелеграмАудио(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоПуть);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио (Путь)");
+
+ Проверка_ТелеграмАудио(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоДД);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио (ДД)");
+
+ Проверка_ТелеграмАудио(Результат, Текст);
+
+ УдалитьФайлы(АудиоПуть);
+
+ IDФайла = Результат["result"]["audio"]["file_id"];
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_FileID", IDФайла);
+
+ ПараметрыФункции.Вставить("Telegram_FileID", IDФайла);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьДокумент(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ Текст = ПараметрыФункции["String"];
+ Документ = ПараметрыФункции["Document"];
+
+ ДокументПуть = ПолучитьИмяВременногоФайла("docx");
+ КопироватьФайл(Документ, ДокументПуть);
+
+ ДокументДД = Новый ДвоичныеДанные(ДокументПуть);
+
+ Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDЧата, Текст, Документ);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент", "Telegram");
+
+ Проверка_ТелеграмДокумент(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументПуть);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (Путь)");
+
+ Проверка_ТелеграмДокумент(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументДД);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (ДД)");
+
+ Проверка_ТелеграмДокумент(Результат, Текст);
+
+ УдалитьФайлы(ДокументПуть);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьГифку(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ Текст = ПараметрыФункции["String"];
+ Гифка = ПараметрыФункции["GIF"];
+
+ ГифкаПуть = ПолучитьИмяВременногоФайла("gif");
+ КопироватьФайл(Гифка, ГифкаПуть);
+
+ ГифкаДД = Новый ДвоичныеДанные(ГифкаПуть);
+
+ Результат = OPI_Telegram.ОтправитьГифку(Токен, IDЧата, Текст, Гифка);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку", "Telegram");
+
+ Проверка_ТелеграмГифка(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаПуть);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (Путь)");
+
+ Проверка_ТелеграмГифка(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаДД);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (ДД)");
+
+ Проверка_ТелеграмГифка(Результат, Текст);
+
+ УдалитьФайлы(ГифкаПуть);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьМеидагруппу(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ Текст = ПараметрыФункции["String"];
+ Картинка = ПараметрыФункции["Picture"];
+ Видео = ПараметрыФункции["Video"];
+
+ КартинкаПуть = ПолучитьИмяВременногоФайла("png");
+ КопироватьФайл(Картинка, КартинкаПуть);
+
+ ВидеоПуть = ПолучитьИмяВременногоФайла("mp4");
+ КопироватьФайл(Видео, ВидеоПуть);
+
+ ВидеоДД = Новый ДвоичныеДанные(ВидеоПуть);
+
+ Медиагруппа = Новый Соответствие;
+ Медиагруппа.Вставить(КартинкаПуть, "photo");
+ Медиагруппа.Вставить(ВидеоДД , "video");
+
+ Результат = OPI_Telegram.ОтправитьМедиагруппу(Токен, IDЧата, Текст, Медиагруппа);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМедиагруппу", "Telegram");
+
+ Проверка_ТелеграмМедиагруппа(Результат);
+
+ УдалитьФайлы(ВидеоПуть);
+ УдалитьФайлы(КартинкаПуть);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьМестоположение(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ Ширина = ПараметрыФункции["Lat"];
+ Долгота = ПараметрыФункции["Long"];
+
+ Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDЧата, Ширина, Долгота);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение", "Telegram");
+
+ Проверка_ТелеграмМестоположение(Результат); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDКанала, Ширина, Долгота);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение (канал)");
+
+ Проверка_ТелеграмМестоположение(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьКонтакт(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ Имя = ПараметрыФункции["Name"];
+ Фамилия = ПараметрыФункции["Surname"];
+ Телефон = ПараметрыФункции["Phone"];
+
+ Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDЧата , Имя, Фамилия, Телефон);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт", "Telegram");
+
+ Проверка_ТелеграмКонтакт(Результат, Имя); // SKIP
+ OPI_Инструменты.Пауза(20); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDКанала, Имя, Фамилия, Телефон);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт (канал)");
+
+ Проверка_ТелеграмКонтакт(Результат, Имя);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьОпрос(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ Вопрос = "Какой ваш любимый цвет?";
+
+ МассивОтветов = Новый Массив;
+ МассивОтветов.Добавить("Красный");
+ МассивОтветов.Добавить("Желтый");
+ МассивОтветов.Добавить("Зеленый");
+ МассивОтветов.Добавить("Синий");
+
+ Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDЧата , Вопрос, МассивОтветов, Ложь);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос", "Telegram");
+
+ Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, МассивОтветов, Истина);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (канал)");
+
+ Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP
+
+ // END
+
+ СтрочныйМассив = "['Красный', 'Желтый','Зеленый' ,'Синий']";
+
+ Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, СтрочныйМассив, Истина);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (строчный массив)");
+
+ Проверка_ТелеграмОпрос(Результат, Вопрос);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_СкачатьФайл(ПараметрыФункции)
+
+ IDФайла = ПараметрыФункции["Telegram_FileID"];
+ Токен = ПараметрыФункции["Telegram_Token"];
+
+ Результат = OPI_Telegram.СкачатьФайл(Токен, IDФайла);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Telegram");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные");
+
+КонецПроцедуры
+
+Процедура Telegram_ПереслатьСообщение(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"];
+
+ Результат = OPI_Telegram.ПереслатьСообщение(Токен, IDСообщения, IDКанала, IDЧата);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереслатьСообщение", "Telegram");
+
+ Проверка_ТелеграмПереслать(Результат, IDСообщения);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_Бан(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDПользователя = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+
+ Результат = OPI_Telegram.Бан(Токен, IDКанала, IDПользователя);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Бан", "Telegram");
+
+ Проверка_ТелеграмБан(Результат);
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_Разбан(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDПользователя = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+
+ Результат = OPI_Telegram.Разбан(Токен, IDКанала, IDПользователя);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Разбан", "Telegram");
+
+ Проверка_ТелеграмБан(Результат);
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_СоздатьСсылкуПриглашение(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ Сутки = 86400;
+ ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
+
+ Заголовок = "Ссылка " + Строка(ТекущаяДата);
+ Истечение = ТекущаяДата + Сутки;
+ UnixИстечение = OPI_Инструменты.UNIXTime(Истечение);
+
+ Результат = OPI_Telegram.СоздатьСсылкуПриглашение(Токен, IDКанала, Заголовок, Истечение, 200);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПриглашение", "Telegram");
+
+ Проверка_ТелеграмПриглашение(Результат, Заголовок, UnixИстечение);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ЗакрепитьСообщение(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"];
+
+ Результат = OPI_Telegram.ЗакрепитьСообщение(Токен, IDКанала, IDСообщения);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрепитьСообщение", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОткрепитьСообщение(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"];
+
+ Результат = OPI_Telegram.ОткрепитьСообщение(Токен, IDКанала, IDСообщения);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрепитьСообщение", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ПолучитьЧислоУчастников(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+
+ Результат = OPI_Telegram.ПолучитьЧислоУчастников(Токен, IDКанала);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЧислоУчастников", "Telegram");
+
+ Проверка_ТелеграмЧисло(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ПолучитьСписокАватаровФорума(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Результат = OPI_Telegram.ПолучитьСписокИконокАватаров(Токен);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокИконокАватаров", "Telegram");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_СоздатьТемуФорума(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+ Иконка = "5357419403325481346";
+ Имя = "Тестовая тема " + Строка(Новый УникальныйИдентификатор);
+
+ Результат = OPI_Telegram.СоздатьТемуФорума(Токен, Чат, Имя, Иконка);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТемуФорума", "Telegram");
+
+ Тема = Результат["result"]["message_thread_id"];
+
+ ПараметрыФункции.Вставить("Telegram_TopicID", Тема);
+ OPI_Инструменты.ДобавитьПоле("Telegram_TopicID", Тема, "Строка", ПараметрыФункции);
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_TopicID", ПараметрыФункции["Telegram_TopicID"]);
+
+ Проверка_ТелеграмСозданиеТемы(Результат, Имя, Иконка);
+
+ ЧатТема = Чат + "*" + Тема;
+ Текст = ПараметрыФункции["String"];
+ Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, ЧатТема, Текст);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение (форум)");
+
+ Проверка_ТелеграмСообщение(Результат, Текст);
+
+КонецПроцедуры
+
+Процедура Telegram_ИзменитьТемуФорума(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+ Тема = ПараметрыФункции["Telegram_TopicID"];
+ НовоеИмя = "Новый тестовый заголовок";
+ НовяИконка = "5310132165583840589";
+
+ Результат = OPI_Telegram.ИзменитьТемуФорума(Токен, Чат, Тема, НовоеИмя, НовяИконка);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТемуФорума", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ЗакрытьТемуФорума(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+ Тема = ПараметрыФункции["Telegram_TopicID"];
+
+ OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // SKIP
+
+ Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат); // Закрывает главную тему
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума (главная)");
+
+ Проверка_ТелеграмИстина(Результат); // SKIP
+
+ Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат, Тема);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(25);
+
+КонецПроцедуры
+
+Процедура Telegram_ОткрытьТемуФорума(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+ Тема = ПараметрыФункции["Telegram_TopicID"];
+
+ Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // Открывает главную тему
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума (главная)");
+
+ Проверка_ТелеграмИстина(Результат); // SKIP
+
+ Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат, Тема);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(25);
+
+КонецПроцедуры
+
+Процедура Telegram_УдалитьТемуФорума(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+ Тема = ПараметрыФункции["Telegram_TopicID"];
+
+ Результат = OPI_Telegram.УдалитьТемуФорума(Токен, Чат, Тема);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТемуФорума", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(25);
+
+КонецПроцедуры
+
+Процедура Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+ Тема = ПараметрыФункции["Telegram_TopicID"];
+
+ Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы (главная)");
+
+ Проверка_ТелеграмИстина(Результат); // SKIP
+
+ Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат, Тема);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_СкрытьГлавнуюТемуФорума(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+
+ Результат = OPI_Telegram.СкрытьГлавнуюТемуФорума(Токен, Чат);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкрытьГлавнуюТемуФорума", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ПоказатьГлавнуюТемуФорума(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+
+ Результат = OPI_Telegram.ПоказатьГлавнуюТемуФорума(Токен, Чат);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоказатьГлавнуюТемуФорума", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ИзменитьИмяГлавнойТемыФорума(ПараметрыФункции)
+
+ Заголовок = "Новое имя главной темы " + Строка(Новый УникальныйИдентификатор);
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+
+ Результат = OPI_Telegram.ИзменитьИмяГлавнойТемыФорума(Токен, Чат, Заголовок);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьИмяГлавнойТемыФорума", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область VK
+
+Процедура VK_СоздатьСсылкуПолученияТокена(ПараметрыФункции)
+
+ Приложение = ПараметрыФункции["VK_AppID"];
+ Результат = OPI_VK.СоздатьСсылкуПолученияТокена(Приложение);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПолученияТокена", "VK");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_СоздатьПост(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ Текст = "Пост из автотеста";
+ URL = "https://github.com/Bayselonarrend/OpenIntegrations";
+
+ Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные
+ Картинка2 = ПараметрыФункции["Picture2"]; // URL, Путь или Двоичные данные
+
+ ИВФ = ПолучитьИмяВременногоФайла("png");
+ КопироватьФайл(Картинка2, ИВФ);
+
+ МассивКартинок = Новый Массив;
+ МассивКартинок.Добавить(Картинка);
+ МассивКартинок.Добавить(ИВФ);
+
+ Результат = OPI_VK.СоздатьПост(Текст, МассивКартинок, Истина, URL, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост", "VK");
+
+ Проверка_ВКПост(Результат); // SKIP
+ ИДПоста = Результат["response"]["post_id"]; // SKIP
+ Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); // SKIP
+
+ Результат = OPI_VK.СоздатьПост(Текст, Картинка, Ложь , , Параметры);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (одна картинка)");
+
+ Проверка_ВКПост(Результат);
+
+ ИДПоста = Результат["response"]["post_id"];
+ Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры);
+
+ OPI_Инструменты.Пауза(5);
+
+ Результат = OPI_VK.СоздатьПост(Текст, ИВФ , Истина, URL, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (один путь)");
+
+ Проверка_ВКПост(Результат);
+
+ ИДПоста = Результат["response"]["post_id"];
+ OPI_Инструменты.ДобавитьПоле("VK_PostID", ИДПоста, "Строка", ПараметрыФункции);
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PostID", ПараметрыФункции["VK_PostID"]);
+
+ УдалитьФайлы(ИВФ);
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_УдалитьПост(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ ИДПоста = ПараметрыФункции["VK_PostID"];
+
+ Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьПост", "VK");
+
+ Проверка_ВКИстина(Результат);
+
+КонецПроцедуры
+
+Процедура VK_СоздатьСоставнойПост(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ Текст = "Пост из автотеста";
+ URL = "https://github.com/Bayselonarrend/OpenIntegrations";
+
+ Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные
+ Видео = ПараметрыФункции["Video"]; // URL, Путь или Двоичные данные
+
+ ИВФ = ПолучитьИмяВременногоФайла("png");
+ КопироватьФайл(Картинка, ИВФ);
+
+ ЗагрузкаКартинки = OPI_VK.ЗагрузитьФотоНаСервер(ИВФ, Параметры)["response"][0];
+ ЗагрузкаВидео = OPI_VK.ЗагрузитьВидеоНаСервер(Видео, "Новое видео", , , Параметры);
+
+ ВладелецКартинки = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаКартинки["owner_id"]);
+ ВладелецВидео = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаВидео["owner_id"]);
+
+ IDКартинки = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаКартинки["id"]);
+ IDВидео = OPI_Инструменты.ЧислоВСтроку(ЗагрузкаВидео["video_id"]);
+
+ МассивВложений = Новый Массив;
+ МассивВложений.Добавить("photo" + ВладелецКартинки + "_" + IDКартинки);
+ МассивВложений.Добавить("video" + ВладелецВидео + "_" + IDВидео);
+
+ Результат = OPI_VK.СоздатьСоставнойПост(Текст, МассивВложений, Ложь, URL, Параметры);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСоставнойПост", "VK");
+
+ Проверка_ВКПост(Результат);
+ УдалитьФайлы(ИВФ);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_СоздатьОпрос()
+
+ Параметры = ПолучитьПараметрыВК();
+ Вопрос = "Какой ваш любимый цвет?";
+
+ МассивВариантов = Новый Массив;
+ МассивВариантов.Добавить("Красный");
+ МассивВариантов.Добавить("Желтый");
+ МассивВариантов.Добавить("Зеленый");
+
+ Результат = OPI_VK.СоздатьОпрос(Вопрос, МассивВариантов, , Параметры);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОпрос", "VK");
+
+ Проверка_ВКПост(Результат);
+
+ ИДПоста = Результат["response"]["post_id"];
+ OPI_VK.УдалитьПост(ИДПоста, Параметры);
+
+ OPI_Инструменты.Пауза(10);
+
+КонецПроцедуры
+
+Процедура VK_СоздатьАльбом(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ Имя = "Альбом из автотеста";
+ Описание = "Новый альбом из автотеста";
+
+ Результат = OPI_VK.СоздатьАльбом(Имя, Описание, Параметры);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьАльбом", "VK");
+
+ Проверка_ВКАльбом(Результат, Описание);
+
+ ИДАльбома = Результат["response"]["id"];
+ ПараметрыФункции.Вставить("VK_AlbumID", ИДАльбома);
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_AlbumID", ИДАльбома);
+
+КонецПроцедуры
+
+Процедура VK_СохранитьКартинкуВАльбом(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ ОписаниеКартинки = "Картинка автотест";
+ ИДАльбома = ПараметрыФункции["VK_AlbumID"];
+
+ Картинка = ПараметрыФункции["Picture"]; // URL, Путь к файлу или Двоичные данные
+ ИВФ = ПолучитьИмяВременногоФайла("png");
+ КопироватьФайл(Картинка, ИВФ);
+
+ Картинка = Новый ДвоичныеДанные(ИВФ);
+
+ Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, Картинка, ОписаниеКартинки, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом", "VK");
+
+ Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP
+
+ ИДКартинки = Результат["response"][0]["id"]; // SKIP
+ Результат = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры); // SKIP
+
+ Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, ИВФ, ОписаниеКартинки, Параметры);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом (путь)");
+
+ Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP
+
+ ИДКартинки = Результат["response"][0]["id"];
+ ПараметрыФункции.Вставить("VK_PictureID", ИДКартинки);
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PictureID", ИДКартинки);
+
+ УдалитьФайлы(ИВФ);
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_УдалитьКартинку(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ ИДКартинки = ПараметрыФункции["VK_PictureID"];
+
+ Результат = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКартинку", "VK");
+
+ Проверка_ВКИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_УдалитьАльбом(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ ИДАльбома = ПараметрыФункции["VK_AlbumID"];
+
+ Результат = OPI_VK.УдалитьАльбом(ИДАльбома, Параметры);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьАльбом", "VK");
+
+ Проверка_ВКИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_СоздатьИсторию(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ URL = "https://github.com/Bayselonarrend/OpenIntegrations";
+
+ Картинка = ПараметрыФункции["Picture"]; // URL, Путь к файлу или Двоичные данные
+ ИВФ = ПолучитьИмяВременногоФайла("png");
+ КопироватьФайл(Картинка, ИВФ);
+ Картинка = Новый ДвоичныеДанные(ИВФ);
+
+ Результат = OPI_VK.СоздатьИсторию(Картинка , URL, Параметры);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию", "VK");
+
+ Проверка_ВКИстория(Результат); // SKIP
+
+ Результат = OPI_VK.СоздатьИсторию(ИВФ, , Параметры);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию (путь)");
+
+ Проверка_ВКИстория(Результат);
+
+ УдалитьФайлы(ИВФ);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_СоздатьОбсуждение(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ Название = "Обсуждаем: какой цвет лучше?";
+ Сообщение = "Красный, желтый, синий или какой-то другой?";
+
+ Результат = OPI_VK.СоздатьОбсуждение(Название, Сообщение, Параметры);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОбсуждение", "VK");
+
+ Проверка_ВКОбсуждение(Результат);
+
+ ИДОбсуждения = Результат["response"];
+ ПараметрыФункции.Вставить("VK_ConvID", ИДОбсуждения);
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_ConvID", ИДОбсуждения);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_ЗакрытьОбсуждение(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ ИДОбсуждения = ПараметрыФункции["VK_ConvID"];
+ Результат = OPI_VK.ЗакрытьОбсуждение(ИДОбсуждения, Ложь, Параметры);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьОбсуждение", "VK");
+
+ Проверка_ВКИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_ОткрытьОбсуждение(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ ИДОбсуждения = ПараметрыФункции["VK_ConvID"];
+ Результат = OPI_VK.ОткрытьОбсуждение(ИДОбсуждения, Параметры);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьОбсуждение", "VK");
+
+ Проверка_ВКИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_НаписатьВОбсуждение(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ ИДОбсуждения = ПараметрыФункции["VK_ConvID"];
+ Сообщение = "Мне больше нравится желтый";
+
+ Результат = OPI_VK.НаписатьВОбсуждение(ИДОбсуждения, Сообщение, Параметры);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьВОбсуждение", "VK");
+
+ Проверка_ВКОбсуждение(Результат);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Dropbox
+
+Процедура Dropbox_ПолучитьСсылкуАвторизации(ПараметрыФункции)
+
+ КлючПриложения = ПараметрыФункции["Dropbox_Appkey"];
+ Результат = OPI_Dropbox.ПолучитьСсылкуАвторизации(КлючПриложения);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуАвторизации", "Dropbox");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка");
+
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьТокен(ПараметрыФункции)
+
+ КлючПриложения = ПараметрыФункции["Dropbox_Appkey"];
+ СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"];
+ Код = ПараметрыФункции["Dropbox_Code"];
+
+ Результат = OPI_Dropbox.ПолучитьТокен(КлючПриложения, СекретПриложения, Код);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТокен");
+
+ Токен = Результат["access_token"];
+ Рефреш = Результат["refresh_token"];
+
+ Если ЗначениеЗаполнено(Токен) Тогда
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен);
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(Рефреш) Тогда
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Refresh", Рефреш);
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура Dropbox_ОбновитьТокен(ПараметрыФункции)
+
+ КлючПриложения = ПараметрыФункции["Dropbox_Appkey"];
+ СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"];
+ РефрешТокен = ПараметрыФункции["Dropbox_Refresh"];
+
+ Результат = OPI_Dropbox.ОбновитьТокен(КлючПриложения, СекретПриложения, РефрешТокен);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьТокен");
+
+ Токен = Результат["access_token"];
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Токен).Заполнено();
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен);
+
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьИнформациюОбОбъекте(ПараметрыФункции)
+
+ Путь = "/New/pic.png";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+
+ Результат = OPI_Dropbox.ПолучитьИнформациюОбОбъекте(Токен, Путь, Истина);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбОбъекте", "Dropbox");
+
+ Проверка_ДропБоксФайл(Результат, Путь);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьПревью(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/New/mydoc.docx";
+
+ Результат = OPI_Dropbox.ПолучитьПревью(Токен, Путь);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПревью", "Dropbox");
+
+ Проверка_ДвоичныеДанные(Результат, 190834);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ЗагрузитьФайл(ПараметрыФункции)
+
+ Путь = "/New/pic.png";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Картинка = ПараметрыФункции["Picture"];
+
+ КартинкаПуть = ПолучитьИмяВременногоФайла("png");
+ КопироватьФайл(Картинка, КартинкаПуть);
+
+ Результат = OPI_Dropbox.ЗагрузитьФайл(Токен, КартинкаПуть, Путь, Истина);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл", "Dropbox");
+
+ Проверка_ДропБоксФайл(Результат, Путь);
+ УдалитьФайлы(КартинкаПуть);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ЗагрузитьФайлПоURL(ПараметрыФункции)
+
+ Путь = "/New/url_doc.docx";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ URL = ПараметрыФункции["Document"];
+
+ Результат = OPI_Dropbox.ЗагрузитьФайлПоURL(Токен, URL, Путь);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайлПоURL", "Dropbox");
+
+ Проверка_ДропБоксРабота(Результат);
+
+ Работа = Результат["async_job_id"];
+
+ ПараметрыФункции.Вставить("Dropbox_Job", Работа);
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Job", Работа);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьСтатусЗагрузкиПоURL(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ ИДРаботы = ПараметрыФункции["Dropbox_Job"];
+ Статус = "in_progress";
+
+ Пока Статус = "in_progress" Цикл
+
+ Результат = OPI_Dropbox.ПолучитьСтатусЗагрузкиПоURL(Токен, ИДРаботы);
+ Статус = Результат[".tag"];
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатусЗагрузкиПоURL", "Dropbox");
+
+ КонецЦикла;
+
+ // END
+
+ Проверка_ДропБоксСтатус(Результат);
+
+ Путь = "/New/url_doc.docx";
+ Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь);
+
+ Проверка_ДропБоксМетаданные(Результат, Путь);
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_УдалитьОбъект(ПараметрыФункции)
+
+ Путь = "/New/pic.png";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+
+ Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект", "Dropbox");
+
+ Проверка_ДропБоксМетаданные(Результат, Путь);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_КопироватьОбъект(ПараметрыФункции)
+
+ Оригинал = "/New/pic.png";
+ Копия = "/New/pic_copy.png";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+
+ Результат = OPI_Dropbox.КопироватьОбъект(Токен, Оригинал, Копия);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьОбъект", "Dropbox");
+
+ Проверка_ДропБоксМетаданные(Результат, Копия);
+
+ Результат = OPI_Dropbox.УдалитьОбъект(Токен, Копия);
+ Проверка_ДропБоксМетаданные(Результат, Копия);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ПереместитьОбъект(ПараметрыФункции)
+
+ ОригиналныйПуть = "/New/pic.png";
+ ЦелевойПуть = "/pic.png";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+
+ Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ОригиналныйПуть, ЦелевойПуть);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Dropbox_ПереместитьОбъект", "Dropbox");
+
+ Проверка_ДропБоксМетаданные(Результат, ЦелевойПуть);
+
+ Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ЦелевойПуть, ОригиналныйПуть);
+ Проверка_ДропБоксМетаданные(Результат, ОригиналныйПуть);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_СоздатьПапку(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/Новый каталог";
+
+ Результат = OPI_Dropbox.СоздатьПапку(Токен, Путь);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку", "Dropbox");
+
+ Проверка_ДропБоксМетаданные(Результат, Путь);
+
+ Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь);
+ Проверка_ДропБоксМетаданные(Результат, Путь);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_СкачатьФайл(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/New/pic.png";
+
+ Результат = OPI_Dropbox.СкачатьФайл(Токен, Путь);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Dropbox");
+
+ Проверка_ДвоичныеДанные(Результат, 2114023);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_СкачатьПапку(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/New";
+
+ Результат = OPI_Dropbox.СкачатьПапку(Токен, Путь);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьПапку", "Dropbox");
+
+ Проверка_ДвоичныеДанные(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьСписокФайловПапки(ПараметрыФункции)
+
+ Путь = "/New";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+
+ Результат = OPI_Dropbox.ПолучитьСписокФайловПапки(Токен, Путь, Истина);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайловПапки", "Dropbox");
+
+ Проверка_ДропБоксМассив(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьСписокВерсийОбъекта(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/New/pic.png";
+
+ Результат = OPI_Dropbox.ПолучитьСписокВерсийОбъекта(Токен, Путь, 1);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВерсийОбъекта", "Dropbox");
+
+ Проверка_ДропБоксМассив(Результат, 1);
+
+ Ревизия = Результат["entries"][0]["rev"];
+
+ ПараметрыФункции.Вставить("Dropbox_FileRevision", Ревизия);
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_FileRevision", Ревизия);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ВосстановитьОбъектКВерсии(ПараметрыФункции)
+
+ Версия = ПараметрыФункции["Dropbox_FileRevision"];
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/New/pic.png";
+
+ Результат = OPI_Dropbox.ВосстановитьОбъектКВерсии(Токен, Путь, Версия);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВосстановитьОбъектКВерсии", "Dropbox");
+
+ Проверка_ДропБоксФайл(Результат, Путь);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ПолчитьСписокТегов(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+
+ МассивПутей = Новый Массив;
+ МассивПутей.Добавить("/New/Dogs.mp3");
+ МассивПутей.Добавить("/New/mydoc.docx");
+
+ Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, МассивПутей);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов", "Dropbox");
+
+ Проверка_ДропБоксТеги(Результат, МассивПутей.Количество());
+
+ Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, "/New/mydoc.docx");
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов (одиночный)");
+
+ Проверка_ДропБоксТеги(Результат, 1);
+
+ ЕстьТег = Ложь;
+
+ Для Каждого Тег Из Результат["paths_to_tags"][0]["tags"] Цикл
+ Если Тег["tag_text"] = "важное" Тогда
+ ЕстьТег = Истина;
+ КонецЕсли;
+ КонецЦикла;
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЕстьТег).Равно(Истина);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ДобавитьТег(ПараметрыФункции)
+
+ Тег = "Важное";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/New/mydoc.docx";
+
+ Результат = OPI_Dropbox.ДобавитьТег(Токен, Путь, Тег);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТег", "Dropbox");
+
+ Проверка_Пусто(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_УдалитьТег(ПараметрыФункции)
+
+ Тег = "Важное";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/New/mydoc.docx";
+
+ Результат = OPI_Dropbox.УдалитьТег(Токен, Путь, Тег);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТег", "Dropbox");
+
+ Проверка_Пусто(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьИнформациюОбАккаунте(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+
+ Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте", "Dropbox");
+
+ Проверка_ДропбоксАккаунт(Результат);
+
+ Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен, Результат["account_id"]);
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте (сторонний)");
+
+ Проверка_ДропбоксАккаунт(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьДанныеИспользованияПространства(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+
+ Результат = OPI_Dropbox.ПолучитьДанныеИспользованияПространства(Токен);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеИспользованияПространства", "Dropbox");
+
+ Проверка_ДропбоксПространство(Результат);
+
+КонецПроцедуры
+
+Процедура Dropbox_ДобавитьПользователейКФайлу(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Почта = ПараметрыФункции["Dropbox_OtherUser"];
+ Файл = ПараметрыФункции["Dropbox_FileID"];
+
+ Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почта, Ложь);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox");
+
+ Проверка_ДропбоксУчастник(Результат, Почта, Ложь);
+
+ Почты = Новый Массив;
+ Почты.Добавить(Почта);
+
+ Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почты, Истина);
+
+ Проверка_ДропбоксУчастник(Результат, Почта, Истина);
+
+КонецПроцедуры
+
+Процедура Dropbox_ОпубликоватьПапку(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/New";
+
+ Результат = OPI_Dropbox.ОпубликоватьПапку(Токен, Путь);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОпубликоватьПапку", "Dropbox");
+
+ Проверка_ДропБоксПубличнаяПапка(Результат);
+
+ IDПапки = Результат["shared_folder_id"];
+
+ ПараметрыФункции.Вставить("Dropbox_SharedFolder", IDПапки);
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_SharedFolder", IDПапки);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ОтменитьПубликациюПапки(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Папка = ПараметрыФункции["Dropbox_SharedFolder"];
+
+ Результат = OPI_Dropbox.ОтменитьПубликациюПапки(Токен, Папка);
+ ТекущийСтатус = "in_progress";
+ IDРаботы = Результат["async_job_id"];
+
+ Пока ТекущийСтатус = "in_progress" Цикл
+ Результат = OPI_Dropbox.ПолучитьСтатусАсинхронногоИзменения(Токен, IDРаботы);
+ ТекущийСтатус = Результат[".tag"];
+ OPI_Инструменты.Пауза(3);
+ КонецЦикла;
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюПапки", "Dropbox");
+
+ Проверка_ДропБоксСтатус(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ДобавитьПользователейКПапке(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Почта = ПараметрыФункции["Dropbox_OtherUser"];
+ Папка = ПараметрыФункции["Dropbox_SharedFolder"]; // shared_folder_id
+
+ Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почта, Ложь);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox");
+
+ Проверка_Пусто(Результат);
+
+ Почты = Новый Массив;
+ Почты.Добавить(Почта);
+
+ Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почты, Истина);
+
+ Проверка_Пусто(Результат);
+
+КонецПроцедуры
+
+Процедура Dropbox_ОтменитьПубликациюФайла(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Файл = ПараметрыФункции["Dropbox_FileID"];
+
+ Результат = OPI_Dropbox.ОтменитьПубликациюФайла(Токен, Файл);
+
+ // END
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюФайла", "Dropbox");
+
+ Проверка_Пусто(Результат);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
+
+#КонецОбласти
diff --git a/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os b/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
index 4f09822b81..5356f23c1e 100644
--- a/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
+++ b/ru/OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
@@ -1,470 +1,470 @@
-// Расположение OS: ./OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:UsingHardcodePath-off
-// BSLLS:Typo-off
-// BSLLS:DeprecatedMessage-off
-// BSLLS:UsingServiceTag-off
-// BSLLS:ExecuteExternalCodeInCommonModule-off
-// BSLLS:DuplicateStringLiteral-off
-
-//@skip-check use-non-recommended-method
-
-// Раскомментировать, если выполняется OneScript
-#Использовать "./internal"
-#Использовать asserts
-
-#Область СлужебныйПрограммныйИнтерфейс
-
-Функция ПолучитьСоответствиеРазделовТестирования() Экспорт
-
- СтандартныеЗависимости = "[Decode, Build]";
- ЗависимостиГугл = "Testing-GoogleWorkspace";
-
- Разделы = Новый Структура;
- Разделы.Вставить("Telegram" , СтандартныеЗависимости);
- Разделы.Вставить("VK" , СтандартныеЗависимости);
- Разделы.Вставить("Viber" , СтандартныеЗависимости);
- Разделы.Вставить("Twitter" , СтандартныеЗависимости);
- Разделы.Вставить("YandexDisk" , СтандартныеЗависимости);
- Разделы.Вставить("GoogleWorkspace", СтандартныеЗависимости);
- Разделы.Вставить("GoogleCalendar" , ЗависимостиГугл);
- Разделы.Вставить("GoogleDrive" , ЗависимостиГугл);
- Разделы.Вставить("GoogleSheets" , ЗависимостиГугл);
- Разделы.Вставить("Notion" , СтандартныеЗависимости);
- Разделы.Вставить("Slack" , СтандартныеЗависимости);
- Разделы.Вставить("Airtable" , СтандартныеЗависимости);
- Разделы.Вставить("Dropbox" , СтандартныеЗависимости);
-
- Возврат Разделы;
-
-КонецФункции
-
-Функция ПолучитьТаблицуТестов() Экспорт
-
- Телеграм = "Telegram";
- ВКонтакте = "VK";
- ЯДиск = "YandexDisk";
- Календарь = "GoogleCalendar";
- Твиттер = "Twitter";
- Вайбер = "Viber";
- Драйв = "GoogleDrive";
- ВСпейс = "GoogleWorkspace";
- Ноушн = "Notion";
- Слак = "Slack";
- Таблицы = "GoogleSheets";
- АирТ = "Airtable";
- ДропБокс = "Dropbox";
-
- ТаблицаТестов = Новый ТаблицаЗначений;
- ТаблицаТестов.Колонки.Добавить("Метод");
- ТаблицаТестов.Колонки.Добавить("Синоним");
- ТаблицаТестов.Колонки.Добавить("Раздел");
-
- НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьИнформациюБота" , "Получить информацию бота" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьОбновления" , "Получить обновления" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_УстановитьWebhook" , "Установить Webhook" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьТекстовоеСообщение" , "Отправить текстовое сообщение" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКартинку" , "Отправить картинку" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьВидео" , "Отправить видео" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьАудио" , "Отправить аудио" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьДокумент" , "Отправить документ" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьГифку" , "Отправить гифку" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьМедиагруппу" , "Отправить медиагруппу" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьМестоположение" , "Отправить местоположение" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКонтакт" , "Отправить контакт" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьОпрос" , "Отправить опрос" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_ПереслатьСообщение" , "Переслать сообщение" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_БанРазбан" , "Бан/Разбан" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_СоздатьСсылкуПриглашение" , "Создать ссылку-приглашение" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_ЗакрепитьОткрепитьСообщение" , "Закрепить/Открепить сообщение" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьЧислоУчастников" , "Получить число участников" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьСписокАватаровФорума", "Получить список аватаров форума", Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_СоздатьУдалитьТемуФорума" , "Создать/Удалить тему форума" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_ИзменитьИмяГлавнойТемы" , "Изменить имя главной темы" , Телеграм);
- НовыйТест(ТаблицаТестов, "Телеграм_СкрытьПоказатьГлавнуюТему" , "Скрыть/Показать главную тему" , Телеграм);
-
- НовыйТест(ТаблицаТестов, "ВК_СоздатьСсылкуТокена" , "Создать ссылку получения токена", ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_СоздатьУдалитьПост" , "Создать/Удалить пост" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_СоздатьСоставнойПост" , "Создать/Удалить составной пост" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_СоздатьОпрос" , "Создать опрос" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_СохранитьУдалитьКартинку" , "Добавить/Удалить картинку" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_СоздатьИсторию" , "Создать историю" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_МетодыОбсуждений" , "Действия с обсуждениями" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_ЛайкРепостКоммент" , "Лайк/Репост/Комментарий" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_ПолучитьСтатистику" , "Получить статистику" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_ПолучитьСтатистикуПостов" , "Получить статистику постов" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_СоздатьРекламнуюКампанию" , "Создать рекламную кампанию" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_ОтправитьСообщение" , "Отправить сообщение" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_ПолучитьКатегорииТоваров" , "Получить категории товаров" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_СоздатьТоварПодборку" , "Создать товар и подборку" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_СоздатьТоварСоСвойствами" , "Создать товар со свойствами" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокТоваров" , "Получить список товаров" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокПодборок" , "Получить список подборок" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокСвойств" , "Получить список свойств" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокЗаказов" , "Получить список заказов" , ВКонтакте);
- НовыйТест(ТаблицаТестов, "ВК_ЗагрузитьВидео" , "Загрузить видео" , ВКонтакте);
-
- НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьИнформациюОДиске" , "Получить информацию о диске" , ЯДиск);
- НовыйТест(ТаблицаТестов, "ЯДиск_СоздатьПапку" , "Создать папку" , ЯДиск);
- НовыйТест(ТаблицаТестов, "ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект", "Загрузить по URL и получить" , ЯДиск);
- НовыйТест(ТаблицаТестов, "ЯДиск_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить файл" , ЯДиск);
- НовыйТест(ТаблицаТестов, "ЯДиск_СоздатьКопиюОбъекта" , "Создать копию объекта" , ЯДиск);
- НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСсылкуНаСкачивание" , "Получить ссылку на скачивание" , ЯДиск);
- НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСписокФайлов" , "Получить список файлов" , ЯДиск);
- НовыйТест(ТаблицаТестов, "ЯДиск_ПереместитьОбъект" , "Переместить объект" , ЯДиск);
- НовыйТест(ТаблицаТестов, "ЯДиск_ДействияПубличныхОбъектов" , "Действия с публичными объектами", ЯДиск);
- НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСписокОпубликованных" , "Получить список опубликованных" , ЯДиск);
-
- НовыйТест(ТаблицаТестов, "ГВ_ПолучитьСсылкуАвторизации" , "Получить ссылку авторизации" , ВСпейс);
- НовыйТест(ТаблицаТестов, "ГВ_ПолучитьТокен" , "Получить токен" , ВСпейс);
- НовыйТест(ТаблицаТестов, "ГВ_ОбновитьТокен" , "Обновить токен" , ВСпейс);
-
- НовыйТест(ТаблицаТестов, "ГК_ПолучитьСписокКалендарей" , "Получить список календарей" , Календарь);
- НовыйТест(ТаблицаТестов, "ГК_СоздатьУдалитьКалендарь" , "Создать/Удалить календарь" , Календарь);
- НовыйТест(ТаблицаТестов, "ГК_СоздатьУдалитьСобытие" , "Создать/Удалить событие" , Календарь);
- НовыйТест(ТаблицаТестов, "ГК_ПолучитьСписокСобытий" , "Получить список событий" , Календарь);
-
- НовыйТест(ТаблицаТестов, "ГД_ПолучитьСписокКаталогов" , "Получить список каталогов" , Драйв);
- НовыйТест(ТаблицаТестов, "ГД_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить Файл" , Драйв);
- НовыйТест(ТаблицаТестов, "ГД_СоздатьУдалитьКомментарий" , "Создать/Удалить кооментарий" , Драйв);
- НовыйТест(ТаблицаТестов, "ГД_СоздатьКаталог" , "Создать/Удалить каталог" , Драйв);
-
- НовыйТест(ТаблицаТестов, "ГТ_СоздатьТаблицу" , "Создать таблицу" , Таблицы);
- НовыйТест(ТаблицаТестов, "ГТ_ПолучитьТаблицу" , "Получить таблицу" , Таблицы);
- НовыйТест(ТаблицаТестов, "ГТ_ЗаполнитьОчиститьЯчейки" , "Заполнить/Очистить ячейки" , Таблицы);
-
- НовыйТест(ТаблицаТестов, "Твиттер_ПолучитьСсылкуАвторизации" , "Получить ссылку авторизации" , Твиттер);
- НовыйТест(ТаблицаТестов, "Твиттер_ОбновитьТокен" , "Обновить токен" , Твиттер);
- НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТекстовыйТвит" , "Текстовый твит" , Твиттер);
- НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСКартинкой" , "Твит с картинкой" , Твиттер);
- НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСВидео" , "Твит с видео" , Твиттер);
- НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСГиф" , "Твит с гиф" , Твиттер);
- НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСОпросом" , "Твит с опросом" , Твиттер);
-
- НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьИнформациюОКанале" , "Получить информацию канала" , Вайбер);
- НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьДанныеПользователя" , "Получить данные пользователя" , Вайбер);
- НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьОнлайнПользователей" , "Получить онлайн пользователей" , Вайбер);
- НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьТекстовоеСообщение" , "Отправить текстовое сообщение" , Вайбер);
- НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьКартинку" , "Отправить картинку" , Вайбер);
- НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьФайл" , "Отправить файл" , Вайбер);
- НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьКонтакт" , "Отправить контакт" , Вайбер);
- НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьЛокацию" , "Отправить локацию" , Вайбер);
- НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьСсылку" , "Отправить ссылку" , Вайбер);
-
- НовыйТест(ТаблицаТестов, "Ноушн_СоздатьСтраницу" , "Создать страницу" , Ноушн);
- НовыйТест(ТаблицаТестов, "Ноушн_СоздатьИзменитьБазу" , "Создать/Изменить базу" , Ноушн);
- НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьИнформациюОСтранице" , "Получить информацию о странице" , Ноушн);
- НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьИнформациюОБазе" , "Получить информацию о базе" , Ноушн);
- НовыйТест(ТаблицаТестов, "Ноушн_СоздатьСтраницуВБазу" , "Создать страницу в базу" , Ноушн);
- НовыйТест(ТаблицаТестов, "Ноушн_ИзменитьСвойстваСтраницы" , "Изменить свойства страницы" , Ноушн);
- НовыйТест(ТаблицаТестов, "Ноушн_СоздатьУдалитьБлок" , "Создать/Удалить блок" , Ноушн);
- НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьПользователей" , "Получить пользователей" , Ноушн);
- НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьДанныеПользователя" , "Получить данные пользователя" , Ноушн);
-
- НовыйТест(ТаблицаТестов, "Слак_ПолучитьИнформациюОБоте" , "Получить информацию о боте" , Слак);
- НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокПользователей" , "Получить список пользователей" , Слак);
- НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокОбластей" , "Получить список областей" , Слак);
- НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьСообщение" , "Отправить/Удалить сообщение" , Слак);
- НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьЭфемерное" , "Отправить/Удалить эфемерное" , Слак);
- НовыйТест(ТаблицаТестов, "Слак_ПолучитьОтложенныеСообщения" , "Получить отложенные сообщения" , Слак);
- НовыйТест(ТаблицаТестов, "Слак_СоздатьАрхивироватьКанал" , "Создать/Архивировать канал" , Слак);
- НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокКаналов" , "Получить список каналов" , Слак);
- НовыйТест(ТаблицаТестов, "Слак_ОткрытьЗакрытьДиалог" , "Открыть/Закрыть диалог" , Слак);
- НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокФайлов" , "Получить список файлов" , Слак);
- НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить файл" , Слак);
- НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокВФ" , "Получить список внеш. файлов" , Слак);
- НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьВФ" , "Загрузить/Удалить внеш. файл" , Слак);
-
- НовыйТест(ТаблицаТестов, "АТ_СоздатьБазу" , "Создать/Изменить базу" , АирТ);
- НовыйТест(ТаблицаТестов, "АТ_СоздатьТаблицу" , "Создать/Изменить таблицу" , АирТ);
- НовыйТест(ТаблицаТестов, "АТ_СоздатьПоле" , "Создать/Изменить поле" , АирТ);
- НовыйТест(ТаблицаТестов, "АТ_СоздатьУдалитьЗаписи" , "Создать/Удалить записи" , АирТ);
-
- НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьОбновитьТокен" , "Получить/Обновить токен" , ДропБокс);
- НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайл" , "Загрузить файл" , ДропБокс);
- НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайлПоURL" , "Загрузить файл по URL" , ДропБокс);
- НовыйТест(ТаблицаТестов, "ДропБокс_СоздатьКаталог" , "Создать каталог" , ДропБокс);
- НовыйТест(ТаблицаТестов, "ДропБокс_СоздатьУдалитьТег" , "Создать/Удалить тег" , ДропБокс);
- НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьАккаунт" , "Получить данные аккаунта" , ДропБокс);
- НовыйТест(ТаблицаТестов, "ДропБокс_РаботаСДоступами" , "Работа с доступами" , ДропБокс);
-
- Возврат ТаблицаТестов;
-
-КонецФункции
-
-Функция ОжидаетЧто(Значение) Экспорт
-
- Попытка
-
- Модуль = ПолучитьОбщийМодуль("ЮТест");
- Ожидаем = ТипЗнч(Модуль) = Тип("ОбщийМодуль");
- Возврат Модуль.ОжидаетЧто(Значение);
-
- Исключение
- Возврат Ожидаем.Что(Значение);
- КонецПопытки;
-
-КонецФункции
-
-Функция СформироватьТестыЯкс() Экспорт
-
- Модуль = ПолучитьОбщийМодуль("ЮТТесты");
- Разделы = ПолучитьСоответствиеРазделовТестирования();
- ТаблицаТестов = ПолучитьТаблицуТестов();
-
- Для Каждого Раздел Из Разделы Цикл
-
- ТекущийРаздел = Раздел.Ключ;
- Отбор = Новый Структура("Раздел", ТекущийРаздел);
- ТестыРаздела = ТаблицаТестов.НайтиСтроки(Отбор);
-
- Набор = Модуль.ДобавитьТестовыйНабор(ТекущийРаздел);
-
- Для Каждого Тест Из ТестыРаздела Цикл
- Набор.ДобавитьСерверныйТест(Тест.Метод, Тест.Синоним);
- КонецЦикла;
-
- КонецЦикла;
-
- Возврат "";
-
-КонецФункции
-
-Функция СформироватьТестыАссертс() Экспорт
-
- ТаблицаТестов = ПолучитьТаблицуТестов();
- МассивТестов = Новый Массив;
-
- Для Каждого Тест Из ТаблицаТестов Цикл
- МассивТестов.Добавить(Тест.Метод);
- КонецЦикла;
-
- Возврат МассивТестов;
-
-КонецФункции
-
-Функция ПолучитьПараметр(Параметр) Экспорт
-
- Путь = ПутьКФайлуДанных();
- Возврат ПолучитьЗначениеИзФайла(Параметр, Путь);
-
-КонецФункции
-
-Функция ПолучитьДвоичные(Параметр) Экспорт
-
- Путь = ПутьКФайлуДанных();
- ПараметрЛокальный = Параметр + "Local";
- ЗначениеОсновной = ПолучитьЗначениеИзФайла(Параметр , Путь);
- ЗначениеЛокальный = ПолучитьЗначениеИзФайла(ПараметрЛокальный, Путь);
-
- ФайлЛокальный = Новый Файл(ЗначениеЛокальный);
-
- Если ФайлЛокальный.Существует() Тогда
- Значение = Новый ДвоичныеДанные(ЗначениеЛокальный);
- Иначе
- Значение = ЗначениеОсновной;
- КонецЕсли;
-
- Если ТипЗнч(Значение) = Тип("Строка") Тогда
- Значение = ПолучитьФайлПути(Значение, ПараметрЛокальный);
- КонецЕсли;
-
- Возврат Значение;
-
-КонецФункции
-
-Функция ПолучитьФайлПути(Знач Путь, ПараметрЛокальный, Знач СохранятьЛокально = Истина) Экспорт
-
- Если СтрНайти(Путь, "http") > 0
- Или СтрНайти(Путь, "www") > 0 Тогда
-
- ИВФ = ПолучитьИмяВременногоФайла();
- КопироватьФайл(Путь, ИВФ);
- Путь = ИВФ;
- Двоичные = Новый ДвоичныеДанные(Путь);
-
- Если СохранятьЛокально Тогда
- ЗаписатьПараметр(ПараметрЛокальный, ИВФ);
- Иначе
- УдалитьФайлы(ИВФ);
- КонецЕсли;
-
- Иначе
-
- Двоичные = Новый ДвоичныеДанные(Путь);
-
- КонецЕсли;
-
- Возврат Двоичные;
-
-КонецФункции
-
-Процедура ПараметрВКоллекцию(Параметр, Коллекция) Экспорт
-
- Значение = ПолучитьПараметр(Параметр);
- Коллекция.Вставить(Параметр, Значение);
-
-КонецПроцедуры
-
-Процедура ДвоичныеВКоллекцию(Параметр, Коллекция) Экспорт
-
- Значение = ПолучитьДвоичные(Параметр);
- Коллекция.Вставить(Параметр, Значение);
-
-КонецПроцедуры
-
-Процедура ЗаписатьПараметр(Параметр, Значение) Экспорт
-
- Путь = ПутьКФайлуДанных();
- ЗаписатьПараметрВФайл(Параметр, Значение, Путь);
-
-КонецПроцедуры
-
-Процедура ЗаписатьЛог(Знач Результат, Знач Метод, Знач Библиотека = "") Экспорт
-
- Шапка = Строка(OPI_Инструменты.ПолучитьТекущуюДату()) + " | " + Метод;
-
- Попытка
- Данные = OPI_Инструменты.JSONСтрокой(Результат);
- Исключение
- Данные = "Не JSON: " + Строка(Результат);
- КонецПопытки;
-
- Данные = " " + Данные;
-
- Сообщить(Шапка);
- Сообщить(Символы.ПС);
- Сообщить(Данные);
- Сообщить(Символы.ПС);
- Сообщить("---------------------------------");
- Сообщить(Символы.ПС);
-
- Если ЗначениеЗаполнено(Библиотека) Тогда
- ЗаписатьФайлЛога(Данные, Метод, Библиотека);
- КонецЕсли;
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ПолучитьЗначениеИзФайла(Параметр, Путь)
-
- Значения = OPI_Инструменты.ПрочитатьJSONФайл(Путь);
- Возврат ?(Значения.Свойство(Параметр), Значения[Параметр], "");
-
-КонецФункции
-
-Функция ПутьКФайлуДанных()
-
- Путь = "";
- ВозможныеПути = Новый Массив;
- ВозможныеПути.Добавить("./data.json");
- ВозможныеПути.Добавить("C:\GDrive\Мой диск\data.json");
- ВозможныеПути.Добавить("D:\GD\Мой диск\data.json");
-
- Для Каждого ВозможныйПуть Из ВозможныеПути Цикл
-
- ФайлРепозитория = Новый Файл(ВозможныйПуть);
-
- Если ФайлРепозитория.Существует() Тогда
- Путь = ВозможныйПуть;
- КонецЕсли;
-
- КонецЦикла;
-
- Возврат Путь;
-
-КонецФункции
-
-Функция ПолучитьОбщийМодуль(Знач Имя)
-
- Модуль = Вычислить(Имя);
-
- Возврат Модуль;
-КонецФункции
-
-Процедура НовыйТест(ТаблицаЗначений, Знач Метод, Знач Синоним, Знач Раздел)
-
- НовыйТест = ТаблицаЗначений.Добавить();
- НовыйТест.Метод = Метод;
- НовыйТест.Синоним = Синоним;
- НовыйТест.Раздел = Раздел;
-
-КонецПроцедуры
-
-Процедура ЗаписатьПараметрВФайл(Знач Параметр, Знач Значение, Знач Путь)
-
- Значения = OPI_Инструменты.ПрочитатьJSONФайл(Путь);
- Значения.Вставить(Параметр, Значение);
-
- Запись = Новый ЗаписьJSON;
- ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
- Запись.ОткрытьФайл(Путь, , , ПараметрыЗаписиJSON);
- ЗаписатьJSON(Запись, Значения);
- Запись.Закрыть();
-
-КонецПроцедуры
-
-Процедура ЗаписатьФайлЛога(Знач Данные, Знач Метод, Знач Библиотека)
-
- Попытка
-
- ПутьЛогов = "./docs/results";
- ПутьЛоговБиблиотеки = ПутьЛогов + "/" + Библиотека;
-
- КаталогЛогов = Новый Файл(ПутьЛогов);
-
- Если Не КаталогЛогов.Существует() Тогда
- СоздатьКаталог(ПутьЛогов);
- КонецЕсли;
-
- КаталогЛоговБиблиотеки = Новый Файл(ПутьЛоговБиблиотеки);
-
- Если Не КаталогЛоговБиблиотеки.Существует() Тогда
- СоздатьКаталог(ПутьЛоговБиблиотеки);
- КонецЕсли;
-
- ПутьКФайлу = ПутьЛоговБиблиотеки + "/" + Метод + ".log";
- ФайлЛога = Новый Файл(ПутьКФайлу);
-
- Если Не ФайлЛога.Существует() Тогда
- ДокументЛога = Новый ТекстовыйДокумент;
- ДокументЛога.УстановитьТекст(Данные);
- ДокументЛога.Записать(ПутьКФайлу);
- КонецЕсли;
-
- Исключение
- Сообщить("Не удалось записать файл лога!: " + ОписаниеОшибки());
- КонецПопытки;
-
-КонецПроцедуры
-
-#КонецОбласти
+// Расположение OS: ./OInt/tools/Modules/OPI_ПолучениеДанныхТестов.os
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:UsingHardcodePath-off
+// BSLLS:Typo-off
+// BSLLS:DeprecatedMessage-off
+// BSLLS:UsingServiceTag-off
+// BSLLS:ExecuteExternalCodeInCommonModule-off
+// BSLLS:DuplicateStringLiteral-off
+
+//@skip-check use-non-recommended-method
+
+// Раскомментировать, если выполняется OneScript
+#Использовать "./internal"
+#Использовать asserts
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+Функция ПолучитьСоответствиеРазделовТестирования() Экспорт
+
+ СтандартныеЗависимости = "[Decode, Build]";
+ ЗависимостиГугл = "Testing-GoogleWorkspace";
+
+ Разделы = Новый Структура;
+ Разделы.Вставить("Telegram" , СтандартныеЗависимости);
+ Разделы.Вставить("VK" , СтандартныеЗависимости);
+ Разделы.Вставить("Viber" , СтандартныеЗависимости);
+ Разделы.Вставить("Twitter" , СтандартныеЗависимости);
+ Разделы.Вставить("YandexDisk" , СтандартныеЗависимости);
+ Разделы.Вставить("GoogleWorkspace", СтандартныеЗависимости);
+ Разделы.Вставить("GoogleCalendar" , ЗависимостиГугл);
+ Разделы.Вставить("GoogleDrive" , ЗависимостиГугл);
+ Разделы.Вставить("GoogleSheets" , ЗависимостиГугл);
+ Разделы.Вставить("Notion" , СтандартныеЗависимости);
+ Разделы.Вставить("Slack" , СтандартныеЗависимости);
+ Разделы.Вставить("Airtable" , СтандартныеЗависимости);
+ Разделы.Вставить("Dropbox" , СтандартныеЗависимости);
+
+ Возврат Разделы;
+
+КонецФункции
+
+Функция ПолучитьТаблицуТестов() Экспорт
+
+ Телеграм = "Telegram";
+ ВКонтакте = "VK";
+ ЯДиск = "YandexDisk";
+ Календарь = "GoogleCalendar";
+ Твиттер = "Twitter";
+ Вайбер = "Viber";
+ Драйв = "GoogleDrive";
+ ВСпейс = "GoogleWorkspace";
+ Ноушн = "Notion";
+ Слак = "Slack";
+ Таблицы = "GoogleSheets";
+ АирТ = "Airtable";
+ ДропБокс = "Dropbox";
+
+ ТаблицаТестов = Новый ТаблицаЗначений;
+ ТаблицаТестов.Колонки.Добавить("Метод");
+ ТаблицаТестов.Колонки.Добавить("Синоним");
+ ТаблицаТестов.Колонки.Добавить("Раздел");
+
+ НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьИнформациюБота" , "Получить информацию бота" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьОбновления" , "Получить обновления" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_УстановитьWebhook" , "Установить Webhook" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьТекстовоеСообщение" , "Отправить текстовое сообщение" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКартинку" , "Отправить картинку" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьВидео" , "Отправить видео" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьАудио" , "Отправить аудио" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьДокумент" , "Отправить документ" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьГифку" , "Отправить гифку" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьМедиагруппу" , "Отправить медиагруппу" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьМестоположение" , "Отправить местоположение" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьКонтакт" , "Отправить контакт" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_ОтправитьОпрос" , "Отправить опрос" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_ПереслатьСообщение" , "Переслать сообщение" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_БанРазбан" , "Бан/Разбан" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_СоздатьСсылкуПриглашение" , "Создать ссылку-приглашение" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_ЗакрепитьОткрепитьСообщение" , "Закрепить/Открепить сообщение" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьЧислоУчастников" , "Получить число участников" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_ПолучитьСписокАватаровФорума", "Получить список аватаров форума", Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_СоздатьУдалитьТемуФорума" , "Создать/Удалить тему форума" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_ИзменитьИмяГлавнойТемы" , "Изменить имя главной темы" , Телеграм);
+ НовыйТест(ТаблицаТестов, "Телеграм_СкрытьПоказатьГлавнуюТему" , "Скрыть/Показать главную тему" , Телеграм);
+
+ НовыйТест(ТаблицаТестов, "ВК_СоздатьСсылкуТокена" , "Создать ссылку получения токена", ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_СоздатьУдалитьПост" , "Создать/Удалить пост" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_СоздатьСоставнойПост" , "Создать/Удалить составной пост" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_СоздатьОпрос" , "Создать опрос" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_СохранитьУдалитьКартинку" , "Добавить/Удалить картинку" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_СоздатьИсторию" , "Создать историю" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_МетодыОбсуждений" , "Действия с обсуждениями" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_ЛайкРепостКоммент" , "Лайк/Репост/Комментарий" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_ПолучитьСтатистику" , "Получить статистику" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_ПолучитьСтатистикуПостов" , "Получить статистику постов" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_СоздатьРекламнуюКампанию" , "Создать рекламную кампанию" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_ОтправитьСообщение" , "Отправить сообщение" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_ПолучитьКатегорииТоваров" , "Получить категории товаров" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_СоздатьТоварПодборку" , "Создать товар и подборку" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_СоздатьТоварСоСвойствами" , "Создать товар со свойствами" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокТоваров" , "Получить список товаров" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокПодборок" , "Получить список подборок" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокСвойств" , "Получить список свойств" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_ПолучитьСписокЗаказов" , "Получить список заказов" , ВКонтакте);
+ НовыйТест(ТаблицаТестов, "ВК_ЗагрузитьВидео" , "Загрузить видео" , ВКонтакте);
+
+ НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьИнформациюОДиске" , "Получить информацию о диске" , ЯДиск);
+ НовыйТест(ТаблицаТестов, "ЯДиск_СоздатьПапку" , "Создать папку" , ЯДиск);
+ НовыйТест(ТаблицаТестов, "ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект", "Загрузить по URL и получить" , ЯДиск);
+ НовыйТест(ТаблицаТестов, "ЯДиск_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить файл" , ЯДиск);
+ НовыйТест(ТаблицаТестов, "ЯДиск_СоздатьКопиюОбъекта" , "Создать копию объекта" , ЯДиск);
+ НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСсылкуНаСкачивание" , "Получить ссылку на скачивание" , ЯДиск);
+ НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСписокФайлов" , "Получить список файлов" , ЯДиск);
+ НовыйТест(ТаблицаТестов, "ЯДиск_ПереместитьОбъект" , "Переместить объект" , ЯДиск);
+ НовыйТест(ТаблицаТестов, "ЯДиск_ДействияПубличныхОбъектов" , "Действия с публичными объектами", ЯДиск);
+ НовыйТест(ТаблицаТестов, "ЯДиск_ПолучитьСписокОпубликованных" , "Получить список опубликованных" , ЯДиск);
+
+ НовыйТест(ТаблицаТестов, "ГВ_ПолучитьСсылкуАвторизации" , "Получить ссылку авторизации" , ВСпейс);
+ НовыйТест(ТаблицаТестов, "ГВ_ПолучитьТокен" , "Получить токен" , ВСпейс);
+ НовыйТест(ТаблицаТестов, "ГВ_ОбновитьТокен" , "Обновить токен" , ВСпейс);
+
+ НовыйТест(ТаблицаТестов, "ГК_ПолучитьСписокКалендарей" , "Получить список календарей" , Календарь);
+ НовыйТест(ТаблицаТестов, "ГК_СоздатьУдалитьКалендарь" , "Создать/Удалить календарь" , Календарь);
+ НовыйТест(ТаблицаТестов, "ГК_СоздатьУдалитьСобытие" , "Создать/Удалить событие" , Календарь);
+ НовыйТест(ТаблицаТестов, "ГК_ПолучитьСписокСобытий" , "Получить список событий" , Календарь);
+
+ НовыйТест(ТаблицаТестов, "ГД_ПолучитьСписокКаталогов" , "Получить список каталогов" , Драйв);
+ НовыйТест(ТаблицаТестов, "ГД_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить Файл" , Драйв);
+ НовыйТест(ТаблицаТестов, "ГД_СоздатьУдалитьКомментарий" , "Создать/Удалить кооментарий" , Драйв);
+ НовыйТест(ТаблицаТестов, "ГД_СоздатьКаталог" , "Создать/Удалить каталог" , Драйв);
+
+ НовыйТест(ТаблицаТестов, "ГТ_СоздатьТаблицу" , "Создать таблицу" , Таблицы);
+ НовыйТест(ТаблицаТестов, "ГТ_ПолучитьТаблицу" , "Получить таблицу" , Таблицы);
+ НовыйТест(ТаблицаТестов, "ГТ_ЗаполнитьОчиститьЯчейки" , "Заполнить/Очистить ячейки" , Таблицы);
+
+ НовыйТест(ТаблицаТестов, "Твиттер_ПолучитьСсылкуАвторизации" , "Получить ссылку авторизации" , Твиттер);
+ НовыйТест(ТаблицаТестов, "Твиттер_ОбновитьТокен" , "Обновить токен" , Твиттер);
+ НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТекстовыйТвит" , "Текстовый твит" , Твиттер);
+ НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСКартинкой" , "Твит с картинкой" , Твиттер);
+ НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСВидео" , "Твит с видео" , Твиттер);
+ НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСГиф" , "Твит с гиф" , Твиттер);
+ НовыйТест(ТаблицаТестов, "Твиттер_СоздатьТвитСОпросом" , "Твит с опросом" , Твиттер);
+
+ НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьИнформациюОКанале" , "Получить информацию канала" , Вайбер);
+ НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьДанныеПользователя" , "Получить данные пользователя" , Вайбер);
+ НовыйТест(ТаблицаТестов, "Вайбер_ПолучитьОнлайнПользователей" , "Получить онлайн пользователей" , Вайбер);
+ НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьТекстовоеСообщение" , "Отправить текстовое сообщение" , Вайбер);
+ НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьКартинку" , "Отправить картинку" , Вайбер);
+ НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьФайл" , "Отправить файл" , Вайбер);
+ НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьКонтакт" , "Отправить контакт" , Вайбер);
+ НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьЛокацию" , "Отправить локацию" , Вайбер);
+ НовыйТест(ТаблицаТестов, "Вайбер_ОтправитьСсылку" , "Отправить ссылку" , Вайбер);
+
+ НовыйТест(ТаблицаТестов, "Ноушн_СоздатьСтраницу" , "Создать страницу" , Ноушн);
+ НовыйТест(ТаблицаТестов, "Ноушн_СоздатьИзменитьБазу" , "Создать/Изменить базу" , Ноушн);
+ НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьИнформациюОСтранице" , "Получить информацию о странице" , Ноушн);
+ НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьИнформациюОБазе" , "Получить информацию о базе" , Ноушн);
+ НовыйТест(ТаблицаТестов, "Ноушн_СоздатьСтраницуВБазу" , "Создать страницу в базу" , Ноушн);
+ НовыйТест(ТаблицаТестов, "Ноушн_ИзменитьСвойстваСтраницы" , "Изменить свойства страницы" , Ноушн);
+ НовыйТест(ТаблицаТестов, "Ноушн_СоздатьУдалитьБлок" , "Создать/Удалить блок" , Ноушн);
+ НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьПользователей" , "Получить пользователей" , Ноушн);
+ НовыйТест(ТаблицаТестов, "Ноушн_ПолучитьДанныеПользователя" , "Получить данные пользователя" , Ноушн);
+
+ НовыйТест(ТаблицаТестов, "Слак_ПолучитьИнформациюОБоте" , "Получить информацию о боте" , Слак);
+ НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокПользователей" , "Получить список пользователей" , Слак);
+ НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокОбластей" , "Получить список областей" , Слак);
+ НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьСообщение" , "Отправить/Удалить сообщение" , Слак);
+ НовыйТест(ТаблицаТестов, "Слак_ОтправитьУдалитьЭфемерное" , "Отправить/Удалить эфемерное" , Слак);
+ НовыйТест(ТаблицаТестов, "Слак_ПолучитьОтложенныеСообщения" , "Получить отложенные сообщения" , Слак);
+ НовыйТест(ТаблицаТестов, "Слак_СоздатьАрхивироватьКанал" , "Создать/Архивировать канал" , Слак);
+ НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокКаналов" , "Получить список каналов" , Слак);
+ НовыйТест(ТаблицаТестов, "Слак_ОткрытьЗакрытьДиалог" , "Открыть/Закрыть диалог" , Слак);
+ НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокФайлов" , "Получить список файлов" , Слак);
+ НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьФайл" , "Загрузить/Удалить файл" , Слак);
+ НовыйТест(ТаблицаТестов, "Слак_ПолучитьСписокВФ" , "Получить список внеш. файлов" , Слак);
+ НовыйТест(ТаблицаТестов, "Слак_ЗагрузитьУдалитьВФ" , "Загрузить/Удалить внеш. файл" , Слак);
+
+ НовыйТест(ТаблицаТестов, "АТ_СоздатьБазу" , "Создать/Изменить базу" , АирТ);
+ НовыйТест(ТаблицаТестов, "АТ_СоздатьТаблицу" , "Создать/Изменить таблицу" , АирТ);
+ НовыйТест(ТаблицаТестов, "АТ_СоздатьПоле" , "Создать/Изменить поле" , АирТ);
+ НовыйТест(ТаблицаТестов, "АТ_СоздатьУдалитьЗаписи" , "Создать/Удалить записи" , АирТ);
+
+ НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьОбновитьТокен" , "Получить/Обновить токен" , ДропБокс);
+ НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайл" , "Загрузить файл" , ДропБокс);
+ НовыйТест(ТаблицаТестов, "ДропБокс_ЗагрузитьФайлПоURL" , "Загрузить файл по URL" , ДропБокс);
+ НовыйТест(ТаблицаТестов, "ДропБокс_СоздатьКаталог" , "Создать каталог" , ДропБокс);
+ НовыйТест(ТаблицаТестов, "ДропБокс_СоздатьУдалитьТег" , "Создать/Удалить тег" , ДропБокс);
+ НовыйТест(ТаблицаТестов, "ДропБокс_ПолучитьАккаунт" , "Получить данные аккаунта" , ДропБокс);
+ НовыйТест(ТаблицаТестов, "ДропБокс_РаботаСДоступами" , "Работа с доступами" , ДропБокс);
+
+ Возврат ТаблицаТестов;
+
+КонецФункции
+
+Функция ОжидаетЧто(Значение) Экспорт
+
+ Попытка
+
+ Модуль = ПолучитьОбщийМодуль("ЮТест");
+ Ожидаем = ТипЗнч(Модуль) = Тип("ОбщийМодуль");
+ Возврат Модуль.ОжидаетЧто(Значение);
+
+ Исключение
+ Возврат Ожидаем.Что(Значение);
+ КонецПопытки;
+
+КонецФункции
+
+Функция СформироватьТестыЯкс() Экспорт
+
+ Модуль = ПолучитьОбщийМодуль("ЮТТесты");
+ Разделы = ПолучитьСоответствиеРазделовТестирования();
+ ТаблицаТестов = ПолучитьТаблицуТестов();
+
+ Для Каждого Раздел Из Разделы Цикл
+
+ ТекущийРаздел = Раздел.Ключ;
+ Отбор = Новый Структура("Раздел", ТекущийРаздел);
+ ТестыРаздела = ТаблицаТестов.НайтиСтроки(Отбор);
+
+ Набор = Модуль.ДобавитьТестовыйНабор(ТекущийРаздел);
+
+ Для Каждого Тест Из ТестыРаздела Цикл
+ Набор.ДобавитьСерверныйТест(Тест.Метод, Тест.Синоним);
+ КонецЦикла;
+
+ КонецЦикла;
+
+ Возврат "";
+
+КонецФункции
+
+Функция СформироватьТестыАссертс() Экспорт
+
+ ТаблицаТестов = ПолучитьТаблицуТестов();
+ МассивТестов = Новый Массив;
+
+ Для Каждого Тест Из ТаблицаТестов Цикл
+ МассивТестов.Добавить(Тест.Метод);
+ КонецЦикла;
+
+ Возврат МассивТестов;
+
+КонецФункции
+
+Функция ПолучитьПараметр(Параметр) Экспорт
+
+ Путь = ПутьКФайлуДанных();
+ Возврат ПолучитьЗначениеИзФайла(Параметр, Путь);
+
+КонецФункции
+
+Функция ПолучитьДвоичные(Параметр) Экспорт
+
+ Путь = ПутьКФайлуДанных();
+ ПараметрЛокальный = Параметр + "Local";
+ ЗначениеОсновной = ПолучитьЗначениеИзФайла(Параметр , Путь);
+ ЗначениеЛокальный = ПолучитьЗначениеИзФайла(ПараметрЛокальный, Путь);
+
+ ФайлЛокальный = Новый Файл(ЗначениеЛокальный);
+
+ Если ФайлЛокальный.Существует() Тогда
+ Значение = Новый ДвоичныеДанные(ЗначениеЛокальный);
+ Иначе
+ Значение = ЗначениеОсновной;
+ КонецЕсли;
+
+ Если ТипЗнч(Значение) = Тип("Строка") Тогда
+ Значение = ПолучитьФайлПути(Значение, ПараметрЛокальный);
+ КонецЕсли;
+
+ Возврат Значение;
+
+КонецФункции
+
+Функция ПолучитьФайлПути(Знач Путь, ПараметрЛокальный, Знач СохранятьЛокально = Истина) Экспорт
+
+ Если СтрНайти(Путь, "http") > 0
+ Или СтрНайти(Путь, "www") > 0 Тогда
+
+ ИВФ = ПолучитьИмяВременногоФайла();
+ КопироватьФайл(Путь, ИВФ);
+ Путь = ИВФ;
+ Двоичные = Новый ДвоичныеДанные(Путь);
+
+ Если СохранятьЛокально Тогда
+ ЗаписатьПараметр(ПараметрЛокальный, ИВФ);
+ Иначе
+ УдалитьФайлы(ИВФ);
+ КонецЕсли;
+
+ Иначе
+
+ Двоичные = Новый ДвоичныеДанные(Путь);
+
+ КонецЕсли;
+
+ Возврат Двоичные;
+
+КонецФункции
+
+Процедура ПараметрВКоллекцию(Параметр, Коллекция) Экспорт
+
+ Значение = ПолучитьПараметр(Параметр);
+ Коллекция.Вставить(Параметр, Значение);
+
+КонецПроцедуры
+
+Процедура ДвоичныеВКоллекцию(Параметр, Коллекция) Экспорт
+
+ Значение = ПолучитьДвоичные(Параметр);
+ Коллекция.Вставить(Параметр, Значение);
+
+КонецПроцедуры
+
+Процедура ЗаписатьПараметр(Параметр, Значение) Экспорт
+
+ Путь = ПутьКФайлуДанных();
+ ЗаписатьПараметрВФайл(Параметр, Значение, Путь);
+
+КонецПроцедуры
+
+Процедура ЗаписатьЛог(Знач Результат, Знач Метод, Знач Библиотека = "") Экспорт
+
+ Шапка = Строка(OPI_Инструменты.ПолучитьТекущуюДату()) + " | " + Метод;
+
+ Попытка
+ Данные = OPI_Инструменты.JSONСтрокой(Результат);
+ Исключение
+ Данные = "Не JSON: " + Строка(Результат);
+ КонецПопытки;
+
+ Данные = " " + Данные;
+
+ Сообщить(Шапка);
+ Сообщить(Символы.ПС);
+ Сообщить(Данные);
+ Сообщить(Символы.ПС);
+ Сообщить("---------------------------------");
+ Сообщить(Символы.ПС);
+
+ Если ЗначениеЗаполнено(Библиотека) Тогда
+ ЗаписатьФайлЛога(Данные, Метод, Библиотека);
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ПолучитьЗначениеИзФайла(Параметр, Путь)
+
+ Значения = OPI_Инструменты.ПрочитатьJSONФайл(Путь);
+ Возврат ?(Значения.Свойство(Параметр), Значения[Параметр], "");
+
+КонецФункции
+
+Функция ПутьКФайлуДанных()
+
+ Путь = "";
+ ВозможныеПути = Новый Массив;
+ ВозможныеПути.Добавить("./data.json");
+ ВозможныеПути.Добавить("C:\GDrive\Мой диск\data.json");
+ ВозможныеПути.Добавить("D:\GD\Мой диск\data.json");
+
+ Для Каждого ВозможныйПуть Из ВозможныеПути Цикл
+
+ ФайлРепозитория = Новый Файл(ВозможныйПуть);
+
+ Если ФайлРепозитория.Существует() Тогда
+ Путь = ВозможныйПуть;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Возврат Путь;
+
+КонецФункции
+
+Функция ПолучитьОбщийМодуль(Знач Имя)
+
+ Модуль = Вычислить(Имя);
+
+ Возврат Модуль;
+КонецФункции
+
+Процедура НовыйТест(ТаблицаЗначений, Знач Метод, Знач Синоним, Знач Раздел)
+
+ НовыйТест = ТаблицаЗначений.Добавить();
+ НовыйТест.Метод = Метод;
+ НовыйТест.Синоним = Синоним;
+ НовыйТест.Раздел = Раздел;
+
+КонецПроцедуры
+
+Процедура ЗаписатьПараметрВФайл(Знач Параметр, Знач Значение, Знач Путь)
+
+ Значения = OPI_Инструменты.ПрочитатьJSONФайл(Путь);
+ Значения.Вставить(Параметр, Значение);
+
+ Запись = Новый ЗаписьJSON;
+ ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, Символы.Таб);
+ Запись.ОткрытьФайл(Путь, , , ПараметрыЗаписиJSON);
+ ЗаписатьJSON(Запись, Значения);
+ Запись.Закрыть();
+
+КонецПроцедуры
+
+Процедура ЗаписатьФайлЛога(Знач Данные, Знач Метод, Знач Библиотека)
+
+ Попытка
+
+ ПутьЛогов = "./docs/results";
+ ПутьЛоговБиблиотеки = ПутьЛогов + "/" + Библиотека;
+
+ КаталогЛогов = Новый Файл(ПутьЛогов);
+
+ Если Не КаталогЛогов.Существует() Тогда
+ СоздатьКаталог(ПутьЛогов);
+ КонецЕсли;
+
+ КаталогЛоговБиблиотеки = Новый Файл(ПутьЛоговБиблиотеки);
+
+ Если Не КаталогЛоговБиблиотеки.Существует() Тогда
+ СоздатьКаталог(ПутьЛоговБиблиотеки);
+ КонецЕсли;
+
+ ПутьКФайлу = ПутьЛоговБиблиотеки + "/" + Метод + ".log";
+ ФайлЛога = Новый Файл(ПутьКФайлу);
+
+ Если Не ФайлЛога.Существует() Тогда
+ ДокументЛога = Новый ТекстовыйДокумент;
+ ДокументЛога.УстановитьТекст(Данные);
+ ДокументЛога.Записать(ПутьКФайлу);
+ КонецЕсли;
+
+ Исключение
+ Сообщить("Не удалось записать файл лога!: " + ОписаниеОшибки());
+ КонецПопытки;
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os b/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os
index b1917ae7af..65f918be99 100644
--- a/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os
+++ b/ru/OInt/tools/Modules/OPI_ПреобразованиеТипов.os
@@ -1,320 +1,320 @@
-// Расположение OS: ./OInt/tools/Modules/OPI_ПреобразованиеТипов.os
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:UnusedLocalVariable-off
-
-#Использовать "./internal"
-
-#Область СлужебныйПрограммныйИнтерфейс
-
-Процедура ПолучитьДвоичныеДанные(Значение) Экспорт
-
- Если Значение = Неопределено Тогда
- Возврат;
- КонецЕсли;
-
- Попытка
-
- Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
- Возврат;
- Иначе
-
- Файл = Новый Файл(Значение);
-
- Если Файл.Существует() Тогда
- Значение = Новый ДвоичныеДанные(Значение);
-
- ИначеЕсли СтрНайти(Значение, "//") Тогда
-
- Значение = OPI_Инструменты.Get(Значение);
-
- Иначе
-
- Значение = Base64Значение(Значение);
-
- КонецЕсли;
-
- КонецЕсли;
-
- Исключение
- ВызватьИсключение "Ошибка получения двоичных данных из параметра: " + ОписаниеОшибки();
- КонецПопытки;
-
-КонецПроцедуры
-
-Процедура ПолучитьДвоичныеИлиПоток(Значение) Экспорт
-
- Если Значение = Неопределено Тогда
- Возврат;
- КонецЕсли;
-
- Если ТипЗнч(Значение) <> Тип("Строка") Тогда
- ПолучитьДвоичныеДанные(Значение);
- Возврат;
- КонецЕсли;
-
- Файл = Новый Файл(Значение);
-
- Если Файл.Существует() Тогда
- Значение = Новый ФайловыйПоток(Значение, РежимОткрытияФайла.Открыть);
- Иначе
- ПолучитьДвоичныеДанные(Значение);
- КонецЕсли;
-
-КонецПроцедуры
-
-Процедура ПолучитьКоллекцию(Значение) Экспорт
-
- Если Значение = Неопределено Тогда
- Возврат;
- КонецЕсли;
-
- Попытка
-
- ИсходноеЗначение = Значение;
-
- Если ЭтоКоллекция(Значение) Тогда
- Возврат;
- Иначе
-
- Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
- Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение);
- Иначе
- Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
- КонецЕсли;
-
- Файл = Новый Файл(Значение);
- ЧтениеJSON = Новый ЧтениеJSON;
-
- Если Файл.Существует() Тогда
-
- ЧтениеJSON.ОткрытьФайл(Значение);
-
- ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда
-
- ИВФ = ПолучитьИмяВременногоФайла();
- КопироватьФайл(Значение, ИВФ);
- ЧтениеJSON.ОткрытьФайл(ИВФ);
- ЧтениеJSON.Прочитать();
-
- УдалитьФайлы(ИВФ);
-
- Иначе
-
- ЧтениеJSON.УстановитьСтроку(СокрЛП(Значение));
-
- КонецЕсли;
-
- Значение = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO);
- ЧтениеJSON.Закрыть();
-
- Если (Не ЭтоКоллекция(Значение)) Или Не ЗначениеЗаполнено(Значение) Тогда
-
- Значение = ИсходноеЗначение;
- ПолучитьМассив(Значение);
-
- КонецЕсли;
-
- КонецЕсли;
-
- Исключение
-
- Значение = ИсходноеЗначение;
- ПолучитьМассив(Значение);
-
- КонецПопытки;
-
-КонецПроцедуры
-
-Процедура ПолучитьМассив(Значение) Экспорт
-
- Если ТипЗнч(Значение) = Тип("Массив") Тогда
- Возврат;
- КонецЕсли;
-
- Если ТипЗнч(Значение) = Тип("Строка")
- И СтрНачинаетсяС(Значение, "[")
- И СтрЗаканчиваетсяНа(Значение, "]") Тогда
-
- ЗапятаяВКавычках = "','";
-
- Значение = СтрЗаменить(Значение, "['" , "");
- Значение = СтрЗаменить(Значение, "']" , "");
- Значение = СтрЗаменить(Значение, "', '" , ЗапятаяВКавычках);
- Значение = СтрЗаменить(Значение, "' , '", ЗапятаяВКавычках);
- Значение = СтрЗаменить(Значение, "' ,'" , ЗапятаяВКавычках);
-
- Значение = СтрРазделить(Значение, ЗапятаяВКавычках, Ложь);
-
- Для Н = 0 По Значение.ВГраница() Цикл
- Значение[Н] = СокрЛП(Значение[Н]);
- КонецЦикла;
-
- Иначе
-
- Если ТипЗнч(Значение) = Тип("Число") Тогда
- Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
- КонецЕсли;
-
- OPI_Инструменты.ЗначениеВМассив(Значение);
-
- КонецЕсли;
-
-КонецПроцедуры
-
-Процедура ПолучитьБулево(Значение) Экспорт
-
- Если Значение = Неопределено Тогда
- Возврат;
- КонецЕсли;
-
- Попытка
-
- Если ТипЗнч(Значение) = Тип("Булево") Тогда
- Возврат;
- Иначе
- Значение = Булево(Значение);
- КонецЕсли;
-
- Исключение
- ВызватьИсключение "Ошибка получения данных булево из параметра";
- КонецПопытки;
-
-КонецПроцедуры
-
-Процедура ПолучитьСтроку(Значение, Знач ИзИсточника = Ложь) Экспорт
-
- Если Значение = Неопределено Тогда
- Возврат;
- КонецЕсли;
-
- Попытка
-
- Если ЭтоСимвольное(Значение) Тогда
-
- Если Не ИзИсточника Тогда
- Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
- Возврат;
- КонецЕсли;
-
- Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
- Файл = Новый Файл(Значение);
-
- Если Файл.Существует() Тогда
-
- ЧтениеТекста = Новый ЧтениеТекста(Значение);
- Значение = ЧтениеТекста.Прочитать();
- ЧтениеТекста.Закрыть();
-
- ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда
-
- ИВФ = ПолучитьИмяВременногоФайла();
- КопироватьФайл(Значение, ИВФ);
-
- ЧтениеТекста = Новый ЧтениеТекста(ИВФ);
- Значение = ЧтениеТекста.Прочитать();
- ЧтениеТекста.Закрыть();
-
- УдалитьФайлы(ИВФ);
-
- Иначе
-
- Возврат;
-
- КонецЕсли;
-
- ИначеЕсли ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
-
- Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение);
-
- ИначеЕсли ЭтоКоллекция(Значение) Тогда
-
- Значение = OPI_Инструменты.JSONСтрокой(Значение);
-
- Иначе
- Возврат;
- КонецЕсли;
-
- Исключение
- Значение = Строка(Значение);
- Возврат;
- КонецПопытки;
-
-КонецПроцедуры
-
-Процедура ПолучитьДату(Значение) Экспорт
-
- Если Значение = Неопределено Тогда
- Возврат;
- КонецЕсли;
-
- Дата = "Дата";
-
- Попытка
-
- Если ТипЗнч(Значение) = Тип(Дата) Тогда
- Возврат;
- Иначе
- Значение = XMLЗначение(Тип(Дата), Значение);
- КонецЕсли;
-
- Исключение
- ООД = Новый ОписаниеТипов(Дата);
- Значение = ООД.ПривестиЗначение(Значение);
- КонецПопытки;
-
-КонецПроцедуры
-
-Процедура ПолучитьЧисло(Значение) Экспорт
-
- ОписаниеТипа = Новый ОписаниеТипов("Число");
- Значение = ОписаниеТипа.ПривестиЗначение(Значение);
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ЭтоКоллекция(Знач Значение)
-
- Возврат ТипЗнч(Значение) = Тип("Массив")
- Или ТипЗнч(Значение) = Тип("Структура")
- Или ТипЗнч(Значение) = Тип("Соответствие");
-
-КонецФункции
-
-Функция ЭтоСимвольное(Знач Значение)
-
- Возврат ТипЗнч(Значение) = Тип("Строка")
- Или ТипЗнч(Значение) = Тип("Число")
- Или ТипЗнч(Значение) = Тип("Дата");
-
-КонецФункции
-
-#КонецОбласти
+// Расположение OS: ./OInt/tools/Modules/OPI_ПреобразованиеТипов.os
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:UnusedLocalVariable-off
+
+#Использовать "./internal"
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+Процедура ПолучитьДвоичныеДанные(Значение) Экспорт
+
+ Если Значение = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
+ Попытка
+
+ Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
+ Возврат;
+ Иначе
+
+ Файл = Новый Файл(Значение);
+
+ Если Файл.Существует() Тогда
+ Значение = Новый ДвоичныеДанные(Значение);
+
+ ИначеЕсли СтрНайти(Значение, "//") Тогда
+
+ Значение = OPI_Инструменты.Get(Значение);
+
+ Иначе
+
+ Значение = Base64Значение(Значение);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Исключение
+ ВызватьИсключение "Ошибка получения двоичных данных из параметра: " + ОписаниеОшибки();
+ КонецПопытки;
+
+КонецПроцедуры
+
+Процедура ПолучитьДвоичныеИлиПоток(Значение) Экспорт
+
+ Если Значение = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если ТипЗнч(Значение) <> Тип("Строка") Тогда
+ ПолучитьДвоичныеДанные(Значение);
+ Возврат;
+ КонецЕсли;
+
+ Файл = Новый Файл(Значение);
+
+ Если Файл.Существует() Тогда
+ Значение = Новый ФайловыйПоток(Значение, РежимОткрытияФайла.Открыть);
+ Иначе
+ ПолучитьДвоичныеДанные(Значение);
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ПолучитьКоллекцию(Значение) Экспорт
+
+ Если Значение = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
+ Попытка
+
+ ИсходноеЗначение = Значение;
+
+ Если ЭтоКоллекция(Значение) Тогда
+ Возврат;
+ Иначе
+
+ Если ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
+ Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение);
+ Иначе
+ Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
+ КонецЕсли;
+
+ Файл = Новый Файл(Значение);
+ ЧтениеJSON = Новый ЧтениеJSON;
+
+ Если Файл.Существует() Тогда
+
+ ЧтениеJSON.ОткрытьФайл(Значение);
+
+ ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда
+
+ ИВФ = ПолучитьИмяВременногоФайла();
+ КопироватьФайл(Значение, ИВФ);
+ ЧтениеJSON.ОткрытьФайл(ИВФ);
+ ЧтениеJSON.Прочитать();
+
+ УдалитьФайлы(ИВФ);
+
+ Иначе
+
+ ЧтениеJSON.УстановитьСтроку(СокрЛП(Значение));
+
+ КонецЕсли;
+
+ Значение = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO);
+ ЧтениеJSON.Закрыть();
+
+ Если (Не ЭтоКоллекция(Значение)) Или Не ЗначениеЗаполнено(Значение) Тогда
+
+ Значение = ИсходноеЗначение;
+ ПолучитьМассив(Значение);
+
+ КонецЕсли;
+
+ КонецЕсли;
+
+ Исключение
+
+ Значение = ИсходноеЗначение;
+ ПолучитьМассив(Значение);
+
+ КонецПопытки;
+
+КонецПроцедуры
+
+Процедура ПолучитьМассив(Значение) Экспорт
+
+ Если ТипЗнч(Значение) = Тип("Массив") Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если ТипЗнч(Значение) = Тип("Строка")
+ И СтрНачинаетсяС(Значение, "[")
+ И СтрЗаканчиваетсяНа(Значение, "]") Тогда
+
+ ЗапятаяВКавычках = "','";
+
+ Значение = СтрЗаменить(Значение, "['" , "");
+ Значение = СтрЗаменить(Значение, "']" , "");
+ Значение = СтрЗаменить(Значение, "', '" , ЗапятаяВКавычках);
+ Значение = СтрЗаменить(Значение, "' , '", ЗапятаяВКавычках);
+ Значение = СтрЗаменить(Значение, "' ,'" , ЗапятаяВКавычках);
+
+ Значение = СтрРазделить(Значение, ЗапятаяВКавычках, Ложь);
+
+ Для Н = 0 По Значение.ВГраница() Цикл
+ Значение[Н] = СокрЛП(Значение[Н]);
+ КонецЦикла;
+
+ Иначе
+
+ Если ТипЗнч(Значение) = Тип("Число") Тогда
+ Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
+ КонецЕсли;
+
+ OPI_Инструменты.ЗначениеВМассив(Значение);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ПолучитьБулево(Значение) Экспорт
+
+ Если Значение = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
+ Попытка
+
+ Если ТипЗнч(Значение) = Тип("Булево") Тогда
+ Возврат;
+ Иначе
+ Значение = Булево(Значение);
+ КонецЕсли;
+
+ Исключение
+ ВызватьИсключение "Ошибка получения данных булево из параметра";
+ КонецПопытки;
+
+КонецПроцедуры
+
+Процедура ПолучитьСтроку(Значение, Знач ИзИсточника = Ложь) Экспорт
+
+ Если Значение = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
+ Попытка
+
+ Если ЭтоСимвольное(Значение) Тогда
+
+ Если Не ИзИсточника Тогда
+ Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
+ Возврат;
+ КонецЕсли;
+
+ Значение = OPI_Инструменты.ЧислоВСтроку(Значение);
+ Файл = Новый Файл(Значение);
+
+ Если Файл.Существует() Тогда
+
+ ЧтениеТекста = Новый ЧтениеТекста(Значение);
+ Значение = ЧтениеТекста.Прочитать();
+ ЧтениеТекста.Закрыть();
+
+ ИначеЕсли СтрНачинаетсяС(нРег(Значение), "http") Тогда
+
+ ИВФ = ПолучитьИмяВременногоФайла();
+ КопироватьФайл(Значение, ИВФ);
+
+ ЧтениеТекста = Новый ЧтениеТекста(ИВФ);
+ Значение = ЧтениеТекста.Прочитать();
+ ЧтениеТекста.Закрыть();
+
+ УдалитьФайлы(ИВФ);
+
+ Иначе
+
+ Возврат;
+
+ КонецЕсли;
+
+ ИначеЕсли ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
+
+ Значение = ПолучитьСтрокуИзДвоичныхДанных(Значение);
+
+ ИначеЕсли ЭтоКоллекция(Значение) Тогда
+
+ Значение = OPI_Инструменты.JSONСтрокой(Значение);
+
+ Иначе
+ Возврат;
+ КонецЕсли;
+
+ Исключение
+ Значение = Строка(Значение);
+ Возврат;
+ КонецПопытки;
+
+КонецПроцедуры
+
+Процедура ПолучитьДату(Значение) Экспорт
+
+ Если Значение = Неопределено Тогда
+ Возврат;
+ КонецЕсли;
+
+ Дата = "Дата";
+
+ Попытка
+
+ Если ТипЗнч(Значение) = Тип(Дата) Тогда
+ Возврат;
+ Иначе
+ Значение = XMLЗначение(Тип(Дата), Значение);
+ КонецЕсли;
+
+ Исключение
+ ООД = Новый ОписаниеТипов(Дата);
+ Значение = ООД.ПривестиЗначение(Значение);
+ КонецПопытки;
+
+КонецПроцедуры
+
+Процедура ПолучитьЧисло(Значение) Экспорт
+
+ ОписаниеТипа = Новый ОписаниеТипов("Число");
+ Значение = ОписаниеТипа.ПривестиЗначение(Значение);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ЭтоКоллекция(Знач Значение)
+
+ Возврат ТипЗнч(Значение) = Тип("Массив")
+ Или ТипЗнч(Значение) = Тип("Структура")
+ Или ТипЗнч(Значение) = Тип("Соответствие");
+
+КонецФункции
+
+Функция ЭтоСимвольное(Знач Значение)
+
+ Возврат ТипЗнч(Значение) = Тип("Строка")
+ Или ТипЗнч(Значение) = Тип("Число")
+ Или ТипЗнч(Значение) = Тип("Дата");
+
+КонецФункции
+
+#КонецОбласти
diff --git a/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os b/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
index 541ea150b9..bc48b37707 100644
--- a/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
+++ b/ru/OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
@@ -1,1229 +1,1229 @@
-// Расположение OS: ./OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:Typo-off
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:UnusedLocalVariable-off
-// BSLLS:UsingServiceTag-off
-// BSLLS:NumberOfOptionalParams-off
-
-//@skip-check module-unused-local-variable
-//@skip-check method-too-many-params
-
-#Область СлужебныйПрограммныйИнтерфейс
-
-#Область HTTPМетоды
-
-#Область ЗапросыБезТела
-
-Функция Get(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = Неопределено) Экспорт
- Возврат ВыполнитьЗапросБезТела(URL, "GET", Параметры, ДопЗаголовки, ФайлОтвета);
-КонецФункции
-
-Функция Delete(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = Неопределено) Экспорт
- Возврат ВыполнитьЗапросБезТела(URL, "DELETE", Параметры, ДопЗаголовки, ФайлОтвета);
-КонецФункции
-
-#КонецОбласти
-
-#Область ЗапросыСТелом
-
-Функция Post(Знач URL
- , Знач Параметры = ""
- , Знач ДопЗаголовки = ""
- , Знач JSON = Истина
- , Знач ПолныйОтвет = Ложь
- , Знач ФайлОтвета = Неопределено) Экспорт
-
- Возврат ВыполнитьЗапросСТелом(URL, "POST", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета);
-
-КонецФункции
-
-Функция Patch(Знач URL
- , Знач Параметры = ""
- , Знач ДопЗаголовки = ""
- , Знач JSON = Истина
- , Знач ПолныйОтвет = Ложь
- , Знач ФайлОтвета = Неопределено) Экспорт
-
- Возврат ВыполнитьЗапросСТелом(URL, "PATCH", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета);
-
-КонецФункции
-
-Функция Put(Знач URL
- , Знач Параметры = ""
- , Знач ДопЗаголовки = ""
- , Знач JSON = Истина
- , Знач ПолныйОтвет = Ложь
- , Знач ФайлОтвета = Неопределено) Экспорт
-
- Возврат ВыполнитьЗапросСТелом(URL, "PUT", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета);
-
-КонецФункции
-
-Функция PostBinary(Знач URL
- , Знач Тело
- , Знач ДопЗаголовки
- , Знач ПолныйОтвет = Ложь
- , Знач ТипДанных = "application/octet-stream") Экспорт
-
- Возврат ВыполнитьЗапросСДвоичнымиДанными(URL, "POST", Тело, ДопЗаголовки, ПолныйОтвет, ТипДанных);
-
-КонецФункции
-
-#КонецОбласти
-
-#Область ЗапросыMultipart
-
-Функция PostMultipart(Знач URL
- , Знач Параметры = ""
- , Знач Файлы = ""
- , Знач ТипКонтента = "image/jpeg"
- , Знач ДопЗаголовки = ""
- , Знач ФайлОтвета = Неопределено) Экспорт
-
- Возврат ВыполнитьЗапросМультипарт(URL, "POST", Параметры, Файлы, ТипКонтента, ДопЗаголовки, ФайлОтвета);
-
-КонецФункции
-
-Функция PutMultipart(Знач URL
- , Знач Параметры = ""
- , Знач Файлы = ""
- , Знач ТипКонтента = "image/jpeg"
- , Знач ДопЗаголовки = ""
- , Знач ФайлОтвета = Неопределено) Экспорт
-
- Возврат ВыполнитьЗапросМультипарт(URL, "PUT", Параметры, Файлы, ТипКонтента, ДопЗаголовки, ФайлОтвета);
-
-КонецФункции
-
-Функция PostMultipartRelated(Знач URL
- , Знач JSON = ""
- , Знач Файлы = ""
- , Знач ДопЗаголовки = ""
- , Знач ФайлОтвета = Неопределено) Экспорт
-
- Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "POST", JSON, Файлы, ДопЗаголовки, ФайлОтвета);
-
-КонецФункции
-
-Функция PatchMultipartRelated(Знач URL
- , Знач JSON = ""
- , Знач Файлы = ""
- , Знач ДопЗаголовки = ""
- , Знач ФайлОтвета = Неопределено) Экспорт
-
- Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "PATCH", JSON, Файлы, ДопЗаголовки, ФайлОтвета);
-
-КонецФункции
-
-#КонецОбласти
-
-#Область Прочее
-
-Процедура ОбработатьОтвет(Ответ, Знач ПолныйОтвет = Ложь) Экспорт
-
- Если ПолныйОтвет Или ТипЗнч(Ответ) <> Тип("HTTPОтвет") Тогда
- Возврат;
- КонецЕсли;
-
- ФайлТела = Ответ.ПолучитьИмяФайлаТела();
-
- Если Не ФайлТела = Неопределено Тогда
- Ответ = ФайлТела;
- Возврат;
- КонецЕсли;
-
- GZip = "gzip";
- НужнаРаспаковка =
- Ответ.Заголовки.Получить("Content-Encoding") = GZip
- Или Ответ.Заголовки.Получить("content-encoding") = GZip;
-
- Если НужнаРаспаковка Тогда
- Ответ = РаспаковатьОтвет(Ответ);
- КонецЕсли;
-
- Ответ = ?(ТипЗнч(Ответ) = Тип("HTTPОтвет"), Ответ.ПолучитьТелоКакДвоичныеДанные(), Ответ);
-
- Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда
-
- Попытка
- Ответ = JsonВСтруктуру(Ответ);
- Исключение
- Возврат;
- КонецПопытки;
-
- КонецЕсли;
-
-КонецПроцедуры
-
-Функция СоздатьЗапрос(Знач Адрес, Знач ДопЗаголовки = "", Знач ТипДанных = "") Экспорт
-
- Заголовки = Новый Соответствие;
- Заголовки.Вставить("Accept-Encoding", "gzip");
- Заголовки.Вставить("Accept" , "*/*");
- Заголовки.Вставить("Connection" , "keep-alive");
- Заголовки.Вставить("Accept-Charset" , "utf-8");
-
- Если ЗначениеЗаполнено(ТипДанных) Тогда
- Заголовки.Вставить("Content-Type", ТипДанных);
- КонецЕсли;
-
- Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
-
- Для Каждого Заголовок Из ДопЗаголовки Цикл
- Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
- КонецЦикла;
-
- КонецЕсли;
-
- НовыйЗапрос = Новый HTTPЗапрос(Адрес, Заголовки);
-
- Возврат НовыйЗапрос;
-
-КонецФункции
-
-Функция СоздатьСоединение(Знач Сервер, Знач Пользователь = "", Знач Пароль = "") Экспорт
-
- Попытка
- SSL = Новый ЗащищенноеСоединениеOpenSSL;
- Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000, SSL);
- Исключение
- Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000);
- КонецПопытки;
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область Служебные
-
-Функция ПараметрыЗапросаВСтроку(Знач Параметры) Экспорт
-
- Если Параметры.Количество() = 0 Тогда
- Возврат "";
- КонецЕсли;
-
- СтрокаПараметров = "?";
-
- Для Каждого Параметр Из Параметры Цикл
-
- ЗначениеПараметра = ПреобразоватьПараметрВСтроку(Параметр.Значение);
-
- СтрокаПараметров = СтрокаПараметров
- + Параметр.Ключ
- + "="
- + ЗначениеПараметра
- + "&";
- КонецЦикла;
-
- СтрокаПараметров = Лев(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
-
- Возврат СтрокаПараметров;
-
-КонецФункции
-
-Функция РазбитьURL(Знач URL) Экспорт
-
- URL = СтрЗаменить(URL, "https://", "");
- URL = СтрЗаменить(URL, "http://", "");
- URL = СтрЗаменить(URL, ":443", "");
-
- Адрес = Прав(URL, СтрДлина(URL) - СтрНайти(URL, "/", НаправлениеПоиска.СНачала) + 1);
- Сервер = Лев(URL, СтрНайти(URL, "/", НаправлениеПоиска.СНачала) - 1);
-
- Попытка
- SSL = Новый ЗащищенноеСоединениеOpenSSL;
- Исключение
- Сервер = "https://" + Сервер;
- КонецПопытки;
-
- СтруктураВозврата = Новый Структура;
- СтруктураВозврата.Вставить("Сервер", Сервер);
- СтруктураВозврата.Вставить("Адрес" , Адрес);
-
- Возврат СтруктураВозврата;
-
-КонецФункции
-
-Функция JsonВСтруктуру(Знач Текст) Экспорт
-
- Если Не ЗначениеЗаполнено(Текст) Тогда
- Возврат "";
- КонецЕсли;
-
- Текст = ?(ТипЗнч(Текст) = Тип("ДвоичныеДанные"), ПолучитьСтрокуИзДвоичныхДанных(Текст), Текст);
-
- ЧтениеJSON = Новый ЧтениеJSON;
- ЧтениеJSON.УстановитьСтроку(Текст);
-
- Данные = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO);
- ЧтениеJSON.Закрыть();
-
- Возврат Данные;
-
-КонецФункции
-
-Функция JSONСтрокой(Знач Данные, Знач Экранирование = "Нет") Экспорт
-
- ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Windows
- , " "
- , Истина
- , ЭкранированиеСимволовJSON[Экранирование]
- , Ложь
- , Ложь
- , Ложь
- , Ложь);
-
- Попытка
-
- ЗаписьJSON = Новый ЗаписьJSON;
- ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
-
- ЗаписатьJSON(ЗаписьJSON, Данные);
- Возврат ЗаписьJSON.Закрыть();
-
- Исключение
- Возврат "НЕ JSON: " + Строка(Данные);
- КонецПопытки;
-
-КонецФункции
-
-Функция ЧислоВСтроку(Знач Число) Экспорт
- Возврат СтрЗаменить(Строка(Число), Символы.НПП, "");
-КонецФункции
-
-Функция ПрочитатьJSONФайл(Знач Путь) Экспорт
-
- ЧтениеJSON = Новый ЧтениеJSON;
- ЧтениеJSON.ОткрытьФайл(Путь);
- Значения = ПрочитатьJSON(ЧтениеJSON);
-
- ЧтениеJSON.Закрыть();
-
- Возврат Значения;
-
-КонецФункции
-
-Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт
-
- СоответствиеВозврата = Новый Соответствие;
- КоличествоЧастей = 2;
- МассивПараметров = СтрРазделить(СтрокаПараметров, "&", Ложь);
-
- Для Каждого Параметр Из МассивПараметров Цикл
-
- МассивКлючЗначение = СтрРазделить(Параметр, "=");
-
- Если МассивКлючЗначение.Количество() = КоличествоЧастей Тогда
- СоответствиеВозврата.Вставить(МассивКлючЗначение[0], МассивКлючЗначение[1]);
- КонецЕсли;
-
- КонецЦикла;
-
- Возврат СоответствиеВозврата;
-
-КонецФункции
-
-Функция ПолучитьТекущуюДату() Экспорт
- Возврат МестноеВремя(ТекущаяУниверсальнаяДата());
-КонецФункции
-
-Функция UNIXTime(Знач Дата) Экспорт
-
- ОТД = Новый ОписаниеТипов("Дата");
- Дата = ОТД.ПривестиЗначение(Дата);
-
- UNIX = Формат(Дата - Дата(1970, 1, 1, 1, 0, 0), "ЧЦ=10; ЧДЦ=0; ЧГ=0");
- UNIX = СтрЗаменить(UNIX, ",", "");
- UNIX = Лев(UNIX, 10);
-
- Возврат UNIX;
-
-КонецФункции
-
-Функция ИнформацияОПрогрессе(Знач Текущее, Знач Всего, Знач ЕдИзм, Знач Делитель = 1) Экспорт
-
- Целое = 100;
- Текущее = Окр(Текущее / Делитель, 2);
- Всего = Окр(Всего / Делитель, 2);
- Процент = Цел(Текущее / Всего * Целое);
-
- СтрТекущее = ЧислоВСтроку(Текущее);
- СтрВсего = ЧислоВСтроку(Всего);
- СтрПроцент = ЧислоВСтроку(Процент);
-
- Информация = СтрТекущее + "/" + СтрВсего + " " + ЕдИзм + " ( " + СтрПроцент + "% )";
-
- Возврат Информация;
-
-КонецФункции
-
-Функция ПреобразоватьДанныеСПолучениемРазмера(Данные, Знач МинимальныйРазмерДляПотока = 0) Экспорт
-
- Размер = 0;
-
- Если ТипЗнч(Данные) = Тип("Строка") Тогда
-
- ФайлНаДиске = Новый Файл(Данные);
-
- Если ФайлНаДиске.Существует() Тогда
- Размер = ФайлНаДиске.Размер();
- Иначе
- OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные);
- Размер = Данные.Размер();
- КонецЕсли;
-
- Иначе
- OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные);
- Размер = Данные.Размер();
- КонецЕсли;
-
- Если ЗначениеЗаполнено(МинимальныйРазмерДляПотока) Тогда
- Если Размер < МинимальныйРазмерДляПотока Тогда
- OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные);
- Иначе
- OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные);
- КонецЕсли;
- Иначе
- OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные);
- КонецЕсли;
-
- Возврат Размер;
-
-КонецФункции
-
-Процедура ЗначениеВМассив(Значение) Экспорт
-
- Значение_ = Новый Массив;
- Значение_.Добавить(Значение);
- Значение = Значение_;
-
-КонецПроцедуры
-
-Процедура ЗаменитьСпецСимволы(Текст, Разметка = "Markdown") Экспорт
-
- СоответствиеСимволов = Новый Соответствие;
-
- Если Разметка = "HTML" Тогда
-
- СоответствиеСимволов.Вставить("&", "&");
-
- ИначеЕсли Разметка = "MarkdownV2" Тогда
-
- СоответствиеСимволов.Вставить("-", "\-");
- СоответствиеСимволов.Вставить("+", "\+");
- СоответствиеСимволов.Вставить("#", "\#");
- СоответствиеСимволов.Вставить("=", "\=");
- СоответствиеСимволов.Вставить("{", "\{");
- СоответствиеСимволов.Вставить("}", "\}");
- СоответствиеСимволов.Вставить(".", "\.");
-
- Иначе
- Возврат;
- КонецЕсли;
-
- Для Каждого СимволМассива Из СоответствиеСимволов Цикл
- Текст = СтрЗаменить(Текст, СимволМассива.Ключ, СимволМассива.Значение);
- КонецЦикла;
-
-КонецПроцедуры
-
-Процедура УдалитьПустыеПоляКоллекции(Коллекция) Экспорт
-
- ТипКоллекции = ТипЗнч(Коллекция);
- ВыходнаяКоллекция = Новый(ТипКоллекции);
-
- Если ТипКоллекции = Тип("Соответствие") Или ТипКоллекции = Тип("Структура") Тогда
-
- УдалитьПустыеКлючиЗначения(Коллекция, ВыходнаяКоллекция);
-
- ИначеЕсли ТипКоллекции = Тип("Массив") Тогда
-
- УдалитьПустыеЭлементыМассива(Коллекция, ВыходнаяКоллекция);
-
- Иначе
-
- ВыходнаяКоллекция = Коллекция;
-
- КонецЕсли;
-
- Коллекция = ВыходнаяКоллекция;
-
-КонецПроцедуры
-
-Процедура Пауза(Знач Секунды) Экспорт
-
- Соединение = Новый HTTPСоединение("1C.ru", 11111, , , , Секунды);
- Попытка
- Соединение.Получить(Новый HTTPЗапрос(""));
- Исключение
- Возврат;
- КонецПопытки;
-
-КонецПроцедуры
-
-Процедура ДобавитьПоле(Знач Имя, Знач Значение, Знач Тип, Коллекция) Экспорт
-
- Заполнено = ЗначениеЗаполнено(Значение);
-
- Если Не Заполнено Тогда
- Возврат;
- КонецЕсли;
-
- Если Тип = "Дата" Тогда
- OPI_ПреобразованиеТипов.ПолучитьДату(Значение);
- Значение = UNIXTime(Значение);
-
- ИначеЕсли Тип = "Коллекция" Тогда
- OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Значение);
-
- ИначеЕсли Тип = "Булево" Тогда
- OPI_ПреобразованиеТипов.ПолучитьБулево(Значение);
-
- ИначеЕсли Тип = "СтрокаФайла" Тогда
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение, Истина);
-
- ИначеЕсли Тип = "Массив" Тогда
- OPI_ПреобразованиеТипов.ПолучитьМассив(Значение);
-
- ИначеЕсли Тип = "ДвоичныеДанные" Тогда
- OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Значение);
-
- ИначеЕсли Тип = "Число" Тогда
- OPI_ПреобразованиеТипов.ПолучитьЧисло(Значение);
-
- Иначе
- OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
-
- КонецЕсли;
-
- Коллекция.Вставить(Имя, Значение);
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ВыполнитьЗапросСТелом(Знач URL
- , Знач Вид
- , Знач Параметры = ""
- , Знач ДопЗаголовки = ""
- , Знач JSON = Истина
- , Знач ПолныйОтвет = Ложь
- , Знач ФайлОтвета = Неопределено)
-
- Если Не ЗначениеЗаполнено(Параметры) Тогда
- Параметры = Новый Структура;
- КонецЕсли;
-
- ТипДанных = ?(JSON, "application/json; charset=utf-8", "application/x-www-form-urlencoded; charset=utf-8");
- СтруктураURL = РазбитьURL(URL);
- Сервер = СтруктураURL["Сервер"];
- Адрес = СтруктураURL["Адрес"];
-
- Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
- Соединение = СоздатьСоединение(Сервер);
-
- УстановитьТелоЗапроса(Запрос, Параметры, JSON);
-
- Если ЗначениеЗаполнено(ФайлОтвета) Тогда
- Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
- Иначе
- Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
- КонецЕсли;
-
- Если ЭтоПереадресация(Ответ) Тогда
- Ответ = ВыполнитьЗапросСТелом(Ответ.Заголовки["Location"]
- , Вид
- , Параметры
- , ДопЗаголовки
- , JSON
- , ПолныйОтвет
- , ФайлОтвета);
- Иначе
- ОбработатьОтвет(Ответ, ПолныйОтвет);
- КонецЕсли;
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ВыполнитьЗапросСДвоичнымиДанными(Знач URL
- , Знач Вид
- , Знач Данные
- , Знач ДопЗаголовки
- , Знач ПолныйОтвет
- , Знач ТипДанных)
-
- СтруктураURL = РазбитьURL(URL);
- Сервер = СтруктураURL["Сервер"];
- Адрес = СтруктураURL["Адрес"];
-
- Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
- Соединение = СоздатьСоединение(Сервер);
-
- Запрос.УстановитьТелоИзДвоичныхДанных(Данные);
-
- Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
-
- Если ЭтоПереадресация(Ответ) Тогда
- Ответ = ВыполнитьЗапросСДвоичнымиДанными(Ответ.Заголовки["Location"]
- , Вид
- , Данные
- , ДопЗаголовки
- , ПолныйОтвет
- , ТипДанных);
- Иначе
- ОбработатьОтвет(Ответ, ПолныйОтвет);
- КонецЕсли;
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ВыполнитьЗапросБезТела(Знач URL
- , Знач Вид
- , Знач Параметры = ""
- , Знач ДопЗаголовки = ""
- , Знач ФайлОтвета = Неопределено)
-
- Если Не ЗначениеЗаполнено(Параметры) Тогда
- Параметры = Новый Структура;
- КонецЕсли;
-
- СтруктураURL = РазбитьURL(URL);
- Сервер = СтруктураURL["Сервер"];
- Адрес = СтруктураURL["Адрес"] + ПараметрыЗапросаВСтроку(Параметры);
-
- Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки);
- Соединение = СоздатьСоединение(Сервер);
-
- Если ЗначениеЗаполнено(ФайлОтвета) Тогда
- Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
- Иначе
- Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
- КонецЕсли;
-
- Если ЭтоПереадресация(Ответ) Тогда
- Ответ = ВыполнитьЗапросБезТела(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки, ФайлОтвета);
- Иначе
- ОбработатьОтвет(Ответ);
- КонецЕсли;
-
- Возврат Ответ;
-
-КонецФункции
-
-Функция ВыполнитьЗапросМультипарт(Знач URL
- , Знач Вид
- , Знач Параметры = ""
- , Знач Файлы = ""
- , Знач ТипКонтента = "image/jpeg"
- , Знач ДопЗаголовки = ""
- , Знач ФайлОтвета = Неопределено)
-
- Если Не ЗначениеЗаполнено(Параметры) Тогда
- Параметры = Новый Структура;
- КонецЕсли;
-
- Если Не ЗначениеЗаполнено(Файлы) Тогда
- Файлы = Новый Соответствие;
- КонецЕсли;
-
- Переадресация = 300;
- Ошибка = 400;
- Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
- РазделительСтрок = Символы.ВК + Символы.ПС;
- ТипДанных = "multipart/form-data; boundary=" + Boundary;
- СтруктураURL = РазбитьURL(URL);
- Сервер = СтруктураURL["Сервер"];
- Адрес = СтруктураURL["Адрес"];
-
- Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
- Соединение = СоздатьСоединение(Сервер);
-
- ТелоЗапроса = ПолучитьИмяВременногоФайла();
- ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса
- , КодировкаТекста.UTF8
- , ПорядокБайтов.LittleEndian
- , ""
- , Ложь
- , ""
- , Ложь);
-
- ЗаписатьПараметрыМультипарт(ЗаписьТекста, Boundary, Параметры);
- ЗаписатьФайлыМультипарт(ЗаписьТекста, Boundary, ТипКонтента, Файлы);
-
- ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
- ЗаписьТекста.Закрыть();
-
- Запрос.УстановитьИмяФайлаТела(ТелоЗапроса);
-
- Если ЗначениеЗаполнено(ФайлОтвета) Тогда
- Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
- Иначе
- Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
- КонецЕсли;
-
- ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка;
-
- Если ЭтоПереадресация Тогда
- Ответ = ВыполнитьЗапросМультипарт(Ответ.Заголовки["Location"]
- , Вид
- , Параметры
- , Файлы
- , ТипКонтента
- , ДопЗаголовки
- , ФайлОтвета);
- Иначе
- ОбработатьОтвет(Ответ);
- КонецЕсли;
-
- Запрос = Неопределено;
- ЗаписьТекста = Неопределено;
-
- УдалитьФайлы(ТелоЗапроса);
- Возврат Ответ;
-
-КонецФункции
-
-Функция ВыполнитьЗапросМультипартРелэйтед(Знач URL
- , Знач Вид
- , Знач JSON = ""
- , Знач Файлы = ""
- , Знач ДопЗаголовки = ""
- , Знач ФайлОтвета = Неопределено)
-
- Переадресация = 300;
- Ошибка = 400;
- Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
- РазделительСтрок = Символы.ВК + Символы.ПС;
- ТипДанных = "multipart/related; boundary=" + Boundary;
- СтруктураURL = РазбитьURL(URL);
- Сервер = СтруктураURL["Сервер"];
- Адрес = СтруктураURL["Адрес"];
-
- Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
- Соединение = СоздатьСоединение(Сервер);
-
- ТелоЗапроса = ПолучитьИмяВременногоФайла();
- ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса
- , КодировкаТекста.UTF8
- , ПорядокБайтов.LittleEndian
- , ""
- , Ложь
- , ""
- , Ложь);
-
- ЗаписатьJSONМультипарт(ЗаписьТекста, Boundary, JSON);
- ЗаписатьФайлыРелэйтед(ЗаписьТекста, Boundary, Файлы);
-
- ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
- ЗаписьТекста.Закрыть();
-
- ДобавитьContentLength(Запрос);
-
- Запрос.УстановитьИмяФайлаТела(ТелоЗапроса);
-
- Если ЗначениеЗаполнено(ФайлОтвета) Тогда
- Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
- Иначе
- Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
- КонецЕсли;
-
- ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка;
-
- Если ЭтоПереадресация Тогда
- Ответ = ВыполнитьЗапросМультипартРелэйтед(Ответ.Заголовки["Location"]
- , Вид
- , JSON
- , Файлы
- , ДопЗаголовки
- , ФайлОтвета);
- Иначе
- ОбработатьОтвет(Ответ);
- КонецЕсли;
-
- Запрос = Неопределено;
- ЗаписьТекста = Неопределено;
-
- УдалитьФайлы(ТелоЗапроса);
- Возврат Ответ;
-
-КонецФункции
-
-Функция ЭтоПереадресация(Знач Ответ)
-
- Переадресация = 300;
- Ошибка = 400;
-
- ЭтоПереадресация = Ответ.КодСостояния >= Переадресация
- И Ответ.КодСостояния < Ошибка
- И ЗначениеЗаполнено(Ответ.Заголовки["Location"]);
-
- Возврат ЭтоПереадресация;
-
-КонецФункции
-
-Функция ПреобразоватьПараметрВСтроку(Знач Значение)
-
- Если ТипЗнч(Значение) = Тип("Массив") Тогда
- Значение = СтрСоединить(Значение, ",");
- Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL);
- Значение = "[" + Значение + "]";
- Иначе
- Значение = ЧислоВСтроку(Значение);
- Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL);
- КонецЕсли;
-
- Возврат Значение;
-
-КонецФункции
-
-Процедура УстановитьТелоЗапроса(Запрос, Знач Параметры, Знач JSON)
-
- Коллекция = ТипЗнч(Параметры) = Тип("Структура")
- Или ТипЗнч(Параметры) = Тип("Соответствие")
- Или ТипЗнч(Параметры) = Тип("Массив");
-
- Если JSON Тогда
- Данные = JSONСтрокой(Параметры);
- ИначеЕсли Не Коллекция Тогда
- Данные = Параметры;
- Иначе
- СтрокаПараметров = ПараметрыЗапросаВСтроку(Параметры);
- Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
- КонецЕсли;
-
- Если ТипЗнч(Данные) = Тип("Строка") Тогда
- Запрос.УстановитьТелоИзСтроки(Данные);
- Иначе
- //@skip-check wrong-type-expression
- Запрос.УстановитьТелоИзДвоичныхДанных(Данные);
- КонецЕсли;
-
-КонецПроцедуры
-
-Процедура ЗаписатьПараметрыМультипарт(ЗаписьТекста, Знач Boundary, Знач Параметры)
-
- РазделительСтрок = Символы.ВК + Символы.ПС;
-
- Для Каждого Параметр Из Параметры Цикл
-
- Если Параметр.Значение = Неопределено
- Или Параметр.Значение = NULL Тогда
- Продолжить;
- КонецЕсли;
-
- ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
- ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + Параметр.Ключ + """");
- ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
- ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-
- Если ТипЗнч(Параметр.Значение) = Тип("Строка")
- Или ТипЗнч(Параметр.Значение) = Тип("Число") Тогда
-
- ЗначениеСтрокой = ЧислоВСтроку(Параметр.Значение);
- ЗаписьТекста.ЗаписатьСтроку(ЗначениеСтрокой);
-
- ИначеЕсли ТипЗнч(Параметр.Значение) = Тип("Булево") Тогда
-
- ЗаписьТекста.ЗаписатьСтроку(?(Параметр.Значение, "true", "false"));
-
- Иначе
-
- ЗаписьТекста.Записать(Параметр.Значение);
-
- КонецЕсли;
-
- ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-
- КонецЦикла;
-
-КонецПроцедуры
-
-Процедура ЗаписатьФайлыМультипарт(ЗаписьТекста, Знач Boundary, Знач ТипКонтента, Знач Файлы)
-
- ТипКонтента = СокрЛП(ТипКонтента);
- РазделительСтрок = Символы.ВК + Символы.ПС;
- ЗаменаТочки = "___";
-
- Для Каждого Файл Из Файлы Цикл
-
- ПутьФайл = СтрЗаменить(Файл.Ключ, ЗаменаТочки, ".");
-
- Если ТипКонтента = "image/jpeg" Тогда
- ИмяФайлаОтправки = "photo";
- Иначе
- ИмяФайлаОтправки = СтрЗаменить(Файл.Ключ, ЗаменаТочки, ".");
- ИмяФайлаОтправки = Лев(ИмяФайлаОтправки, СтрНайти(ИмяФайлаОтправки, ".") - 1);
- ИмяФайлаОтправки = ?(ЗначениеЗаполнено(ИмяФайлаОтправки), ИмяФайлаОтправки, СтрЗаменить(Файл.Ключ,
- ЗаменаТочки, "."));
- КонецЕсли;
-
- ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
- ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name="""
- + ИмяФайлаОтправки
- + """; filename="""
- + ПутьФайл
- + """");
- ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-
- Если ЗначениеЗаполнено(ТипКонтента) Тогда
- ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + ТипКонтента);
- КонецЕсли;
-
- ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
- ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
- ЗаписатьДвоичныеДанные(ЗаписьТекста, Файл.Значение);
- ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-
- КонецЦикла;
-
-КонецПроцедуры
-
-Процедура ЗаписатьФайлыРелэйтед(ЗаписьТекста, Знач Boundary, Знач Файлы)
-
- Если Не ЗначениеЗаполнено(Файлы) Тогда
- Возврат;
- КонецЕсли;
-
- РазделительСтрок = Символы.ВК + Символы.ПС;
-
- Если ТипЗнч(Файлы) = Тип("Соответствие") Тогда
- Для Каждого Файл Из Файлы Цикл
-
- ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
- ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + Файл.Значение);
- ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
- ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
- ЗаписатьДвоичныеДанные(ЗаписьТекста, Файл.Ключ);
- ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
- ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-
- КонецЦикла;
-
- КонецЕсли;
-
-КонецПроцедуры
-
-Процедура ЗаписатьДвоичныеДанные(ЗаписьДанных, Знач ДвоичныеДанные)
-
- РазмерЧасти = 268435456;
- ПрочитанноБайт = 0;
- ТекущаяПозиция = 0;
- ОбщийРазмер = ДвоичныеДанные.Размер();
-
- Пока ПрочитанноБайт < ОбщийРазмер Цикл
-
- ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные);
- ПрочитанноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция);
- Результат = ЧтениеДанных.Прочитать(РазмерЧасти);
- ТекущиеДанные = Результат.ПолучитьДвоичныеДанные();
- РазмерТекущих = ТекущиеДанные.Размер();
-
- Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда
- Прервать;
- КонецЕсли;
-
- ЗаписьДанных.Записать(ТекущиеДанные);
-
- ОсвободитьОбъект(ТекущиеДанные);
- ВыполнитьСборкуМусора();
-
- ТекущаяПозиция = ТекущаяПозиция + РазмерТекущих;
-
- КонецЦикла;
-
-КонецПроцедуры
-
-Процедура ЗаписатьJSONМультипарт(ЗаписьТекста, Знач Boundary, Знач JSON)
-
- Если Не ЗначениеЗаполнено(JSON) Тогда
- Возврат;
- КонецЕсли;
-
- РазделительСтрок = Символы.ВК + Символы.ПС;
-
- ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
- ЗаписьТекста.ЗаписатьСтроку("Content-Type: application/json; charset=UTF-8");
- ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
- ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
- ЗаписьТекста.ЗаписатьСтроку(JSON);
- ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
- ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
-
-КонецПроцедуры
-
-Процедура ДобавитьContentLength(Запрос)
-
- ТелоЗапроса = Запрос.ПолучитьТелоКакДвоичныеДанные();
-
- Если ЗначениеЗаполнено(ТелоЗапроса) Тогда
-
- Размер = ТелоЗапроса.Размер();
- Запрос.Заголовки.Вставить("Content-Length", ЧислоВСтроку(Размер));
-
- КонецЕсли;
-
-КонецПроцедуры
-
-Процедура УдалитьПустыеКлючиЗначения(Знач Коллекция, ВыходнаяКоллекция)
-
- Для Каждого ЭлементКоллекции Из Коллекция Цикл
-
- Если Не ЭлементКоллекции.Значение = Неопределено И Не ЭлементКоллекции.Значение = NULL Тогда
- ВыходнаяКоллекция.Вставить(ЭлементКоллекции.Ключ, ЭлементКоллекции.Значение);
- КонецЕсли;
-
- КонецЦикла;
-
-КонецПроцедуры
-
-Процедура УдалитьПустыеЭлементыМассива(Знач Коллекция, ВыходнаяКоллекция)
-
- Для Каждого ЭлементКоллекции Из Коллекция Цикл
-
- Если Не ЭлементКоллекции = Неопределено И Не ЭлементКоллекции = NULL Тогда
- ВыходнаяКоллекция.Добавить(ЭлементКоллекции);
- КонецЕсли;
-
- КонецЦикла;
-
-КонецПроцедуры
-
-#Область GZip
-
-// Описание структур см. здесь https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
-// Источник: https://github.com/vbondarevsky/Connector
-
-// Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
-//
-// Copyright 2017-2023 Vladimir Bondarevskiy
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-//
-// URL: https://github.com/vbondarevsky/Connector
-// e-mail: vbondarevsky@gmail.com
-// Версия: 2.4.8
-//
-// Требования: платформа 1С версии 8.3.10 и выше
-
-Функция РаспаковатьОтвет(Ответ)
-
- Попытка
- Возврат ПрочитатьGZip(Ответ.ПолучитьТелоКакДвоичныеДанные());
- Исключение
- Возврат Ответ;
- КонецПопытки;
-
-КонецФункции
-
-Функция ПрочитатьGZip(СжатыеДанные) Экспорт
-
- РазмерПрефиксаGZip = 10;
- РазмерПостфиксаGZip = 8;
-
- РазмерДД = ZipРазмерDD();
- РазмерСДХ = ZipРазмерCDH();
- РазмерЕСД = ZipРазмерEOCD();
- РазмерЛФХ = ZipРазмерLFH();
-
- ЧтениеДанных = Новый ЧтениеДанных(СжатыеДанные);
- ЧтениеДанных.Пропустить(РазмерПрефиксаGZip);
- РазмерСжатыхДанных = ЧтениеДанных.ИсходныйПоток().Размер() - РазмерПрефиксаGZip - РазмерПостфиксаGZip;
-
- ПотокZip = Новый ПотокВПамяти(РазмерЛФХ
- + РазмерСжатыхДанных
- + РазмерДД
- + РазмерСДХ
- + РазмерЕСД);
-
- ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
- ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipLFH());
- ЧтениеДанных.КопироватьВ(ЗаписьДанных, РазмерСжатыхДанных);
-
- ЗаписьДанных.Закрыть();
- ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
-
- CRC32 = ЧтениеДанных.ПрочитатьЦелое32();
- РазмерНесжатыхДанных = ЧтениеДанных.ПрочитатьЦелое32();
- ЧтениеДанных.Закрыть();
-
- ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
- ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
- ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipEOCD(РазмерСжатыхДанных));
- ЗаписьДанных.Закрыть();
-
- Возврат ПрочитатьZip(ПотокZip);
-
-КонецФункции
-
-Функция ПрочитатьZip(СжатыеДанные, ТекстОшибки = Неопределено)
-
- Каталог = ПолучитьИмяВременногоФайла();
- ЧтениеZip = Новый ЧтениеZipФайла(СжатыеДанные);
- ИмяФайла = ЧтениеZip.Элементы[0].Имя;
- Попытка
- ЧтениеZip.Извлечь(ЧтениеZip.Элементы[0], Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
- Исключение
- // Игнорируем проверку целостности архива, просто читаем результат
- ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
- КонецПопытки;
- ЧтениеZip.Закрыть();
-
- Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла);
- УдалитьФайлы(Каталог);
-
- Возврат Результат;
-
-КонецФункции
-
-Функция ZipРазмерLFH()
-
- Возврат 34;
-
-КонецФункции
-
-Функция ZipРазмерDD()
-
- Возврат 16;
-
-КонецФункции
-
-Функция ZipРазмерCDH()
-
- Возврат 50;
-
-КонецФункции
-
-Функция ZipРазмерEOCD()
-
- Возврат 22;
-
-КонецФункции
-
-Функция ZipLFH()
-
- // Local file header
- Буфер = Новый БуферДвоичныхДанных(ZipРазмерLFH());
- Буфер.ЗаписатьЦелое32(0, 67324752); // signature 0x04034b50
- Буфер.ЗаписатьЦелое16(4, 20); // version
- Буфер.ЗаписатьЦелое16(6, 10); // bit flags
- Буфер.ЗаписатьЦелое16(8, 8); // compression method
- Буфер.ЗаписатьЦелое16(10, 0); // time
- Буфер.ЗаписатьЦелое16(12, 0); // date
- Буфер.ЗаписатьЦелое32(14, 0); // crc-32
- Буфер.ЗаписатьЦелое32(18, 0); // compressed size
- Буфер.ЗаписатьЦелое32(22, 0); // uncompressed size
- Буфер.ЗаписатьЦелое16(26, 4); // filename legth - "data"
- Буфер.ЗаписатьЦелое16(28, 0); // extra field length
- Буфер.Записать(30, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь));
-
- Возврат Буфер;
-
-КонецФункции
-
-Функция ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)
-
- // Data descriptor
- Буфер = Новый БуферДвоичныхДанных(ZipРазмерDD());
- Буфер.ЗаписатьЦелое32(0, 134695760);
- Буфер.ЗаписатьЦелое32(4, CRC32);
- Буфер.ЗаписатьЦелое32(8, РазмерСжатыхДанных);
- Буфер.ЗаписатьЦелое32(12, РазмерНесжатыхДанных);
-
- Возврат Буфер;
-
-КонецФункции
-
-Функция ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)
-
- // Central directory header
- Буфер = Новый БуферДвоичныхДанных(ZipРазмерCDH());
- Буфер.ЗаписатьЦелое32(0, 33639248); // signature 0x02014b50
- Буфер.ЗаписатьЦелое16(4, 798); // version made by
- Буфер.ЗаписатьЦелое16(6, 20); // version needed to extract
- Буфер.ЗаписатьЦелое16(8, 10); // bit flags
- Буфер.ЗаписатьЦелое16(10, 8); // compression method
- Буфер.ЗаписатьЦелое16(12, 0); // time
- Буфер.ЗаписатьЦелое16(14, 0); // date
- Буфер.ЗаписатьЦелое32(16, CRC32); // crc-32
- Буфер.ЗаписатьЦелое32(20, РазмерСжатыхДанных); // compressed size
- Буфер.ЗаписатьЦелое32(24, РазмерНесжатыхДанных); // uncompressed size
- Буфер.ЗаписатьЦелое16(28, 4); // file name length
- Буфер.ЗаписатьЦелое16(30, 0); // extra field length
- Буфер.ЗаписатьЦелое16(32, 0); // file comment length
- Буфер.ЗаписатьЦелое16(34, 0); // disk number start
- Буфер.ЗаписатьЦелое16(36, 0); // internal file attributes
- Буфер.ЗаписатьЦелое32(38, 2176057344); // external file attributes
- Буфер.ЗаписатьЦелое32(42, 0); // relative offset of local header
- Буфер.Записать(46, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь));
-
- Возврат Буфер;
-
-КонецФункции
-
-Функция ZipEOCD(РазмерСжатыхДанных)
-
- // End of central directory
- РазмерCDH = 50;
- Буфер = Новый БуферДвоичныхДанных(ZipРазмерEOCD());
- Буфер.ЗаписатьЦелое32(0, 101010256); // signature 0x06054b50
- Буфер.ЗаписатьЦелое16(4, 0); // number of this disk
- Буфер.ЗаписатьЦелое16(6, 0); // number of the disk with the start of the central directory
- Буфер.ЗаписатьЦелое16(8, 1); // total number of entries in the central directory on this disk
- Буфер.ЗаписатьЦелое16(10, 1); // total number of entries in the central directory
- Буфер.ЗаписатьЦелое32(12, РазмерCDH); // size of the central directory
- // offset of start of central directory with respect to the starting disk number
- Буфер.ЗаписатьЦелое32(16, ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD());
- Буфер.ЗаписатьЦелое16(20, 0); // the starting disk number
-
- Возврат Буфер;
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
+// Расположение OS: ./OInt/tools/Modules/internal/Modules/OPI_Инструменты.os
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:Typo-off
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:UnusedLocalVariable-off
+// BSLLS:UsingServiceTag-off
+// BSLLS:NumberOfOptionalParams-off
+
+//@skip-check module-unused-local-variable
+//@skip-check method-too-many-params
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+#Область HTTPМетоды
+
+#Область ЗапросыБезТела
+
+Функция Get(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = Неопределено) Экспорт
+ Возврат ВыполнитьЗапросБезТела(URL, "GET", Параметры, ДопЗаголовки, ФайлОтвета);
+КонецФункции
+
+Функция Delete(Знач URL, Знач Параметры = "", Знач ДопЗаголовки = "", Знач ФайлОтвета = Неопределено) Экспорт
+ Возврат ВыполнитьЗапросБезТела(URL, "DELETE", Параметры, ДопЗаголовки, ФайлОтвета);
+КонецФункции
+
+#КонецОбласти
+
+#Область ЗапросыСТелом
+
+Функция Post(Знач URL
+ , Знач Параметры = ""
+ , Знач ДопЗаголовки = ""
+ , Знач JSON = Истина
+ , Знач ПолныйОтвет = Ложь
+ , Знач ФайлОтвета = Неопределено) Экспорт
+
+ Возврат ВыполнитьЗапросСТелом(URL, "POST", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета);
+
+КонецФункции
+
+Функция Patch(Знач URL
+ , Знач Параметры = ""
+ , Знач ДопЗаголовки = ""
+ , Знач JSON = Истина
+ , Знач ПолныйОтвет = Ложь
+ , Знач ФайлОтвета = Неопределено) Экспорт
+
+ Возврат ВыполнитьЗапросСТелом(URL, "PATCH", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета);
+
+КонецФункции
+
+Функция Put(Знач URL
+ , Знач Параметры = ""
+ , Знач ДопЗаголовки = ""
+ , Знач JSON = Истина
+ , Знач ПолныйОтвет = Ложь
+ , Знач ФайлОтвета = Неопределено) Экспорт
+
+ Возврат ВыполнитьЗапросСТелом(URL, "PUT", Параметры, ДопЗаголовки, JSON, ПолныйОтвет, ФайлОтвета);
+
+КонецФункции
+
+Функция PostBinary(Знач URL
+ , Знач Тело
+ , Знач ДопЗаголовки
+ , Знач ПолныйОтвет = Ложь
+ , Знач ТипДанных = "application/octet-stream") Экспорт
+
+ Возврат ВыполнитьЗапросСДвоичнымиДанными(URL, "POST", Тело, ДопЗаголовки, ПолныйОтвет, ТипДанных);
+
+КонецФункции
+
+#КонецОбласти
+
+#Область ЗапросыMultipart
+
+Функция PostMultipart(Знач URL
+ , Знач Параметры = ""
+ , Знач Файлы = ""
+ , Знач ТипКонтента = "image/jpeg"
+ , Знач ДопЗаголовки = ""
+ , Знач ФайлОтвета = Неопределено) Экспорт
+
+ Возврат ВыполнитьЗапросМультипарт(URL, "POST", Параметры, Файлы, ТипКонтента, ДопЗаголовки, ФайлОтвета);
+
+КонецФункции
+
+Функция PutMultipart(Знач URL
+ , Знач Параметры = ""
+ , Знач Файлы = ""
+ , Знач ТипКонтента = "image/jpeg"
+ , Знач ДопЗаголовки = ""
+ , Знач ФайлОтвета = Неопределено) Экспорт
+
+ Возврат ВыполнитьЗапросМультипарт(URL, "PUT", Параметры, Файлы, ТипКонтента, ДопЗаголовки, ФайлОтвета);
+
+КонецФункции
+
+Функция PostMultipartRelated(Знач URL
+ , Знач JSON = ""
+ , Знач Файлы = ""
+ , Знач ДопЗаголовки = ""
+ , Знач ФайлОтвета = Неопределено) Экспорт
+
+ Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "POST", JSON, Файлы, ДопЗаголовки, ФайлОтвета);
+
+КонецФункции
+
+Функция PatchMultipartRelated(Знач URL
+ , Знач JSON = ""
+ , Знач Файлы = ""
+ , Знач ДопЗаголовки = ""
+ , Знач ФайлОтвета = Неопределено) Экспорт
+
+ Возврат ВыполнитьЗапросМультипартРелэйтед(URL, "PATCH", JSON, Файлы, ДопЗаголовки, ФайлОтвета);
+
+КонецФункции
+
+#КонецОбласти
+
+#Область Прочее
+
+Процедура ОбработатьОтвет(Ответ, Знач ПолныйОтвет = Ложь) Экспорт
+
+ Если ПолныйОтвет Или ТипЗнч(Ответ) <> Тип("HTTPОтвет") Тогда
+ Возврат;
+ КонецЕсли;
+
+ ФайлТела = Ответ.ПолучитьИмяФайлаТела();
+
+ Если Не ФайлТела = Неопределено Тогда
+ Ответ = ФайлТела;
+ Возврат;
+ КонецЕсли;
+
+ GZip = "gzip";
+ НужнаРаспаковка =
+ Ответ.Заголовки.Получить("Content-Encoding") = GZip
+ Или Ответ.Заголовки.Получить("content-encoding") = GZip;
+
+ Если НужнаРаспаковка Тогда
+ Ответ = РаспаковатьОтвет(Ответ);
+ КонецЕсли;
+
+ Ответ = ?(ТипЗнч(Ответ) = Тип("HTTPОтвет"), Ответ.ПолучитьТелоКакДвоичныеДанные(), Ответ);
+
+ Если ТипЗнч(Ответ) = Тип("ДвоичныеДанные") Тогда
+
+ Попытка
+ Ответ = JsonВСтруктуру(Ответ);
+ Исключение
+ Возврат;
+ КонецПопытки;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция СоздатьЗапрос(Знач Адрес, Знач ДопЗаголовки = "", Знач ТипДанных = "") Экспорт
+
+ Заголовки = Новый Соответствие;
+ Заголовки.Вставить("Accept-Encoding", "gzip");
+ Заголовки.Вставить("Accept" , "*/*");
+ Заголовки.Вставить("Connection" , "keep-alive");
+ Заголовки.Вставить("Accept-Charset" , "utf-8");
+
+ Если ЗначениеЗаполнено(ТипДанных) Тогда
+ Заголовки.Вставить("Content-Type", ТипДанных);
+ КонецЕсли;
+
+ Если ТипЗнч(ДопЗаголовки) = Тип("Соответствие") Тогда
+
+ Для Каждого Заголовок Из ДопЗаголовки Цикл
+ Заголовки.Вставить(Заголовок.Ключ, Заголовок.Значение);
+ КонецЦикла;
+
+ КонецЕсли;
+
+ НовыйЗапрос = Новый HTTPЗапрос(Адрес, Заголовки);
+
+ Возврат НовыйЗапрос;
+
+КонецФункции
+
+Функция СоздатьСоединение(Знач Сервер, Знач Пользователь = "", Знач Пароль = "") Экспорт
+
+ Попытка
+ SSL = Новый ЗащищенноеСоединениеOpenSSL;
+ Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000, SSL);
+ Исключение
+ Возврат Новый HTTPСоединение(Сервер, 443, Пользователь, Пароль, , 3000);
+ КонецПопытки;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область Служебные
+
+Функция ПараметрыЗапросаВСтроку(Знач Параметры) Экспорт
+
+ Если Параметры.Количество() = 0 Тогда
+ Возврат "";
+ КонецЕсли;
+
+ СтрокаПараметров = "?";
+
+ Для Каждого Параметр Из Параметры Цикл
+
+ ЗначениеПараметра = ПреобразоватьПараметрВСтроку(Параметр.Значение);
+
+ СтрокаПараметров = СтрокаПараметров
+ + Параметр.Ключ
+ + "="
+ + ЗначениеПараметра
+ + "&";
+ КонецЦикла;
+
+ СтрокаПараметров = Лев(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
+
+ Возврат СтрокаПараметров;
+
+КонецФункции
+
+Функция РазбитьURL(Знач URL) Экспорт
+
+ URL = СтрЗаменить(URL, "https://", "");
+ URL = СтрЗаменить(URL, "http://", "");
+ URL = СтрЗаменить(URL, ":443", "");
+
+ Адрес = Прав(URL, СтрДлина(URL) - СтрНайти(URL, "/", НаправлениеПоиска.СНачала) + 1);
+ Сервер = Лев(URL, СтрНайти(URL, "/", НаправлениеПоиска.СНачала) - 1);
+
+ Попытка
+ SSL = Новый ЗащищенноеСоединениеOpenSSL;
+ Исключение
+ Сервер = "https://" + Сервер;
+ КонецПопытки;
+
+ СтруктураВозврата = Новый Структура;
+ СтруктураВозврата.Вставить("Сервер", Сервер);
+ СтруктураВозврата.Вставить("Адрес" , Адрес);
+
+ Возврат СтруктураВозврата;
+
+КонецФункции
+
+Функция JsonВСтруктуру(Знач Текст) Экспорт
+
+ Если Не ЗначениеЗаполнено(Текст) Тогда
+ Возврат "";
+ КонецЕсли;
+
+ Текст = ?(ТипЗнч(Текст) = Тип("ДвоичныеДанные"), ПолучитьСтрокуИзДвоичныхДанных(Текст), Текст);
+
+ ЧтениеJSON = Новый ЧтениеJSON;
+ ЧтениеJSON.УстановитьСтроку(Текст);
+
+ Данные = ПрочитатьJSON(ЧтениеJSON, Истина, Неопределено, ФорматДатыJSON.ISO);
+ ЧтениеJSON.Закрыть();
+
+ Возврат Данные;
+
+КонецФункции
+
+Функция JSONСтрокой(Знач Данные, Знач Экранирование = "Нет") Экспорт
+
+ ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Windows
+ , " "
+ , Истина
+ , ЭкранированиеСимволовJSON[Экранирование]
+ , Ложь
+ , Ложь
+ , Ложь
+ , Ложь);
+
+ Попытка
+
+ ЗаписьJSON = Новый ЗаписьJSON;
+ ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
+
+ ЗаписатьJSON(ЗаписьJSON, Данные);
+ Возврат ЗаписьJSON.Закрыть();
+
+ Исключение
+ Возврат "НЕ JSON: " + Строка(Данные);
+ КонецПопытки;
+
+КонецФункции
+
+Функция ЧислоВСтроку(Знач Число) Экспорт
+ Возврат СтрЗаменить(Строка(Число), Символы.НПП, "");
+КонецФункции
+
+Функция ПрочитатьJSONФайл(Знач Путь) Экспорт
+
+ ЧтениеJSON = Новый ЧтениеJSON;
+ ЧтениеJSON.ОткрытьФайл(Путь);
+ Значения = ПрочитатьJSON(ЧтениеJSON);
+
+ ЧтениеJSON.Закрыть();
+
+ Возврат Значения;
+
+КонецФункции
+
+Функция ПараметрыЗапросаВСоответствие(Знач СтрокаПараметров) Экспорт
+
+ СоответствиеВозврата = Новый Соответствие;
+ КоличествоЧастей = 2;
+ МассивПараметров = СтрРазделить(СтрокаПараметров, "&", Ложь);
+
+ Для Каждого Параметр Из МассивПараметров Цикл
+
+ МассивКлючЗначение = СтрРазделить(Параметр, "=");
+
+ Если МассивКлючЗначение.Количество() = КоличествоЧастей Тогда
+ СоответствиеВозврата.Вставить(МассивКлючЗначение[0], МассивКлючЗначение[1]);
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Возврат СоответствиеВозврата;
+
+КонецФункции
+
+Функция ПолучитьТекущуюДату() Экспорт
+ Возврат МестноеВремя(ТекущаяУниверсальнаяДата());
+КонецФункции
+
+Функция UNIXTime(Знач Дата) Экспорт
+
+ ОТД = Новый ОписаниеТипов("Дата");
+ Дата = ОТД.ПривестиЗначение(Дата);
+
+ UNIX = Формат(Дата - Дата(1970, 1, 1, 1, 0, 0), "ЧЦ=10; ЧДЦ=0; ЧГ=0");
+ UNIX = СтрЗаменить(UNIX, ",", "");
+ UNIX = Лев(UNIX, 10);
+
+ Возврат UNIX;
+
+КонецФункции
+
+Функция ИнформацияОПрогрессе(Знач Текущее, Знач Всего, Знач ЕдИзм, Знач Делитель = 1) Экспорт
+
+ Целое = 100;
+ Текущее = Окр(Текущее / Делитель, 2);
+ Всего = Окр(Всего / Делитель, 2);
+ Процент = Цел(Текущее / Всего * Целое);
+
+ СтрТекущее = ЧислоВСтроку(Текущее);
+ СтрВсего = ЧислоВСтроку(Всего);
+ СтрПроцент = ЧислоВСтроку(Процент);
+
+ Информация = СтрТекущее + "/" + СтрВсего + " " + ЕдИзм + " ( " + СтрПроцент + "% )";
+
+ Возврат Информация;
+
+КонецФункции
+
+Функция ПреобразоватьДанныеСПолучениемРазмера(Данные, Знач МинимальныйРазмерДляПотока = 0) Экспорт
+
+ Размер = 0;
+
+ Если ТипЗнч(Данные) = Тип("Строка") Тогда
+
+ ФайлНаДиске = Новый Файл(Данные);
+
+ Если ФайлНаДиске.Существует() Тогда
+ Размер = ФайлНаДиске.Размер();
+ Иначе
+ OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные);
+ Размер = Данные.Размер();
+ КонецЕсли;
+
+ Иначе
+ OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные);
+ Размер = Данные.Размер();
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(МинимальныйРазмерДляПотока) Тогда
+ Если Размер < МинимальныйРазмерДляПотока Тогда
+ OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Данные);
+ Иначе
+ OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные);
+ КонецЕсли;
+ Иначе
+ OPI_ПреобразованиеТипов.ПолучитьДвоичныеИлиПоток(Данные);
+ КонецЕсли;
+
+ Возврат Размер;
+
+КонецФункции
+
+Процедура ЗначениеВМассив(Значение) Экспорт
+
+ Значение_ = Новый Массив;
+ Значение_.Добавить(Значение);
+ Значение = Значение_;
+
+КонецПроцедуры
+
+Процедура ЗаменитьСпецСимволы(Текст, Разметка = "Markdown") Экспорт
+
+ СоответствиеСимволов = Новый Соответствие;
+
+ Если Разметка = "HTML" Тогда
+
+ СоответствиеСимволов.Вставить("&", "&");
+
+ ИначеЕсли Разметка = "MarkdownV2" Тогда
+
+ СоответствиеСимволов.Вставить("-", "\-");
+ СоответствиеСимволов.Вставить("+", "\+");
+ СоответствиеСимволов.Вставить("#", "\#");
+ СоответствиеСимволов.Вставить("=", "\=");
+ СоответствиеСимволов.Вставить("{", "\{");
+ СоответствиеСимволов.Вставить("}", "\}");
+ СоответствиеСимволов.Вставить(".", "\.");
+
+ Иначе
+ Возврат;
+ КонецЕсли;
+
+ Для Каждого СимволМассива Из СоответствиеСимволов Цикл
+ Текст = СтрЗаменить(Текст, СимволМассива.Ключ, СимволМассива.Значение);
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура УдалитьПустыеПоляКоллекции(Коллекция) Экспорт
+
+ ТипКоллекции = ТипЗнч(Коллекция);
+ ВыходнаяКоллекция = Новый(ТипКоллекции);
+
+ Если ТипКоллекции = Тип("Соответствие") Или ТипКоллекции = Тип("Структура") Тогда
+
+ УдалитьПустыеКлючиЗначения(Коллекция, ВыходнаяКоллекция);
+
+ ИначеЕсли ТипКоллекции = Тип("Массив") Тогда
+
+ УдалитьПустыеЭлементыМассива(Коллекция, ВыходнаяКоллекция);
+
+ Иначе
+
+ ВыходнаяКоллекция = Коллекция;
+
+ КонецЕсли;
+
+ Коллекция = ВыходнаяКоллекция;
+
+КонецПроцедуры
+
+Процедура Пауза(Знач Секунды) Экспорт
+
+ Соединение = Новый HTTPСоединение("1C.ru", 11111, , , , Секунды);
+ Попытка
+ Соединение.Получить(Новый HTTPЗапрос(""));
+ Исключение
+ Возврат;
+ КонецПопытки;
+
+КонецПроцедуры
+
+Процедура ДобавитьПоле(Знач Имя, Знач Значение, Знач Тип, Коллекция) Экспорт
+
+ Заполнено = ЗначениеЗаполнено(Значение);
+
+ Если Не Заполнено Тогда
+ Возврат;
+ КонецЕсли;
+
+ Если Тип = "Дата" Тогда
+ OPI_ПреобразованиеТипов.ПолучитьДату(Значение);
+ Значение = UNIXTime(Значение);
+
+ ИначеЕсли Тип = "Коллекция" Тогда
+ OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Значение);
+
+ ИначеЕсли Тип = "Булево" Тогда
+ OPI_ПреобразованиеТипов.ПолучитьБулево(Значение);
+
+ ИначеЕсли Тип = "СтрокаФайла" Тогда
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение, Истина);
+
+ ИначеЕсли Тип = "Массив" Тогда
+ OPI_ПреобразованиеТипов.ПолучитьМассив(Значение);
+
+ ИначеЕсли Тип = "ДвоичныеДанные" Тогда
+ OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(Значение);
+
+ ИначеЕсли Тип = "Число" Тогда
+ OPI_ПреобразованиеТипов.ПолучитьЧисло(Значение);
+
+ Иначе
+ OPI_ПреобразованиеТипов.ПолучитьСтроку(Значение);
+
+ КонецЕсли;
+
+ Коллекция.Вставить(Имя, Значение);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ВыполнитьЗапросСТелом(Знач URL
+ , Знач Вид
+ , Знач Параметры = ""
+ , Знач ДопЗаголовки = ""
+ , Знач JSON = Истина
+ , Знач ПолныйОтвет = Ложь
+ , Знач ФайлОтвета = Неопределено)
+
+ Если Не ЗначениеЗаполнено(Параметры) Тогда
+ Параметры = Новый Структура;
+ КонецЕсли;
+
+ ТипДанных = ?(JSON, "application/json; charset=utf-8", "application/x-www-form-urlencoded; charset=utf-8");
+ СтруктураURL = РазбитьURL(URL);
+ Сервер = СтруктураURL["Сервер"];
+ Адрес = СтруктураURL["Адрес"];
+
+ Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
+ Соединение = СоздатьСоединение(Сервер);
+
+ УстановитьТелоЗапроса(Запрос, Параметры, JSON);
+
+ Если ЗначениеЗаполнено(ФайлОтвета) Тогда
+ Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
+ Иначе
+ Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
+ КонецЕсли;
+
+ Если ЭтоПереадресация(Ответ) Тогда
+ Ответ = ВыполнитьЗапросСТелом(Ответ.Заголовки["Location"]
+ , Вид
+ , Параметры
+ , ДопЗаголовки
+ , JSON
+ , ПолныйОтвет
+ , ФайлОтвета);
+ Иначе
+ ОбработатьОтвет(Ответ, ПолныйОтвет);
+ КонецЕсли;
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ВыполнитьЗапросСДвоичнымиДанными(Знач URL
+ , Знач Вид
+ , Знач Данные
+ , Знач ДопЗаголовки
+ , Знач ПолныйОтвет
+ , Знач ТипДанных)
+
+ СтруктураURL = РазбитьURL(URL);
+ Сервер = СтруктураURL["Сервер"];
+ Адрес = СтруктураURL["Адрес"];
+
+ Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
+ Соединение = СоздатьСоединение(Сервер);
+
+ Запрос.УстановитьТелоИзДвоичныхДанных(Данные);
+
+ Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
+
+ Если ЭтоПереадресация(Ответ) Тогда
+ Ответ = ВыполнитьЗапросСДвоичнымиДанными(Ответ.Заголовки["Location"]
+ , Вид
+ , Данные
+ , ДопЗаголовки
+ , ПолныйОтвет
+ , ТипДанных);
+ Иначе
+ ОбработатьОтвет(Ответ, ПолныйОтвет);
+ КонецЕсли;
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ВыполнитьЗапросБезТела(Знач URL
+ , Знач Вид
+ , Знач Параметры = ""
+ , Знач ДопЗаголовки = ""
+ , Знач ФайлОтвета = Неопределено)
+
+ Если Не ЗначениеЗаполнено(Параметры) Тогда
+ Параметры = Новый Структура;
+ КонецЕсли;
+
+ СтруктураURL = РазбитьURL(URL);
+ Сервер = СтруктураURL["Сервер"];
+ Адрес = СтруктураURL["Адрес"] + ПараметрыЗапросаВСтроку(Параметры);
+
+ Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки);
+ Соединение = СоздатьСоединение(Сервер);
+
+ Если ЗначениеЗаполнено(ФайлОтвета) Тогда
+ Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
+ Иначе
+ Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
+ КонецЕсли;
+
+ Если ЭтоПереадресация(Ответ) Тогда
+ Ответ = ВыполнитьЗапросБезТела(Ответ.Заголовки["Location"], Вид, Параметры, ДопЗаголовки, ФайлОтвета);
+ Иначе
+ ОбработатьОтвет(Ответ);
+ КонецЕсли;
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ВыполнитьЗапросМультипарт(Знач URL
+ , Знач Вид
+ , Знач Параметры = ""
+ , Знач Файлы = ""
+ , Знач ТипКонтента = "image/jpeg"
+ , Знач ДопЗаголовки = ""
+ , Знач ФайлОтвета = Неопределено)
+
+ Если Не ЗначениеЗаполнено(Параметры) Тогда
+ Параметры = Новый Структура;
+ КонецЕсли;
+
+ Если Не ЗначениеЗаполнено(Файлы) Тогда
+ Файлы = Новый Соответствие;
+ КонецЕсли;
+
+ Переадресация = 300;
+ Ошибка = 400;
+ Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
+ РазделительСтрок = Символы.ВК + Символы.ПС;
+ ТипДанных = "multipart/form-data; boundary=" + Boundary;
+ СтруктураURL = РазбитьURL(URL);
+ Сервер = СтруктураURL["Сервер"];
+ Адрес = СтруктураURL["Адрес"];
+
+ Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
+ Соединение = СоздатьСоединение(Сервер);
+
+ ТелоЗапроса = ПолучитьИмяВременногоФайла();
+ ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса
+ , КодировкаТекста.UTF8
+ , ПорядокБайтов.LittleEndian
+ , ""
+ , Ложь
+ , ""
+ , Ложь);
+
+ ЗаписатьПараметрыМультипарт(ЗаписьТекста, Boundary, Параметры);
+ ЗаписатьФайлыМультипарт(ЗаписьТекста, Boundary, ТипКонтента, Файлы);
+
+ ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
+ ЗаписьТекста.Закрыть();
+
+ Запрос.УстановитьИмяФайлаТела(ТелоЗапроса);
+
+ Если ЗначениеЗаполнено(ФайлОтвета) Тогда
+ Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
+ Иначе
+ Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
+ КонецЕсли;
+
+ ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка;
+
+ Если ЭтоПереадресация Тогда
+ Ответ = ВыполнитьЗапросМультипарт(Ответ.Заголовки["Location"]
+ , Вид
+ , Параметры
+ , Файлы
+ , ТипКонтента
+ , ДопЗаголовки
+ , ФайлОтвета);
+ Иначе
+ ОбработатьОтвет(Ответ);
+ КонецЕсли;
+
+ Запрос = Неопределено;
+ ЗаписьТекста = Неопределено;
+
+ УдалитьФайлы(ТелоЗапроса);
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ВыполнитьЗапросМультипартРелэйтед(Знач URL
+ , Знач Вид
+ , Знач JSON = ""
+ , Знач Файлы = ""
+ , Знач ДопЗаголовки = ""
+ , Знач ФайлОтвета = Неопределено)
+
+ Переадресация = 300;
+ Ошибка = 400;
+ Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор), "-", "");
+ РазделительСтрок = Символы.ВК + Символы.ПС;
+ ТипДанных = "multipart/related; boundary=" + Boundary;
+ СтруктураURL = РазбитьURL(URL);
+ Сервер = СтруктураURL["Сервер"];
+ Адрес = СтруктураURL["Адрес"];
+
+ Запрос = СоздатьЗапрос(Адрес, ДопЗаголовки, ТипДанных);
+ Соединение = СоздатьСоединение(Сервер);
+
+ ТелоЗапроса = ПолучитьИмяВременногоФайла();
+ ЗаписьТекста = Новый ЗаписьДанных(ТелоЗапроса
+ , КодировкаТекста.UTF8
+ , ПорядокБайтов.LittleEndian
+ , ""
+ , Ложь
+ , ""
+ , Ложь);
+
+ ЗаписатьJSONМультипарт(ЗаписьТекста, Boundary, JSON);
+ ЗаписатьФайлыРелэйтед(ЗаписьТекста, Boundary, Файлы);
+
+ ЗаписьТекста.ЗаписатьСтроку("--" + boundary + "--" + РазделительСтрок);
+ ЗаписьТекста.Закрыть();
+
+ ДобавитьContentLength(Запрос);
+
+ Запрос.УстановитьИмяФайлаТела(ТелоЗапроса);
+
+ Если ЗначениеЗаполнено(ФайлОтвета) Тогда
+ Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос, ФайлОтвета);
+ Иначе
+ Ответ = Соединение.ВызватьHTTPМетод(Вид, Запрос);
+ КонецЕсли;
+
+ ЭтоПереадресация = Ответ.КодСостояния >= Переадресация И Ответ.КодСостояния < Ошибка;
+
+ Если ЭтоПереадресация Тогда
+ Ответ = ВыполнитьЗапросМультипартРелэйтед(Ответ.Заголовки["Location"]
+ , Вид
+ , JSON
+ , Файлы
+ , ДопЗаголовки
+ , ФайлОтвета);
+ Иначе
+ ОбработатьОтвет(Ответ);
+ КонецЕсли;
+
+ Запрос = Неопределено;
+ ЗаписьТекста = Неопределено;
+
+ УдалитьФайлы(ТелоЗапроса);
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ЭтоПереадресация(Знач Ответ)
+
+ Переадресация = 300;
+ Ошибка = 400;
+
+ ЭтоПереадресация = Ответ.КодСостояния >= Переадресация
+ И Ответ.КодСостояния < Ошибка
+ И ЗначениеЗаполнено(Ответ.Заголовки["Location"]);
+
+ Возврат ЭтоПереадресация;
+
+КонецФункции
+
+Функция ПреобразоватьПараметрВСтроку(Знач Значение)
+
+ Если ТипЗнч(Значение) = Тип("Массив") Тогда
+ Значение = СтрСоединить(Значение, ",");
+ Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL);
+ Значение = "[" + Значение + "]";
+ Иначе
+ Значение = ЧислоВСтроку(Значение);
+ Значение = КодироватьСтроку(Значение, СпособКодированияСтроки.КодировкаURL);
+ КонецЕсли;
+
+ Возврат Значение;
+
+КонецФункции
+
+Процедура УстановитьТелоЗапроса(Запрос, Знач Параметры, Знач JSON)
+
+ Коллекция = ТипЗнч(Параметры) = Тип("Структура")
+ Или ТипЗнч(Параметры) = Тип("Соответствие")
+ Или ТипЗнч(Параметры) = Тип("Массив");
+
+ Если JSON Тогда
+ Данные = JSONСтрокой(Параметры);
+ ИначеЕсли Не Коллекция Тогда
+ Данные = Параметры;
+ Иначе
+ СтрокаПараметров = ПараметрыЗапросаВСтроку(Параметры);
+ Данные = Прав(СтрокаПараметров, СтрДлина(СтрокаПараметров) - 1);
+ КонецЕсли;
+
+ Если ТипЗнч(Данные) = Тип("Строка") Тогда
+ Запрос.УстановитьТелоИзСтроки(Данные);
+ Иначе
+ //@skip-check wrong-type-expression
+ Запрос.УстановитьТелоИзДвоичныхДанных(Данные);
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ЗаписатьПараметрыМультипарт(ЗаписьТекста, Знач Boundary, Знач Параметры)
+
+ РазделительСтрок = Символы.ВК + Символы.ПС;
+
+ Для Каждого Параметр Из Параметры Цикл
+
+ Если Параметр.Значение = Неопределено
+ Или Параметр.Значение = NULL Тогда
+ Продолжить;
+ КонецЕсли;
+
+ ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
+ ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name=""" + Параметр.Ключ + """");
+ ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+ ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+
+ Если ТипЗнч(Параметр.Значение) = Тип("Строка")
+ Или ТипЗнч(Параметр.Значение) = Тип("Число") Тогда
+
+ ЗначениеСтрокой = ЧислоВСтроку(Параметр.Значение);
+ ЗаписьТекста.ЗаписатьСтроку(ЗначениеСтрокой);
+
+ ИначеЕсли ТипЗнч(Параметр.Значение) = Тип("Булево") Тогда
+
+ ЗаписьТекста.ЗаписатьСтроку(?(Параметр.Значение, "true", "false"));
+
+ Иначе
+
+ ЗаписьТекста.Записать(Параметр.Значение);
+
+ КонецЕсли;
+
+ ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ЗаписатьФайлыМультипарт(ЗаписьТекста, Знач Boundary, Знач ТипКонтента, Знач Файлы)
+
+ ТипКонтента = СокрЛП(ТипКонтента);
+ РазделительСтрок = Символы.ВК + Символы.ПС;
+ ЗаменаТочки = "___";
+
+ Для Каждого Файл Из Файлы Цикл
+
+ ПутьФайл = СтрЗаменить(Файл.Ключ, ЗаменаТочки, ".");
+
+ Если ТипКонтента = "image/jpeg" Тогда
+ ИмяФайлаОтправки = "photo";
+ Иначе
+ ИмяФайлаОтправки = СтрЗаменить(Файл.Ключ, ЗаменаТочки, ".");
+ ИмяФайлаОтправки = Лев(ИмяФайлаОтправки, СтрНайти(ИмяФайлаОтправки, ".") - 1);
+ ИмяФайлаОтправки = ?(ЗначениеЗаполнено(ИмяФайлаОтправки), ИмяФайлаОтправки, СтрЗаменить(Файл.Ключ,
+ ЗаменаТочки, "."));
+ КонецЕсли;
+
+ ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
+ ЗаписьТекста.ЗаписатьСтроку("Content-Disposition: form-data; name="""
+ + ИмяФайлаОтправки
+ + """; filename="""
+ + ПутьФайл
+ + """");
+ ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+
+ Если ЗначениеЗаполнено(ТипКонтента) Тогда
+ ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + ТипКонтента);
+ КонецЕсли;
+
+ ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+ ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+ ЗаписатьДвоичныеДанные(ЗаписьТекста, Файл.Значение);
+ ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ЗаписатьФайлыРелэйтед(ЗаписьТекста, Знач Boundary, Знач Файлы)
+
+ Если Не ЗначениеЗаполнено(Файлы) Тогда
+ Возврат;
+ КонецЕсли;
+
+ РазделительСтрок = Символы.ВК + Символы.ПС;
+
+ Если ТипЗнч(Файлы) = Тип("Соответствие") Тогда
+ Для Каждого Файл Из Файлы Цикл
+
+ ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
+ ЗаписьТекста.ЗаписатьСтроку("Content-Type: " + Файл.Значение);
+ ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+ ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+ ЗаписатьДвоичныеДанные(ЗаписьТекста, Файл.Ключ);
+ ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+ ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+
+ КонецЦикла;
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ЗаписатьДвоичныеДанные(ЗаписьДанных, Знач ДвоичныеДанные)
+
+ РазмерЧасти = 268435456;
+ ПрочитанноБайт = 0;
+ ТекущаяПозиция = 0;
+ ОбщийРазмер = ДвоичныеДанные.Размер();
+
+ Пока ПрочитанноБайт < ОбщийРазмер Цикл
+
+ ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные);
+ ПрочитанноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция);
+ Результат = ЧтениеДанных.Прочитать(РазмерЧасти);
+ ТекущиеДанные = Результат.ПолучитьДвоичныеДанные();
+ РазмерТекущих = ТекущиеДанные.Размер();
+
+ Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда
+ Прервать;
+ КонецЕсли;
+
+ ЗаписьДанных.Записать(ТекущиеДанные);
+
+ ОсвободитьОбъект(ТекущиеДанные);
+ ВыполнитьСборкуМусора();
+
+ ТекущаяПозиция = ТекущаяПозиция + РазмерТекущих;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ЗаписатьJSONМультипарт(ЗаписьТекста, Знач Boundary, Знач JSON)
+
+ Если Не ЗначениеЗаполнено(JSON) Тогда
+ Возврат;
+ КонецЕсли;
+
+ РазделительСтрок = Символы.ВК + Символы.ПС;
+
+ ЗаписьТекста.ЗаписатьСтроку("--" + boundary + РазделительСтрок);
+ ЗаписьТекста.ЗаписатьСтроку("Content-Type: application/json; charset=UTF-8");
+ ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+ ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+ ЗаписьТекста.ЗаписатьСтроку(JSON);
+ ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+ ЗаписьТекста.ЗаписатьСтроку(РазделительСтрок);
+
+КонецПроцедуры
+
+Процедура ДобавитьContentLength(Запрос)
+
+ ТелоЗапроса = Запрос.ПолучитьТелоКакДвоичныеДанные();
+
+ Если ЗначениеЗаполнено(ТелоЗапроса) Тогда
+
+ Размер = ТелоЗапроса.Размер();
+ Запрос.Заголовки.Вставить("Content-Length", ЧислоВСтроку(Размер));
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура УдалитьПустыеКлючиЗначения(Знач Коллекция, ВыходнаяКоллекция)
+
+ Для Каждого ЭлементКоллекции Из Коллекция Цикл
+
+ Если Не ЭлементКоллекции.Значение = Неопределено И Не ЭлементКоллекции.Значение = NULL Тогда
+ ВыходнаяКоллекция.Вставить(ЭлементКоллекции.Ключ, ЭлементКоллекции.Значение);
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура УдалитьПустыеЭлементыМассива(Знач Коллекция, ВыходнаяКоллекция)
+
+ Для Каждого ЭлементКоллекции Из Коллекция Цикл
+
+ Если Не ЭлементКоллекции = Неопределено И Не ЭлементКоллекции = NULL Тогда
+ ВыходнаяКоллекция.Добавить(ЭлементКоллекции);
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+#Область GZip
+
+// Описание структур см. здесь https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
+// Источник: https://github.com/vbondarevsky/Connector
+
+// Коннектор: удобный HTTP-клиент для 1С:Предприятие 8
+//
+// Copyright 2017-2023 Vladimir Bondarevskiy
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+//
+// URL: https://github.com/vbondarevsky/Connector
+// e-mail: vbondarevsky@gmail.com
+// Версия: 2.4.8
+//
+// Требования: платформа 1С версии 8.3.10 и выше
+
+Функция РаспаковатьОтвет(Ответ)
+
+ Попытка
+ Возврат ПрочитатьGZip(Ответ.ПолучитьТелоКакДвоичныеДанные());
+ Исключение
+ Возврат Ответ;
+ КонецПопытки;
+
+КонецФункции
+
+Функция ПрочитатьGZip(СжатыеДанные) Экспорт
+
+ РазмерПрефиксаGZip = 10;
+ РазмерПостфиксаGZip = 8;
+
+ РазмерДД = ZipРазмерDD();
+ РазмерСДХ = ZipРазмерCDH();
+ РазмерЕСД = ZipРазмерEOCD();
+ РазмерЛФХ = ZipРазмерLFH();
+
+ ЧтениеДанных = Новый ЧтениеДанных(СжатыеДанные);
+ ЧтениеДанных.Пропустить(РазмерПрефиксаGZip);
+ РазмерСжатыхДанных = ЧтениеДанных.ИсходныйПоток().Размер() - РазмерПрефиксаGZip - РазмерПостфиксаGZip;
+
+ ПотокZip = Новый ПотокВПамяти(РазмерЛФХ
+ + РазмерСжатыхДанных
+ + РазмерДД
+ + РазмерСДХ
+ + РазмерЕСД);
+
+ ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
+ ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipLFH());
+ ЧтениеДанных.КопироватьВ(ЗаписьДанных, РазмерСжатыхДанных);
+
+ ЗаписьДанных.Закрыть();
+ ЗаписьДанных = Новый ЗаписьДанных(ПотокZip);
+
+ CRC32 = ЧтениеДанных.ПрочитатьЦелое32();
+ РазмерНесжатыхДанных = ЧтениеДанных.ПрочитатьЦелое32();
+ ЧтениеДанных.Закрыть();
+
+ ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
+ ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных));
+ ЗаписьДанных.ЗаписатьБуферДвоичныхДанных(ZipEOCD(РазмерСжатыхДанных));
+ ЗаписьДанных.Закрыть();
+
+ Возврат ПрочитатьZip(ПотокZip);
+
+КонецФункции
+
+Функция ПрочитатьZip(СжатыеДанные, ТекстОшибки = Неопределено)
+
+ Каталог = ПолучитьИмяВременногоФайла();
+ ЧтениеZip = Новый ЧтениеZipФайла(СжатыеДанные);
+ ИмяФайла = ЧтениеZip.Элементы[0].Имя;
+ Попытка
+ ЧтениеZip.Извлечь(ЧтениеZip.Элементы[0], Каталог, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
+ Исключение
+ // Игнорируем проверку целостности архива, просто читаем результат
+ ТекстОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
+ КонецПопытки;
+ ЧтениеZip.Закрыть();
+
+ Результат = Новый ДвоичныеДанные(Каталог + ПолучитьРазделительПути() + ИмяФайла);
+ УдалитьФайлы(Каталог);
+
+ Возврат Результат;
+
+КонецФункции
+
+Функция ZipРазмерLFH()
+
+ Возврат 34;
+
+КонецФункции
+
+Функция ZipРазмерDD()
+
+ Возврат 16;
+
+КонецФункции
+
+Функция ZipРазмерCDH()
+
+ Возврат 50;
+
+КонецФункции
+
+Функция ZipРазмерEOCD()
+
+ Возврат 22;
+
+КонецФункции
+
+Функция ZipLFH()
+
+ // Local file header
+ Буфер = Новый БуферДвоичныхДанных(ZipРазмерLFH());
+ Буфер.ЗаписатьЦелое32(0, 67324752); // signature 0x04034b50
+ Буфер.ЗаписатьЦелое16(4, 20); // version
+ Буфер.ЗаписатьЦелое16(6, 10); // bit flags
+ Буфер.ЗаписатьЦелое16(8, 8); // compression method
+ Буфер.ЗаписатьЦелое16(10, 0); // time
+ Буфер.ЗаписатьЦелое16(12, 0); // date
+ Буфер.ЗаписатьЦелое32(14, 0); // crc-32
+ Буфер.ЗаписатьЦелое32(18, 0); // compressed size
+ Буфер.ЗаписатьЦелое32(22, 0); // uncompressed size
+ Буфер.ЗаписатьЦелое16(26, 4); // filename legth - "data"
+ Буфер.ЗаписатьЦелое16(28, 0); // extra field length
+ Буфер.Записать(30, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь));
+
+ Возврат Буфер;
+
+КонецФункции
+
+Функция ZipDD(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)
+
+ // Data descriptor
+ Буфер = Новый БуферДвоичныхДанных(ZipРазмерDD());
+ Буфер.ЗаписатьЦелое32(0, 134695760);
+ Буфер.ЗаписатьЦелое32(4, CRC32);
+ Буфер.ЗаписатьЦелое32(8, РазмерСжатыхДанных);
+ Буфер.ЗаписатьЦелое32(12, РазмерНесжатыхДанных);
+
+ Возврат Буфер;
+
+КонецФункции
+
+Функция ZipCDH(CRC32, РазмерСжатыхДанных, РазмерНесжатыхДанных)
+
+ // Central directory header
+ Буфер = Новый БуферДвоичныхДанных(ZipРазмерCDH());
+ Буфер.ЗаписатьЦелое32(0, 33639248); // signature 0x02014b50
+ Буфер.ЗаписатьЦелое16(4, 798); // version made by
+ Буфер.ЗаписатьЦелое16(6, 20); // version needed to extract
+ Буфер.ЗаписатьЦелое16(8, 10); // bit flags
+ Буфер.ЗаписатьЦелое16(10, 8); // compression method
+ Буфер.ЗаписатьЦелое16(12, 0); // time
+ Буфер.ЗаписатьЦелое16(14, 0); // date
+ Буфер.ЗаписатьЦелое32(16, CRC32); // crc-32
+ Буфер.ЗаписатьЦелое32(20, РазмерСжатыхДанных); // compressed size
+ Буфер.ЗаписатьЦелое32(24, РазмерНесжатыхДанных); // uncompressed size
+ Буфер.ЗаписатьЦелое16(28, 4); // file name length
+ Буфер.ЗаписатьЦелое16(30, 0); // extra field length
+ Буфер.ЗаписатьЦелое16(32, 0); // file comment length
+ Буфер.ЗаписатьЦелое16(34, 0); // disk number start
+ Буфер.ЗаписатьЦелое16(36, 0); // internal file attributes
+ Буфер.ЗаписатьЦелое32(38, 2176057344); // external file attributes
+ Буфер.ЗаписатьЦелое32(42, 0); // relative offset of local header
+ Буфер.Записать(46, ПолучитьБуферДвоичныхДанныхИзСтроки("data", "ascii", Ложь));
+
+ Возврат Буфер;
+
+КонецФункции
+
+Функция ZipEOCD(РазмерСжатыхДанных)
+
+ // End of central directory
+ РазмерCDH = 50;
+ Буфер = Новый БуферДвоичныхДанных(ZipРазмерEOCD());
+ Буфер.ЗаписатьЦелое32(0, 101010256); // signature 0x06054b50
+ Буфер.ЗаписатьЦелое16(4, 0); // number of this disk
+ Буфер.ЗаписатьЦелое16(6, 0); // number of the disk with the start of the central directory
+ Буфер.ЗаписатьЦелое16(8, 1); // total number of entries in the central directory on this disk
+ Буфер.ЗаписатьЦелое16(10, 1); // total number of entries in the central directory
+ Буфер.ЗаписатьЦелое32(12, РазмерCDH); // size of the central directory
+ // offset of start of central directory with respect to the starting disk number
+ Буфер.ЗаписатьЦелое32(16, ZipРазмерLFH() + РазмерСжатыхДанных + ZipРазмерDD());
+ Буфер.ЗаписатьЦелое16(20, 0); // the starting disk number
+
+ Возврат Буфер;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
diff --git a/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os b/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os
index 57f73e85f9..0c2132b95c 100644
--- a/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os
+++ b/ru/OInt/tools/Modules/internal/Modules/OPI_Криптография.os
@@ -1,110 +1,110 @@
-// Расположение OS: ./OInt/tools/Modules/internal/Modules/OPI_Криптография.os
-
-// MIT License
-
-// Copyright (c) 2023 Anton Tsitavets
-
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-
-// https://github.com/Bayselonarrend/OpenIntegrations
-
-// BSLLS:LatinAndCyrillicSymbolInWord-off
-// BSLLS:IncorrectLineBreak-off
-// BSLLS:UnusedLocalVariable-off
-
-#Область СлужебныйПрограммныйИнтерфейс
-
-#Область БСП
-
-///////////////////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2019, ООО 1С-Софт
-// Все права защищены. Эта программа и сопроводительные материалы предоставляются
-// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
-// Текст лицензии доступен по ссылке:
-// https://creativecommons.org/licenses/by/4.0/legalcode
-///////////////////////////////////////////////////////////////////////////////////////////////////////
-
-Функция HMACSHA256(Знач Ключ, Знач Данные) Экспорт
-
- Возврат HMAC(Ключ, Данные, ХешФункция.SHA256, 64);
-
-КонецФункции
-
-Функция Хеш(ДвоичныеДанные, Тип) Экспорт
-
- Хеширование = Новый ХешированиеДанных(Тип);
- Хеширование.Добавить(ДвоичныеДанные);
-
- Возврат Хеширование.ХешСумма;
-
-КонецФункции
-
-Функция HMAC(Знач Ключ, Знач Данные, Тип, РазмерБлока) Экспорт
-
- Дважды = 2;
-
- Если Ключ.Размер() > РазмерБлока Тогда
- Ключ = Хеш(Ключ, Тип);
- КонецЕсли;
-
- Если Ключ.Размер() <= РазмерБлока Тогда
- Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ);
- Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * Дважды);
- КонецЕсли;
-
- Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ));
-
- Ipad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("36", РазмерБлока));
- Opad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("5c", РазмерБлока));
-
- Ipad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
- Ikeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ipad);
-
- Opad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
- Okeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(opad);
-
- Возврат Хеш(СклеитьДвоичныеДанные(okeypad, Хеш(СклеитьДвоичныеДанные(ikeypad, Данные), Тип)), Тип);
-
-КонецФункции
-
-Функция СклеитьДвоичныеДанные(ДвоичныеДанные1, ДвоичныеДанные2) Экспорт
-
- МассивДвоичныхДанных = Новый Массив;
- МассивДвоичныхДанных.Добавить(ДвоичныеДанные1);
- МассивДвоичныхДанных.Добавить(ДвоичныеДанные2);
-
- Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных);
-
-КонецФункции
-
-Функция ПовторитьСтроку(Строка, Количество) Экспорт
-
- Части = Новый Массив(Количество);
-
- Для К = 1 По Количество Цикл
- Части.Добавить(Строка);
- КонецЦикла;
-
- Возврат СтрСоединить(Части, "");
-
-КонецФункции
-
-#КонецОбласти
-
-#КонецОбласти
+// Расположение OS: ./OInt/tools/Modules/internal/Modules/OPI_Криптография.os
+
+// MIT License
+
+// Copyright (c) 2023 Anton Tsitavets
+
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+
+// The above copyright notice and this permission notice shall be included in all
+// copies or substantial portions of the Software.
+
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+// SOFTWARE.
+
+// https://github.com/Bayselonarrend/OpenIntegrations
+
+// BSLLS:LatinAndCyrillicSymbolInWord-off
+// BSLLS:IncorrectLineBreak-off
+// BSLLS:UnusedLocalVariable-off
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+#Область БСП
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 2019, ООО 1С-Софт
+// Все права защищены. Эта программа и сопроводительные материалы предоставляются
+// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
+// Текст лицензии доступен по ссылке:
+// https://creativecommons.org/licenses/by/4.0/legalcode
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+
+Функция HMACSHA256(Знач Ключ, Знач Данные) Экспорт
+
+ Возврат HMAC(Ключ, Данные, ХешФункция.SHA256, 64);
+
+КонецФункции
+
+Функция Хеш(ДвоичныеДанные, Тип) Экспорт
+
+ Хеширование = Новый ХешированиеДанных(Тип);
+ Хеширование.Добавить(ДвоичныеДанные);
+
+ Возврат Хеширование.ХешСумма;
+
+КонецФункции
+
+Функция HMAC(Знач Ключ, Знач Данные, Тип, РазмерБлока) Экспорт
+
+ Дважды = 2;
+
+ Если Ключ.Размер() > РазмерБлока Тогда
+ Ключ = Хеш(Ключ, Тип);
+ КонецЕсли;
+
+ Если Ключ.Размер() <= РазмерБлока Тогда
+ Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ);
+ Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * Дважды);
+ КонецЕсли;
+
+ Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ));
+
+ Ipad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("36", РазмерБлока));
+ Opad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("5c", РазмерБлока));
+
+ Ipad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
+ Ikeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ipad);
+
+ Opad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
+ Okeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(opad);
+
+ Возврат Хеш(СклеитьДвоичныеДанные(okeypad, Хеш(СклеитьДвоичныеДанные(ikeypad, Данные), Тип)), Тип);
+
+КонецФункции
+
+Функция СклеитьДвоичныеДанные(ДвоичныеДанные1, ДвоичныеДанные2) Экспорт
+
+ МассивДвоичныхДанных = Новый Массив;
+ МассивДвоичныхДанных.Добавить(ДвоичныеДанные1);
+ МассивДвоичныхДанных.Добавить(ДвоичныеДанные2);
+
+ Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных);
+
+КонецФункции
+
+Функция ПовторитьСтроку(Строка, Количество) Экспорт
+
+ Части = Новый Массив(Количество);
+
+ Для К = 1 По Количество Цикл
+ Части.Добавить(Строка);
+ КонецЦикла;
+
+ Возврат СтрСоединить(Части, "");
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти