diff --git a/.github/workflows/os/dictionary.json b/.github/workflows/os/dictionary.json
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/.github/workflows/os/oint_dictionary.os b/.github/workflows/os/oint_dictionary.os
index e69de29bb2..4337b1d457 100644
--- a/.github/workflows/os/oint_dictionary.os
+++ b/.github/workflows/os/oint_dictionary.os
@@ -0,0 +1,303 @@
+Перем СписокЯзыков;
+Перем ОбщийМассивСлов;
+Перем Алфавит;
+Перем МассивСимволов;
+
+Процедура ПолучитьСписокЯзыков() Экспорт
+
+ СписокЯзыков = Новый Массив();
+ СписокЯзыков.Добавить("en");
+
+КонецПроцедуры
+
+Процедура СоздатьСловари()
+
+ ПолучитьСписокЯзыков();
+ ПолучитьАлфавит();
+ ПолучитьМассивСимволов();
+
+ Для Каждого Язык Из СписокЯзыков Цикл
+ СоздатьСловарь(Язык);
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура СоздатьСловарь(Знач Язык)
+
+ ФайлыМодулей = НайтиФайлы("./ru/", "*.os", Истина);
+ СписокСлов = Новый СписокЗначений();
+
+ Для Каждого Модуль Из ФайлыМодулей Цикл
+ ПолучитьМассивСловОригинала(Модуль.ПолноеИмя, СписокСлов);
+ КонецЦикла;
+
+ ПутьСловаря = "./service/dictionaries/" + Язык + ".json";
+ ФайлСловаря = Новый Файл(ПутьСловаря);
+
+ СоответствиеСловаря = Новый Соответствие();
+ СоответствиеСуществующегоСловаря = Новый Соответствие();
+
+ Если ФайлСловаря.Существует() Тогда
+
+ ЧтениеJSON = Новый ЧтениеJSON();
+ ЧтениеJSON.ОткрытьФайл(ПутьСловаря);
+ СоответствиеСуществующегоСловаря = ПрочитатьJSON(ЧтениеJSON, Истина);
+ ЧтениеJSON.Закрыть();
+
+ КонецЕсли;
+
+ //СписокСлов.СортироватьПоПредставлению(НаправлениеСортировки.Убыв);
+
+ Для Каждого Слово Из СписокСлов Цикл
+
+ Значение = Слово.Значение;
+ Существующее = СоответствиеСуществующегоСловаря[Значение];
+
+ Если Существующее = Неопределено Тогда
+ СоответствиеСловаря.Вставить(Значение, "");
+ Иначе
+ СоответствиеСловаря.Вставить(Значение, Существующее);
+ КонецЕсли;
+
+ КонецЦикла;
+
+ ЗаписатьJSONСловаря(СоответствиеСловаря, ПутьСловаря);
+
+КонецПроцедуры
+
+Процедура ЗаписатьJSONСловаря(СоответствиеСловаря, ПутьСловаря)
+
+ ТекстовыйДок = Новый ТекстовыйДокумент();
+ ТекстовыйДок.ДобавитьСтроку("{");
+
+ ТЗ = Новый ТаблицаЗначений();
+ ТЗ.Колонки.Добавить("Ключ");
+ ТЗ.Колонки.Добавить("Значение");
+ ТЗ.Колонки.Добавить("ДлинаКлюча");
+ ТЗ.Колонки.Добавить("Заполнено");
+
+ Для Каждого Элемент Из СоответствиеСловаря Цикл
+
+ НоваяСтрока = ТЗ.Добавить();
+ НоваяСтрока.Ключ = Элемент.Ключ;
+ НоваяСтрока.Значение = Элемент.Значение;
+ НоваяСтрока.ДлинаКлюча = СтрДлина(Элемент.Ключ);
+ НоваяСтрока.Заполнено = ЗначениеЗаполнено(Элемент.Значение);
+
+ КонецЦикла;
+
+ ТЗ.Сортировать("Заполнено УБЫВ, ДлинаКлюча");
+
+ Для Каждого СтрокаТЗ Из ТЗ Цикл
+ Значение = СтрокаТЗ.Значение;
+ Значение = СтрЗаменить(Значение, "\", "\\");
+ Значение = СтрЗаменить(Значение, "/", "\/");
+ Значение = СтрЗаменить(Значение, """", "\""");
+
+ Ключ = СтрокаТЗ.Ключ;
+ Ключ = СтрЗаменить(Ключ, "\", "\\");
+ Ключ = СтрЗаменить(Ключ, "/", "\/");
+ Ключ = СтрЗаменить(Ключ, """", "\""");
+
+ ТекстовыйДок.ДобавитьСтроку("""" + Ключ + """: """ + Значение + """,");
+ КонецЦикла;
+
+ ТекстовыйДок.ДобавитьСтроку("}");
+ ТекстовыйДок.Записать(ПутьСловаря);
+
+КонецПроцедуры
+
+Процедура ПолучитьМассивСловОригинала(Знач ПутьКФайлу, СписокСлов)
+
+ Документ = Новый ТекстовыйДокумент();
+ Документ.Прочитать(ПутьКФайлу, "UTF-8");
+
+ Для Н = 1 По Документ.КоличествоСтрок() Цикл
+
+ ТекущаяСтрока = СокрЛП(Документ.ПолучитьСтроку(Н));
+
+ Если СтрНачинаетсяС(ТекущаяСтрока, "//") Тогда
+ ТекущаяСтрока = СокрЛП(СтрЗаменить(ТекущаяСтрока, "//", ""));
+ ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, " - ", "$");
+ ТекущаяСтрока = СтрРазделить(ТекущаяСтрока, "$", Ложь);
+
+ Для Каждого Элемент Из ТекущаяСтрока Цикл
+ ДобавитьСлово(СписокСлов, Элемент);
+ КонецЦикла;
+
+ Продолжить;
+ КонецЕсли;
+
+ Если СтрНайти(ТекущаяСтрока, """") <> 0 Или СтрНайти(ТекущаяСтрока, "|") <> 0 Тогда
+ ТекущаяСтрока = " " + ТекущаяСтрока;
+
+ ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, """", "$");
+ ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, "|", "$");
+ ТекущаяСтрока = СтрЗаменить(ТекущаяСтрока, "$$", """""");
+
+ МассивСтроки = СтрРазделить(ТекущаяСтрока, "$", Истина);
+
+ Цельный = Ложь;
+ Для Каждого Элемент Из МассивСтроки Цикл
+
+ Если Не ЗначениеЗаполнено(СокрЛП(Элемент)) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Если Цельный Тогда
+ ДобавитьСлово(СписокСлов, Элемент);
+ Иначе
+
+ Для Каждого Символ Из МассивСимволов Цикл
+ Элемент = СтрЗаменить(Элемент, Символ, "$");
+ КонецЦикла;
+
+ Пока СтрНайти(Элемент, "$$") <> 0 Цикл
+ Элемент = СтрЗаменить(Элемент, "$$", "$");
+ КонецЦикла;
+
+ МассивЭлемента = СтрРазделить(Элемент, "$", Ложь);
+ Для Каждого Дробный Из МассивЭлемента Цикл
+ ДобавитьСлово(СписокСлов, Дробный);
+ КонецЦикла;
+
+ КонецЕсли;
+
+ Цельный = Не Цельный;
+ КонецЦикла;
+
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ДобавитьСлово(Список, Слово)
+
+ Слово = СокрЛП(Слово);
+
+ Нормализовано = Ложь;
+
+ Пока Не Нормализовано Цикл
+
+ ПервыйСимвол = Ложь;
+ ПоследнийСимвол = Ложь;
+
+ Для Каждого Символ Из МассивСимволов Цикл
+
+ ПервыйСимвол = СтрНачинаетсяС(Слово, Символ);
+ ПоследнийСимвол = СтрЗаканчиваетсяНа(Слово, Символ);
+
+ Если ПервыйСимвол Или ПоследнийСимвол Тогда
+ Прервать;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Если ПервыйСимвол Тогда
+ Слово = Лев(Слово, СтрДлина(Слово) - 1);
+ КонецЕсли;
+
+ Если ПоследнийСимвол Тогда
+ Слово = Прав(Слово, СтрДлина(Слово) - 1);
+ КонецЕсли;
+
+ Если Не ПервыйСимвол И Не ПоследнийСимвол Тогда
+ Нормализовано = Истина;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Слово = СокрЛП(Слово);
+
+ Если Не ЗначениеЗаполнено(Слово) Или Не НайтиКириллицу(Слово) Тогда
+ Возврат;
+ КонецЕсли;
+
+ СуществующееЗначение = Список.НайтиПоЗначению(Слово);
+
+ Если СуществующееЗначение = Неопределено Тогда
+ Список.Добавить(Слово, СтрДлина(Слово));
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура ПолучитьАлфавит()
+
+ Алфавит = Новый Массив;
+
+ Алфавит.Добавить("а");
+ Алфавит.Добавить("б");
+ Алфавит.Добавить("в");
+ Алфавит.Добавить("г");
+ Алфавит.Добавить("д");
+ Алфавит.Добавить("е");
+ Алфавит.Добавить("ё");
+ Алфавит.Добавить("ж");
+ Алфавит.Добавить("з");
+ Алфавит.Добавить("и");
+ Алфавит.Добавить("й");
+ Алфавит.Добавить("к");
+ Алфавит.Добавить("л");
+ Алфавит.Добавить("м");
+ Алфавит.Добавить("н");
+ Алфавит.Добавить("о");
+ Алфавит.Добавить("п");
+ Алфавит.Добавить("р");
+ Алфавит.Добавить("с");
+ Алфавит.Добавить("т");
+ Алфавит.Добавить("у");
+ Алфавит.Добавить("ф");
+ Алфавит.Добавить("х");
+ Алфавит.Добавить("ц");
+ Алфавит.Добавить("ч");
+ Алфавит.Добавить("ш");
+ Алфавит.Добавить("щ");
+ Алфавит.Добавить("ъ");
+ Алфавит.Добавить("ы");
+ Алфавит.Добавить("ь");
+ Алфавит.Добавить("э");
+ Алфавит.Добавить("ю");
+ Алфавит.Добавить("я");
+
+КонецПроцедуры
+
+Процедура ПолучитьМассивСимволов()
+
+ МассивСимволов = Новый Массив();
+ МассивСимволов.Добавить(";");
+ МассивСимволов.Добавить(".");
+ МассивСимволов.Добавить(",");
+ МассивСимволов.Добавить(")");
+ МассивСимволов.Добавить("(");
+ МассивСимволов.Добавить("/");
+ МассивСимволов.Добавить("\");
+ МассивСимволов.Добавить("[");
+ МассивСимволов.Добавить("]");
+ МассивСимволов.Добавить("=");
+ МассивСимволов.Добавить("+");
+ МассивСимволов.Добавить("-");
+ МассивСимволов.Добавить("*");
+ МассивСимволов.Добавить("#");
+ МассивСимволов.Добавить(" ");
+ МассивСимволов.Добавить("""");
+
+КонецПроцедуры
+
+Функция НайтиКириллицу(Знач Слово)
+
+ СловоНРег = НРег(Слово);
+
+ Для Каждого Буква Из Алфавит Цикл
+ Если СтрНайти(СловоНРег, Буква) <> 0 Тогда
+ Возврат Истина;
+ КонецЕсли;
+ КонецЦикла;
+
+ Возврат Ложь;
+
+КонецФункции
+
+СоздатьСловари();
+
diff --git a/.github/workflows/os/opi_translate.os b/.github/workflows/os/opi_translate.os
new file mode 100644
index 0000000000..28e22d1b27
--- /dev/null
+++ b/.github/workflows/os/opi_translate.os
@@ -0,0 +1,37 @@
+
+Процедура СоздатьЛокализацию(Знач Язык)
+
+ КаталогИсточник = Новый Файл(".\ru\OPI");
+ КаталогПриемник = Новый Файл(".\" + Язык + "\OPI");
+
+ СкопироватьФайлы(КаталогИсточник.ПолноеИмя, КаталогПриемник.ПолноеИмя);
+ ФайлыМодулей = НайтиФайлы("./" + Язык + "/", "*.bsl", Истина);
+
+
+КонецПроцедуры
+
+Процедура СкопироватьФайлы(Знач КаталогИсточник, Знач КаталогПриемник)
+
+ Если Прав(КаталогИсточник, 1) <> "\" Тогда
+ КаталогИсточник = КаталогИсточник + "\";
+ КонецЕсли;
+ Если Прав(КаталогПриемник, 1) <> "\" Тогда
+ КаталогПриемник = КаталогПриемник + "\";
+ КонецЕсли;
+
+ СоздатьКаталог(КаталогПриемник);
+
+ МассивФайлов = НайтиФайлы(КаталогИсточник, "*.*", Истина);
+
+ Для Каждого Файл Из МассивФайлов Цикл
+ ПолноеИмяИсточник = Файл.ПолноеИмя;
+ ПолноеИмяПриемник = КаталогПриемник + СтрЗаменить(Файл.ПолноеИмя, КаталогИсточник, "");
+
+ Если Файл.ЭтоКаталог() Тогда
+ СоздатьКаталог(ПолноеИмяПриемник);
+ Иначе
+ КопироватьФайл(ПолноеИмяИсточник, ПолноеИмяПриемник);
+ КонецЕсли;
+ КонецЦикла;
+
+КонецПроцедуры
\ No newline at end of file
diff --git a/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Obnovit-token.md b/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Obnovit-token.md
index 6692477550..2c24a59d69 100644
--- a/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Obnovit-token.md
+++ b/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Obnovit-token.md
@@ -19,18 +19,18 @@ sidebar_position: 3
```bsl title="Пример кода"
- Ключ = "oynqxds...";
- Секрет = "tk2oewn...";
- Рефреш = "MJIG2TBhD-kAAAAAAAAAAd3oNph_4iTy...";
+ КлючПриложения = "oynqxds...";
+ СекретПриложения = "tk2oewn...";
+ РефрешТокен = "oZFWg3DmZ_IAAAAAAAAAAWilOA0M1SjV...";
- Результат = OPI_Dropbox.ОбновитьТокен(Ключ, Секрет, Рефреш);
+ Результат = OPI_Dropbox.ОбновитьТокен(КлючПриложения, СекретПриложения, РефрешТокен);
```
```sh title="Пример команд CLI"
- oint dropbox ОбновитьТокен --appkey %appkey% --appsecret %appsecret% --refresh %refresh%
+ oint dropbox ОбновитьТокен --appkey "oynqxds..." --appsecret "tk2oewn..." --refresh "oZFWg3DmZ_IAAAAAAAAAAWilOA0M1SjV..."
```
diff --git a/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Poluchit-dannye-ispolzovaniya-prostranstva.md b/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Poluchit-dannye-ispolzovaniya-prostranstva.md
index 5e435052d2..aec26faa44 100644
--- a/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Poluchit-dannye-ispolzovaniya-prostranstva.md
+++ b/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Poluchit-dannye-ispolzovaniya-prostranstva.md
@@ -17,7 +17,7 @@ sidebar_position: 5
```bsl title="Пример кода"
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Результат = OPI_Dropbox.ПолучитьДанныеИспользованияПространства(Токен);
@@ -26,7 +26,7 @@ sidebar_position: 5
```sh title="Пример команд CLI"
- oint dropbox ПолучитьДанныеИспользованияПространства --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..."
+ oint dropbox ПолучитьДанныеИспользованияПространства --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..."
```
diff --git a/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Poluchit-informatsiu-ob-akkaunte.md b/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Poluchit-informatsiu-ob-akkaunte.md
index 6576ede3c1..2cb647e5a0 100644
--- a/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Poluchit-informatsiu-ob-akkaunte.md
+++ b/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Poluchit-informatsiu-ob-akkaunte.md
@@ -18,7 +18,7 @@ sidebar_position: 4
```bsl title="Пример кода"
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен);
@@ -27,7 +27,7 @@ sidebar_position: 4
```sh title="Пример команд CLI"
- oint dropbox ПолучитьИнформациюОбАккаунте --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --account %account%
+ oint dropbox ПолучитьИнформациюОбАккаунте --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --account %account%
```
diff --git a/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Poluchit-ssylku-avtorizatsii.md b/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Poluchit-ssylku-avtorizatsii.md
index fa9309616b..36fdcd791f 100644
--- a/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Poluchit-ssylku-avtorizatsii.md
+++ b/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Poluchit-ssylku-avtorizatsii.md
@@ -17,15 +17,15 @@ sidebar_position: 1
```bsl title="Пример кода"
- Ключ = "oynqxds...";
- Результат = OPI_Dropbox.ПолучитьСсылкуАвторизации(Ключ);
+ КлючПриложения = "oynqxds...";
+ Результат = OPI_Dropbox.ПолучитьСсылкуАвторизации(КлючПриложения);
```
```sh title="Пример команд CLI"
- oint dropbox ПолучитьСсылкуАвторизации --appkey %appkey%
+ oint dropbox ПолучитьСсылкуАвторизации --appkey "oynqxds..."
```
diff --git a/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Poluchit-token.md b/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Poluchit-token.md
index 3e7a818902..c09aba1f5e 100644
--- a/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Poluchit-token.md
+++ b/docs/md/Dropbox/Akkaunt-i-avtorizatsiya/Poluchit-token.md
@@ -19,13 +19,18 @@ sidebar_position: 2
```bsl title="Пример кода"
+ КлючПриложения = "oynqxds...";
+ СекретПриложения = "tk2oewn...";
+ Код = "bTCiUTzxe6kAAAAAAAAAMgkkeJxqxqAO0YhahYskSmo";
+
+ Результат = OPI_Dropbox.ПолучитьТокен(КлючПриложения, СекретПриложения, Код);
```
```sh title="Пример команд CLI"
- oint dropbox ПолучитьТокен --appkey %appkey% --appsecret %appsecret% --code %code%
+ oint dropbox ПолучитьТокен --appkey "oynqxds..." --appsecret "tk2oewn..." --code "bTCiUTzxe6kAAAAAAAAAMgkkeJxqxqAO0YhahYskSmo"
```
diff --git a/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Dobavit-polzovateley-k-papke.md b/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Dobavit-polzovateley-k-papke.md
index 007231bc79..ab4a01e13e 100644
--- a/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Dobavit-polzovateley-k-papke.md
+++ b/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Dobavit-polzovateley-k-papke.md
@@ -20,9 +20,9 @@ sidebar_position: 4
```bsl title="Пример кода"
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Почта = "h5bk6ft62s@privaterelay.appleid.com";
- Папка = "4999224241"; // shared_folder_id
+ Папка = "5008139809"; // shared_folder_id
Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почта, Ложь);
@@ -31,7 +31,7 @@ sidebar_position: 4
```sh title="Пример команд CLI"
- oint dropbox ДобавитьПользователейКПапке --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --folder %folder% --emails %emails% --readonly %readonly%
+ oint dropbox ДобавитьПользователейКПапке --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --folder %folder% --emails %emails% --readonly %readonly%
```
diff --git a/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Dobavit-polzovatelya-k-faylu.md b/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Dobavit-polzovatelya-k-faylu.md
index 2816a2713b..9b36953254 100644
--- a/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Dobavit-polzovatelya-k-faylu.md
+++ b/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Dobavit-polzovatelya-k-faylu.md
@@ -20,7 +20,7 @@ sidebar_position: 3
```bsl title="Пример кода"
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Почта = "h5bk6ft62s@privaterelay.appleid.com";
Файл = "kJU6-a-pT48AAAAAAAAABw";
@@ -31,7 +31,7 @@ sidebar_position: 3
```sh title="Пример команд CLI"
- oint dropbox ДобавитьПользователейКФайлу --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --fileid %fileid% --emails %emails% --readonly %readonly%
+ oint dropbox ДобавитьПользователейКФайлу --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --fileid %fileid% --emails %emails% --readonly %readonly%
```
diff --git a/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Opublikovat-papku.md b/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Opublikovat-papku.md
index aa5799c661..3418e43e0e 100644
--- a/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Opublikovat-papku.md
+++ b/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Opublikovat-papku.md
@@ -18,7 +18,7 @@ sidebar_position: 1
```bsl title="Пример кода"
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Путь = "/New";
Результат = OPI_Dropbox.ОпубликоватьПапку(Токен, Путь);
@@ -28,7 +28,7 @@ sidebar_position: 1
```sh title="Пример команд CLI"
- oint dropbox ОпубликоватьПапку --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path%
+ oint dropbox ОпубликоватьПапку --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path%
```
diff --git a/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Otmenit-publikatsiu-fayla.md b/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Otmenit-publikatsiu-fayla.md
index f783361c8c..345130f1b2 100644
--- a/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Otmenit-publikatsiu-fayla.md
+++ b/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Otmenit-publikatsiu-fayla.md
@@ -18,13 +18,17 @@ sidebar_position: 6
```bsl title="Пример кода"
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
+ Файл = "kJU6-a-pT48AAAAAAAAABw";
+
+ Результат = OPI_Dropbox.ОтменитьПубликациюФайла(Токен, Файл);
```
```sh title="Пример команд CLI"
- oint dropbox ОтменитьПубликациюФайла --token %token% --fileid %fileid%
+ oint dropbox ОтменитьПубликациюФайла --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --fileid %fileid%
```
diff --git a/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Otmenit-publikatsiu-papki.md b/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Otmenit-publikatsiu-papki.md
index 43b7fab9e4..3325099435 100644
--- a/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Otmenit-publikatsiu-papki.md
+++ b/docs/md/Dropbox/Nastroyki-sovmestnogo-dostupa/Otmenit-publikatsiu-papki.md
@@ -18,17 +18,25 @@ sidebar_position: 2
```bsl title="Пример кода"
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
- Папка = "4999224241";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
+ Папка = "5008139809";
- Результат = OPI_Dropbox.ОтменитьПубликациюПапки(Токен, Папка);
+ Результат = OPI_Dropbox.ОтменитьПубликациюПапки(Токен, Папка);
+ ТекущийСтатус = "in_progress";
+ IDРаботы = Результат["async_job_id"];
+
+ Пока ТекущийСтатус = "in_progress" Цикл
+ Результат = OPI_Dropbox.ПолучитьСтатусАсинхронногоИзменения(Токен, IDРаботы);
+ ТекущийСтатус = Результат[".tag"];
+ OPI_Инструменты.Пауза(3);
+ КонецЦикла;
```
```sh title="Пример команд CLI"
- oint dropbox ОтменитьПубликациюПапки --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --folder %folder%
+ oint dropbox ОтменитьПубликациюПапки --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --folder %folder%
```
diff --git a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Kopirovat-obekt.md b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Kopirovat-obekt.md
index ff64d366a1..6a1054ea67 100644
--- a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Kopirovat-obekt.md
+++ b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Kopirovat-obekt.md
@@ -21,7 +21,7 @@ sidebar_position: 8
Оригинал = "/New/pic.png";
Копия = "/New/pic_copy.png";
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Результат = OPI_Dropbox.КопироватьОбъект(Токен, Оригинал, Копия);
@@ -30,7 +30,7 @@ sidebar_position: 8
```sh title="Пример команд CLI"
- oint dropbox КопироватьОбъект --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --form %form% --to %to%
+ oint dropbox КопироватьОбъект --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --form %form% --to %to%
```
diff --git a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Peremestit-obekt.md b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Peremestit-obekt.md
index 1883e690a8..9bca226d3a 100644
--- a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Peremestit-obekt.md
+++ b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Peremestit-obekt.md
@@ -21,7 +21,7 @@ sidebar_position: 9
ОригиналныйПуть = "/New/pic.png";
ЦелевойПуть = "/pic.png";
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ОригиналныйПуть, ЦелевойПуть);
@@ -30,7 +30,7 @@ sidebar_position: 9
```sh title="Пример команд CLI"
- oint dropbox ПереместитьОбъект --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --form %form% --to %to%
+ oint dropbox ПереместитьОбъект --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --form %form% --to %to%
```
diff --git a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-informatsiu-ob-obekte.md b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-informatsiu-ob-obekte.md
index 6ea4c8d72e..d042c14e54 100644
--- a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-informatsiu-ob-obekte.md
+++ b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-informatsiu-ob-obekte.md
@@ -20,7 +20,7 @@ sidebar_position: 1
```bsl title="Пример кода"
Путь = "/New/pic.png";
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Результат = OPI_Dropbox.ПолучитьИнформациюОбОбъекте(Токен, Путь, Истина);
@@ -29,7 +29,7 @@ sidebar_position: 1
```sh title="Пример команд CLI"
- oint dropbox ПолучитьИнформациюОбОбъекте --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path% --detail %detail%
+ oint dropbox ПолучитьИнформациюОбОбъекте --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path% --detail %detail%
```
diff --git a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-prevu.md b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-prevu.md
index 5b1ecb2fbb..8713d08911 100644
--- a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-prevu.md
+++ b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-prevu.md
@@ -18,7 +18,7 @@ sidebar_position: 3
```bsl title="Пример кода"
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Путь = "/New/mydoc.docx";
Результат = OPI_Dropbox.ПолучитьПревью(Токен, Путь);
@@ -28,7 +28,7 @@ sidebar_position: 3
```sh title="Пример команд CLI"
- oint dropbox ПолучитьПревью --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path%
+ oint dropbox ПолучитьПревью --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path%
```
diff --git a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-spisok-faylov-papki.md b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-spisok-faylov-papki.md
index 9fcc9e621e..3537625320 100644
--- a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-spisok-faylov-papki.md
+++ b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-spisok-faylov-papki.md
@@ -21,7 +21,7 @@ sidebar_position: 2
```bsl title="Пример кода"
Путь = "/New";
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Результат = OPI_Dropbox.ПолучитьСписокФайловПапки(Токен, Путь, Истина);
@@ -30,7 +30,7 @@ sidebar_position: 2
```sh title="Пример команд CLI"
- oint dropbox ПолучитьСписокФайловПапки --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path% --detail %detail% --cursor %cursor%
+ oint dropbox ПолучитьСписокФайловПапки --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path% --detail %detail% --cursor %cursor%
```
diff --git a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-spisok-versiy-obekta.md b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-spisok-versiy-obekta.md
index ea30b330d8..f55e0d4796 100644
--- a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-spisok-versiy-obekta.md
+++ b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-spisok-versiy-obekta.md
@@ -19,7 +19,7 @@ sidebar_position: 13
```bsl title="Пример кода"
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Путь = "/New/pic.png";
Результат = OPI_Dropbox.ПолучитьСписокВерсийОбъекта(Токен, Путь, 1);
@@ -29,7 +29,7 @@ sidebar_position: 13
```sh title="Пример команд CLI"
- oint dropbox ПолучитьСписокВерсийОбъекта --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path% --amount %amount%
+ oint dropbox ПолучитьСписокВерсийОбъекта --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path% --amount %amount%
```
diff --git a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-status-zagruzki-po-url.md b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-status-zagruzki-po-url.md
index bf2117300c..83d06bd0a6 100644
--- a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-status-zagruzki-po-url.md
+++ b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Poluchit-status-zagruzki-po-url.md
@@ -18,8 +18,8 @@ sidebar_position: 6
```bsl title="Пример кода"
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
- ИДРаботы = "kwvJIcRS7eAAAAAAAAAAAQ";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
+ ИДРаботы = "mTzF6hWsswAAAAAAAAAAAQ";
Статус = "in_progress";
Пока Статус = "in_progress" Цикл
@@ -38,7 +38,7 @@ sidebar_position: 6
```sh title="Пример команд CLI"
- oint dropbox ПолучитьСтатусЗагрузкиПоURL --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --job %job%
+ oint dropbox ПолучитьСтатусЗагрузкиПоURL --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --job %job%
```
diff --git a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Skachat-fayl.md b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Skachat-fayl.md
index 65088b57c9..0ac5f8b605 100644
--- a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Skachat-fayl.md
+++ b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Skachat-fayl.md
@@ -18,7 +18,7 @@ sidebar_position: 11
```bsl title="Пример кода"
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Путь = "/New/pic.png";
Результат = OPI_Dropbox.СкачатьФайл(Токен, Путь);
@@ -28,7 +28,7 @@ sidebar_position: 11
```sh title="Пример команд CLI"
- oint dropbox СкачатьФайл --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path%
+ oint dropbox СкачатьФайл --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path%
```
diff --git a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Skachat-papku.md b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Skachat-papku.md
index 43c6458089..aec1c1439b 100644
--- a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Skachat-papku.md
+++ b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Skachat-papku.md
@@ -18,7 +18,7 @@ sidebar_position: 12
```bsl title="Пример кода"
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Путь = "/New";
Результат = OPI_Dropbox.СкачатьПапку(Токен, Путь);
@@ -28,7 +28,7 @@ sidebar_position: 12
```sh title="Пример команд CLI"
- oint dropbox СкачатьПапку --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path%
+ oint dropbox СкачатьПапку --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path%
```
diff --git a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Sozdat-papku.md b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Sozdat-papku.md
index 0d3136f34e..3d1e9b6d0f 100644
--- a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Sozdat-papku.md
+++ b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Sozdat-papku.md
@@ -18,7 +18,7 @@ sidebar_position: 10
```bsl title="Пример кода"
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Путь = "/Новый каталог";
Результат = OPI_Dropbox.СоздатьПапку(Токен, Путь);
@@ -28,7 +28,7 @@ sidebar_position: 10
```sh title="Пример команд CLI"
- oint dropbox СоздатьПапку --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path%
+ oint dropbox СоздатьПапку --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path%
```
diff --git a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Udalit-obekt.md b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Udalit-obekt.md
index 57dfeba09c..d629d2c9fa 100644
--- a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Udalit-obekt.md
+++ b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Udalit-obekt.md
@@ -20,7 +20,7 @@ sidebar_position: 7
```bsl title="Пример кода"
Путь = "/New/pic.png";
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь);
@@ -29,7 +29,7 @@ sidebar_position: 7
```sh title="Пример команд CLI"
- oint dropbox УдалитьОбъект --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path% --permanently %permanently%
+ oint dropbox УдалитьОбъект --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path% --permanently %permanently%
```
diff --git a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Vosstanovit-obekt-k-versii.md b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Vosstanovit-obekt-k-versii.md
index 1ef3afac0b..01833c9a25 100644
--- a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Vosstanovit-obekt-k-versii.md
+++ b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Vosstanovit-obekt-k-versii.md
@@ -19,13 +19,18 @@ sidebar_position: 14
```bsl title="Пример кода"
+ Версия = "016196bc6e08dda00000001295a2bc1";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
+ Путь = "/New/pic.png";
+
+ Результат = OPI_Dropbox.ВосстановитьОбъектКВерсии(Токен, Путь, Версия);
```
```sh title="Пример команд CLI"
- oint dropbox ВосстановитьОбъектКВерсии --token %token% --path %path% --rev %rev%
+ oint dropbox ВосстановитьОбъектКВерсии --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path% --rev "016196bc6e08dda00000001295a2bc1"
```
diff --git a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Zagruzit-fayl-po-url.md b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Zagruzit-fayl-po-url.md
index 2f582f637e..a1dfcdc554 100644
--- a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Zagruzit-fayl-po-url.md
+++ b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Zagruzit-fayl-po-url.md
@@ -20,7 +20,7 @@ sidebar_position: 5
```bsl title="Пример кода"
Путь = "/New/url_doc.docx";
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
URL = "https://openintegrations.dev/test_data/document.docx";
Результат = OPI_Dropbox.ЗагрузитьФайлПоURL(Токен, URL, Путь);
@@ -30,7 +30,7 @@ sidebar_position: 5
```sh title="Пример команд CLI"
- oint dropbox ЗагрузитьФайлПоURL --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --url %url% --path %path%
+ oint dropbox ЗагрузитьФайлПоURL --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --url %url% --path %path%
```
diff --git a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Zagruzit-fayl.md b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Zagruzit-fayl.md
index 35d40f80de..2ad18ea057 100644
--- a/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Zagruzit-fayl.md
+++ b/docs/md/Dropbox/Rabota-s-faylami-i-katalogami/Zagruzit-fayl.md
@@ -21,7 +21,7 @@ sidebar_position: 4
```bsl title="Пример кода"
Путь = "/New/pic.png";
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Картинка = "https://openintegrations.dev/test_data/picture.jpg";
КартинкаПуть = ПолучитьИмяВременногоФайла("png");
@@ -34,7 +34,7 @@ sidebar_position: 4
```sh title="Пример команд CLI"
- oint dropbox ЗагрузитьФайл --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --file %file% --path %path% --overwrite %overwrite%
+ oint dropbox ЗагрузитьФайл --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --file %file% --path %path% --overwrite %overwrite%
```
diff --git a/docs/md/Dropbox/Rabota-s-tegami/Dobavit-teg.md b/docs/md/Dropbox/Rabota-s-tegami/Dobavit-teg.md
index a4e3641443..3521895585 100644
--- a/docs/md/Dropbox/Rabota-s-tegami/Dobavit-teg.md
+++ b/docs/md/Dropbox/Rabota-s-tegami/Dobavit-teg.md
@@ -20,7 +20,7 @@ sidebar_position: 2
```bsl title="Пример кода"
Тег = "Важное";
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Путь = "/New/mydoc.docx";
Результат = OPI_Dropbox.ДобавитьТег(Токен, Путь, Тег);
@@ -30,7 +30,7 @@ sidebar_position: 2
```sh title="Пример команд CLI"
- oint dropbox ДобавитьТег --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path% --tag %tag%
+ oint dropbox ДобавитьТег --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path% --tag %tag%
```
diff --git a/docs/md/Dropbox/Rabota-s-tegami/Udalit-teg.md b/docs/md/Dropbox/Rabota-s-tegami/Udalit-teg.md
index c0c88cb208..e6de7728aa 100644
--- a/docs/md/Dropbox/Rabota-s-tegami/Udalit-teg.md
+++ b/docs/md/Dropbox/Rabota-s-tegami/Udalit-teg.md
@@ -20,7 +20,7 @@ sidebar_position: 3
```bsl title="Пример кода"
Тег = "Важное";
- Токен = "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT...";
+ Токен = "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c...";
Путь = "/New/mydoc.docx";
Результат = OPI_Dropbox.УдалитьТег(Токен, Путь, Тег);
@@ -30,7 +30,7 @@ sidebar_position: 3
```sh title="Пример команд CLI"
- oint dropbox УдалитьТег --token "sl.B17cqxbDyPFFIOUOnGtEqpFGF9gIqUvxX70TTaWmpA1BudA7xI0IR4UK3WuJkeHL7f229VtvwT..." --path %path% --tag %tag%
+ oint dropbox УдалитьТег --token "sl.B2PZ-Sk7vWqtAfWKI0CKnYNapuN4bH-a4_tTsbN02eoxT1dlQ9Vs_vcf30ZAAl9h-m3xg5uz5c..." --path %path% --tag %tag%
```
diff --git a/docs/md/Telegram/Administrirovanie/Otkrepit-soobschenie.md b/docs/md/Telegram/Administrirovanie/Otkrepit-soobschenie.md
index 2ded700939..a470055862 100644
--- a/docs/md/Telegram/Administrirovanie/Otkrepit-soobschenie.md
+++ b/docs/md/Telegram/Administrirovanie/Otkrepit-soobschenie.md
@@ -21,7 +21,7 @@ sidebar_position: 5
Токен = "6129457865:AAFyzNYOAFbu...";
IDКанала = "@testsichee";
- IDСообщения = "4606";
+ IDСообщения = "4494";
Результат = OPI_Telegram.ОткрепитьСообщение(Токен, IDКанала, IDСообщения);
@@ -30,7 +30,7 @@ sidebar_position: 5
```sh title="Пример команд CLI"
- oint telegram ОткрепитьСообщение --token "6129457865:AAFyzNYOAFbu..." --chat %chat% --message "4606"
+ oint telegram ОткрепитьСообщение --token "6129457865:AAFyzNYOAFbu..." --chat %chat% --message "4494"
```
diff --git a/docs/md/Telegram/Administrirovanie/Zakrepit-soobschenie.md b/docs/md/Telegram/Administrirovanie/Zakrepit-soobschenie.md
index f953dd2476..4b705a8666 100644
--- a/docs/md/Telegram/Administrirovanie/Zakrepit-soobschenie.md
+++ b/docs/md/Telegram/Administrirovanie/Zakrepit-soobschenie.md
@@ -21,7 +21,7 @@ sidebar_position: 4
Токен = "6129457865:AAFyzNYOAFbu...";
IDКанала = "@testsichee";
- IDСообщения = "4606";
+ IDСообщения = "4494";
Результат = OPI_Telegram.ЗакрепитьСообщение(Токен, IDКанала, IDСообщения);
@@ -30,7 +30,7 @@ sidebar_position: 4
```sh title="Пример команд CLI"
- oint telegram ЗакрепитьСообщение --token "6129457865:AAFyzNYOAFbu..." --chat %chat% --message "4606"
+ oint telegram ЗакрепитьСообщение --token "6129457865:AAFyzNYOAFbu..." --chat %chat% --message "4494"
```
diff --git a/docs/md/Telegram/Otpravka-dannyh/Pereslat-soobschenie.md b/docs/md/Telegram/Otpravka-dannyh/Pereslat-soobschenie.md
index 5cf15cfab7..897630b08b 100644
--- a/docs/md/Telegram/Otpravka-dannyh/Pereslat-soobschenie.md
+++ b/docs/md/Telegram/Otpravka-dannyh/Pereslat-soobschenie.md
@@ -23,7 +23,7 @@ sidebar_position: 11
Токен = "6129457865:AAFyzNYOAFbu...";
IDЧата = "461699897";
IDКанала = "@testsichee";
- IDСообщения = "4606";
+ IDСообщения = "4494";
Результат = OPI_Telegram.ПереслатьСообщение(Токен, IDСообщения, IDКанала, IDЧата);
diff --git a/docs/md/Telegram/Poluchenie-dannyh-i-nastroyka/Skachat-fayl.md b/docs/md/Telegram/Poluchenie-dannyh-i-nastroyka/Skachat-fayl.md
index 16507a0a56..bc5866eb71 100644
--- a/docs/md/Telegram/Poluchenie-dannyh-i-nastroyka/Skachat-fayl.md
+++ b/docs/md/Telegram/Poluchenie-dannyh-i-nastroyka/Skachat-fayl.md
@@ -18,7 +18,7 @@ sidebar_position: 5
```bsl title="Пример кода"
- IDФайла = "CQACAgIAAx0EcNsaZQACEgRmVgMIOr9Q0NEt9l4OXJuwUgbl-wAC3kYAAnFFsUp2dLSNM3JeRjUE";
+ IDФайла = "CQACAgIAAx0EcNsaZQACEZRmUbbz_bhDX_wPiSnMclSID6CD7wACC00AAoaTiEpOTiNykV_72zUE";
Токен = "6129457865:AAFyzNYOAFbu...";
Результат = OPI_Telegram.СкачатьФайл(Токен, IDФайла);
@@ -28,7 +28,7 @@ sidebar_position: 5
```sh title="Пример команд CLI"
- oint telegram СкачатьФайл --token "6129457865:AAFyzNYOAFbu..." --fileid "CQACAgIAAx0EcNsaZQACEgRmVgMIOr9Q0NEt9l4OXJuwUgbl-wAC3kYAAnFFsUp2dLSNM3JeRjUE"
+ oint telegram СкачатьФайл --token "6129457865:AAFyzNYOAFbu..." --fileid "CQACAgIAAx0EcNsaZQACEZRmUbbz_bhDX_wPiSnMclSID6CD7wACC00AAoaTiEpOTiNykV_72zUE"
```
diff --git a/docs/md/Telegram/Rabota-s-temami-foruma/Izmenit-temu-foruma.md b/docs/md/Telegram/Rabota-s-temami-foruma/Izmenit-temu-foruma.md
index ead8ee93b0..57963f3351 100644
--- a/docs/md/Telegram/Rabota-s-temami-foruma/Izmenit-temu-foruma.md
+++ b/docs/md/Telegram/Rabota-s-temami-foruma/Izmenit-temu-foruma.md
@@ -23,7 +23,7 @@ sidebar_position: 3
Токен = "6129457865:AAFyzNYOAFbu...";
Чат = "-1001971186208";
- Тема = "2402";
+ Тема = "2325";
НовоеИмя = "Новый тестовый заголовок";
НовяИконка = "5310132165583840589";
diff --git a/docs/md/Telegram/Rabota-s-temami-foruma/Ochistit-spisok-zakreplennyh-soobscheniy-temy.md b/docs/md/Telegram/Rabota-s-temami-foruma/Ochistit-spisok-zakreplennyh-soobscheniy-temy.md
index 8c9faf5a99..aee2e57861 100644
--- a/docs/md/Telegram/Rabota-s-temami-foruma/Ochistit-spisok-zakreplennyh-soobscheniy-temy.md
+++ b/docs/md/Telegram/Rabota-s-temami-foruma/Ochistit-spisok-zakreplennyh-soobscheniy-temy.md
@@ -21,7 +21,7 @@ sidebar_position: 10
Токен = "6129457865:AAFyzNYOAFbu...";
Чат = "-1001971186208";
- Тема = "2402";
+ Тема = "2325";
Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат);
diff --git a/docs/md/Telegram/Rabota-s-temami-foruma/Otkryt-temu-foruma.md b/docs/md/Telegram/Rabota-s-temami-foruma/Otkryt-temu-foruma.md
index 27562d2e22..18d9a83a27 100644
--- a/docs/md/Telegram/Rabota-s-temami-foruma/Otkryt-temu-foruma.md
+++ b/docs/md/Telegram/Rabota-s-temami-foruma/Otkryt-temu-foruma.md
@@ -21,7 +21,7 @@ sidebar_position: 5
Токен = "6129457865:AAFyzNYOAFbu...";
Чат = "-1001971186208";
- Тема = "2402";
+ Тема = "2325";
Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // Открывает главную тему
diff --git a/docs/md/Telegram/Rabota-s-temami-foruma/Udalit-temu-foruma.md b/docs/md/Telegram/Rabota-s-temami-foruma/Udalit-temu-foruma.md
index 8013416cf1..20a960b244 100644
--- a/docs/md/Telegram/Rabota-s-temami-foruma/Udalit-temu-foruma.md
+++ b/docs/md/Telegram/Rabota-s-temami-foruma/Udalit-temu-foruma.md
@@ -21,7 +21,7 @@ sidebar_position: 6
Токен = "6129457865:AAFyzNYOAFbu...";
Чат = "-1001971186208";
- Тема = "2402";
+ Тема = "2325";
Результат = OPI_Telegram.УдалитьТемуФорума(Токен, Чат, Тема);
diff --git a/docs/md/Telegram/Rabota-s-temami-foruma/Zakryt-temu-foruma.md b/docs/md/Telegram/Rabota-s-temami-foruma/Zakryt-temu-foruma.md
index a2342fea8b..b8182e8515 100644
--- a/docs/md/Telegram/Rabota-s-temami-foruma/Zakryt-temu-foruma.md
+++ b/docs/md/Telegram/Rabota-s-temami-foruma/Zakryt-temu-foruma.md
@@ -21,7 +21,7 @@ sidebar_position: 4
Токен = "6129457865:AAFyzNYOAFbu...";
Чат = "-1001971186208";
- Тема = "2402";
+ Тема = "2325";
Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат); // Закрывает главную тему
diff --git a/docs/md/VK/Rabota-s-gruppoy/Sohranit-kartinku-v-albom.md b/docs/md/VK/Rabota-s-gruppoy/Sohranit-kartinku-v-albom.md
index 041357b383..b12478de7a 100644
--- a/docs/md/VK/Rabota-s-gruppoy/Sohranit-kartinku-v-albom.md
+++ b/docs/md/VK/Rabota-s-gruppoy/Sohranit-kartinku-v-albom.md
@@ -22,14 +22,14 @@ sidebar_position: 8
Параметры = ПолучитьПараметрыВК();
ОписаниеКартинки = "Картинка автотест";
- ИДАльбома = "304369700";
+ ИДАльбома = "304440188";
Картинка = "https://openintegrations.dev/test_data/picture.jpg"; // URL, Путь к файлу или Двоичные данные
ИВФ = ПолучитьИмяВременногоФайла("png");
КопироватьФайл(Картинка, ИВФ);
+
Картинка = Новый ДвоичныеДанные(ИВФ);
-
Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, Картинка, ОписаниеКартинки, Параметры);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом", "VK");
diff --git a/docs/md/VK/Rabota-s-gruppoy/Sozdat-post.md b/docs/md/VK/Rabota-s-gruppoy/Sozdat-post.md
index e8b6ae24ae..8237d0b206 100644
--- a/docs/md/VK/Rabota-s-gruppoy/Sozdat-post.md
+++ b/docs/md/VK/Rabota-s-gruppoy/Sozdat-post.md
@@ -40,7 +40,6 @@ sidebar_position: 1
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост", "VK");
-
Результат = OPI_VK.СоздатьПост(Текст, Картинка, Ложь , , Параметры);
diff --git a/docs/md/VK/Rabota-s-gruppoy/Udalit-albom.md b/docs/md/VK/Rabota-s-gruppoy/Udalit-albom.md
index 3c8593a16e..e74d1f4c14 100644
--- a/docs/md/VK/Rabota-s-gruppoy/Udalit-albom.md
+++ b/docs/md/VK/Rabota-s-gruppoy/Udalit-albom.md
@@ -19,7 +19,7 @@ sidebar_position: 6
```bsl title="Пример кода"
Параметры = ПолучитьПараметрыВК();
- ИДАльбома = "304369700";
+ ИДАльбома = "304440188";
Результат = OPI_VK.УдалитьАльбом(ИДАльбома, Параметры);
diff --git a/docs/md/VK/Rabota-s-gruppoy/Udalit-kartinku.md b/docs/md/VK/Rabota-s-gruppoy/Udalit-kartinku.md
index 7280f9b9ed..7c15cd9db5 100644
--- a/docs/md/VK/Rabota-s-gruppoy/Udalit-kartinku.md
+++ b/docs/md/VK/Rabota-s-gruppoy/Udalit-kartinku.md
@@ -19,7 +19,7 @@ sidebar_position: 9
```bsl title="Пример кода"
Параметры = ПолучитьПараметрыВК();
- ИДКартинки = "457243771";
+ ИДКартинки = "457243842";
Результат = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры);
diff --git a/docs/md/VK/Rabota-s-gruppoy/Udalit-post.md b/docs/md/VK/Rabota-s-gruppoy/Udalit-post.md
index e174c9f56c..7c7e646b21 100644
--- a/docs/md/VK/Rabota-s-gruppoy/Udalit-post.md
+++ b/docs/md/VK/Rabota-s-gruppoy/Udalit-post.md
@@ -19,7 +19,7 @@ sidebar_position: 3
```bsl title="Пример кода"
Параметры = ПолучитьПараметрыВК();
- ИДПоста = "2021";
+ ИДПоста = "2045";
Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры);
diff --git a/docs/md/VK/Rabota-s-obsuzhdeniyami/Napisat-v-obsuzhdenie.md b/docs/md/VK/Rabota-s-obsuzhdeniyami/Napisat-v-obsuzhdenie.md
index 796e17330f..404969ac37 100644
--- a/docs/md/VK/Rabota-s-obsuzhdeniyami/Napisat-v-obsuzhdenie.md
+++ b/docs/md/VK/Rabota-s-obsuzhdeniyami/Napisat-v-obsuzhdenie.md
@@ -20,7 +20,7 @@ sidebar_position: 4
```bsl title="Пример кода"
Параметры = ПолучитьПараметрыВК();
- ИДОбсуждения = "51136513";
+ ИДОбсуждения = "51167955";
Сообщение = "Мне больше нравится желтый";
Результат = OPI_VK.НаписатьВОбсуждение(ИДОбсуждения, Сообщение, Параметры);
diff --git a/docs/md/VK/Rabota-s-obsuzhdeniyami/Otkryt-obsuzhdenie.md b/docs/md/VK/Rabota-s-obsuzhdeniyami/Otkryt-obsuzhdenie.md
index 581e11866f..87c468f92c 100644
--- a/docs/md/VK/Rabota-s-obsuzhdeniyami/Otkryt-obsuzhdenie.md
+++ b/docs/md/VK/Rabota-s-obsuzhdeniyami/Otkryt-obsuzhdenie.md
@@ -19,7 +19,7 @@ sidebar_position: 3
```bsl title="Пример кода"
Параметры = ПолучитьПараметрыВК();
- ИДОбсуждения = "51136513";
+ ИДОбсуждения = "51167955";
Результат = OPI_VK.ОткрытьОбсуждение(ИДОбсуждения, Параметры);
diff --git a/docs/md/VK/Rabota-s-obsuzhdeniyami/Zakryt-obsuzhdenie.md b/docs/md/VK/Rabota-s-obsuzhdeniyami/Zakryt-obsuzhdenie.md
index 319492e9ca..fb0b35cc1c 100644
--- a/docs/md/VK/Rabota-s-obsuzhdeniyami/Zakryt-obsuzhdenie.md
+++ b/docs/md/VK/Rabota-s-obsuzhdeniyami/Zakryt-obsuzhdenie.md
@@ -20,7 +20,7 @@ sidebar_position: 2
```bsl title="Пример кода"
Параметры = ПолучитьПараметрыВК();
- ИДОбсуждения = "51136513";
+ ИДОбсуждения = "51167955";
Результат = OPI_VK.ЗакрытьОбсуждение(ИДОбсуждения, Ложь, Параметры);
diff --git a/en/OPI/.project b/en/OPI/.project
new file mode 100644
index 0000000000..304a6b8660
--- /dev/null
+++ b/en/OPI/.project
@@ -0,0 +1,18 @@
+
+
+ OPI
+
+
+
+
+
+ org.eclipse.xtext.ui.shared.xtextBuilder
+
+
+
+
+
+ org.eclipse.xtext.ui.shared.xtextNature
+ com._1c.g5.v8.dt.core.V8ExtensionNature
+
+
diff --git a/en/OPI/.settings/org.eclipse.core.resources.prefs b/en/OPI/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000000..99f26c0203
--- /dev/null
+++ b/en/OPI/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/=UTF-8
diff --git a/en/OPI/DT-INF/PROJECT.PMF b/en/OPI/DT-INF/PROJECT.PMF
new file mode 100644
index 0000000000..690880282e
--- /dev/null
+++ b/en/OPI/DT-INF/PROJECT.PMF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Runtime-Version: 8.3.15
+Base-Project: OpenIntegrations
diff --git a/en/OPI/src/CommonModules/OPI_Airtable/Module.bsl b/en/OPI/src/CommonModules/OPI_Airtable/Module.bsl
new file mode 100644
index 0000000000..9a8f60d899
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Airtable/Module.bsl
@@ -0,0 +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", Данные, "Коллекция", Параметры);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
\ No newline at end of file
diff --git a/en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo b/en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo
new file mode 100644
index 0000000000..7dfa64ba1b
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Airtable/OPI_Airtable.mdo
@@ -0,0 +1,11 @@
+
+
+ OPI_Airtable
+
+
+ OPI airtable
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl b/en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl
new file mode 100644
index 0000000000..5ee4262a40
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Dropbox/Module.bsl
@@ -0,0 +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, ТекущиеДанные, Заголовки);
+
+ ТекущаяПозиция = СледующаяПозиция;
+
+ // !OInt КБайт = 1024;
+ // !OInt МБайт = КБайт * КБайт;
+ // !OInt Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт));
+
+ // !OInt ВыполнитьСборкуМусора();
+ // !OInt ОсвободитьОбъект(ТекущиеДанные);
+
+ КонецЦикла;
+
+ Ответ = ЗакрытьСессию(Токен, Путь, Режим, ОбщийРазмер, Сессия);
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ЗагрузитьМалыйФайл(Знач Токен, Знач Файл, Знач Путь, Знач Режим)
+
+ Булево_ = "Булево";
+ Строка_ = "Строка";
+ 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");
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git a/en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo b/en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo
new file mode 100644
index 0000000000..7902731e7c
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Dropbox/OPI_Dropbox.mdo
@@ -0,0 +1,15 @@
+
+
+ OPI_Dropbox
+
+
+ OPI dropbox
+
+
+ ru
+ Drop box
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl b/en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl
new file mode 100644
index 0000000000..a67673021c
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_GoogleCalendar/Module.bsl
@@ -0,0 +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 И ЗначениеЗаполнено(Страница) Тогда
+ ПолучитьСписокСобытийРекурсивно(Заголовки, МассивСобытий, Страница);
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
\ No newline at end of file
diff --git a/en/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo b/en/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo
new file mode 100644
index 0000000000..3d38018f54
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_GoogleCalendar/OPI_GoogleCalendar.mdo
@@ -0,0 +1,11 @@
+
+
+ OPI_GoogleCalendar
+
+
+ OPI google calendar
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl b/en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl
new file mode 100644
index 0000000000..cb8511f9f0
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_GoogleDrive/Module.bsl
@@ -0,0 +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(АдресЗагрузки, ТекущиеДанные, ДопЗаголовки, Ложь, Истина);
+
+ РезультатПроверки = ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция);
+
+ Если ЗначениеЗаполнено(РезультатПроверки) Тогда
+ Возврат РезультатПроверки;
+ КонецЕсли;
+
+ // !OInt КБайт = 1024;
+ // !OInt МБайт = КБайт * КБайт;
+ // !OInt Сообщить(OPI_Инструменты.ИнформацияОПрогрессе(ТекущаяПозиция, ОбщийРазмер, "МБ", МБайт));
+
+ // !OInt ВыполнитьСборкуМусора();
+ // !OInt ОсвободитьОбъект(ТекущиеДанные);
+
+ КонецЦикла;
+
+ Возврат Ответ;
+
+КонецФункции
+
+Функция ПроверитьЗагрузкуЧасти(Ответ, СтрОбщийРазмер, ДопЗаголовки, АдресЗагрузки, ТекущаяПозиция)
+
+ НачалоКодовОшибок = 400;
+ КонецКодовПадений = 600;
+ НачалоКодовУспеха = 200;
+ КонецКодовУспеха = 300;
+ Перенаправление = 308;
+
+ Если Ответ.КодСостояния >= НачалоКодовОшибок И Ответ.КодСостояния < КонецКодовПадений Тогда
+
+ ЗаголовокПотока = "bytes */" + СтрОбщийРазмер;
+ ДопЗаголовки.Вставить("Content-Range" , ЗаголовокПотока);
+
+ ОтветПроверки = OPI_Инструменты.Put(АдресЗагрузки, "", ДопЗаголовки, Ложь, Истина);
+
+ Если ОтветПроверки.КодСостояния >= НачалоКодовУспеха И ОтветПроверки.КодСостояния < КонецКодовУспеха Тогда
+
+ OPI_Инструменты.ОбработатьОтвет(ОтветПроверки);
+ Возврат ОтветПроверки;
+
+ ИначеЕсли ОтветПроверки.КодСостояния = Перенаправление Тогда
+
+ ЗагруженныеДанные = Ответ.Заголовки["Range"];
+
+ Иначе
+
+ OPI_Инструменты.ОбработатьОтвет(Ответ);
+ Возврат Ответ;
+
+ КонецЕсли;
+
+ Иначе
+ ЗагруженныеДанные = Ответ.Заголовки["Range"];
+ КонецЕсли;
+
+ Если Не ЗначениеЗаполнено(ЗагруженныеДанные) Тогда
+ OPI_Инструменты.ОбработатьОтвет(Ответ);
+ Возврат Ответ;
+ КонецЕсли;
+
+ ЗагруженныеДанные = СтрЗаменить(ЗагруженныеДанные, "bytes=", "");
+ МассивИнформации = СтрРазделить(ЗагруженныеДанные, "-", Ложь);
+ НеобходимоЧастей = 2;
+
+ Если Не МассивИнформации.Количество() = НеобходимоЧастей Тогда
+ OPI_Инструменты.ОбработатьОтвет(Ответ);
+ Возврат Ответ;
+ КонецЕсли;
+
+ ТекущаяПозиция = Число(МассивИнформации[1]) + 1;
+
+ Возврат "";
+
+КонецФункции
+
+#КонецОбласти
diff --git a/en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo b/en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo
new file mode 100644
index 0000000000..696a3a5326
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_GoogleDrive/OPI_GoogleDrive.mdo
@@ -0,0 +1,11 @@
+
+
+ OPI_GoogleDrive
+
+
+ OPI google drive
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl b/en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl
new file mode 100644
index 0000000000..966de01568
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_GoogleSheets/Module.bsl
@@ -0,0 +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 По МассивИмен.ВГраница() Цикл
+ ДобавитьИмяЛиста(МассивИмен[Н], Лист);
+ КонецЦикла;
+
+КонецПроцедуры
+
+#КонецОбласти
\ No newline at end of file
diff --git a/en/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo b/en/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo
new file mode 100644
index 0000000000..c26710fdc3
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_GoogleSheets/OPI_GoogleSheets.mdo
@@ -0,0 +1,11 @@
+
+
+ OPI_GoogleSheets
+
+
+ OPI google sheets
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl b/en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl
new file mode 100644
index 0000000000..44b81bdde2
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_GoogleWorkspace/Module.bsl
@@ -0,0 +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");
+ КонецЕсли;
+
+ Возврат СтрСоединить(МассивРазрешений, " ");
+
+КонецФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git a/en/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo b/en/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo
new file mode 100644
index 0000000000..45fb1957ce
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_GoogleWorkspace/OPI_GoogleWorkspace.mdo
@@ -0,0 +1,11 @@
+
+
+ OPI_GoogleWorkspace
+
+
+ OPI google workspace
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_Notion/Module.bsl b/en/OPI/src/CommonModules/OPI_Notion/Module.bsl
new file mode 100644
index 0000000000..85adf32b33
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Notion/Module.bsl
@@ -0,0 +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", Телефон);
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
\ No newline at end of file
diff --git a/en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo b/en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo
new file mode 100644
index 0000000000..2af4fd559d
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Notion/OPI_Notion.mdo
@@ -0,0 +1,11 @@
+
+
+ OPI_Notion
+
+ ru
+ Методы работы с Notion (ОПИ)
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_Slack/Module.bsl b/en/OPI/src/CommonModules/OPI_Slack/Module.bsl
new file mode 100644
index 0000000000..46d6ffc006
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Slack/Module.bsl
@@ -0,0 +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, Параметры, Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git a/en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo b/en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo
new file mode 100644
index 0000000000..10c2bd2efb
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Slack/OPI_Slack.mdo
@@ -0,0 +1,11 @@
+
+
+ OPI_Slack
+
+ ru
+ Slack
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_Telegram/Module.bsl b/en/OPI/src/CommonModules/OPI_Telegram/Module.bsl
new file mode 100644
index 0000000000..8db134d5ac
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Telegram/Module.bsl
@@ -0,0 +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_ПреобразованиеТипов.ПолучитьСтроку(Текст);
+
+ Если ТипЗнч(СоответствиеФайлов) <> Тип("Соответствие") Тогда
+ // !OInt ВызватьИсключение("Не удалось получить информацию из 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/en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo b/en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo
new file mode 100644
index 0000000000..cc233a0791
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Telegram/OPI_Telegram.mdo
@@ -0,0 +1,11 @@
+
+
+ OPI_Telegram
+
+ ru
+ Методы интеграции с Telegram (ОПИ)
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_Twitter/Module.bsl b/en/OPI/src/CommonModules/OPI_Twitter/Module.bsl
new file mode 100644
index 0000000000..6b7e460aa0
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Twitter/Module.bsl
@@ -0,0 +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"];
+
+ Если Не ЗначениеЗаполнено(СтатусОбработки) Тогда
+ Возврат Ответ;
+ Иначе
+ Возврат СтатусОбработки;
+ КонецЕсли;
+
+КонецФункции
+
+#КонецОбласти
diff --git a/en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo b/en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo
new file mode 100644
index 0000000000..759025a8c6
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Twitter/OPI_Twitter.mdo
@@ -0,0 +1,11 @@
+
+
+ OPI_Twitter
+
+ ru
+ Методы работы с Twitter (ОПИ)
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_VK/Module.bsl b/en/OPI/src/CommonModules/OPI_VK/Module.bsl
new file mode 100644
index 0000000000..7c31e644de
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_VK/Module.bsl
@@ -0,0 +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", Сдвиг);
+ ПолучитьСписокЗаказовРекурсивно(МассивЗаказов, Параметры, Сдвиг);
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo b/en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo
new file mode 100644
index 0000000000..f0ebc10c6b
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_VK/OPI_VK.mdo
@@ -0,0 +1,11 @@
+
+
+ OPI_VK
+
+ ru
+ Методы интеграции с VK (ОПИ)
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_Viber/Module.bsl b/en/OPI/src/CommonModules/OPI_Viber/Module.bsl
new file mode 100644
index 0000000000..583e0ec42d
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Viber/Module.bsl
@@ -0,0 +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", Токен);
+ Возврат СтруктураЗаголовков;
+
+КонецФункции
+
+#КонецОбласти
diff --git a/en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo b/en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo
new file mode 100644
index 0000000000..dc7840096f
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Viber/OPI_Viber.mdo
@@ -0,0 +1,11 @@
+
+
+ OPI_Viber
+
+ ru
+ Методы интеграции с Viber (ОПИ)
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl b/en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl
new file mode 100644
index 0000000000..84012779b9
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_YandexDisk/Module.bsl
@@ -0,0 +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Ответа, , Заголовки);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git a/en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo b/en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo
new file mode 100644
index 0000000000..6846d3d51e
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_YandexDisk/OPI_YandexDisk.mdo
@@ -0,0 +1,11 @@
+
+
+ OPI_YandexDisk
+
+ ru
+ Методы работы с Yandex Disk (ОПИ)
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_YandexID/Module.bsl b/en/OPI/src/CommonModules/OPI_YandexID/Module.bsl
new file mode 100644
index 0000000000..da3a55619f
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_YandexID/Module.bsl
@@ -0,0 +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", Параметры, , Ложь);
+
+ Возврат Ответ;
+
+КонецФункции
+
+#КонецОбласти
diff --git a/en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo b/en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo
new file mode 100644
index 0000000000..7b8489440d
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_YandexID/OPI_YandexID.mdo
@@ -0,0 +1,11 @@
+
+
+ OPI_YandexID
+
+ ru
+ Методы работы с Yandex ID (ОПИ)
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_Инструменты/Module.bsl b/en/OPI/src/CommonModules/OPI_Инструменты/Module.bsl
new file mode 100644
index 0000000000..2ad213032a
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Инструменты/Module.bsl
@@ -0,0 +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;
+ ОбщийРазмер = ДвоичныеДанные.Размер();
+
+ Пока ПрочитанноБайт < ОбщийРазмер Цикл
+
+ ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные);
+ ПрочитанноБайт = ЧтениеДанных.Пропустить(ТекущаяПозиция);
+ Результат = ЧтениеДанных.Прочитать(РазмерЧасти);
+ ТекущиеДанные = Результат.ПолучитьДвоичныеДанные();
+ РазмерТекущих = ТекущиеДанные.Размер();
+
+ Если Не ЗначениеЗаполнено(ТекущиеДанные) Тогда
+ Прервать;
+ КонецЕсли;
+
+ ЗаписьДанных.Записать(ТекущиеДанные);
+
+ // !OInt ОсвободитьОбъект(ТекущиеДанные);
+ // !OInt ВыполнитьСборкуМусора();
+
+ ТекущаяПозиция = ТекущаяПозиция + РазмерТекущих;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура Записать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
+
+ Возврат Буфер;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
\ No newline at end of file
diff --git a/en/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo b/en/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo
new file mode 100644
index 0000000000..14693fe85e
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Инструменты/OPI_Инструменты.mdo
@@ -0,0 +1,11 @@
+
+
+ OPI_Инструменты
+
+ ru
+ OPI инструменты
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_Криптография/Module.bsl b/en/OPI/src/CommonModules/OPI_Криптография/Module.bsl
new file mode 100644
index 0000000000..a5001d217b
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Криптография/Module.bsl
@@ -0,0 +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 По Количество Цикл
+ Части.Добавить(Строка);
+ КонецЦикла;
+
+ Возврат СтрСоединить(Части, "");
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
diff --git a/en/OPI/src/CommonModules/OPI_Криптография/OPI_Криптография.mdo b/en/OPI/src/CommonModules/OPI_Криптография/OPI_Криптография.mdo
new file mode 100644
index 0000000000..710fe257bf
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Криптография/OPI_Криптография.mdo
@@ -0,0 +1,11 @@
+
+
+ OPI_Криптография
+
+ ru
+ Криптография (OPI)
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl b/en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl
new file mode 100644
index 0000000000..30d315a7d2
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl
@@ -0,0 +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";
+ ФайлЛога = Новый Файл(ПутьКФайлу);
+
+ Если Не ФайлЛога.Существует() Тогда
+ ДокументЛога = Новый ТекстовыйДокумент;
+ ДокументЛога.УстановитьТекст(Данные);
+ ДокументЛога.Записать(ПутьКФайлу);
+ КонецЕсли;
+
+ Исключение
+ Сообщить("Не удалось записать файл лога!: " + ОписаниеОшибки());
+ КонецПопытки;
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/OPI_ПолучениеДанныхТестов.mdo b/en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/OPI_ПолучениеДанныхТестов.mdo
new file mode 100644
index 0000000000..cbe314eccc
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/OPI_ПолучениеДанныхТестов.mdo
@@ -0,0 +1,11 @@
+
+
+ OPI_ПолучениеДанныхТестов
+
+
+ OPI получение данных тестов
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl b/en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl
new file mode 100644
index 0000000000..50c760d589
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/Module.bsl
@@ -0,0 +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Значение(Тип(Дата), Значение);
+ КонецЕсли;
+
+ Исключение
+ ООД = Новый ОписаниеТипов(Дата);
+ Значение = ООД.ПривестиЗначение(Значение);
+ КонецПопытки;
+
+КонецПроцедуры
+
+Процедура ПолучитьЧисло(Значение) Экспорт
+
+ ОписаниеТипа = Новый ОписаниеТипов("Число");
+ Значение = ОписаниеТипа.ПривестиЗначение(Значение);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ЭтоКоллекция(Знач Значение)
+
+ Возврат ТипЗнч(Значение) = Тип("Массив")
+ Или ТипЗнч(Значение) = Тип("Структура")
+ Или ТипЗнч(Значение) = Тип("Соответствие");
+
+КонецФункции
+
+Функция ЭтоСимвольное(Знач Значение)
+
+ Возврат ТипЗнч(Значение) = Тип("Строка")
+ Или ТипЗнч(Значение) = Тип("Число")
+ Или ТипЗнч(Значение) = Тип("Дата");
+
+КонецФункции
+
+#КонецОбласти
\ No newline at end of file
diff --git a/en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/OPI_ПреобразованиеТипов.mdo b/en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/OPI_ПреобразованиеТипов.mdo
new file mode 100644
index 0000000000..154515af34
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_ПреобразованиеТипов/OPI_ПреобразованиеТипов.mdo
@@ -0,0 +1,11 @@
+
+
+ OPI_ПреобразованиеТипов
+
+ ru
+ Преобразование типов (OPI)
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/CommonModules/OPI_Тесты/Module.bsl b/en/OPI/src/CommonModules/OPI_Тесты/Module.bsl
new file mode 100644
index 0000000000..bb8d3bd26a
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Тесты/Module.bsl
@@ -0,0 +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.ПоставитьЛайк(ИДПоста, , Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоставитьЛайк");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["likes"]).ИмеетТип(ТипЧисло).Заполнено();
+
+ ВнешнийПост = 2571;
+ ВнешняяСтена = -218704372;
+
+ Результат = OPI_VK.СделатьРепост(ВнешнийПост, ВнешняяСтена, , , Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СделатьРепост");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["success"]).ИмеетТип(ТипЧисло).Равно(1);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["wall_repost_count"]).ИмеетТип(ТипЧисло).Равно(1);
+
+ Результат = OPI_VK.НаписатьКомментарий(ИДПоста, Параметры["owner_id"], Сообщение, Параметры);
+
+ // !OInt 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, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистику");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["visitors"]).ИмеетТип(ТипСоответствие).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"][0]["reach"]).ИмеетТип(ТипСоответствие).Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ПолучитьСтатистикуПостов() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+
+ МассивПостов = Новый Массив;
+ МассивПостов.Добавить(214);
+ МассивПостов.Добавить(215);
+
+ Результат = OPI_VK.ПолучитьСтатистикуПостов(МассивПостов, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатистикуПостов");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив").ИмеетДлину(2);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_СоздатьРекламнуюКампанию() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ ИДКабинета = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_AdsCabinetID");
+ Наименование = "Тестовая кампания";
+ ТипСоответствие = Тип("Соответствие");
+ ТипЧисло = Тип("Число");
+ Response = "response";
+ UID = "id";
+
+ Результат = OPI_VK.СоздатьРекламнуюКампанию(ИДКабинета, Наименование, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламнуюКампанию");
+
+ Результат = Результат[Response][0];
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено();
+
+ ИДКампании = Результат[UID];
+ ИДКатегории = 126;
+ Лимит = 150;
+
+ Результат = OPI_VK.СоздатьПост(Наименование, Новый Массив, , , Параметры);
+ ИДПоста = Результат[Response]["post_id"];
+
+ Результат = OPI_VK.СоздатьРекламноеОбъявление(ИДКампании
+ , Лимит
+ , ИДКатегории
+ , ИДПоста
+ , ИДКабинета
+ , Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьРекламноеОбъявление");
+
+ Результат = Результат[Response][0];
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["error_code"]).ИмеетТип(ТипЧисло).Равно(602);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено();
+
+ ИДОбъявления = Результат[UID];
+ Результат = OPI_VK.ПриостановитьРекламноеОбъявление(ИДКабинета, ИДОбъявления, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПриостановитьРекламноеОбъявление");
+
+ Результат = Результат[Response][0];
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[UID]).ИмеетТип(ТипЧисло).Заполнено();
+
+ OPI_VK.УдалитьПост(ИДПоста, Параметры);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ОтправитьСообщение() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_UserID");
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("VK_CommunityToken");
+ Текст = "Сообщение из автотеста";
+
+ МассивКнопок = Новый Массив;
+ МассивКнопок.Добавить("Кнопка 1");
+ МассивКнопок.Добавить("Кнопка 2");
+
+ Клавиатура = OPI_VK.СформироватьКлавиатуру(МассивКнопок);
+ Результат = OPI_VK.НаписатьСообщение(Текст, Пользователь, Токен, Клавиатура, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьСообщение");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["response"]).ИмеетТип("Число").Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ПолучитьКатегорииТоваров() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ Результат = OPI_VK.ПолучитьСписокКатегорийТоваров(Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКатегорийТоваров");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
+ .ИмеетТип("Соответствие")
+ .Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_СоздатьТоварПодборку() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ ТипСоответствие = Тип("Соответствие");
+ ТипЧисло = Тип("Число");
+ Response = "response";
+ Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+ ИВФ = ПолучитьИмяВременногоФайла("png");
+ Картинка.Записать(ИВФ);
+
+ Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка"
+ , Картинка
+ , Истина
+ , Ложь
+ , Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["albums_count"]).ИмеетТип(ТипЧисло).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_album_id"]).ИмеетТип(ТипЧисло).Заполнено();
+
+ ИДПодборки = Результат[Response]["market_album_id"];
+
+ Результат = OPI_VK.ИзменитьПодборкуТоваров("Измененная подборка", ИДПодборки, , , , Параметры);
+
+ // !OInt 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.ДобавитьТовар(Товар, ИДПодборки, Параметры); // Добавление товара
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["market_item_id"]).ИмеетТип(ТипЧисло).Заполнено();
+
+ ИДТовара = Результат[Response]["market_item_id"];
+
+ Товар = Новый Соответствие;
+ Товар.Вставить("Имя", "Тестовый товар измененный");
+
+ Результат = OPI_VK.ИзменитьТовар(ИДТовара, Товар, , Параметры); // Изменение товара
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТовар");
+
+ Проверка_ВКИстина(Результат);
+
+ Результат = OPI_VK.ДобавитьТоварВПодборку(ИДТовара, ИДПодборки, Параметры); // Добавление в подборку
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТоварВПодборку");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]).ИмеетТип(ТипЧисло).Заполнено();
+
+ Результат = OPI_VK.УдалитьТоварИзПодборки(ИДТовара, ИДПодборки, Параметры); // Удаляет из подборки
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТоварИзПодборки");
+
+ OPI_Инструменты.Пауза(5);
+ Проверка_ВКИстина(Результат);
+
+ Результат = OPI_VK.УдалитьТовар(ИДТовара, Параметры); // Удаление товара
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТовар");
+
+ OPI_Инструменты.Пауза(5);
+ Проверка_ВКИстина(Результат);
+
+ Результат = OPI_VK.УдалитьПодборку(ИДПодборки, Параметры); // Уадление подборки
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьПодборку");
+
+ OPI_Инструменты.Пауза(5);
+ Проверка_ВКИстина(Результат);
+
+ УдалитьФайлы(ИВФ);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_СоздатьТоварСоСвойствами() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ ТипСоответствие = Тип("Соответствие");
+ ТипЧисло = Тип("Число");
+ MII = "market_item_id";
+ Response = "response";
+ Желтый = "Желтый";
+ Красный = "Красный";
+ Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+ ИВФ = ПолучитьИмяВременногоФайла("png");
+ Картинка.Записать(ИВФ);
+
+ МассивВариантов = Новый Массив;
+ МассивВариантов.Добавить(Желтый);
+ МассивВариантов.Добавить("Синий");
+ МассивВариантов.Добавить(Красный);
+
+ Результат = OPI_VK.СоздатьСвойствоТовара("Цвет", Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСвойствоТовара");
+
+ OPI_Инструменты.Пауза(5);
+
+ Свойство = Результат[Response]["property_id"];
+ Свойство = OPI_Инструменты.ЧислоВСтроку(Свойство);
+
+ СоответствиеСвойств = Новый Соответствие;
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["property_id"]).ИмеетТип(ТипЧисло).Заполнено();
+
+ Результат = OPI_VK.ИзменитьСвойствоТовара("Цвет (изм.)", Свойство, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойствоТовара");
+
+ OPI_Инструменты.Пауза(5);
+
+ Проверка_ВКИстина(Результат);
+
+ Для Каждого Вариант Из МассивВариантов Цикл
+
+ Результат = OPI_VK.ДобавитьВариантСвойстваТовара(Вариант, Свойство, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВариантСвойстваТовара");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["variant_id"]).ИмеетТип(ТипЧисло).Заполнено();
+
+ ИДВарианта = Результат[Response]["variant_id"];
+ СоответствиеСвойств.Вставить(Вариант, ИДВарианта);
+
+ Результат = OPI_VK.ИзменитьВариантСвойстваТовара(Вариант + Строка(Новый УникальныйИдентификатор())
+ , Свойство
+ , ИДВарианта
+ , Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьВариантСвойстваТовара");
+
+ Проверка_ВКИстина(Результат);
+
+ КонецЦикла;
+
+ МассивКартинок = Новый Массив;
+ МассивКартинок.Добавить(ИВФ);
+ МассивКартинок.Добавить(Картинка);
+
+ Товар = Новый Соответствие();
+ Товар.Вставить("Имя" , "Тестовый товар (" + Желтый + ")");
+ Товар.Вставить("Описание" , "Описание товара");
+ Товар.Вставить("Категория" , "20173");
+ Товар.Вставить("Цена" , 1);
+ Товар.Вставить("СтараяЦена" , 15);
+ Товар.Вставить("ОсновноеФото" , Картинка);
+ Товар.Вставить("URL" , "https://github.com/Bayselonarrend/OpenIntegrations");
+ Товар.Вставить("ДополнительныеФото" , МассивКартинок);
+ Товар.Вставить("ГлавныйВГруппе" , Истина);
+ Товар.Вставить("НомерГруппы" , Неопределено);
+ Товар.Вставить("Ширина" , 20);
+ Товар.Вставить("Высота" , 30);
+ Товар.Вставить("Глубина" , 40);
+ Товар.Вставить("Вес" , 100);
+ Товар.Вставить("SKU" , 12345);
+ Товар.Вставить("ДоступныйОстаток" , "10");
+ Товар.Вставить("ЗначенияСвойств" , СоответствиеСвойств[Желтый]);
+
+ Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); // Добавление товара
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар");
+
+ OPI_Инструменты.Пауза(5);
+
+ ИДЖелтого = Результат[Response]["market_item_id"];
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено();
+
+ Товар.Вставить("Имя" , "Тестовый товар (" + Красный + ")");
+ Товар.Вставить("ЗначенияСвойств", СоответствиеСвойств[Красный]);
+
+ Результат = OPI_VK.ДобавитьТовар(Товар, , Параметры); // Добавление товара
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТовар");
+
+ OPI_Инструменты.Пауза(5);
+
+ ИДКрасного = Результат[Response][MII];
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response][MII]).ИмеетТип(ТипЧисло).Заполнено();
+
+ МассивТоваров = Новый Массив;
+ МассивТоваров.Добавить(ИДЖелтого);
+ МассивТоваров.Добавить(ИДКрасного);
+
+ Результат = OPI_VK.ПолучитьТоварыПоИД(МассивТоваров, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТоварыПоИД");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["items"]).ИмеетТип("Массив").ИмеетДлину(2);
+
+ Результат = OPI_VK.СгруппироватьТовары(МассивТоваров, , Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СгруппироватьТовары");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Response]["item_group_id"]).ИмеетТип(ТипЧисло).Заполнено();
+
+ OPI_VK.УдалитьТовар(ИДЖелтого , Параметры);
+ OPI_VK.УдалитьТовар(ИДКрасного, Параметры);
+
+ Для Каждого Вариант Из СоответствиеСвойств Цикл
+
+ Удаление = OPI_VK.УдалитьВариантСвойстваТовара(Вариант.Значение, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьВариантСвойстваТовара");
+
+ OPI_Инструменты.Пауза(5);
+ Проверка_ВКИстина(Удаление);
+
+ КонецЦикла;
+
+ Удаление = OPI_VK.УдалитьСвойствоТовара(Свойство, Параметры);
+
+ // !OInt 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.ПолучитьСписокТоваров(, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТоваров");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
+ .ИмеетТип("Массив").Заполнено();
+
+ OPI_VK.УдалитьТовар(ИДТовара, Параметры);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ПолучитьСписокПодборок() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+ Результат = OPI_VK.СоздатьПодборкуТоваров("Тестовая подборка"
+ , Картинка
+ , Истина
+ , Ложь
+ , Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПодборкуТоваров");
+
+ ИДПодборки = Результат["response"]["market_album_id"];
+ Результат = OPI_VK.ПолучитьСписокПодборок(Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПодборок");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
+ .ИмеетТип("Массив").Заполнено();
+
+ OPI_VK.УдалитьПодборку(ИДПодборки, Параметры);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ПолучитьСписокСвойств() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ Результат = OPI_VK.ПолучитьСписокСвойств(Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСвойств");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
+ .ИмеетТип("Массив").Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ПолучитьСписокЗаказов() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ Результат = OPI_VK.ПолучитьСписокЗаказов(Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
+ .ИмеетТип("Массив").Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ВК_ЗагрузитьВидео() Экспорт
+
+ Параметры = ПолучитьПараметрыВК();
+ Видео = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Video");
+ Наименование = "Новое видео";
+ Описание = "Описание видео";
+
+ Результат = OPI_VK.ЗагрузитьВидеоНаСервер(Видео, Наименование, Описание, , Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаказов");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_id"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["video_hash"]).Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область YandexDisk
+
+Процедура ЯДиск_ПолучитьИнформациюОДиске() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+ Соответствие = "Соответствие";
+
+ Результат = OPI_YandexDisk.ПолучитьИнформациюОДиске(Токен);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОДиске");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["system_folders"]).ИмеетТип(Соответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user"]).ИмеетТип(Соответствие);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ЯДиск_СоздатьПапку() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+ Путь = "/" + Строка(Новый УникальныйИдентификатор);
+
+ Результат = OPI_YandexDisk.СоздатьПапку(Токен, Путь);
+
+ // !OInt 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.ПолучитьОбъект(Токен, Путь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбъект");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("disk:" + Путь);
+
+ OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ЯДиск_ЗагрузитьУдалитьФайл() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+ Путь = "/" + Строка(Новый УникальныйИдентификатор) + ".png";
+ Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+ ИВФ = ПолучитьИмяВременногоФайла("png");
+ Картинка.Записать(ИВФ);
+
+ Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, Картинка, Истина);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
+
+ Проверка_Пусто(Результат);
+ OPI_Инструменты.Пауза(5);
+
+ Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект");
+
+ Проверка_Пусто(Результат);
+
+ Результат = OPI_YandexDisk.ЗагрузитьФайл(Токен, Путь, ИВФ, Истина);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
+
+ Проверка_Пусто(Результат);
+ OPI_Инструменты.Пауза(5);
+
+ Результат = OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
+
+ // !OInt 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.СоздатьКопиюОбъекта(Токен, ПутьОригинала, ПутьКопии, Истина);
+
+ // !OInt 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.ПолучитьСсылкуДляСкачивания(Токен, Путь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуДляСкачивания");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено();
+
+ URL = Результат["href"];
+
+ Результат = OPI_YandexDisk.СкачатьФайл(Токен, Путь);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные").Заполнено();
+
+ OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
+
+КонецПроцедуры
+
+Процедура ЯДиск_ПолучитьСписокФайлов() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+ Количество = 2;
+ Отступ = 1;
+
+ Результат = OPI_YandexDisk.ПолучитьСписокФайлов(Токен, Количество, Отступ, "image");
+
+ // !OInt 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.ПереместитьОбъект(Токен, ПутьОригинала, ПутьКопии, Истина);
+
+ // !OInt 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);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуСкачиванияПубличногоОбъекта");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["method"]).Равно("GET");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["href"]).ИмеетТип("Строка").Заполнено();
+
+ Результат = OPI_YandexDisk.ПолучитьПубличныйОбъект(Токен, ПубличныйURL);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПубличныйОбъект");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Равно("/");
+
+ МассивРезультатов.Добавить(OPI_YandexDisk.СохранитьПубличныйОбъектНаДиск(Токен, ПубличныйURL));
+
+ МассивРезультатов.Добавить(OPI_YandexDisk.ОтменитьПубликациюОбъекта(Токен, Путь));
+
+ Счетчик = 0;
+ Для Каждого Результат Из МассивРезультатов Цикл
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Изменение публикации");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(Соответствие).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["type"]).Равно("file");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["path"]).Заполнено();
+
+ Если Счетчик = 0 Тогда
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Строка").Заполнено();
+ Иначе
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[PUrl]).ИмеетТип("Неопределено");
+ КонецЕсли;
+
+ Счетчик = Счетчик + 1;
+
+ КонецЦикла;
+
+ OPI_YandexDisk.УдалитьОбъект(Токен, Путь, Ложь);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ЯДиск_ПолучитьСписокОпубликованных() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("YandexDisk_Token");
+ Количество = 2;
+ Отступ = 1;
+
+ Результат = OPI_YandexDisk.ПолучитьСписокОпубликованныхОбъектов(Токен, Количество, Отступ);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОпубликованныхОбъектов");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["limit"]).Равно(Количество);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["offset"]).Равно(Отступ);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["items"]).ИмеетТип("Массив");
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Viber
+
+Процедура Вайбер_ПолучитьИнформациюОКанале() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+ Результат = OPI_Viber.ПолучитьИнформациюОКанале(Токен);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОКанале");
+
+ Проверка_ВайберОк(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ПолучитьДанныеПользователя() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+ Результат = OPI_Viber.ПолучитьДанныеПользователя(Токен, Пользователь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["chat_hostname"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["status_message"]).Заполнено();
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ПолучитьОнлайнПользователей() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+ Результат = OPI_Viber.ПолучитьОнлайнПользователей(Токен, Пользователь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОнлайнПользователей");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["users"]).ИмеетТип("Массив");
+ Проверка_ВайберОк(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ОтправитьТекстовоеСообщение() Экспорт
+
+ Текст = "Тестовое сообщение";
+ ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+ ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+ Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+
+ МассивКнопок = Новый Массив;
+ МассивКнопок.Добавить("Кнопка 1");
+ МассивКнопок.Добавить("Кнопка 2");
+ МассивКнопок.Добавить("Кнопка 3");
+
+ Клавиатура = OPI_Viber.СформироватьКлавиатуруИзМассиваКнопок(МассивКнопок);
+
+ Результат = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенБота, Текст, Пользователь, Ложь, Клавиатура);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ Результат = OPI_Viber.ОтправитьТекстовоеСообщение(ТокенКанал, Текст, Администратор, Истина, Клавиатура);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ОтправитьКартинку() Экспорт
+
+ Текст = "Тестовое сообщение";
+ Картинка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture");
+ ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+ ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+ Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+
+ Результат = OPI_Viber.ОтправитьКартинку(ТокенБота, Картинка, Пользователь, Ложь, Текст);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ Результат = OPI_Viber.ОтправитьКартинку(ТокенКанал, Картинка, Администратор, Истина, Текст);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ОтправитьФайл() Экспорт
+
+ Документ = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document");
+ ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+ ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+ Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+
+ Результат = OPI_Viber.ОтправитьФайл(ТокенБота, Документ, Пользователь, Ложь, "docx");
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ Результат = OPI_Viber.ОтправитьФайл(ТокенКанал, Документ, Администратор, Истина, "docx");
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьФайл");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ОтправитьКонтакт() Экспорт
+
+ Имя = "Петр Петров";
+ Телефон = "+123456789";
+ ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+ ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+ Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+
+ Результат = OPI_Viber.ОтправитьКонтакт(ТокенБота, Имя, Телефон, Пользователь, Ложь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ Результат = OPI_Viber.ОтправитьКонтакт(ТокенКанал, Имя, Телефон, Администратор, Истина);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Вайбер_ОтправитьЛокацию() Экспорт
+
+ Широта = "48.87373649724122";
+ Долгота = "2.2954639195323967";
+ ТокенКанал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelToken");
+ ТокенБота = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_Token");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_UserID");
+ Администратор = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Viber_ChannelAdminID");
+
+ Результат = OPI_Viber.ОтправитьЛокацию(ТокенБота, Широта, Долгота, Пользователь, Ложь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьЛокацию");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ Результат = OPI_Viber.ОтправитьЛокацию(ТокенКанал, Широта, Долгота, Администратор, Истина);
+
+ // !OInt 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, Пользователь, Ложь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСсылку");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_token"]).Заполнено();
+ Проверка_ВайберОк(Результат);
+
+ Результат = OPI_Viber.ОтправитьСсылку(ТокенКанал, URL, Администратор, Истина);
+
+ // !OInt 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.ПолучитьСписокКалендарей(Токен);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКалендарей");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат)
+ .ИмеетТип("Массив");
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ГК_СоздатьУдалитьКалендарь() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+ Наименование = "Тестовый календарь";
+ Описание = "Тестовое описание";
+ НаименованиеИзмененное = Наименование + " (изм.)";
+ ТипСоответствие = Тип("Соответствие");
+ ТипСтрока = Тип("Строка");
+ Summary = "summary";
+ Черный = "#000000";
+ Желтый = "#ffd800";
+
+ Результат = OPI_GoogleCalendar.СоздатьКалендарь(Токен, Наименование);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКалендарь");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(Наименование);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).ИмеетТип(ТипСтрока).Заполнено();
+
+ Календарь = Результат["id"];
+
+ Результат = OPI_GoogleCalendar.ИзменитьМетаданныеКалендаря(Токен
+ , Календарь
+ , НаименованиеИзмененное
+ , Описание);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьМетаданныеКалендаря");
+
+ Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание);
+
+ Результат = OPI_GoogleCalendar.ПолучитьМетаданныеКалендаря(Токен, Календарь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьМетаданныеКалендаря");
+
+ Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание);
+
+ Результат = OPI_GoogleCalendar.ДобавитьКалендарьВСписок(Токен, Календарь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьКалендарьВСписок");
+
+ Проверка_ГКОбъект(Результат, НаименованиеИзмененное, Описание);
+
+ Результат = OPI_GoogleCalendar.ИзменитьКалендарьСписка(Токен, Календарь, Черный, Желтый, Ложь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКалендарьСписка");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый);
+
+ Результат = OPI_GoogleCalendar.ПолучитьКалендарьСписка(Токен, Календарь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКалендарьСписка");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип(ТипСоответствие);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Summary]).Равно(НаименованиеИзмененное);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["foregroundColor"]).Равно(Черный);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["backgroundColor"]).Равно(Желтый);
+
+ Результат = OPI_GoogleCalendar.ОчиститьОсновнойКалендарь(Токен);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьОсновнойКалендарь");
+
+ Проверка_Пусто(Результат);
+
+ Результат = OPI_GoogleCalendar.УдалитьКалендарьИзСписка(Токен, Календарь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКалендарьИзСписка");
+
+ Проверка_Пусто(Результат);
+
+ Результат = OPI_GoogleCalendar.УдалитьКалендарь(Токен, Календарь);
+
+ // !OInt 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.СоздатьСобытие(Токен, Календарь, СоответствиеСобытия);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСобытие");
+
+ Событие = Результат[UID];
+
+ Проверка_ГКОбъект(Результат, Наименование, Описание);
+
+ СоответствиеСобытия = Новый Соответствие;
+ СоответствиеСобытия.Вставить("Описание", ОписаниеИзм);
+
+ Результат = OPI_GoogleCalendar.ИзменитьСобытие(Токен, Календарь, СоответствиеСобытия, Событие);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСобытие");
+
+ Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм);
+
+ Результат = OPI_GoogleCalendar.ПолучитьСобытие(Токен, Календарь, Событие);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСобытие");
+
+ Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм);
+
+ Результат = OPI_GoogleCalendar.ПереместитьСобытие(Токен, Календарь, Календарь, Событие);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереместитьСобытие");
+
+ Проверка_ГКОбъект(Результат, Наименование, ОписаниеИзм);
+
+ Результат = OPI_GoogleCalendar.УдалитьСобытие(Токен, Календарь, Событие);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСобытие");
+
+ Проверка_Пусто(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура ГК_ПолучитьСписокСобытий() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+ Календарь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_CalendarID");
+
+ Результат = OPI_GoogleCalendar.ПолучитьСписокСобытий(Токен, Календарь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокСобытий");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Массив");
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область GoogleDrive
+
+Процедура ГД_ПолучитьСписокКаталогов() Экспорт
+
+ MimeType = "mimeType";
+ Name = "name";
+ Имя = "Тестовая папка";
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+ Результат = OPI_GoogleDrive.ПолучитьСписокКаталогов(Токен, Имя, Истина);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаталогов");
+
+ Результат = Результат[0];
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно("application/vnd.google-apps.folder");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+ Идентификатор = Результат["id"];
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("GD_Catalog", Идентификатор);
+
+ Результат = OPI_GoogleDrive.ПолучитьИнформациюОбОбъекте(Токен, Идентификатор);
+
+ // !OInt 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.ЗагрузитьФайл(Токен, Картинка, Описание);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Описание["Имя"]);
+
+ Идентификатор = Результат[Id_];
+ МассивУдаляемых.Добавить(Идентификатор);
+
+ НовоеИмя = "Скопированный файл.jpeg";
+ Результат = OPI_GoogleDrive.СкопироватьОбъект(Токен, Идентификатор, НовоеИмя, "root");
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкоприроватьОбъект");
+
+ OPI_Инструменты.Пауза(5);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя);
+
+ МассивУдаляемых.Добавить(Результат[Id_]);
+
+ Результат = OPI_GoogleDrive.СкачатьФайл(Токен, Идентификатор);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат.Размер()).Равно(Картинка.Размер() + ЛишниеБайты);
+ OPI_Инструменты.Пауза(5);
+
+ НовоеИмя = "Обновленный файл.jpg";
+ Результат = OPI_GoogleDrive.ОбновитьФайл(Токен, Идентификатор, КартинкаЗамены, НовоеИмя);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьФайл");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[MimeType]).Равно(Описание[MIME]);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(НовоеИмя);
+
+ OPI_Инструменты.Пауза(5);
+
+ Комментарий = "Yo";
+ Результат = OPI_GoogleDrive.СоздатьКомментарий(Токен, Идентификатор, Комментарий);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment");
+
+ OPI_Инструменты.Пауза(5);
+
+ Для Каждого Удаляемый Из МассивУдаляемых Цикл
+ Результат = OPI_GoogleDrive.УдалитьОбъект(Токен, Удаляемый);
+
+ // !OInt 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.СоздатьКомментарий(Токен, Идентификатор, Комментарий);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий");
+
+ ИДКомментария = Результат[Id_];
+
+ МассивРезультатов.Добавить(Результат);
+
+ Результат = OPI_GoogleDrive.ПолучитьКомментарий(Токен, Идентификатор, ИДКомментария);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарий");
+
+ МассивРезультатов.Добавить(Результат);
+
+ Результат = OPI_GoogleDrive.ПолучитьСписокКомментариев(Токен, Идентификатор);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКомментариев");
+
+ Комментарии = Результат[Comments];
+ ОбъектКомментарий = Комментарии[Комментарии.ВГраница()];
+
+ МассивРезультатов.Добавить(ОбъектКомментарий);
+
+ Для Каждого Результат Из МассивРезультатов Цикл
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Content]).Равно(Комментарий);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Kind]).Равно("drive#comment");
+ КонецЦикла;
+
+ Результат = OPI_GoogleDrive.УдалитьКомментарий(Токен, Идентификатор, ИДКомментария);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗначениеЗаполнено(Результат)).Равно(Ложь);
+
+ OPI_GoogleDrive.УдалитьОбъект(Токен, Идентификатор);
+
+КонецПроцедуры
+
+Процедура ГД_СоздатьКаталог() Экспорт
+
+ Name = "name";
+ Имя = "Тестовая папка";
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+ Каталог = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GD_Catalog");
+
+ МассивРезультатов = Новый Массив;
+
+ МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя));
+ МассивРезультатов.Добавить(OPI_GoogleDrive.СоздатьПапку(Токен, Имя, Каталог));
+
+ Для Каждого Результат Из МассивРезультатов Цикл
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку");
+
+ ИДКаталога = Результат["id"];
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат[Name]).Равно(Имя);
+
+ OPI_GoogleDrive.УдалитьОбъект(Токен, ИДКаталога);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область GoogleSheets
+
+Процедура ГТ_СоздатьТаблицу() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+ Наименование = "Тестовая таблица";
+
+ МассивЛистов = Новый Массив;
+ МассивЛистов.Добавить("Лист1");
+ МассивЛистов.Добавить("Лист2");
+
+ Результат = OPI_GoogleSheets.СоздатьКнигу(Токен, Наименование, МассивЛистов);
+
+ // !OInt 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, Лист);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьЛист");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["title"]).Равно(ИмяЛиста + " (копия)");
+
+ Наименование = "Тестовый лист";
+
+ Результат = OPI_GoogleSheets.ДобавитьЛист(Токен, Книга, Наименование);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьЛист");
+
+ НовыйЛист = Результат["replies"][0]["addSheet"]["properties"]["sheetId"];
+ НовыйЛист = OPI_Инструменты.ЧислоВСтроку(НовыйЛист);
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+
+ Результат = OPI_GoogleSheets.УдалитьЛист(Токен, Книга, НовыйЛист);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЛист");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+
+ Наименование = "Тестовая таблица (изм.)";
+
+ Результат = OPI_GoogleSheets.ИзменитьНаименованиеКниги(Токен, Книга, Наименование);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьНаименованиеКниги");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+
+КонецПроцедуры
+
+Процедура ГТ_ПолучитьТаблицу() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Google_Token");
+ Книга = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("GS_Spreadsheet");
+ Наименование = "Тестовая таблица (изм.)";
+
+ Результат = OPI_GoogleSheets.ПолучитьКнигу(Токен, Книга);
+
+ // !OInt 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.УстановитьЗначенияЯчеек(Токен, Книга, СтруктураЯчеек, Лист);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЗначенияЯчеек");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["totalUpdatedCells"]).Равно(СтруктураЯчеек.Количество());
+
+ Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, МассивЯчеек, Лист);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["valueRanges"].Количество()).Равно(МассивЯчеек.Количество());
+
+ Результат = OPI_GoogleSheets.ПолучитьЗначенияЯчеек(Токен, Книга, , Лист);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗначенияЯчеек");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["spreadsheetId"]).Равно(Книга);
+
+ МассивЯчеек = Новый Массив;
+ МассивЯчеек.Добавить("B2");
+ МассивЯчеек.Добавить("A3");
+ МассивЯчеек.Добавить("B4");
+
+ Результат = OPI_GoogleSheets.ОчиститьЯчейки(Токен, Книга, МассивЯчеек, Лист);
+
+ // !OInt 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.СоздатьТекстовыйТвит(Текст, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТекстовыйТвит");
+
+ Проверка_ТвиттерТекст(Результат, Текст);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Твиттер_СоздатьТвитСКартинкой() Экспорт
+
+ Параметры = ПолучитьПараметрыТвиттер();
+ Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
+ Картинка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Picture");
+ ИВФ = ПолучитьИмяВременногоФайла("png");
+ Картинка.Записать(ИВФ);
+
+ Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, Картинка, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки");
+
+ Проверка_ТвиттерТекст(Результат, Текст);
+
+ Результат = OPI_Twitter.СоздатьТвитКартинки(Текст, ИВФ, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитКартинки");
+
+ Проверка_ТвиттерТекст(Результат, Текст);
+
+ УдалитьФайлы(ИВФ);
+
+ OPI_Инструменты.Пауза(20);
+
+КонецПроцедуры
+
+Процедура Твиттер_СоздатьТвитСВидео() Экспорт
+
+ Параметры = ПолучитьПараметрыТвиттер();
+ Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
+ Видео = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Video");
+ ИВФ = ПолучитьИмяВременногоФайла("mp4");
+ Видео.Записать(ИВФ);
+
+ Результат = OPI_Twitter.СоздатьТвитВидео(Текст, Видео, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео");
+
+ Проверка_ТвиттерТекст(Результат, Текст);
+
+ Результат = OPI_Twitter.СоздатьТвитВидео(Текст, ИВФ, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитВидео");
+
+ Проверка_ТвиттерТекст(Результат, Текст);
+
+ УдалитьФайлы(ИВФ);
+
+ OPI_Инструменты.Пауза(20);
+
+КонецПроцедуры
+
+Процедура Твиттер_СоздатьТвитСГиф() Экспорт
+
+ Параметры = ПолучитьПараметрыТвиттер();
+ Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
+ Гифка = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("GIF");
+ ИВФ = ПолучитьИмяВременногоФайла("gif");
+ Гифка.Записать(ИВФ);
+
+ Результат = OPI_Twitter.СоздатьТвитГифки(Текст, Гифка, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки");
+
+ Проверка_ТвиттерТекст(Результат, Текст);
+
+ Результат = OPI_Twitter.СоздатьТвитГифки(Текст, ИВФ, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитГифки");
+
+ Проверка_ТвиттерТекст(Результат, Текст);
+
+ УдалитьФайлы(ИВФ);
+
+ OPI_Инструменты.Пауза(20);
+
+КонецПроцедуры
+
+Процедура Твиттер_СоздатьТвитСОпросом() Экспорт
+
+ Параметры = ПолучитьПараметрыТвиттер();
+ Текст = "Тестовый твитт" + Строка(Новый УникальныйИдентификатор);
+ МассивОтветов = Новый Массив;
+ МассивОтветов.Добавить("Вариант 1");
+ МассивОтветов.Добавить("Вариант 2");
+
+ Результат = OPI_Twitter.СоздатьТвитОпрос(Текст, МассивОтветов, 60, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТвитОпрос");
+
+ Проверка_ТвиттерТекст(Результат, Текст);
+
+ OPI_Инструменты.Пауза(20);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Notion
+
+Процедура Ноушн_СоздатьСтраницу() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+ Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent");
+ Заголовок = "Тестовый заголовок";
+
+ Результат = OPI_Notion.СоздатьСтраницу(Токен, Родитель, Заголовок);
+
+ // !OInt 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.СоздатьБазуДанных(Токен, Родитель, Заголовок, Свойства);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазуДанных");
+
+ Проверка_НоушнОбъект(Результат, "database");
+
+ База = Результат["id"];
+ Заголовок = "Тестовый заголовок";
+ Описание = "Тестовое описание";
+
+ Свойства = Новый Соответствие;
+ Свойства.Вставить("Почта", "rich_text"); // Тип поля "Почта" будет изменен с email на текст
+ Свойства.Вставить("Сайт"); // Поле "Сайт" будет удалено
+
+ Результат = OPI_Notion.ИзменитьСвойстваБазы(Токен, База, Свойства, Заголовок, Описание);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваБазы");
+
+ Проверка_НоушнОбъект(Результат, "database");
+
+КонецПроцедуры
+
+Процедура Ноушн_ПолучитьИнформациюОСтранице() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+ Страница = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page");
+
+ Результат = OPI_Notion.ПолучитьСтраницу(Токен, Страница);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтраницу");
+
+ Проверка_НоушнОбъект(Результат);
+
+КонецПроцедуры
+
+Процедура Ноушн_ПолучитьИнформациюОБазе() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+ База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base");
+
+ Результат = OPI_Notion.ПолучитьБазуДанных(Токен, База);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьБазуДанных");
+
+ Проверка_НоушнОбъект(Результат, "database");
+
+КонецПроцедуры
+
+Процедура Ноушн_СоздатьСтраницуВБазу() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+ База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Base");
+
+ Картинка = Новый Соответствие;
+ Картинка.Вставить("Лого", OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture"));
+
+ Свойства = Новый Соответствие;
+ Свойства.Вставить("Имя" , "ООО Вектор");
+ Свойства.Вставить("Описание" , "Наш первый клиент");
+ Свойства.Вставить("Номер" , 1);
+ Свойства.Вставить("Статус" , "Обычный");
+ Свойства.Вставить("Дата создания" , OPI_Инструменты.ПолучитьТекущуюДату());
+ Свойства.Вставить("Картинка" , Картинка);
+ Свойства.Вставить("Активен" , Истина);
+ Свойства.Вставить("Сайт" , "https://vector.ru");
+ Свойства.Вставить("Почта" , "mail@vector.ru");
+ Свойства.Вставить("Телефон" , "88005553535");
+ Свойства.Вставить("Статус" , "Новый");
+
+ Результат = OPI_Notion.СоздатьСтраницуВБазу(Токен, База, Свойства);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСтраницуВБазу");
+
+ Проверка_НоушнОбъект(Результат);
+
+ Родитель = СтрЗаменить(Результат["parent"]["database_id"], "-", "");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Родитель).Равно(База);
+
+КонецПроцедуры
+
+Процедура Ноушн_ИзменитьСвойстваСтраницы() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+ Страница = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Page");
+ Иконка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture");
+ Обложка = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Picture2");
+ Архивировать = Ложь;
+
+ Свойства = Новый Соответствие;
+ Свойства.Вставить("Активен" , Ложь);
+ Свойства.Вставить("Почта" , "vector@mail.ru");
+
+ Результат = OPI_Notion.ИзменитьСвойстваСтраницы(Токен
+ , Страница
+ , Свойства
+ , Иконка
+ , Обложка
+ , Архивировать);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСвойстваСтраницы");
+
+ Проверка_НоушнОбъект(Результат);
+
+КонецПроцедуры
+
+Процедура Ноушн_СоздатьУдалитьБлок() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+ Родитель = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Parent");
+ Блок = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Block");
+
+ Результат = OPI_Notion.ВернутьБлок(Токен, Блок);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьБлок");
+
+ Проверка_НоушнОбъект(Результат, "block");
+
+ Результат = OPI_Notion.СоздатьБлок(Токен, Родитель, Результат);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБлок");
+
+ Проверка_НоушнОбъект(Результат, "list");
+
+ Блок = Результат["results"][0]["id"];
+ Результат = OPI_Notion.ВернутьДочерниеБлоки(Токен, Блок);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВернутьДочерниеБлоки");
+
+ Проверка_НоушнОбъект(Результат, "list");
+
+ Результат = OPI_Notion.УдалитьБлок(Токен, Блок);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьБлок");
+
+ Проверка_НоушнОбъект(Результат, "block");
+
+КонецПроцедуры
+
+Процедура Ноушн_ПолучитьПользователей() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+ Результат = OPI_Notion.СписокПользователей(Токен);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СписокПользователей");
+
+ Проверка_НоушнОбъект(Результат, "list");
+
+КонецПроцедуры
+
+Процедура Ноушн_ПолучитьДанныеПользователя() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_Token");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Notion_User");
+ Результат = OPI_Notion.ПолучитьДанныеПользователя(Токен, Пользователь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеПользователя");
+
+ Проверка_НоушнОбъект(Результат, "user");
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Slack
+
+Процедура Слак_ПолучитьИнформациюОБоте() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Результат = OPI_Slack.ПолучитьИнформациюОБоте(Токен);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОБоте");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bot_id"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["user_id"]).Заполнено();
+
+КонецПроцедуры
+
+Процедура Слак_ПолучитьСписокПользователей() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Результат = OPI_Slack.ПолучитьСписокПользователей(Токен);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователей");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив");
+
+КонецПроцедуры
+
+Процедура Слак_ПолучитьСписокОбластей() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Результат = OPI_Slack.ПолучитьСписокРабочихОбластей(Токен);
+
+ // !OInt 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.ОтправитьСообщение(Токен, Канал, Текст);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст);
+
+ Отметка = Результат["ts"];
+
+ Результат = OPI_Slack.ИзменитьСообщение(Токен, Канал, Отметка, Текст2);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьСообщение");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message"]["text"]).Равно(Текст2);
+
+ Результат = OPI_Slack.ПолучитьСписокОтветовНаСообщение(Токен, Канал, Отметка);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтветовНаСообщение");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив");
+
+ Результат = OPI_Slack.ПолучитьСсылкуНаСообщение(Токен, Канал, Отметка);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуНаСообщение");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["permalink"]).Заполнено();
+
+ Проверка_СлакОк(Результат);
+
+ Отметки.Добавить(Отметка);
+
+ МассивБлоков = Новый Массив;
+ Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo");
+ МассивБлоков.Добавить(Блок);
+
+ Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , МассивБлоков);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (картинка)");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+
+ Отметки.Добавить(Результат["ts"]);
+
+ Блок = OPI_Slack.СформироватьБлокКартинку(Картинка, "Yo");
+ БлокJSON = OPI_Инструменты.JSONСтрокой(Блок);
+
+ ИВФ = ПолучитьИмяВременногоФайла("json");
+
+ ТекстовыйДокумент = Новый ТекстовыйДокумент();
+ ТекстовыйДокумент.УстановитьТекст(БлокJSON);
+ ТекстовыйДокумент.Записать(ИВФ);
+
+ Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , ИВФ);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json)");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+
+ Отметки.Добавить(Результат["ts"]);
+
+ Блоки = "['" + ИВФ + "','" + ИВФ + "']";
+ Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, , Блоки);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (json массив)");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+
+ Отметки.Добавить(Результат["ts"]);
+
+ УдалитьФайлы(ИВФ);
+
+ Для Каждого Отметка Из Отметки Цикл
+
+ Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьСообщение");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["ts"]).Заполнено();
+
+ КонецЦикла;
+
+ Час = 3600;
+ Сутки = 24;
+ Отправка = OPI_Инструменты.ПолучитьТекущуюДату() + (Сутки * Час);
+ Результат = OPI_Slack.ОтправитьСообщение(Токен, Канал, Текст, Отправка);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение (отложенное)");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).Равно(Канал);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_message_id"]).Заполнено();
+
+ Отметка = Результат["scheduled_message_id"];
+ Результат = OPI_Slack.УдалитьСообщение(Токен, Канал, Отметка, Истина);
+
+ // !OInt 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.ОтправитьЭфемерноеСообщение(Токен, Канал, Текст, Пользователь, Блок);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["message_ts"]).Заполнено();
+
+КонецПроцедуры
+
+Процедура Слак_ПолучитьОтложенныеСообщения() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+
+ Результат = OPI_Slack.ПолучитьСписокОтложенныхСообщений(Токен, Канал);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокОтложенныхСообщений");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["scheduled_messages"]).ИмеетТип("Массив");
+
+КонецПроцедуры
+
+Процедура Слак_СоздатьАрхивироватьКанал() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User");
+ Имя = "testconv" + Строка(Новый УникальныйИдентификатор);
+ Тема = "Тестовая тема";
+ Цель = "Тестовая цель";
+
+ #Область СоздатьКанал
+ Результат = OPI_Slack.СоздатьКанал(Токен, Имя);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКанал");
+
+ Данные = Результат["channel"];
+ Канал = Данные["id"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
+ #КонецОбласти
+
+ #Область УстановитьТемуКанала
+ Результат = OPI_Slack.УстановитьТемуКанала(Токен, Канал, Тема);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьТемуКанала");
+
+ Данные = Результат["channel"];
+ Канал = Данные["id"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["topic"]["value"]).Равно(Тема);
+ #КонецОбласти
+
+ #Область УстановитьЦельКанала
+ Результат = OPI_Slack.УстановитьЦельКанала(Токен, Канал, Цель);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьЦельКанала");
+
+ Проверка_СлакОк(Результат);
+ #КонецОбласти
+
+ #Область ПолучитьКанал
+ Результат = OPI_Slack.ПолучитьКанал(Токен, Канал);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКанал");
+
+ Данные = Результат["channel"];
+ Канал = Данные["id"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
+ #КонецОбласти
+
+ #Область ПригласитьПользователейВКанал
+ Результат = OPI_Slack.ПригласитьПользователейВКанал(Токен, Канал, Пользователь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПригласитьПользователейВКанал");
+
+ Данные = Результат["channel"];
+ Канал = Данные["id"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
+ #КонецОбласти
+
+ #Область ВыгнатьПользователяИзКанала
+ Результат = OPI_Slack.ВыгнатьПользователяИзКанала(Токен, Канал, Пользователь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыгнатьПользователяИзКанала");
+
+ Проверка_СлакОк(Результат);
+ #КонецОбласти
+
+ #Область ПолучитьИсториюКанала
+ Результат = OPI_Slack.ПолучитьИсториюКанала(Токен, Канал);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИсториюКанала");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["messages"]).ИмеетТип("Массив");
+ #КонецОбласти
+
+ #Область ПолучитьСписокПользователейКанала
+ Результат = OPI_Slack.ПолучитьСписокПользователейКанала(Токен, Канал);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокПользователейКанала");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["members"]).ИмеетТип("Массив");
+ #КонецОбласти
+
+ #Область ПокинутьКанал
+ Результат = OPI_Slack.ПокинутьКанал(Токен, Канал);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПокинутьКанал");
+
+ Проверка_СлакОк(Результат);
+ #КонецОбласти
+
+ #Область ВступитьВКанал
+ Результат = OPI_Slack.ВступитьВКанал(Токен, Канал);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВступитьВКанал");
+
+ Данные = Результат["channel"];
+ Канал = Данные["id"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(Имя);
+ #КонецОбласти
+
+ #Область ПереименоватьКанал
+ НовоеИмя = "testconv" + Строка(Новый УникальныйИдентификатор);
+ Результат = OPI_Slack.ПереименоватьКанал(Токен, Канал, НовоеИмя);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереименоватьКанал");
+
+ Данные = Результат["channel"];
+ Канал = Данные["id"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Данные["name"]).Равно(НовоеИмя);
+ #КонецОбласти
+
+ #Область АрхивироватьКанал
+ Результат = OPI_Slack.АрхивироватьКанал(Токен, Канал);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "АрхивироватьКанал");
+
+ Проверка_СлакОк(Результат);
+ #КонецОбласти
+
+КонецПроцедуры
+
+Процедура Слак_ПолучитьСписокКаналов() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+
+ Результат = OPI_Slack.ПолучитьСписокКаналов(Токен);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокКаналов");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channels"]).ИмеетТип("Массив");
+
+КонецПроцедуры
+
+Процедура Слак_ОткрытьЗакрытьДиалог() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Пользователь = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_User");
+ Текст = "Yo, dude";
+
+ Результат = OPI_Slack.ОткрытьДиалог(Токен, Пользователь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьДиалог");
+
+ Диалог = Результат["channel"]["id"];
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["channel"]).ИмеетТип("Соответствие");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Диалог).Заполнено();
+
+ Результат = OPI_Slack.ОтправитьСообщение(Токен, Диалог, Текст);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьСообщение");
+
+ Проверка_СлакОк(Результат);
+
+ Результат = OPI_Slack.ЗакрытьДиалог(Токен, Диалог);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьДиалог");
+
+ Проверка_СлакОк(Результат);
+
+КонецПроцедуры
+
+Процедура Слак_ПолучитьСписокФайлов() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+
+ Результат = OPI_Slack.ПолучитьСписокФайлов(Токен, Канал);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайлов");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
+
+КонецПроцедуры
+
+Процедура Слак_ЗагрузитьУдалитьФайл() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Файл = OPI_ПолучениеДанныхТестов.ПолучитьДвоичные("Document");
+ Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+ МассивФайлов = Новый Массив;
+ ИмяФайла = "megadoc.docx";
+ Заголовок = "Новый файл";
+
+ Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл");
+
+ ЗагруженныйФайл = Результат["files"][0];
+ МассивФайлов.Добавить(ЗагруженныйФайл["id"]);
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла);
+
+ Результат = OPI_Slack.ЗагрузитьФайл(Токен, Файл, ИмяФайла, Заголовок, Канал);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл (в канал)");
+
+ ЗагруженныйФайл = Результат["files"][0];
+ МассивФайлов.Добавить(ЗагруженныйФайл["id"]);
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла);
+
+ Результат = OPI_Slack.ПолучитьДанныеФайла(Токен, ЗагруженныйФайл["id"]);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьФайл");
+
+ ЗагруженныйФайл = Результат["file"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["name"]).Равно(ИмяФайла);
+
+ Для Каждого ЗагруженныйФайл Из МассивФайлов Цикл
+
+ Результат = OPI_Slack.УдалитьФайл(Токен, ЗагруженныйФайл);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьФайл");
+
+ Проверка_СлакОк(Результат);
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура Слак_ПолучитьСписокВФ() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+
+ Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
+
+ Результат = OPI_Slack.ПолучитьСписокВнешнихФайлов(Токен, Канал);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВнешнихФайлов");
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["files"]).ИмеетТип("Массив");
+
+КонецПроцедуры
+
+Процедура Слак_ЗагрузитьУдалитьВФ() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Token");
+ Файл = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Document");
+ Канал = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Slack_Channel");
+ Заголовок = "Новый файл";
+
+ Результат = OPI_Slack.ДобавитьВнешнийФайл(Токен, Файл, Заголовок);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьВнешнийФайл");
+
+ ЗагруженныйФайл = Результат["file"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок);
+
+ Результат = OPI_Slack.ПолучитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьВнешнийФайл");
+
+ ЗагруженныйФайл = Результат["file"];
+
+ Проверка_СлакОк(Результат);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЗагруженныйФайл["title"]).Равно(Заголовок);
+
+ Результат = OPI_Slack.ОтправитьВнешнийФайл(Токен, ЗагруженныйФайл["id"], Канал);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл");
+
+ Проверка_СлакОк(Результат);
+
+ Результат = OPI_Slack.УдалитьВнешнийФайл(Токен, ЗагруженныйФайл["id"]);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВнешнийФайл");
+
+ Проверка_СлакОк(Результат);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Airtable
+
+Процедура АТ_СоздатьБазу() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
+ Область = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Workspace");
+ Наименование = "Тестовая база";
+
+ МассивПолей = Новый Массив;
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер"));
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое"));
+
+ ИмяТаблицы = "Тестовая таблица";
+
+ СоответствиеТаблиц = Новый Соответствие;
+ СоответствиеТаблиц.Вставить(ИмяТаблицы, МассивПолей);
+
+ Результат = OPI_Airtable.СоздатьБазу(Токен, Область, Наименование, СоответствиеТаблиц);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьБазу");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"][0]["name"]).Равно(ИмяТаблицы);
+
+ База = Результат["id"];
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Base", База);
+
+ Результат = OPI_Airtable.ПолучитьТаблицыБазы(Токен, База);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТаблицыБазы");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["tables"]).ИмеетТип("Массив");
+
+ Результат = OPI_Airtable.ПолучитьСписокБаз(Токен);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокБаз");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["bases"]).ИмеетТип("Массив");
+
+КонецПроцедуры
+
+Процедура АТ_СоздатьТаблицу() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
+ База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base");
+
+ МассивПолей = Новый Массив;
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеНомера("Номер"));
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[0], "ПолучитьПолеНомера");
+
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСтроковое("Строковое"));
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[1], "ПолучитьПолеСтроковое");
+
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеВложения("Вложение"));
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[2], "ПолучитьПолеВложения");
+
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеФлажка("Флажок"));
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[3], "ПолучитьПолеФлажка");
+
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеДаты("Дата"));
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[4], "ПолучитьПолеДаты");
+
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеТелефона("Телефон"));
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[5], "ПолучитьПолеТелефона");
+
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеПочты("Почта"));
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[6], "ПолучитьПолеПочты");
+
+ МассивПолей.Добавить(OPI_Airtable.ПолучитьПолеСсылки("Ссылка"));
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(МассивПолей[7], "ПолучитьПолеСсылки");
+
+ ИмяТаблицы = "Тестовая таблица 2";
+ Описание = "Новая таблица";
+
+ Результат = OPI_Airtable.СоздатьТаблицу(Токен, База, ИмяТаблицы, МассивПолей, Описание);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТаблицу");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
+
+ Таблица = Результат["id"];
+ ИмяТаблицы = "Тестовая таблица 2 (изм.)";
+ Описание = "Новая таблица (изм.)";
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Airtable_Table", Таблица);
+
+ Результат = OPI_Airtable.ИзменитьТаблицу(Токен, База, Таблица, ИмяТаблицы, Описание);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТаблицу");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(ИмяТаблицы);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
+
+КонецПроцедуры
+
+Процедура АТ_СоздатьПоле() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
+ База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base");
+ Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table");
+ Имя = Строка(Новый УникальныйИдентификатор);
+
+ Поле = OPI_Airtable.ПолучитьПолеНомера(Имя);
+
+ Результат = OPI_Airtable.СоздатьПоле(Токен, База, Таблица, Поле);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПоле");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя);
+
+ Поле = Результат["id"];
+ Имя = Имя + "(изм.)";
+ Описание = "Новое описание";
+
+ Результат = OPI_Airtable.ИзменитьПоле(Токен, База, Таблица, Поле, Имя, Описание);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьПоле");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["name"]).Равно(Имя);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["description"]).Равно(Описание);
+
+КонецПроцедуры
+
+Процедура АТ_СоздатьУдалитьЗаписи() Экспорт
+
+ Токен = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Token");
+ База = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Base");
+ Таблица = OPI_ПолучениеДанныхТестов.ПолучитьПараметр("Airtable_Table");
+
+ Числовой = 10;
+ Строчный = "Привет";
+
+ ОписаниеСтроки1 = Новый Структура("Номер,Строковое", Числовой, Строчный);
+ ОписаниеСтроки2 = Новый Структура("Номер,Строковое", Числовой, Строчный);
+
+ МассивУдаляемых = Новый Массив;
+ МассивОписаний = Новый Массив;
+ МассивОписаний.Добавить(ОписаниеСтроки1);
+ МассивОписаний.Добавить(ОписаниеСтроки2);
+
+ Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, МассивОписаний);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"].Количество()).Равно(2);
+
+ Для Каждого Запись Из Результат["records"] Цикл
+ МассивУдаляемых.Добавить(Запись["id"]);
+ КонецЦикла;
+
+ Результат = OPI_Airtable.СоздатьЗаписи(Токен, База, Таблица, ОписаниеСтроки1);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьЗаписи (одна)");
+
+ ОдиночнаяЗапись = Результат["id"];
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ОдиночнаяЗапись).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["createdTime"]).Заполнено();
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["fields"]["Номер"]).Равно(Числовой);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(СокрЛП(Результат["fields"]["Строковое"])).Равно(Строчный);
+
+ Результат = OPI_Airtable.ПолучитьЗапись(Токен, База, Таблица, ОдиночнаяЗапись);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЗапись");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(ОдиночнаяЗапись);
+
+ Текст = "Тестовый комментарий";
+ Результат = OPI_Airtable.СоздатьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Текст);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьКомментарий");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст);
+
+ Коммент = Результат["id"];
+ Текст = "Тестовый комментарий (изм.)";
+ Результат = OPI_Airtable.ИзменитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент, Текст);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьКомментарий");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["text"]).Равно(Текст);
+
+ Результат = OPI_Airtable.ПолучитьКомментарии(Токен, База, Таблица, ОдиночнаяЗапись);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьКомментарии");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["comments"]).ИмеетТип("Массив");
+
+ Результат = OPI_Airtable.УдалитьКомментарий(Токен, База, Таблица, ОдиночнаяЗапись, Коммент);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКомментарий");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["deleted"]).Равно(Истина);
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["id"]).Равно(Коммент);
+
+ Результат = OPI_Airtable.ПолучитьСписокЗаписей(Токен, База, Таблица);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокЗаписей");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено();
+
+ Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, МассивУдаляемых);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьЗаписи");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).ИмеетТип("Массив");
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат["records"]).Заполнено();
+
+ Результат = OPI_Airtable.УдалитьЗаписи(Токен, База, Таблица, ОдиночнаяЗапись);
+
+ // !OInt 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
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюБота", "Telegram");
+
+ Проверка_ТелеграмИнформацияБота(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ПолучитьОбновления(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Результат = OPI_Telegram.ПолучитьОбновления(Токен);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьОбновления", "Telegram");
+
+ Проверка_ТелеграмМассив(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_УстановитьWebhook(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ URL = ПараметрыФункции["Telegram_URL"];
+
+ Результат = OPI_Telegram.УстановитьWebhook(Токен, URL);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УстановитьWebhook", "Telegram");
+
+ Проверка_ТелеграмУстановкаВебхук(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_УдалитьWebhook(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Результат = OPI_Telegram.УдалитьWebhook(Токен);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьWebhook", "Telegram");
+
+ Проверка_ТелеграмУдалениеВебхук(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьТекстовоеСообщение(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ Текст = ПараметрыФункции["String"];
+
+ Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDЧата, Текст);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение", "Telegram");
+
+ Проверка_ТелеграмСообщение(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, IDКанала, Текст);
+
+ // END
+
+ // !OInt 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Чата, Текст, Картинка);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку", "Telegram");
+
+ Проверка_ТелеграмКартинка(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаПуть);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКартинку (Путь)");
+
+ Проверка_ТелеграмКартинка(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьКартинку(Токен, IDКанала, Текст, КартинкаДД);
+
+ // END
+
+ // !OInt 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Чата, Текст, Видео);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео", "Telegram");
+
+ Проверка_ТелеграмВидео(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоПуть);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьВидео (Путь)");
+
+ Проверка_ТелеграмВидео(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьВидео(Токен, IDКанала, Текст, ВидеоДД);
+
+ // END
+
+ // !OInt 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Чата, Текст, Аудио);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио", "Telegram");
+
+ Проверка_ТелеграмАудио(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоПуть);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьАудио (Путь)");
+
+ Проверка_ТелеграмАудио(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьАудио(Токен, IDКанала, Текст, АудиоДД);
+
+ // END
+
+ // !OInt 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Чата, Текст, Документ);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент", "Telegram");
+
+ Проверка_ТелеграмДокумент(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументПуть);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (Путь)");
+
+ Проверка_ТелеграмДокумент(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьДокумент(Токен, IDКанала, Текст, ДокументДД);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьДокумент (ДД)");
+
+ Проверка_ТелеграмДокумент(Результат, Текст);
+
+ УдалитьФайлы(ДокументПуть);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьГифку(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ Текст = ПараметрыФункции["String"];
+ Гифка = ПараметрыФункции["GIF"];
+
+ ГифкаПуть = ПолучитьИмяВременногоФайла("gif");
+ КопироватьФайл(Гифка, ГифкаПуть);
+
+ ГифкаДД = Новый ДвоичныеДанные(ГифкаПуть);
+
+ Результат = OPI_Telegram.ОтправитьГифку(Токен, IDЧата, Текст, Гифка);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку", "Telegram");
+
+ Проверка_ТелеграмГифка(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаПуть);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (Путь)");
+
+ Проверка_ТелеграмГифка(Результат, Текст); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьГифку(Токен, IDКанала, Текст, ГифкаДД);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьГифку (ДД)");
+
+ Проверка_ТелеграмГифка(Результат, Текст);
+
+ УдалитьФайлы(ГифкаПуть);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьМеидагруппу(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ Текст = ПараметрыФункции["String"];
+ Картинка = ПараметрыФункции["Picture"];
+ Видео = ПараметрыФункции["Video"];
+
+ КартинкаПуть = ПолучитьИмяВременногоФайла("png");
+ КопироватьФайл(Картинка, КартинкаПуть);
+
+ ВидеоПуть = ПолучитьИмяВременногоФайла("mp4");
+ КопироватьФайл(Видео, ВидеоПуть);
+
+ ВидеоДД = Новый ДвоичныеДанные(ВидеоПуть);
+
+ Медиагруппа = Новый Соответствие;
+ Медиагруппа.Вставить(КартинкаПуть, "photo");
+ Медиагруппа.Вставить(ВидеоДД , "video");
+
+ Результат = OPI_Telegram.ОтправитьМедиагруппу(Токен, IDЧата, Текст, Медиагруппа);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМедиагруппу", "Telegram");
+
+ Проверка_ТелеграмМедиагруппа(Результат);
+
+ УдалитьФайлы(ВидеоПуть);
+ УдалитьФайлы(КартинкаПуть);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьМестоположение(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ Ширина = ПараметрыФункции["Lat"];
+ Долгота = ПараметрыФункции["Long"];
+
+ Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDЧата, Ширина, Долгота);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение", "Telegram");
+
+ Проверка_ТелеграмМестоположение(Результат); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьМестоположение(Токен, IDКанала, Ширина, Долгота);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьМестоположение (канал)");
+
+ Проверка_ТелеграмМестоположение(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьКонтакт(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ Имя = ПараметрыФункции["Name"];
+ Фамилия = ПараметрыФункции["Surname"];
+ Телефон = ПараметрыФункции["Phone"];
+
+ Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDЧата , Имя, Фамилия, Телефон);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт", "Telegram");
+
+ Проверка_ТелеграмКонтакт(Результат, Имя); // SKIP
+ OPI_Инструменты.Пауза(20); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьКонтакт(Токен, IDКанала, Имя, Фамилия, Телефон);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьКонтакт (канал)");
+
+ Проверка_ТелеграмКонтакт(Результат, Имя);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОтправитьОпрос(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ Вопрос = "Какой ваш любимый цвет?";
+
+ МассивОтветов = Новый Массив;
+ МассивОтветов.Добавить("Красный");
+ МассивОтветов.Добавить("Желтый");
+ МассивОтветов.Добавить("Зеленый");
+ МассивОтветов.Добавить("Синий");
+
+ Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDЧата , Вопрос, МассивОтветов, Ложь);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос", "Telegram");
+
+ Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP
+
+ Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, МассивОтветов, Истина);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (канал)");
+
+ Проверка_ТелеграмОпрос(Результат, Вопрос); // SKIP
+
+ // END
+
+ СтрочныйМассив = "['Красный', 'Желтый','Зеленый' ,'Синий']";
+
+ Результат = OPI_Telegram.ОтправитьОпрос(Токен, IDКанала, Вопрос, СтрочныйМассив, Истина);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьОпрос (строчный массив)");
+
+ Проверка_ТелеграмОпрос(Результат, Вопрос);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_СкачатьФайл(ПараметрыФункции)
+
+ IDФайла = ПараметрыФункции["Telegram_FileID"];
+ Токен = ПараметрыФункции["Telegram_Token"];
+
+ Результат = OPI_Telegram.СкачатьФайл(Токен, IDФайла);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Telegram");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные");
+
+КонецПроцедуры
+
+Процедура Telegram_ПереслатьСообщение(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDЧата = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"];
+
+ Результат = OPI_Telegram.ПереслатьСообщение(Токен, IDСообщения, IDКанала, IDЧата);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереслатьСообщение", "Telegram");
+
+ Проверка_ТелеграмПереслать(Результат, IDСообщения);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_Бан(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDПользователя = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+
+ Результат = OPI_Telegram.Бан(Токен, IDКанала, IDПользователя);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Бан", "Telegram");
+
+ Проверка_ТелеграмБан(Результат);
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_Разбан(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDПользователя = ПараметрыФункции["Telegram_ChatID"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+
+ Результат = OPI_Telegram.Разбан(Токен, IDКанала, IDПользователя);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Разбан", "Telegram");
+
+ Проверка_ТелеграмБан(Результат);
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_СоздатьСсылкуПриглашение(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ Сутки = 86400;
+ ТекущаяДата = OPI_Инструменты.ПолучитьТекущуюДату();
+
+ Заголовок = "Ссылка " + Строка(ТекущаяДата);
+ Истечение = ТекущаяДата + Сутки;
+ UnixИстечение = OPI_Инструменты.UNIXTime(Истечение);
+
+ Результат = OPI_Telegram.СоздатьСсылкуПриглашение(Токен, IDКанала, Заголовок, Истечение, 200);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПриглашение", "Telegram");
+
+ Проверка_ТелеграмПриглашение(Результат, Заголовок, UnixИстечение);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ЗакрепитьСообщение(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"];
+
+ Результат = OPI_Telegram.ЗакрепитьСообщение(Токен, IDКанала, IDСообщения);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрепитьСообщение", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ОткрепитьСообщение(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+ IDСообщения = ПараметрыФункции["Telegram_ChannelMessageID"];
+
+ Результат = OPI_Telegram.ОткрепитьСообщение(Токен, IDКанала, IDСообщения);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрепитьСообщение", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ПолучитьЧислоУчастников(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ IDКанала = ПараметрыФункции["Telegram_ChannelID"];
+
+ Результат = OPI_Telegram.ПолучитьЧислоУчастников(Токен, IDКанала);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьЧислоУчастников", "Telegram");
+
+ Проверка_ТелеграмЧисло(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ПолучитьСписокАватаровФорума(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Результат = OPI_Telegram.ПолучитьСписокИконокАватаров(Токен);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокИконокАватаров", "Telegram");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Соответствие").Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_СоздатьТемуФорума(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+ Иконка = "5357419403325481346";
+ Имя = "Тестовая тема " + Строка(Новый УникальныйИдентификатор);
+
+ Результат = OPI_Telegram.СоздатьТемуФорума(Токен, Чат, Имя, Иконка);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьТемуФорума", "Telegram");
+
+ Тема = Результат["result"]["message_thread_id"];
+
+ ПараметрыФункции.Вставить("Telegram_TopicID", Тема);
+ OPI_Инструменты.ДобавитьПоле("Telegram_TopicID", Тема, "Строка", ПараметрыФункции);
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Telegram_TopicID", ПараметрыФункции["Telegram_TopicID"]);
+
+ Проверка_ТелеграмСозданиеТемы(Результат, Имя, Иконка);
+
+ ЧатТема = Чат + "*" + Тема;
+ Текст = ПараметрыФункции["String"];
+ Результат = OPI_Telegram.ОтправитьТекстовоеСообщение(Токен, ЧатТема, Текст);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтправитьТекстовоеСообщение (форум)");
+
+ Проверка_ТелеграмСообщение(Результат, Текст);
+
+КонецПроцедуры
+
+Процедура Telegram_ИзменитьТемуФорума(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+ Тема = ПараметрыФункции["Telegram_TopicID"];
+ НовоеИмя = "Новый тестовый заголовок";
+ НовяИконка = "5310132165583840589";
+
+ Результат = OPI_Telegram.ИзменитьТемуФорума(Токен, Чат, Тема, НовоеИмя, НовяИконка);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьТемуФорума", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ЗакрытьТемуФорума(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+ Тема = ПараметрыФункции["Telegram_TopicID"];
+
+ OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // SKIP
+
+ Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат); // Закрывает главную тему
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума (главная)");
+
+ Проверка_ТелеграмИстина(Результат); // SKIP
+
+ Результат = OPI_Telegram.ЗакрытьТемуФорума(Токен, Чат, Тема);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьТемуФорума", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(25);
+
+КонецПроцедуры
+
+Процедура Telegram_ОткрытьТемуФорума(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+ Тема = ПараметрыФункции["Telegram_TopicID"];
+
+ Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат); // Открывает главную тему
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума (главная)");
+
+ Проверка_ТелеграмИстина(Результат); // SKIP
+
+ Результат = OPI_Telegram.ОткрытьТемуФорума(Токен, Чат, Тема);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьТемуФорума", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(25);
+
+КонецПроцедуры
+
+Процедура Telegram_УдалитьТемуФорума(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+ Тема = ПараметрыФункции["Telegram_TopicID"];
+
+ Результат = OPI_Telegram.УдалитьТемуФорума(Токен, Чат, Тема);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТемуФорума", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(25);
+
+КонецПроцедуры
+
+Процедура Telegram_ОчиститьСписокЗакрепленныхСообщенийТемы(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+ Тема = ПараметрыФункции["Telegram_TopicID"];
+
+ Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы (главная)");
+
+ Проверка_ТелеграмИстина(Результат); // SKIP
+
+ Результат = OPI_Telegram.ОчиститьСписокЗакрепленныхСообщенийТемы(Токен, Чат, Тема);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОчиститьСписокЗакрепленныхСообщенийТемы", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_СкрытьГлавнуюТемуФорума(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+
+ Результат = OPI_Telegram.СкрытьГлавнуюТемуФорума(Токен, Чат);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкрытьГлавнуюТемуФорума", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ПоказатьГлавнуюТемуФорума(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+
+ Результат = OPI_Telegram.ПоказатьГлавнуюТемуФорума(Токен, Чат);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПоказатьГлавнуюТемуФорума", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Telegram_ИзменитьИмяГлавнойТемыФорума(ПараметрыФункции)
+
+ Заголовок = "Новое имя главной темы " + Строка(Новый УникальныйИдентификатор);
+ Токен = ПараметрыФункции["Telegram_Token"];
+ Чат = ПараметрыФункции["Telegram_ForumID"];
+
+ Результат = OPI_Telegram.ИзменитьИмяГлавнойТемыФорума(Токен, Чат, Заголовок);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ИзменитьИмяГлавнойТемыФорума", "Telegram");
+
+ Проверка_ТелеграмИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область VK
+
+Процедура VK_СоздатьСсылкуПолученияТокена(ПараметрыФункции)
+
+ Приложение = ПараметрыФункции["VK_AppID"];
+ Результат = OPI_VK.СоздатьСсылкуПолученияТокена(Приложение);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСсылкуПолученияТокена", "VK");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено();
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_СоздатьПост(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ Текст = "Пост из автотеста";
+ URL = "https://github.com/Bayselonarrend/OpenIntegrations";
+
+ Картинка = ПараметрыФункции["Picture"]; // URL, Путь или Двоичные данные
+ Картинка2 = ПараметрыФункции["Picture2"]; // URL, Путь или Двоичные данные
+
+ ИВФ = ПолучитьИмяВременногоФайла("png");
+ КопироватьФайл(Картинка2, ИВФ);
+
+ МассивКартинок = Новый Массив;
+ МассивКартинок.Добавить(Картинка);
+ МассивКартинок.Добавить(ИВФ);
+
+ Результат = OPI_VK.СоздатьПост(Текст, МассивКартинок, Истина, URL, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост", "VK");
+
+ Проверка_ВКПост(Результат); // SKIP
+ ИДПоста = Результат["response"]["post_id"]; // SKIP
+ Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры); // SKIP
+
+ Результат = OPI_VK.СоздатьПост(Текст, Картинка, Ложь , , Параметры);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (одна картинка)");
+
+ Проверка_ВКПост(Результат);
+
+ ИДПоста = Результат["response"]["post_id"];
+ Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры);
+
+ OPI_Инструменты.Пауза(5);
+
+ Результат = OPI_VK.СоздатьПост(Текст, ИВФ , Истина, URL, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПост (один путь)");
+
+ Проверка_ВКПост(Результат);
+
+ ИДПоста = Результат["response"]["post_id"];
+ OPI_Инструменты.ДобавитьПоле("VK_PostID", ИДПоста, "Строка", ПараметрыФункции);
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PostID", ПараметрыФункции["VK_PostID"]);
+
+ УдалитьФайлы(ИВФ);
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_УдалитьПост(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ ИДПоста = ПараметрыФункции["VK_PostID"];
+
+ Результат = OPI_VK.УдалитьПост(ИДПоста, Параметры);
+
+ // END
+
+ // !OInt 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
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьСоставнойПост", "VK");
+
+ Проверка_ВКПост(Результат);
+ УдалитьФайлы(ИВФ);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_СоздатьОпрос()
+
+ Параметры = ПолучитьПараметрыВК();
+ Вопрос = "Какой ваш любимый цвет?";
+
+ МассивВариантов = Новый Массив;
+ МассивВариантов.Добавить("Красный");
+ МассивВариантов.Добавить("Желтый");
+ МассивВариантов.Добавить("Зеленый");
+
+ Результат = OPI_VK.СоздатьОпрос(Вопрос, МассивВариантов, , Параметры);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОпрос", "VK");
+
+ Проверка_ВКПост(Результат);
+
+ ИДПоста = Результат["response"]["post_id"];
+ OPI_VK.УдалитьПост(ИДПоста, Параметры);
+
+ OPI_Инструменты.Пауза(10);
+
+КонецПроцедуры
+
+Процедура VK_СоздатьАльбом(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ Имя = "Альбом из автотеста";
+ Описание = "Новый альбом из автотеста";
+
+ Результат = OPI_VK.СоздатьАльбом(Имя, Описание, Параметры);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьАльбом", "VK");
+
+ Проверка_ВКАльбом(Результат, Описание);
+
+ ИДАльбома = Результат["response"]["id"];
+ ПараметрыФункции.Вставить("VK_AlbumID", ИДАльбома);
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_AlbumID", ИДАльбома);
+
+КонецПроцедуры
+
+Процедура VK_СохранитьКартинкуВАльбом(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ ОписаниеКартинки = "Картинка автотест";
+ ИДАльбома = ПараметрыФункции["VK_AlbumID"];
+
+ Картинка = ПараметрыФункции["Picture"]; // URL, Путь к файлу или Двоичные данные
+ ИВФ = ПолучитьИмяВременногоФайла("png");
+ КопироватьФайл(Картинка, ИВФ);
+
+ Картинка = Новый ДвоичныеДанные(ИВФ);
+
+ Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, Картинка, ОписаниеКартинки, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом", "VK");
+
+ Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP
+
+ ИДКартинки = Результат["response"][0]["id"]; // SKIP
+ Результат = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры); // SKIP
+
+ Результат = OPI_VK.СохранитьКартинкуВАльбом(ИДАльбома, ИВФ, ОписаниеКартинки, Параметры);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьКартинкуВАльбом (путь)");
+
+ Проверка_ВККартинкаАльбома(Результат, ОписаниеКартинки, ИДАльбома); // SKIP
+
+ ИДКартинки = Результат["response"][0]["id"];
+ ПараметрыФункции.Вставить("VK_PictureID", ИДКартинки);
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_PictureID", ИДКартинки);
+
+ УдалитьФайлы(ИВФ);
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_УдалитьКартинку(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ ИДКартинки = ПараметрыФункции["VK_PictureID"];
+
+ Результат = OPI_VK.УдалитьКартинку(ИДКартинки, Параметры);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьКартинку", "VK");
+
+ Проверка_ВКИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_УдалитьАльбом(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ ИДАльбома = ПараметрыФункции["VK_AlbumID"];
+
+ Результат = OPI_VK.УдалитьАльбом(ИДАльбома, Параметры);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьАльбом", "VK");
+
+ Проверка_ВКИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_СоздатьИсторию(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ URL = "https://github.com/Bayselonarrend/OpenIntegrations";
+
+ Картинка = ПараметрыФункции["Picture"]; // URL, Путь к файлу или Двоичные данные
+ ИВФ = ПолучитьИмяВременногоФайла("png");
+ КопироватьФайл(Картинка, ИВФ);
+ Картинка = Новый ДвоичныеДанные(ИВФ);
+
+ Результат = OPI_VK.СоздатьИсторию(Картинка , URL, Параметры);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию", "VK");
+
+ Проверка_ВКИстория(Результат); // SKIP
+
+ Результат = OPI_VK.СоздатьИсторию(ИВФ, , Параметры);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьИсторию (путь)");
+
+ Проверка_ВКИстория(Результат);
+
+ УдалитьФайлы(ИВФ);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_СоздатьОбсуждение(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ Название = "Обсуждаем: какой цвет лучше?";
+ Сообщение = "Красный, желтый, синий или какой-то другой?";
+
+ Результат = OPI_VK.СоздатьОбсуждение(Название, Сообщение, Параметры);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьОбсуждение", "VK");
+
+ Проверка_ВКОбсуждение(Результат);
+
+ ИДОбсуждения = Результат["response"];
+ ПараметрыФункции.Вставить("VK_ConvID", ИДОбсуждения);
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("VK_ConvID", ИДОбсуждения);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_ЗакрытьОбсуждение(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ ИДОбсуждения = ПараметрыФункции["VK_ConvID"];
+ Результат = OPI_VK.ЗакрытьОбсуждение(ИДОбсуждения, Ложь, Параметры);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗакрытьОбсуждение", "VK");
+
+ Проверка_ВКИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_ОткрытьОбсуждение(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ ИДОбсуждения = ПараметрыФункции["VK_ConvID"];
+ Результат = OPI_VK.ОткрытьОбсуждение(ИДОбсуждения, Параметры);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьОбсуждение", "VK");
+
+ Проверка_ВКИстина(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура VK_НаписатьВОбсуждение(ПараметрыФункции)
+
+ Параметры = ПолучитьПараметрыВК();
+ ИДОбсуждения = ПараметрыФункции["VK_ConvID"];
+ Сообщение = "Мне больше нравится желтый";
+
+ Результат = OPI_VK.НаписатьВОбсуждение(ИДОбсуждения, Сообщение, Параметры);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "НаписатьВОбсуждение", "VK");
+
+ Проверка_ВКОбсуждение(Результат);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область Dropbox
+
+Процедура Dropbox_ПолучитьСсылкуАвторизации(ПараметрыФункции)
+
+ КлючПриложения = ПараметрыФункции["Dropbox_Appkey"];
+ Результат = OPI_Dropbox.ПолучитьСсылкуАвторизации(КлючПриложения);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСсылкуАвторизации", "Dropbox");
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Результат).ИмеетТип("Строка");
+
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьТокен(ПараметрыФункции)
+
+ КлючПриложения = ПараметрыФункции["Dropbox_Appkey"];
+ СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"];
+ Код = ПараметрыФункции["Dropbox_Code"];
+
+ Результат = OPI_Dropbox.ПолучитьТокен(КлючПриложения, СекретПриложения, Код);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьТокен");
+
+ Токен = Результат["access_token"];
+ Рефреш = Результат["refresh_token"];
+
+ Если ЗначениеЗаполнено(Токен) Тогда
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен);
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(Рефреш) Тогда
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Refresh", Рефреш);
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура Dropbox_ОбновитьТокен(ПараметрыФункции)
+
+ КлючПриложения = ПараметрыФункции["Dropbox_Appkey"];
+ СекретПриложения = ПараметрыФункции["Dropbox_Appsecret"];
+ РефрешТокен = ПараметрыФункции["Dropbox_Refresh"];
+
+ Результат = OPI_Dropbox.ОбновитьТокен(КлючПриложения, СекретПриложения, РефрешТокен);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОбновитьТокен");
+
+ Токен = Результат["access_token"];
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(Токен).Заполнено();
+
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_Token", Токен);
+
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьИнформациюОбОбъекте(ПараметрыФункции)
+
+ Путь = "/New/pic.png";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+
+ Результат = OPI_Dropbox.ПолучитьИнформациюОбОбъекте(Токен, Путь, Истина);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбОбъекте", "Dropbox");
+
+ Проверка_ДропБоксФайл(Результат, Путь);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьПревью(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/New/mydoc.docx";
+
+ Результат = OPI_Dropbox.ПолучитьПревью(Токен, Путь);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьПревью", "Dropbox");
+
+ Проверка_ДвоичныеДанные(Результат, 190834);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ЗагрузитьФайл(ПараметрыФункции)
+
+ Путь = "/New/pic.png";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Картинка = ПараметрыФункции["Picture"];
+
+ КартинкаПуть = ПолучитьИмяВременногоФайла("png");
+ КопироватьФайл(Картинка, КартинкаПуть);
+
+ Результат = OPI_Dropbox.ЗагрузитьФайл(Токен, КартинкаПуть, Путь, Истина);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ЗагрузитьФайл", "Dropbox");
+
+ Проверка_ДропБоксФайл(Результат, Путь);
+ УдалитьФайлы(КартинкаПуть);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ЗагрузитьФайлПоURL(ПараметрыФункции)
+
+ Путь = "/New/url_doc.docx";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ URL = ПараметрыФункции["Document"];
+
+ Результат = OPI_Dropbox.ЗагрузитьФайлПоURL(Токен, URL, Путь);
+
+ // END
+
+ // !OInt 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);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСтатусЗагрузкиПоURL", "Dropbox");
+
+ КонецЦикла;
+
+ // END
+
+ Проверка_ДропБоксСтатус(Результат);
+
+ Путь = "/New/url_doc.docx";
+ Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь);
+
+ Проверка_ДропБоксМетаданные(Результат, Путь);
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_УдалитьОбъект(ПараметрыФункции)
+
+ Путь = "/New/pic.png";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+
+ Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьОбъект", "Dropbox");
+
+ Проверка_ДропБоксМетаданные(Результат, Путь);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_КопироватьОбъект(ПараметрыФункции)
+
+ Оригинал = "/New/pic.png";
+ Копия = "/New/pic_copy.png";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+
+ Результат = OPI_Dropbox.КопироватьОбъект(Токен, Оригинал, Копия);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "КопироватьОбъект", "Dropbox");
+
+ Проверка_ДропБоксМетаданные(Результат, Копия);
+
+ Результат = OPI_Dropbox.УдалитьОбъект(Токен, Копия);
+ Проверка_ДропБоксМетаданные(Результат, Копия);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ПереместитьОбъект(ПараметрыФункции)
+
+ ОригиналныйПуть = "/New/pic.png";
+ ЦелевойПуть = "/pic.png";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+
+ Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ОригиналныйПуть, ЦелевойПуть);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "Dropbox_ПереместитьОбъект", "Dropbox");
+
+ Проверка_ДропБоксМетаданные(Результат, ЦелевойПуть);
+
+ Результат = OPI_Dropbox.ПереместитьОбъект(Токен, ЦелевойПуть, ОригиналныйПуть);
+ Проверка_ДропБоксМетаданные(Результат, ОригиналныйПуть);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_СоздатьПапку(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/Новый каталог";
+
+ Результат = OPI_Dropbox.СоздатьПапку(Токен, Путь);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СоздатьПапку", "Dropbox");
+
+ Проверка_ДропБоксМетаданные(Результат, Путь);
+
+ Результат = OPI_Dropbox.УдалитьОбъект(Токен, Путь);
+ Проверка_ДропБоксМетаданные(Результат, Путь);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_СкачатьФайл(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/New/pic.png";
+
+ Результат = OPI_Dropbox.СкачатьФайл(Токен, Путь);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьФайл", "Dropbox");
+
+ Проверка_ДвоичныеДанные(Результат, 2114023);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_СкачатьПапку(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/New";
+
+ Результат = OPI_Dropbox.СкачатьПапку(Токен, Путь);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СкачатьПапку", "Dropbox");
+
+ Проверка_ДвоичныеДанные(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьСписокФайловПапки(ПараметрыФункции)
+
+ Путь = "/New";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+
+ Результат = OPI_Dropbox.ПолучитьСписокФайловПапки(Токен, Путь, Истина);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокФайловПапки", "Dropbox");
+
+ Проверка_ДропБоксМассив(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьСписокВерсийОбъекта(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/New/pic.png";
+
+ Результат = OPI_Dropbox.ПолучитьСписокВерсийОбъекта(Токен, Путь, 1);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокВерсийОбъекта", "Dropbox");
+
+ Проверка_ДропБоксМассив(Результат, 1);
+
+ Ревизия = Результат["entries"][0]["rev"];
+
+ ПараметрыФункции.Вставить("Dropbox_FileRevision", Ревизия);
+ OPI_ПолучениеДанныхТестов.ЗаписатьПараметр("Dropbox_FileRevision", Ревизия);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ВосстановитьОбъектКВерсии(ПараметрыФункции)
+
+ Версия = ПараметрыФункции["Dropbox_FileRevision"];
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/New/pic.png";
+
+ Результат = OPI_Dropbox.ВосстановитьОбъектКВерсии(Токен, Путь, Версия);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВосстановитьОбъектКВерсии", "Dropbox");
+
+ Проверка_ДропБоксФайл(Результат, Путь);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ПолчитьСписокТегов(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+
+ МассивПутей = Новый Массив;
+ МассивПутей.Добавить("/New/Dogs.mp3");
+ МассивПутей.Добавить("/New/mydoc.docx");
+
+ Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, МассивПутей);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов", "Dropbox");
+
+ Проверка_ДропБоксТеги(Результат, МассивПутей.Количество());
+
+ Результат = OPI_Dropbox.ПолучитьСписокТегов(Токен, "/New/mydoc.docx");
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьСписокТегов (одиночный)");
+
+ Проверка_ДропБоксТеги(Результат, 1);
+
+ ЕстьТег = Ложь;
+
+ Для Каждого Тег Из Результат["paths_to_tags"][0]["tags"] Цикл
+ Если Тег["tag_text"] = "важное" Тогда
+ ЕстьТег = Истина;
+ КонецЕсли;
+ КонецЦикла;
+
+ OPI_ПолучениеДанныхТестов.ОжидаетЧто(ЕстьТег).Равно(Истина);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ДобавитьТег(ПараметрыФункции)
+
+ Тег = "Важное";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/New/mydoc.docx";
+
+ Результат = OPI_Dropbox.ДобавитьТег(Токен, Путь, Тег);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьТег", "Dropbox");
+
+ Проверка_Пусто(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_УдалитьТег(ПараметрыФункции)
+
+ Тег = "Важное";
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/New/mydoc.docx";
+
+ Результат = OPI_Dropbox.УдалитьТег(Токен, Путь, Тег);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "УдалитьТег", "Dropbox");
+
+ Проверка_Пусто(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьИнформациюОбАккаунте(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+
+ Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте", "Dropbox");
+
+ Проверка_ДропбоксАккаунт(Результат);
+
+ Результат = OPI_Dropbox.ПолучитьИнформациюОбАккаунте(Токен, Результат["account_id"]);
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьИнформациюОбАккаунте (сторонний)");
+
+ Проверка_ДропбоксАккаунт(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ПолучитьДанныеИспользованияПространства(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+
+ Результат = OPI_Dropbox.ПолучитьДанныеИспользованияПространства(Токен);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПолучитьДанныеИспользованияПространства", "Dropbox");
+
+ Проверка_ДропбоксПространство(Результат);
+
+КонецПроцедуры
+
+Процедура Dropbox_ДобавитьПользователейКФайлу(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Почта = ПараметрыФункции["Dropbox_OtherUser"];
+ Файл = ПараметрыФункции["Dropbox_FileID"];
+
+ Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почта, Ложь);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox");
+
+ Проверка_ДропбоксУчастник(Результат, Почта, Ложь);
+
+ Почты = Новый Массив;
+ Почты.Добавить(Почта);
+
+ Результат = OPI_Dropbox.ДобавитьПользователейКФайлу(Токен, Файл, Почты, Истина);
+
+ Проверка_ДропбоксУчастник(Результат, Почта, Истина);
+
+КонецПроцедуры
+
+Процедура Dropbox_ОпубликоватьПапку(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Путь = "/New";
+
+ Результат = OPI_Dropbox.ОпубликоватьПапку(Токен, Путь);
+
+ // END
+
+ // !OInt 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
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюПапки", "Dropbox");
+
+ Проверка_ДропБоксСтатус(Результат);
+
+ OPI_Инструменты.Пауза(5);
+
+КонецПроцедуры
+
+Процедура Dropbox_ДобавитьПользователейКПапке(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Почта = ПараметрыФункции["Dropbox_OtherUser"];
+ Папка = ПараметрыФункции["Dropbox_SharedFolder"]; // shared_folder_id
+
+ Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почта, Ложь);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ДобавитьПользователяКФайлу", "Dropbox");
+
+ Проверка_Пусто(Результат);
+
+ Почты = Новый Массив;
+ Почты.Добавить(Почта);
+
+ Результат = OPI_Dropbox.ДобавитьПользователейКПапке(Токен, Папка, Почты, Истина);
+
+ Проверка_Пусто(Результат);
+
+КонецПроцедуры
+
+Процедура Dropbox_ОтменитьПубликациюФайла(ПараметрыФункции)
+
+ Токен = ПараметрыФункции["Dropbox_Token"];
+ Файл = ПараметрыФункции["Dropbox_FileID"];
+
+ Результат = OPI_Dropbox.ОтменитьПубликациюФайла(Токен, Файл);
+
+ // END
+
+ // !OInt OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОтменитьПубликациюФайла", "Dropbox");
+
+ Проверка_Пусто(Результат);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
+
+#КонецОбласти
diff --git a/en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo b/en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo
new file mode 100644
index 0000000000..6106c21e79
--- /dev/null
+++ b/en/OPI/src/CommonModules/OPI_Тесты/OPI_Тесты.mdo
@@ -0,0 +1,15 @@
+
+
+ OPI_Тесты
+
+
+ OPI тесты
+
+
+ ru
+ Тесты для YaxUnit (ОПИ)
+
+ true
+ true
+ true
+
diff --git a/en/OPI/src/Configuration/Configuration.mdo b/en/OPI/src/Configuration/Configuration.mdo
new file mode 100644
index 0000000000..0c5da04703
--- /dev/null
+++ b/en/OPI/src/Configuration/Configuration.mdo
@@ -0,0 +1,70 @@
+
+
+ OpenIntegrations
+
+ ru
+ Открытый пакет интеграций
+
+ Adopted
+
+ Checked
+ Checked
+ Checked
+
+
+
+
+
+
+
+
+ true
+ OPI_
+ 8.3.9
+ Customization
+ ManagedApplication
+ PersonalComputer
+ Russian
+ Bayselonarrend
+ 1.9.0
+
+ ru
+ Открытый пакет интеграций - набор библиотек для интеграции с некоторыми популярными API для 1C:Enterprise. Он состоит из общих модулей, каждый из которых отвечает за свой API, а также нескольких модулей-инструментов, общих для всех.
+
+
+ ru
+ https://github.com/Bayselonarrend
+
+
+ ru
+ https://github.com/Bayselonarrend/OpenIntegrations
+
+
+ Русский
+ Adopted
+
+ Checked
+
+ ru
+
+ Subsystem.OPI_Интеграция
+ CommonModule.OPI_Инструменты
+ CommonModule.OPI_Криптография
+ CommonModule.OPI_ПреобразованиеТипов
+ CommonModule.OPI_Telegram
+ CommonModule.OPI_VK
+ CommonModule.OPI_Viber
+ CommonModule.OPI_Twitter
+ CommonModule.OPI_Notion
+ CommonModule.OPI_YandexID
+ CommonModule.OPI_YandexDisk
+ CommonModule.OPI_GoogleWorkspace
+ CommonModule.OPI_GoogleCalendar
+ CommonModule.OPI_GoogleDrive
+ CommonModule.OPI_GoogleSheets
+ CommonModule.OPI_Slack
+ CommonModule.OPI_Airtable
+ CommonModule.OPI_Dropbox
+ CommonModule.OPI_Тесты
+ CommonModule.OPI_ПолучениеДанныхТестов
+
diff --git a/en/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi b/en/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi
new file mode 100644
index 0000000000..0cf6de8a40
--- /dev/null
+++ b/en/OPI/src/Subsystems/OPI_Интеграция/CommandInterface.cmi
@@ -0,0 +1,2 @@
+
+
diff --git a/en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo b/en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo
new file mode 100644
index 0000000000..64613d82e4
--- /dev/null
+++ b/en/OPI/src/Subsystems/OPI_Интеграция/OPI_Интеграция.mdo
@@ -0,0 +1,28 @@
+
+
+ OPI_Интеграция
+
+ ru
+ Интеграция
+
+ true
+ true
+ CommonModule.OPI_Инструменты
+ CommonModule.OPI_Криптография
+ CommonModule.OPI_ПреобразованиеТипов
+ CommonModule.OPI_VK
+ CommonModule.OPI_Telegram
+ CommonModule.OPI_Viber
+ CommonModule.OPI_Twitter
+ CommonModule.OPI_Notion
+ CommonModule.OPI_YandexID
+ CommonModule.OPI_YandexDisk
+ CommonModule.OPI_GoogleWorkspace
+ CommonModule.OPI_GoogleCalendar
+ CommonModule.OPI_GoogleDrive
+ CommonModule.OPI_GoogleSheets
+ CommonModule.OPI_Slack
+ CommonModule.OPI_Airtable
+ CommonModule.OPI_Тесты
+ CommonModule.OPI_ПолучениеДанныхТестов
+
diff --git a/service/dictionaries/backup/en.json b/service/dictionaries/backup/en.json
new file mode 100644
index 0000000000..991849d6d7
--- /dev/null
+++ b/service/dictionaries/backup/en.json
@@ -0,0 +1,2804 @@
+{
+"В": "In",
+"т": "t",
+"И": "And",
+"о": "o",
+"д": "d",
+"в": "in",
+"Н": "N",
+"и": "and",
+"к": "to",
+"с": "with",
+"не": "not",
+"то": "that",
+"из": "from",
+"МБ": "MB",
+"Из": "Of",
+"же": "same",
+"ВК": "VK",
+"он": "he",
+"ПС": "PS",
+"по": "by",
+"Не": "Not",
+"ДД": "DD",
+"ФС": "FS",
+"См": "See",
+"на": "to",
+"БД": "DB",
+"ИВФ": "AndVF",
+"Вес": "Weight",
+"Код": "Code",
+"так": "so",
+"для": "for",
+"что": "what",
+"без": "without",
+"тип": "type",
+"все": "all",
+"они": "they",
+"Чат": "Chat",
+"Тип": "Type",
+"Час": "Hour",
+"или": "or",
+"Это": "This",
+"это": "this",
+"ОТД": "OTD",
+"Лев": "Left",
+"Для": "For",
+"имя": "name",
+"Или": "Or",
+"Хэш": "Hash",
+"при": "at",
+"осн": "main",
+"Бан": "Ban",
+"БАН": "BAN",
+"Нет": "No",
+"НПП": "NPP",
+"доп": "add",
+"Вид": "View",
+"Имя": "Name",
+"Тег": "Tag",
+"поля": "fields",
+"Пути": "Paths",
+"Куда": "To",
+"Файл": "File",
+"Сайт": "Website",
+"типа": "type",
+"Тест": "Test",
+"быть": "be",
+"Цикл": "Loop",
+"Пока": "While",
+"цены": "price",
+"путь": "path",
+"фото": "photo",
+"Цвет": "Color",
+"Поля": "Fields",
+"базы": "databases",
+"файл": "file",
+"Цель": "Purpose",
+"Тема": "Topic",
+"Блок": "Block",
+"Лист": "Sheet",
+"Линк": "Link",
+"Путь": "Path",
+"Пост": "Post",
+"если": "if",
+"Туда": "There",
+"Слак": "Slack",
+"Ключ": "Key",
+"база": "database",
+"есть": "is",
+"Знач": "Value",
+"АирТ": "AirT",
+"вРег": "inReg",
+"Цена": "Price",
+"Ложь": "False",
+"Тело": "Body",
+"Если": "If",
+"Прав": "Right",
+"бота": "bot",
+"Поле": "Field",
+"База": "Base",
+"нРег": "nReg",
+"Лого": "Logo",
+"Фото": "Photo",
+"Вход": "Entry",
+"Дата": "Date",
+"Часть": "Part",
+"вроде": "like",
+"Медиа": "Media",
+"Форум": "Forum",
+"будет": "will",
+"Твиты": "Tweets",
+"имени": "name",
+"новый": "new",
+"ячеек": "cells",
+"типом": "type",
+"Аудио": "Audio",
+"типы:": "types:",
+"боте:": "bot:",
+"нечто": "something",
+"можно": "can",
+"Опции": "Options",
+"ТЗнач": "TValue",
+"Режим": "Mode",
+"Число": "Number",
+"МБайт": "MByte",
+"Метка": "Label",
+"места": "of the venue",
+"Вызов": "Call",
+"Серый": "Gray",
+"Белый": "White",
+"файлу": "file",
+"Дата0": "Date0",
+"Добро": "Welcome",
+"Дата1": "Date1",
+"Отбор": "Filter",
+"файла": "file",
+"Листы": "Sheets",
+"товар": "product",
+"Книга": "Book",
+"через": "through",
+"Почта": "Email",
+"Канал": "Channel",
+"Блоки": "Blocks",
+"Адрес": "Address",
+"новых": "new",
+"Видео": "Video",
+"Части": "Parts",
+"Гифка": "GIF",
+"Номер": "Number",
+"своей": "of its",
+"полей": "fields",
+"текст": "text",
+"Драйв": "Drive",
+"Лист2": "Sheet2",
+"Вывод": "Output",
+"Ответ": "Response",
+"Ноушн": "Notion",
+"ЯДиск": "YDisk",
+"Файлы": "Files",
+"Тогда": "Then",
+"Сдвиг": "Shift",
+"Новый": "New",
+"Шапка": "Header",
+"Файла": "File",
+"ЮТест": "UTest",
+"Равно": "Equal",
+"Синий": "Blue",
+"Опрос": "Poll",
+"Папка": "Folder",
+"Токен": "Token",
+"Лист1": "Sheet1",
+"ЕдИзм": "Unit",
+"Буфер": "Buffer",
+"Текст": "Text",
+"Копия": "Copy",
+"Метод": "Method",
+"путей": "paths",
+"Товар": "Product",
+"Сервер": "Server",
+"Работа": "Work",
+"Это A4": "ThisIsA4",
+"Запрос": "Request",
+"Модуль": "Module",
+"Это A3": "ThisIsA3",
+"Булево": "Boolean",
+"разные": "different",
+"Курсор": "Cursor",
+"Высота": "Height",
+"Это B3": "ThisIsB3",
+"Это B2": "ThisIsB2",
+"Откуда": "From",
+"Ширина": "Width",
+"данных": "data",
+"Это A2": "ThisIsA2",
+"таблиц": "tables",
+"Массив": "Array",
+"Это A1": "ThisIsA1",
+"Книга2": "Book2",
+"Сессия": "Session",
+"Это B1": "ThisIsB1",
+"Это B4": "ThisIsB4",
+"Прочие": "Others",
+"Запись": "Record",
+"метода": "method",
+"Важное": "Important",
+"опции:": "options:",
+"Привет": "Hello",
+"Текст2": "Text2",
+"Желтый": "Yellow",
+"Бирюза": "Turquoise",
+"адресу": "address",
+"стучит": "knocks",
+"Вайбер": "Viber",
+"Записи": "Records",
+"СокрЛП": "ShortLP",
+"ВСпейс": "VSpace",
+"сервис": "service",
+"канале": "channel",
+"СКонца": "FromEnd",
+"Отступ": "Indent",
+"Версия": "Version",
+"важное": "important",
+"типов:": "types:",
+"Список": "List",
+"Рефреш": "Refresh",
+"Статус": "Status",
+"Флажок": "Checkbox",
+"начала": "of start",
+"Коммит": "Commit",
+"только": "only",
+"ТипЗнч": "TypeValue",
+"IDЧата": "ChatID",
+"группе": "group",
+"Данные": "Data",
+"Широта": "Latitude",
+"Формат": "Format",
+"Вопрос": "Question",
+"КудаID": "ToID",
+"Строки": "Strings",
+"IDТемы": "ThreadID",
+"Кнопки": "Buttons",
+"Кнопка": "Button",
+"Ссылка": "Link",
+"Товары": "Products",
+"Альбом": "Album",
+"Должно": "Should",
+"ячейки": "cell",
+"данные": "Data",
+"Ответы": "Answers",
+"булево": "boolean",
+"Дважды": "Twice",
+"IDФото": "PhotoID",
+"ФотоID": "PhotoID",
+"Парсер": "Parser",
+"Диалог": "Dialog",
+"ИДФото": "PhotoID",
+"Строка": "String",
+"корень": "root",
+"тестов": "tests",
+"Истина": "True",
+"полей:": "fields:",
+"Пример": "Example",
+"режиме": "mode",
+"Размер": "Size",
+"Заказы": "Orders",
+"работе": "work",
+"Черный": "Black",
+"Разбан": "Unban",
+"товара": "product",
+"Первый": "First",
+"Ячейка": "Cell",
+"Раздел": "Section",
+"Иконка": "Icon",
+"группы": "groups",
+"Пароль": "Password",
+"Способ": "Method",
+"РАЗБАН": "UNBAN",
+"Синоним": "Synonym",
+"который": "which",
+"Ревизия": "Revision",
+"Таблицы": "Tables",
+"базовую": "basic",
+"обычным": "ordinary",
+"Секунды": "Seconds",
+"Ожидаем": "Awaiting",
+"выбором": "choice",
+"Разделы": "Sections",
+"ЮТТесты": "UTTests",
+"Твиттер": "Twitter",
+"сервере": "server",
+"СНачала": "FromStart",
+"ID темы": "Thread ID",
+"формате": "format",
+"IDПоста": "PostID",
+"ЧатТема": "ChatTopic",
+"запуска": "start",
+"Элемент": "Element",
+"Альбомы": "Albums",
+"Запросы": "Requests",
+"Обложка": "Cover",
+"Удалить": "Delete",
+"ИДБлока": "BlockID",
+"Вариант": "Option",
+"ТипПоля": "FieldType",
+"ДопФото": "AdditionalPhoto",
+"Телефон": "Phone",
+"Отметка": "Timestamp",
+"Скрытая": "Hidden",
+"Каталог": "Directory",
+"Таймаут": "Timeout",
+"граммах": "grams",
+"главным": "main",
+"Долгота": "Longitude",
+"Фамилия": "Last name",
+"Сделать": "Make",
+"свойств": "properties",
+"Счетчик": "Counter",
+"IDСтены": "WallID",
+"История": "Story",
+"ОпросID": "PollID",
+"Подпись": "Signature",
+"Реклама": "Advertisement",
+"Объекты": "Objects",
+"Артикул": "SKU",
+"IDВидео": "VideoID",
+"ИДПоста": "PostID",
+"Признак": "Indication",
+"Глубина": "Depth",
+"ВидеоДД": "VideoDD",
+"Консоль": "Console",
+"Вывести": "Output",
+"Коммент": "Comment",
+"Зеленый": "Green",
+"вызова:": "call:",
+"Каждого": "Each",
+"справку": "help",
+"Символы": "Symbols",
+"Отметки": "Tags",
+"методы:": "methods:",
+"Причина": "Reason",
+"Красный": "Red",
+"Обычный": "Regular",
+"Экспорт": "Export",
+"Функция": "Function",
+"Префикс": "Prefix",
+"изменен": "changed",
+"Активен": "Active",
+"Таблица": "Table",
+"Строка_": "String_",
+"IDПапки": "FolderID",
+"IDФайла": "FileID",
+"Булево_": "Boolean_",
+"Скрытый": "Hidden",
+"Событие": "Event",
+"В офисе": "InOffice",
+"удалено": "deleted",
+"объекта": "object",
+"Аккаунт": "Account",
+"Утилиты": "Utilities",
+"таблицы": "tables",
+"Функции": "Functions",
+"Область": "Region",
+"Справка": "Help",
+"Возврат": "Return",
+"массив:": "array:",
+"<Данные": " ID, Значение > Emoji": "Key > ID, Value > Emoji",
+"Создать товар со свойствами": "Create product with properties",
+"Отправить\/Удалить сообщение": "Send\/Delete message",
+"Путь к файлу для скачивания": "Path to the file for downloading",
+"Получает информацию о файле": "Gets information about the file",
+"СформироватьОписаниеТаблицы": "GenerateTableDescription",
+"Получить ссылку авторизации": "Get authorization link",
+"Создает историю из картинки": "Creates a story from an image",
+"ПолучитьСписокВнешнихФайлов": "GetExternalFileList",
+"URL для перехода в браузере": "URL for browser transition",
+"Отменить публикацию объекта": "Unpublish object",
+"Библиотека: Google Calendar": "Library: Google Calendar",
+"ID стены расположения поста": "ID of the wall where the post is located",
+"Массив каналов для отправки": "Array of channels for sending",
+"Очистить основной календарь": "Clear primary calendar",
+"Изменить наименование книги": "ChangeBookName",
+"разрешение на методы Sheets": "Sheets methods permission",
+"Добавить календарь в список": "Add calendar to list",
+"Удалить календарь из списка": "Remove calendar from list",
+"Массив соответствий событий": "Array of event mappings",
+"Удалить картинку из альбома": "Deletes an image from the album",
+"Отправить\/Удалить эфемерное": "Send\/Delete ephemeral",
+"Телеграм_ПолучитьОбновления": "Telegram_GetUpdates",
+"Код со страницы авторизации": "Code from the authorization page",
+"Получить информацию о диске": "Get disk information",
+"ДропБокс_ЗагрузитьФайлПоURL": "Dropbox_UploadFileByURL",
+"HEX цвет кнопок с # в начале": "HEX color of buttons with # at the beginning",
+"C:\\GDrive\\Мой диск\\data.json": "C:\\GDrive\\My Drive\\data.json",
+"Массив сформированных кнопок": "Array of formed buttons",
+"Восстановить объект к версии": "Restore object to version",
+"Создать рекламное объявление": "Create advertising post",
+"УдалитьВариантСвойстваТовара": "DeleteProductPropertyVariant",
+"ГВ_ПолучитьСсылкуАвторизации": "GV_GetAuthorizationLink",
+"Скрыть\/Показать главную тему": "Hide\/Show main topic",
+"JSON массива описаний блоков": "JSON array of block descriptions",
+"ПолучитьИнформациюОбАккаунте": "GetAccountInformation",
+"Получить список файлов папки": "Get list of folder files",
+"Получает описание поля с URL": "Gets the description of a URL field",
+"Библиотека: Google Workspace": "Library: Google Workspace",
+"Эти токены обновлять не надо": "These tokens do not need to be updated",
+"Массив соответствий подборок": "Array of selection matches",
+"Получить данные пользователя": "Get user data",
+"Показать главную тему форума": "Show main forum thread",
+"Обсуждаем: какой цвет лучше?": "Discussing: Which color is better?",
+"ПолучитьСтандартныеПараметры": "GetStandardParameters",
+"ГД_СоздатьУдалитьКомментарий": "GD_CreateDeleteComment",
+"Создает новую таблицу в базе": "Creates a new table in the base",
+"Получить информацию о канале": "Get channel information",
+"Получить ссылку на сообщение": "Get message link",
+"URL картинки иконки страницы": "URL of the page icon image",
+"Добавляет новый внешний файл": "Adds a new external file",
+"Получить список внеш. файлов": "Get external file list",
+"ПолучитьСоответствиеКартинки": "GetImageCorrespondence",
+"Загрузить\/Удалить внеш. файл": "Upload\/Delete external file",
+"Твиттер_СоздатьТекстовыйТвит": "Twitter_CreateTextTweet",
+"Отправить группу медиафайлов": "Send media group",
+"Слак_ПолучитьИнформациюОБоте": "Slack_GetBotInfo",
+"JSON файлов или путь к .json": "File JSON or path to .json",
+"Получить список комментариев": "Get list of comments",
+"Добавляет новый лист в книгу": "Adds a new sheet to the book",
+"Скрывает главную тему форума": "Hides the main forum thread",
+"Время ожидания новых событий": "Waiting time for new events",
+"Получает информацию о канале": "Gets information about the channel",
+"JSON описание товара или путь": "JSON description of the product or path",
+"разрешение на методы Calendar": "Calendar methods permission",
+"Удаляет ранее созданный товар": "Deletes a previously created product",
+"Слак_СоздатьАрхивироватьКанал": "Slack_CreateArchiveChannel",
+"Закрепить\/Открепить сообщение": "Pin\/Unpin message",
+"URL картинки обложки страницы": "URL of the page cover image",
+"Альтернативный текст картинки": "Alternate text of the image",
+"Получить отложенные сообщения": "Get scheduled messages",
+"Отправить текстовое сообщение": "Send text message",
+"Получить статистику по постам": "Get post statistics",
+"Получает список доступных баз": "Gets the list of available bases",
+"СоздатьЗаголовокАвторизацииV1": "CreateAuthorizationHeaderV1",
+"Телеграм_ОтправитьМедиагруппу": "Telegram_SendMediaGroup",
+"app_id из настроек приложения": "app_id from application settings",
+"Закрывает существующий диалог": "Closes an existing dialog",
+"Соответствие Из КлючИЗначение": "Key-Value Pair",
+"ID подборки, если нужен отбор": "Selection ID, if filtering is needed",
+"Массив соответствий каталогов": "Array of directory mappings",
+"Ошибка в данных описания поля": "Error in field description data",
+"ПолучитьТелоКакДвоичныеДанные": "GetBodyAsBinaryData",
+"Получить ссылку на скачивание": "Get download link",
+"ИзменитьВариантСвойстваТовара": "EditProductPropertyVariant",
+"Изменяет существующее событие": "Edits an existing event",
+"Соответствие из КлючИЗначение": "Map from KeyAndValue",
+"ПолучитьСписокРабочихОбластей": "GetWorkspaceList",
+"Получить данные о базе данных": "Get database information",
+"Удаляет внешний файл из Slack": "Deletes an external file from Slack",
+"Получить онлайн пользователей": "Get online users",
+"Отправить эфемерное сообщение": "Send ephemeral message",
+"ДобавитьВариантСвойстваТовара": "AddProductPropertyVariant",
+"ID блока или сам блок образец": "Block ID or block sample itself",
+"Получить список пользователей": "Get user list",
+"Создает твит с видеовложением": "Creates a tweet with a video attachment",
+"Отбор по ID каталога родителя": "Filter by parent directory ID",
+"Ноушн_ПолучитьИнформациюОБазе": "Notion_GetDatabaseInfo",
+"Твиттер_СоздатьТвитСКартинкой": "Twitter_CreateTweetWithImage",
+"Добавить пользователя к файлу": "Add user to file",
+"JSON описания или путь к .json": "JSON description or path to .json",
+"Слак_ОтправитьУдалитьЭфемерное": "Slack_SendDeleteEphemeral",
+"Получить информацию об объекте": "Get object information",
+"Изменяет ранее созданный товар": "Edits a previously created product",
+"Получить список версий объекта": "Get list of object versions",
+"Получить список опубликованных": "Get published list",
+"Создать\/Удалить составной пост": "Create\/Delete composite post",
+"Размер файла в случае отправке": "File size in case of sending",
+"ПолучитьСтрокуИзДвоичныхДанных": "GetStringFromBinaryData",
+"Добавить пользователей к папке": "Add users to folder",
+"Получить описание файла !NOCLI": "Get file description !NOCLI",
+"ЯДиск_ПолучитьИнформациюОДиске": "YDisk_GetDiskInfo",
+"Удаляет ранее созданный альбом": "Deletes a previously created album",
+"ID события календаря источника": "ID of the source calendar event",
+"Идентификатор удаляемого листа": "IdentifierOfSheetToDelete",
+"ПолучитьДвоичныеДанныеИзСтроки": "GetBinaryDataFromString",
+"Идентификатор записи в таблице": "Record identifier in the table",
+"Слак_ОтправитьУдалитьСообщение": "Slack_SendDeleteMessage",
+"Выгнать пользователя из канала": "Kick user from channel",
+"УправлениеСостояниемТемыФорума": "ManageForumThreadState",
+"СохранитьПубличныйОбъектНаДиск": "SavePublicObjectToDisk",
+"Нельзя замешивать разные типы!": "Different types cannot be mixed!",
+"ДропБокс_ПолучитьОбновитьТокен": "Dropbox_GetUpdateToken",
+"Получить информацию о странице": "Get page info",
+"ПолучитьСписокКатегорийТоваров": "GetProductCategoryList",
+"Структура, Массив из Структура": "Structure, Array of Structures",
+"Путь или набору путей к файлам": "Path or set of paths to the files",
+"Получить список внешних файлов": "Get list of external files",
+"Целевой путь создания каталога": "Target path for creating the directory",
+"Получить ссылку для скачивания": "Get download link",
+"Ноушн_ИзменитьСвойстваСтраницы": "Notion_EditPageProperties",
+"Удаляет файл или каталог по ID": "Deletes file or directory by ID",
+"Создать ссылку получения токена": "Create token retrieval link",
+"Удалить вариант свойства товара": "Delete product property variant",
+"Создает твит с вложением-гифкой": "Creates a tweet with a gif attachment",
+"Двоичные данные или путь к фото": "Binary data or path to photo",
+"Путь назначение для перемещения": "Destination path for moving",
+"Получает информацию об аккаунте": "Gets account information",
+"Не удалось записать файл лога!:": "Failed to write log file!:",
+"Телеграм_ИзменитьИмяГлавнойТемы": "Telegram_ChangeMainTopicName",
+"Получить список иконок-аватаров": "Get avatar icon list",
+"Обновляет двоичные данные файла": "Updates file binary data",
+"Получает список каталогов диска": "Gets the list of drive directories",
+"ЯДиск_ДействияПубличныхОбъектов": "YDisk_PublicObjectActions",
+"Действия с публичными объектами": "Actions with public objects",
+"Получить статус загрузки по URL": "Get upload status by URL",
+"Получает значения ячеек таблицы": "Gets cell values of the table",
+"Получить список аватаров форума": "Get forum avatars list",
+"Создает пустую подборку товаров": "Creates an empty product selection",
+"Загружает файл на сервера Slack": "Uploads a file to Slack servers",
+"только конкретному пользователю": "only to a specific user",
+"ПолучитьСписокСобытийРекурсивно": "GetEventsListRecursively",
+"Удаляет текущего бота из канала": "Removes the current bot from the channel",
+"ID чата оригинального сообщения": "Chat ID of the original message",
+"Массив из Строка,ДвоичныеДанные": "Array from String, BinaryData",
+"Copyright (c) 2019, ООО 1С-Софт": "Copyright (c) 2019, LLC 1C-Soft",
+"Отправка в канал или в чат бота": "Sending to channel or bot chat",
+"См.ПолучитьСтандартныеПараметры": "See GetStandardParameters",
+"Целевой путь для нового объекта": "Target path for the new object",
+"Получить ссылку для авторизации": "Get authorization link",
+"Получить информацию об аккаунте": "Get account information",
+"Добавляет текущего бота в канал": "Adds the current bot to the channel",
+"Создает пустой каталог на диске": "Creates an empty directory on the drive",
+"Загружает файл на облачный диск": "Uploads a file to the cloud drive",
+"Телеграм_ПолучитьИнформациюБота": "Telegram_GetBotInfo",
+"Слак_ПолучитьОтложенныеСообщения": "Slack_GetScheduledMessages",
+"ЯДиск_ПолучитьСсылкуНаСкачивание": "YDisk_GetDownloadLink",
+"ПриостановитьРекламноеОбъявление": "PauseAdvertisingAd",
+"См. ПолучитьСписокИконокАватаров": "See GetAvatarIconList",
+"Ноушн_ПолучитьДанныеПользователя": "Notion_GetUserData",
+"Слак_ПолучитьСписокПользователей": "Slack_GetUserList",
+"Создает страницу в базе-родителе": "Creates a page in the parent database",
+"Получает список подборок товаров": "Gets the list of product selections",
+"Закрывает или удаляет обсуждение": "Close or delete discussion",
+"Удаляет объект по заданному пути": "Deletes an object at the specified path",
+"Количество возвращаемых объектов": "Number of returned objects",
+"Получить описание события !NOCLI": "Get event description !NOCLI",
+"Идентификатор файла или каталога": "Identifier of the file or folder",
+"ВыполнитьЗапросСДвоичнымиДанными": "ExecuteRequestWithBinaryData",
+"Отправляет видео в чат или канал": "Sends a video to a chat or channel",
+"Массив ячеек вида А1 для очистки": "Array of cells like A1 to be cleared",
+"Получить список рабочих областей": "Get workspace list",
+"Путь к удаляемой папке или файлу": "Path to the folder or file to be deleted",
+"Удаляет объект с облачного диска": "Deletes an object from the cloud drive",
+"ПолучитьСписокОтветовНаСообщение": "GetMessageReplyList",
+"Добавить вариант свойства товара": "Add product property variant",
+"Вайбер_ПолучитьИнформациюОКанале": "Viber_GetChannelInfo",
+"Получает описание поля типа дата": "Gets the description of a date field",
+"См.ДобавитьВариантСвойстваТовара": "See AddPropertyVariant",
+"Телеграм_ПолучитьЧислоУчастников": "Telegram_GetMemberCount",
+"Изменяет имя главной темы форума": "Edits the name of the main forum thread",
+"ПолучитьСписокОбъектовРекурсивно": "GetObjectsListRecursively",
+"Телеграм_ОтправитьМестоположение": "Telegram_SendLocation",
+"Обновляет токен по Refresh token": "Updates token by Refresh token",
+"Отправляет гифку в чат или канал": "Sends a GIF to a chat or channel",
+"JSON клавиатуры или путь к .json": "Keyboard JSON or path to .json",
+"Изменить вариант свойства товара": "Edit product property variant",
+"ПолучитьСписокРекламныхКатегорий": "GetAdvertisingCategoryList",
+"Пригласить пользователей в канал": "Invite users to channel",
+"Получить описание товара. !NOCLI": "Get product description. !NOCLI",
+"Изменить имя главной темы форума": "Edit main forum thread name",
+"Ошибка в данных коллекции таблиц": "Error in table collection data",
+"Идентификатор изменяемого товара": "Identifier of the product being edited",
+"Отправка в канал или чат с ботом": "Sending to channel or bot chat",
+"Загрузить массив вложений !NOCLI": "Upload attachments array !NOCLI",
+"Массив из Строка, ДвоичныеДанные": "Array from String, BinaryData",
+"ПолучитьСписокОтложенныхСообщений": "GetDelayedMessageList",
+"Создает опрос с вариантами ответа": "Creates a poll with answer options",
+"Ноушн_ПолучитьИнформациюОСтранице": "Notion_GetPageInfo",
+"Получает информацию о книге по ID": "Gets information about the book by ID",
+"ВыполнитьЗапросМультипартРелэйтед": "ExecuteMultipartRelatedRequest",
+"Получить список категорий товаров": "Get a list of product categories",
+"сериализованный JSON ответа от VK": "Serialized JSON response from VK",
+"Закрепляет сообщение в шапке чата": "Pins a message in the chat header",
+"JSON авторизации или путь к .json": "Authorization JSON or path to .json",
+"Путь помещения загруженного файла": "Path to place the downloaded file",
+"v1.1. Поэтому что-то нужно делать": "v1.1. Therefore, something needs to be done",
+"Запрос, приходящий на http-сервис": "Request coming to the http service",
+"Открепляет сообщение в шапке чата": "Unpins a message in the chat header",
+"Ссылка на страницу сайта магазина": "Link to the store's website page",
+"Вайбер_ПолучитьДанныеПользователя": "Viber_GetUserData",
+"Предпочтительное хранение токенов": "Preferred token storage",
+"ПолучитьСписокПользователейКанала": "GetChannelUserList",
+"Скачивает файл по указанному пути": "Downloads a file at the specified path",
+"Телеграм_СоздатьУдалитьТемуФорума": "Telegram_CreateDeleteForumTopic",
+"Телеграм_СоздатьСсылкуПриглашение": "Telegram_CreateInvitationLink",
+"Твиттер_ПолучитьСсылкуАвторизации": "Twitter_GetAuthorizationLink",
+"Получает список доступных каналов": "Gets a list of available channels",
+"Соответствие изменяемых параметров": "Matching of editable parameters",
+"Скачивает файл с серверов Telegram": "Download file from Telegram servers",
+"См. ПолучитьСписокКатегорийТоваров": "See GetProductCategoryList",
+"Расширение файла в случае отправки": "File extension in case of sending",
+"Массив данных статистики по постам": "Array of post statistics data",
+"что обсуловлено наличием сразу 2-х": "which is due to the presence of two at once",
+"Устанавливает значения ячеек листа": "Sets sheet cell values",
+"Создает твит с картинкой вложением": "Creates a tweet with an image attachment",
+"Идентификатор объекта для удаления": "Identifier of the object to delete",
+"querry из Telegram.WebApp.initData": "Query from Telegram.WebApp.initData",
+"Сохранить публичный объект на диск": "Save public object to disk",
+"Получает описание поля типа булево": "Gets the description of a boolean field",
+"ID целевого чата или IDЧата*IDТемы": "Target chat ID or ChatID*TopicID",
+"ПолучитьСписокКалендарейРекурсивно": "GetCalendarsListRecursively",
+"Путь для сохранение файла на Диске": "Path for saving the file to disk",
+"Временная отметка или ID сообщения": "Timestamp or message ID",
+"Закрывает тему для новых сообщений": "Closes the thread for new messages",
+"ОбработатьДанные Telegram Mini App": "Process Telegram Mini App data",
+"Получает данные пользователя по ID": "Gets user data by ID",
+"Вайбер_ПолучитьОнлайнПользователей": "Viber_GetOnlineUsers",
+"Идентификатор обновляемого объекта": "Identifier of the object to update",
+"Сформировать ссылку получения кода": "Generate code retrieval link",
+"Телеграм_СкрытьПоказатьГлавнуюТему": "Telegram_HideShowMainTopic",
+"Вайбер_ОтправитьТекстовоеСообщение": "Viber_SendTextMessage",
+"Приостановить рекламное объявление": "Pause advertising post",
+"ЯДиск_ПолучитьСписокОпубликованных": "YDisk_GetPublishedList",
+"Изменяет свойства подборки товаров": "Edits the properties of a product selection",
+"Текст лицензии доступен по ссылке:": "License text available at:",
+"Получает список товаров сообщества": "Gets the community's product list",
+"Получить список рекламных категорий": "Get a list of advertising categories",
+"Идентификатор рабочего пространства": "Workspace identifier",
+"Получает информацию событиях канала": "Gets information about channel events",
+"Создает сокращенный URL из обычного": "Creates a shortened URL from a regular one",
+"Строка,Число,Массив из Строка,Число": "String,Number,Array of String,Number",
+"Изменяет свойства существующей базы": "Edits properties of an existing database",
+"Получает основную информацию о боте": "Gets basic information about the bot",
+"Получает информацию о текущем диске": "Gets information about the current disk",
+"Отправляет документ в чат или канал": "Sends a document to a chat or channel",
+"ПолучитьБуферДвоичныхДанныхИзСтроки": "GetBinaryDataBufferFromString",
+"Наименование создаваемого календаря": "Name of the created calendar",
+"Открывает ранее закрытое обсуждение": "Opens a previously closed discussion",
+"Получает массив календарей аккаунта": "Gets an array of account calendars",
+"Типы: audio, document, photo, video": "Types: audio, document, photo, video",
+"ID родительского блока или страницы": "Parent block or page ID",
+"ID темы. Главная, если не заполнено": "Thread ID. Main if not filled",
+"Отправляет картинку в чат или канал": "Sends an image to a chat or channel",
+"Получает информацию о внешнем файле": "Gets information about the external file",
+"Банит пользователя в выбранном чате": "Bans a user in the selected chat",
+"Строка,Соответствие Из КлючИЗначение": "String, Map From KeyAndValue",
+"Телеграм_ЗакрепитьОткрепитьСообщение": "Telegram_PinUnpinMessage",
+"Результат чтения JSON ответа сервера": "Result of reading the JSON response from the server",
+"Устанавливает цель (описание) канала": "Sets the channel purpose (description)",
+"Путь к опубликованному ранее объекту": "Path to the previously published object",
+"Перемещает объект по выбранному пути": "Moves an object to the selected path",
+"Отправляет сообщение в выбранный час": "Sends a message at a selected hour",
+"Отправляет аудиофайл в чат или канал": "Sends an audio file to a chat or channel",
+"Получает ссылку для скачивания файла": "Gets a download link for the file",
+"Отправляет опрос с вариантами ответа": "Sends a poll with answer options",
+"Получает информацию о странице по ID": "Gets information about the page by ID",
+"Возвращает список заказов сообщества": "Returns the community's order list",
+"Получить список пользователей канала": "Get channel user list",
+"Получить список ответов на сообщение": "Get list of message replies",
+"Путь к оригинальному файлу или папке": "Path to the original file or folder",
+"сериализованный JSON ответа от Viber": "serialized JSON response from Viber",
+"сериализованный JSON ответа от Slack": "Serialized JSON response from Slack",
+"Главный в группе, если есть в группе": "Main in the group, if exists in the group",
+"Получает общее число участников чата": "Gets the total number of chat participants",
+"Получить список отложенных сообщений": "Get list of delayed messages",
+"Телеграм_ОтправитьТекстовоеСообщение": "Telegram_SendTextMessage",
+"Удаляет существующее свойство товара": "Deletes the existing product property",
+"Получает статистику в разрезе постов": "Gets statistics in terms of posts",
+"Создает альбом для хранения картинок": "Creates an album to store images",
+"Удаляет комментарий к записи таблицы": "Deletes a comment for a table record",
+"Получает информацию о календаре по ID": "Gets calendar information by ID",
+"Получает статус загрузки файла по URL": "Gets the upload status of the file by URL",
+"сериализованный JSON ответа от Yandex": "serialized JSON response from Yandex",
+"СформироватьКлавиатуруИзМассиваКнопок": "CreateKeyboardFromArrayButton",
+"Телеграм_ПолучитьСписокАватаровФорума": "Telegram_GetForumAvatarsList",
+"Пример структуры\/соответствия свойств": "Example structure\/property map",
+"сериализованный JSON ответа от Notion": "Serialized JSON response from Notion",
+"Массив соответствий данных календарей": "Array of calendar data mappings",
+"Копирует лист из одной книги в другую": "Copies a sheet from one book to another",
+"Получает описание поля числового типа": "Gets the description of a numeric field",
+"Удаляет сообщение канала по timestamp": "Deletes a channel message by timestamp",
+"ID свойства, куда добавляется вариант": "Property ID where the variant is added",
+"ID версии (ревизии) для востановления": "ID of the version (revision) for restoration",
+"Перемещает событие в другой календарь": "Moves an event to another calendar",
+"сериализованный JSON ответа от Google": "serialized JSON response from Google",
+"Получает описание поля файлового типа": "Gets the description of a file field",
+"Изменяет существующее свойство товара": "Edits the existing product property",
+"Для отображения скидки\/изменения цены": "For displaying discount\/changing price",
+"ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект": "YDisk_UploadByUrlAndGetObject",
+"Сохраняет картинку в альбом сообщества": "Saves an image to the community album",
+"Получает список всех событий календаря": "Gets the list of all calendar events",
+"Получить список подборок по массиву ID": "Gets the list of selections by array of IDs",
+"Признак удаления отложенного сообщения": "Indicator of deleting a delayed message",
+"Формирует клавиатуру по массиву кнопок": "Forms a keyboard from an array of buttons",
+"Смещение в списке получаемых сообщений": "Offset in the list of received messages",
+"Создает комментарий к записи в таблице": "Creates a comment for a record in the table",
+"Получить статус асинхронного изменения": "Get asynchronous change status",
+"Получает список тегов выбранных файлов": "Gets the list of tags of the selected files",
+"сериализованный JSON ответа от Dropbox": "serialized JSON response from Dropbox",
+"Сохраняет публичный объект на ваш диск": "Saves the public object to your disk",
+"Получает список файлов бота или канала": "Gets a list of files of the bot or channel",
+"Некорректный статус управления форумом": "Incorrect forum management status",
+"Получает описание поля строкового типа": "Gets the description of a string field",
+"Получает список свойств товаров группы": "Gets the list of properties of group products",
+"Удалить полностью (Истина) или закрыть": "Delete completely (True) or close",
+"сериализованный JSON ответа от Twitter": "serialized JSON response from Twitter",
+"ПолучитьБуферДвоичныхДанныхИзHexСтроки": "GetBinaryDataBufferFromHexString",
+"сериализованный JSON ответа от Airtable": "serialized JSON response from Airtable",
+"ID существующей группы, если необходимо": "ID of the existing group, if needed",
+"Получает список опубликованных объектов": "Gets a list of published objects",
+"ОчиститьСписокЗакрепленныхСообщенийТемы": "ClearThreadPinnedMessagesList",
+"Дата отправки для отложенного сообщения": "Sending date for delayed message",
+"HTTPОтвет, Произвольный, ДвоичныеДанные": "HTTPResponse, Arbitrary, BinaryData",
+"Путь к оригинальному файлу или каталогу": "Path to the original file or directory",
+"сериализованный JSON ответа от Telegram": "Serialized JSON response from Telegram",
+"Изменяет состав существующего сообщения": "Edits the content of an existing message",
+"Перезаписывать файл при конфликте путей": "Overwrite file in case of path conflicts",
+"Получает информацию о файле или каталоге": "Gets information about a file or directory",
+"Создает комментарий к файлу или каталогу": "Creates a comment for a file or directory",
+"Удаляет текстовый тег файла или каталога": "Deletes the text tag of a file or directory",
+"Массив идентификаторов вида photo123_123": "Array of identifiers like photo123_123",
+"Удаляет календарь из списка пользователя": "Removes a calendar from the user's list",
+"Изменяет текст существующего комментария": "Changes the text of an existing comment",
+"Массив вариантов опроса, если необходимо": "Array of poll options, if necessary",
+"Получает список версий (ревизий) объекта": "Gets the list of versions (revisions) of the object",
+"Получает информацию о пользователе по ID": "Gets user information by ID",
+"Изменяет наименование существующей книги": "Changes the name of the existing book",
+"Загружает файл на диск по заданному пути": "Uploads a file to disk at the specified path",
+"Скачивает файл по указанному пути или ID": "Downloads a file by the specified path or ID",
+"Удаляет ранее созданный вариант свойства": "Deletes the previously created product property variant",
+"Добавляет список файлов к полям каталога": "Adds a list of files to the directory fields",
+"Добавляет указанных пользователей в канал": "Adds specified users to the channel",
+"Изменяет свойства существуещего календаря": "Edits properties of an existing calendar",
+"ПолучитьСсылкуСкачиванияПубличногоОбъекта": "GetDownloadLinkForPublicObject",
+"Получает список записей выбранной таблицы": "Gets the list of records of the selected table",
+"Сформировать клавиатуру по массиву кнопок": "Generate keyboard from array of buttons",
+"Удаляет указанного пользователя из канала": "Removes specified user from channel",
+"Получает список всех комментариев объекта": "Gets the list of all comments of the object",
+"Создает комментарий под выбранной записью": "Creates a comment under the selected record",
+"Публикует объект диска в публичный доступ": "Publishes the disk object for public access",
+"Изменяет наименование и|или описание базы": "Changes the name and\/or description of the base",
+"Массив двоичных данных или путей к файлам": "Array of binary data or file paths",
+"Новые или изменяемые свойства базы данных": "New or modified database properties",
+"Сформировать клавиатуру из массива кнопок": "Create a keyboard from an array of buttons",
+"См. СформироватьКлавиатуруПоМассивуКнопок": "See GenerateKeyboardFromArray",
+"действия будут выполняться от лица группы": "actions will be performed on behalf of the group",
+"Возвращает URL для авторизации в браузере": "Returns URL for browser authorization",
+"Создает пустой каталог по выбранному пути": "Creates an empty directory at the selected path",
+"|--------[через 2 ч.]-------------------|": "|--------[after 2 hrs.]-------------------|",
+"См. СформироватьКлавиатуруИзМассиваКнопок": "See CreateKeyboardFromArrayButton",
+"Получает описание поля с номером телефона": "Gets the description of a phone number field",
+"Признак исключения архивированных каналов": "Indicator of excluding archived channels",
+"Отменяет режим общего доступа для каталога": "Cancels the public access mode for the directory",
+"Получает постоянный UTL к сообщению канала": "Gets a permanent URL to the channel message",
+"Получить данные использования пространства": "Get space usage data",
+"ID поста, используемого в качетсве рекламы": "ID of the post used for advertising",
+"Отправляет файл (документ) в чат или канал": "Sends a file (document) to a chat or channel",
+"Добавляет новый товар в каталог сообщества": "Adds a new product to the community's catalog",
+"JSON клавиатуры. См.СформироватьКлавиатуру": "JSON keyboard. See FormKeyboard",
+"Разбанивает забаненного ранее пользователя": "Unbans a previously banned user",
+"Отправляет внейшний файл по списку каналов": "Sends an external file to a list of channels",
+"Очищает список событий основного календаря": "Clears the event list of the primary calendar",
+"Сформировать клавиатуру из массива кнопок:": "Create a keyboard from an array of buttons:",
+"Очистить список закрепленных сообщений темы": "Clear thread's pinned messages list",
+"Получает информацию о папке или файле по ID": "Gets information about a folder or file by ID",
+"Обновляет v2 токен при помощи refresh_token": "Updates the v2 token using the refresh_token",
+"Получает информацию о товарах по массиву ID": "Gets information about products by array of IDs",
+"Красный, желтый, синий или какой-то другой?": "Red, yellow, blue, or some other?",
+"Ошибка получения данных булево из параметра": "Error getting boolean data from parameter",
+"ID файла, к которому предоставляется доступ": "ID of the file to be accessed",
+"Удаляет ранее добавленный товар из подборки": "Removes a previously added product from the selection",
+"Получает описание поля с электронной почтой": "Gets the description of an email field",
+"Получает список отложенных сообщений канала": "Gets a list of delayed channel messages",
+"Создает рекламное объявление на основе поста": "Creates an advertising post based on a post",
+"Копирует файл или каталог по выбранному пути": "Copies a file or directory to the selected path",
+"Загружает файлы на сервер и возвращает их ID": "Uploads files to the server and returns their IDs",
+"Создает ссылку для вступления в закрытый чат": "Creates a link for joining a closed chat",
+"Переводит каталог в режим публичного доступа": "Sets the directory to public access mode",
+"Добавляет вариант для существующего свойства": "Adds a variant for an existing property",
+"Получает новый токен на основе рефреш токена": "Gets a new token based on the refresh token",
+"Показывает ранее скрытую главную тему форума": "Shows a previously hidden main forum thread",
+"Удалить объект без возможности востановления": "Delete object without the possibility of recovery",
+"Приостанавливает показ рекламного объявления": "Pauses the display of the advertising post",
+"Идентификатор новой подборки, если необходимо": "Identifier of the new selection, if needed",
+"Требования: платформа 1С версии 8.3.10 и выше": "Requirements: 1C platform version 8.3.10 and above",
+"Повторно открывает ранее закрытую тему форума": "Reopens a previously closed forum thread",
+"Получить ссылку скачивания публичного объекта": "Get download link for public object",
+"Возвращает структура клавиатуры для сообщений": "Returns a keyboard structure for messages",
+"Получает список пользователей рабочей области": "Gets a list of users in the workspace",
+"Раскомментировать, если выполняется OneScript": "Uncomment if OneScript is executed",
+"Число последних версий объекта для отображения": "Number of the latest versions of the object to display",
+"Формирует ссылку для авторизации через браузер": "Forms a link for authorization via the browser",
+"Отправляет контакт с именем и номером телефона": "Sends a contact with name and phone number",
+"Клавиатура под сообщением или на нижней панели": "Keyboard under the message or on the bottom panel",
+"Получает общую статистику сообщества за период": "Gets the overall community statistics for a period",
+"Отправляет текстовое сообщение в чат или канал": "Sends a text message to a chat or channel",
+"Список адресов почты добавляемых пользователей": "List of email addresses of users being added",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_VK.os": "Location OS: .\/OInt\/core\/Modules\/OPI_VK.os",
+"Ошибка получения двоичных данных из параметра:": "Error getting binary data from parameter:",
+"URL, по которому необходимо перейти в браузере": "URL to go to in the browser",
+"Массив имен для добавления новых листов в книгу": "Array of names to add new sheets to the book",
+"Получает список файлов с или без отбора по типу": "Gets a list of files with or without filtering by type",
+"Путь к объекту, тег которого необходимо удалить": "Path to the object whose tag needs to be deleted",
+"Получает список комментариев к записи в таблице": "Gets the list of comments for a record in the table",
+"Отправляет URL с предпросмотром в чат или канал": "Sends a URL with a preview to a chat or channel",
+"Получает список пользователей указанного канала": "Gets a list of users in the specified channel",
+"Получает календарь из списка пользователя по ID": "Gets a calendar from the user's list by ID",
+"Создает кампанию в выбранном рекламном кабинете": "Creates a campaign in the selected advertising account",
+"Получает токен по коду из авторизации в бразуере": "Gets token by code from browser authorization",
+"Получает данные строки таблицы по идентификатору": "Gets row data of the table by identifier",
+"Создает новый блок на основе существующего блока": "Creates a new block based on an existing block",
+"Добавляет сообщение в обсуждение от имени группы": "Adds a message to the discussion on behalf of the group",
+"Истина > сортировать по дате, Ложь > по алфавиту": "True > sort by date, False > alphabetically",
+"двоичные данные zip архива с содержимым каталога": "binary data of the zip archive with the contents of the directory",
+"Отменяет публикацию ранее опубликованного объекта": "Unpublishes a previously published object",
+"Путь к каталогу. Необязателен, если указан курсор": "Path to the directory. Optional if the cursor is specified",
+"Твиттер не смог обработать загруженное вами видео": "Twitter could not process the video you uploaded",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_Viber.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Viber.os",
+"Идентификатор или массив индентификаторов записей": "Identifier or array of record identifiers",
+"Источник: https:github.com\/vbondarevsky\/Connector": "Source: https:github.com\/vbondarevsky\/Connector",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_Slack.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Slack.os",
+"ID подборка для помещения товара, если необходимо": "Selection ID for placing the product, if needed",
+"Запрещает доступ к файлу для внешних пользователей": "Prohibits access to the file for external users",
+"ID асинхронной работы из ответа ЗагрузитьФайлПоURL": "ID of the asynchronous job from the UploadFileByURL response",
+"Добавляет новый текстовый тег к файлу или каталогу": "Adds a new text tag to a file or directory",
+"ID блока, после которого необходимо встаивть новый": "Block ID after which to insert the new one",
+"Создает новое свойство для использования в товарах": "Creates a new property for use in products",
+"Не удалось привести структуру значений к коллекции": "Failed to convert the structure of values to a collection",
+"Данные заполнения, где ключ это имя ячейки вида A1": "Fill data where the key is the cell name like A1",
+"Удаляет одну или массив записей по идентификаторам": "Deletes one or an array of records by identifiers",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_Notion.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Notion.os",
+"Путь к объекту, для которого необходимо создать тег": "Path to the object for which the tag needs to be created",
+"Смещение для получение объектов не из начала списка": "Offset for getting objects not from the beginning of the list",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_Dropbox.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Dropbox.os",
+"Изменяет свойства календаря из списка пользователей": "Edits the properties of a calendar from the user's list",
+"Коннектор: удобный HTTP-клиент для 1С:Предприятие 8": "Connector: convenient HTTP client for 1C:Enterprise 8",
+"Очищает список закрепленных сообщений в теме форума": "Clears the list of pinned messages in the forum thread",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_Twitter.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Twitter.os",
+"Здесь собрано определение данных для работы с VK API": "Here is a collection of data definitions for working with the VK API",
+"Обрабатывает данные TMA и опредеяет их достоверность": "Processes TMA data and determines its validity",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_Airtable.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Airtable.os",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_Telegram.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Telegram.os",
+"Основное измерение при заполнении диапазона массивом": "Main dimension when filling the array range",
+"Загружает файл на диск, забирая его по заданному URL": "Downloads a file to disk from the specified URL",
+"Истина > кнопки выводятся в столбик, Ложь > в строку": "True > buttons are displayed in a column, False > in a row",
+"Отправляет географические координаты в чат или канал": "Sends geographic coordinates to a chat or channel",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_YandexID.os": "Location OS: .\/OInt\/core\/Modules\/OPI_YandexID.os",
+"Скачивает zip архив с содержимым указанного каталога": "Downloads a zip archive with the contents of the specified directory",
+"Написать сообщение пользователю в диалоге сообщества": "Write a message to a user in the community's dialog",
+"Описание таблиц: Ключ > имя, Значение > массив полей": "Table description: Key > name, Value > array of fields",
+"Определяет доступ к файлу для стороннего пользователя": "Defines access to the file for an external user",
+"Генерирует ссылку авторизации для перехода в браузере": "Generates an authorization link for browser transition",
+"Отправляет контакт с номером телефона в чат или канал": "Sends a contact with a phone number to a chat or channel",
+"Возвращает список пользователей рабочего пространства": "Returns a list of workspace users",
+"Изменяет имя и|или описание существующего поля таблицы": "Changes the name and\/or description of an existing table field",
+"Перемещает объект по заданному пути и пути к оригиналу": "Moves the object to the specified path and path to the original",
+"Добавляет существующий календарь в список пользователя": "Adds an existing calendar to the user's list",
+"Группирует товары на основе одинаковых наборов свойств": "Groups products based on similar sets of properties",
+"ID аккаунта. Текущий аккаунт токена, если не заполнено": "Account ID. Current token account if not filled",
+"Перезаписывать если файл с таким именем уже существует": "Overwrite if a file with the same name already exists",
+"Получает список внешних файлов пользователя или канала": "Gets a list of external files of a user or channel",
+"Получает информацию об объекте диска по заданному пути": "Gets information about a disk object at the specified path",
+"Предоставляет стороннии пользователям доступ к каталогу": "Grants external users access to the directory",
+"Перезаписывать, если файл с таким именем уже существует": "Overwrite if a file with the same name already exists",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleDrive.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleDrive.os",
+"Идентификатор файла или каталога размещения комментария": "Identifier of the file or directory where the comment is located",
+"Изменяет значение варианта существующего свойства товара": "Edits the value of an existing product property variant",
+"Соответствие данных с результатом проверки в поле passed": "Map of data with the result of verification in the passed field",
+"Получает информацию об опубликованном объекте по его URL": "Gets information about the published object by its URL",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleSheets.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleSheets.os",
+"Получает статус асинхронной работы по изменению доступов": "Gets the status of the asynchronous access change job",
+"Отправляет сообщение, которое приходит в канал, но видно": "Sends a message that arrives in the channel but is visible",
+"Получает прямую ссылку для скачивания публичного объекта": "Gets a direct link to download the public object",
+"Добавляет дополнительные поля информации для медиафайлов": "Adds additional information fields for media files",
+"Создает дочернюю страницу над другой страницей-родителем": "Creates a child page above another parent page",
+"Удаляет публичный URL у файла. Требует токен пользователя": "Removes the public URL from the file. Requires user token",
+"Получает список рабочих областей, в которых подключен бот": "Gets a list of workspaces where the bot is connected",
+"Идентификатор объекта, для которого необходим комментарий": "Identifier of the object that needs a comment",
+"Создает новую тему в группе с включенным функционалом тем": "Creates a new thread in the group with theme functionality enabled",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleCalendar.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleCalendar.os",
+"Пересылает сообщение между чатами или в рамках одного чата": "Forwards a message between chats or within a chat",
+"Загружает фото на сервер для его дальнейшего использования": "Uploads photo to server for further use",
+"Запрещает редактирование файла для стороннего пользователя": "Prohibits file editing for the external user",
+"Создает копию объекта по заданному пути и пути к оригиналу": "Creates a copy of the object at the specified path and path to the original",
+"Расположение OS: .\/OInt\/tests\/Modules\/internal\/OPI_Тесты.os": "Location OS: .\/OInt\/tests\/Modules\/internal\/OPI_Tests.os",
+"Вы можете переопределять их, передавая в качестве параметра": "You can override them by passing them as a parameter",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleWorkspace.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleWorkspace.os",
+"Истина > служебные поля удаляются, остается только сам блок": "True > service fields are deleted, only the block itself remains",
+"Создает публичный URL для файла. Требует токен пользователя": "Creates a public URL for the file. Requires user token",
+"Код, полученный из авторизации См.ПолучитьСсылкуАвторизации": "Code obtained from authorization See GetAuthorizationLink",
+"механизм загрузки файлов и некоторые другие из старой версии": "file upload mechanism and some others from the old version",
+"Смещение для получение вложенных объектов не из начала списка": "Offset for getting nested objects not from the beginning of the list",
+"Указатель из предыдущего запроса, если строк результата > 100": "Pointer from the previous request, if the result rows > 100",
+"Иднтификатор следующей страницы данных из предыдущего запроса": "Next page identifier of data from the previous request",
+"Открывает новый диалог с одним или несколькими пользователями": "Opens a new dialog with one or more users",
+"Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено": "String, Arbitrary, HTTPResponse, BinaryData, Undefined",
+"Токен бота чата сообщества, котрый можно получить в настройках": "Community chat bot token, which can be obtained in the settings",
+"Загружает файл на облачный диск, получая его по указанному URL": "Uploads a file to the cloud drive by fetching it from the specified URL",
+"Игнорируем проверку целостности архива, просто читаем результат": "Ignore archive integrity check, just read the result",
+"Получает статус пользователя или нескольких пользователей по ID": "Gets the status of a user or several users by ID",
+"Удаляет URL обработчика событий бота для работы в режиме Webhook": "Deletes the bot event handler URL for webhook operation",
+"Получает массив сообщений, которые являются ответом на указанное": "Gets an array of messages that are replies to the specified",
+"Расположение OS: .\/OInt\/tools\/Modules\/OPI_ПреобразованиеТипов.os": "Location OS: .\/OInt\/tools\/Modules\/OPI_TypeConversion.os",
+"Набор или массив наборов пар Ключ : Значение > Поле : Показатель": "Set or array of sets of Key : Value pairs > Field : Indicator",
+"Клавиатура, если нужна, см. СформироватьКлавиатуруИзМассиваКнопок": "Keyboard, if needed, see CreateKeyboardFromArrayButton",
+"Расположение OS: .\/OInt\/tools\/Modules\/OPI_ПолучениеДанныхТестов.os": "Location OS: .\/OInt\/tools\/Modules\/OPI_TestDataRetrieval.os",
+"Идентификатор следующей страницы списка баз из перыдудщего запроса": "Next page identifier of the base list from the previous request",
+"Совпадающие поля будут перезаписаны с приоритетом параметра функции": "Matching fields will be overwritten with the parameter of the function",
+"Формирует блок с картинкой для добавления в массив блоков сообщения": "Generates a block with an image to add to the message block array",
+"ID пользователя. Для канала > администратора, для бота > получателя": "User ID. For channel > administrator, for bot > recipient",
+"Полеучает токен на основе кода со страницы ПолучитьСсылкуАвторизации": "Gets token based on the code from the GetAuthorizationLink page",
+"Курсор из предыдущего запроса для получения следующего набора файлов": "Cursor from the previous request to get the next set of files",
+"на redirect_uri после авторизации через браузер есть всего 30 секунд": "on redirect_uri after authorization via the browser is only 30 seconds",
+"Загружает видео в группу с возможностью его дальнейшего использования": "Uploads video to the group for further use",
+"access_token нужно будет забрать из параметра в строке адреса браузера": "access_token will need to be taken from the parameter in the browser address bar",
+"Двоичные данные или путь к файлу при указании параметра ПутьСохранения": "Binary data or file path when SavePath parameter is specified",
+"Устанавливает URL обработчика событий бота для работы в режиме Webhook": "Set webhook URL for bot event handling in webhook mode",
+"Получает список ID товарных категорий для указания при создании товара": "Gets a list of product category IDs to specify when creating a product",
+"Получает информацию о количестве использованного дискового пространства": "Gets information on the amount of used disk space",
+"Расположение OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Инструменты.os": "Location OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Tools.os",
+"Получает соответствие ID Emoji для установки в качестве иконок тем форума": "Gets the mapping of Emoji IDs for setting as forum theme icons",
+"Получает список id рекламных категорий для создания рекламного объявления": "Gets a list of advertising category IDs for creating an advertising post",
+"Метод для вставки в http-сервис, адрес которого указывается в redirect_uri": "Method for insertion into an http service, the address of which is specified in redirect_uri",
+"Расположение OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Криптография.os": "Location OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Cryptography.os",
+"URL вашего http-сервиса (или другого обработчика запросов) для авторизации": "URL of your http service (or other request handler) for authorization",
+"Отправляет местоположение по географической широте и долготе в чат или канал": "Sends location by geographic latitude and longitude to a chat or channel",
+"Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer": "From OAuth 2.0 Client ID and Client Secret settings page of Twitter Developer",
+"Размер файла. Если не заполнен > определяется автоматически скачиванием файла": "File size. If not filled in > determined automatically by downloading the file",
+"Получает код подтверждения и адрес страницы, на которой его необходимо ввести": "Gets the confirmation code and the address of the page where it needs to be entered",
+"Все права защищены. Эта программа и сопроводительные материалы предоставляются": "All rights reserved. This program and accompanying materials are provided",
+"1, а что-то на 2: вплоть до того что они убрали возможность постить твиты из v1": "1, and something on 2: up to the point that they removed the ability to post tweets from v1",
+"Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer": "From Consumer Keys -> Access Token and Secret settings page of Twitter Developer",
+"Создает одну или массив записей по описанию или массиву описаний значений полей": "Creates one or an array of records by description or an array of field value descriptions",
+"id приложения, которое необходимо создать в профиле на странице для разработчиков": "application ID that needs to be created in the profile on the developer page",
+"Вызывает метод получения токена, так как для получения токена из кода, приходящего": "Calls the token acquisition method, as for obtaining a token from the code received",
+"Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели": "Generates a simple JSON keyboard from an array of buttons for a message or bottom panel",
+"Преобразовывает код в токен после ввода кода при выполнении ПолучитьКодПодтверждения": "Converts the code to a token after entering the code when executing GetConfirmationCode",
+"ID пользователя из информации о канале не подойдет для отправки сообщений через бота": "The user ID from channel information is not suitable for sending messages through the bot",
+"|--> ОбновитьТокен() ->|access_token --> Используется в т-нии 2-х часов для запросов": "|--> RefreshToken() ->| access_token --> Used in the interval of 2 hours for requests",
+"Все страницы, которые будут созданы как дочерние, должны иметь свойства базы-родителя": "All pages created as children must have parent base properties",
+"Описание структур см. здесь https:pkware.cachefly.net\/webdocs\/casestudies\/APPNOTE.TXT": "Description of structures see here https:pkware.cachefly.net\/webdocs\/casestudies\/APPNOTE.TXT",
+"id группы с \"-\" в начале. Можно найти в настройках группы ВК или в ее URL, если не был": "group ID with \"-\" at the beginning. Can be found in the settings of the VK group or in its URL if not set",
+"набор разрешений для получаемого ключа. Может быть любой, но offline.access обязателен": "a set of permissions for the received key. Can be any, but offline.access is mandatory",
+"Получение ссылки для интерактивного получения токена (access_token), который необходим": "Getting a link for interactive token retrieval (access_token), which is necessary",
+"можно использовать http-сервис. Туда же будет приходить и информация о новых сообщениях": "you can use an HTTP service. Information about new messages will also be sent there",
+"Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer": "From Authentication Tokens -> Access Token and Secret settings page of Twitter Developer",
+"При следующем обновлении нужно использовать уже новый refresh_token, так что захардкодить": "For the next update, you need to use a new refresh_token, so hardcode",
+"Приходит вместе с access_token и используется для его обновления (время жизни access_token": "Comes together with access_token and is used to refresh it (access_token lifetime",
+"Получает токен по коду, полученному при авторизации по ссылке из ПолучитьСсылкуАвторизации": "Gets the token by the code obtained during authorization via the link from GetAuthorizationLink",
+"Отправляет набор файлов в чат или канал. Варианты типов медиа: audio, document, photo, video": "Sends a set of files to a chat or channel. Media types: audio, document, photo, video",
+"Получает список первых файлов каталога или продолжает получение следующих при указании курсора": "Gets the list of the first files in the directory or continues getting the next ones when the cursor is specified",
+"который будет возвращать 200 и подлинный SSL сертификат. Если есть сертификат и база опубликована": "which will return 200 and a genuine SSL certificate. If there is a certificate and the database is published",
+"что Twitter настаивает на использовании этой актуальной версии, они как-то умудрились не перенести": "that Twitter insists on using this latest version, they somehow managed not to transfer",
+"Тут можно получить ID пользователей канала. ID для бота необходимо получать из прилетов на Webhook": "Here you can get the channel's user IDs. Bot IDs need to be obtained from the Webhook arrivals",
+"но только через нее в твит можно добавить картинку. При этом способы авторизации и токены у них разные": "but only through it you can add a picture to the tweet. At the same time, their authentication methods and tokens are different",
+"Viber периодически стучит по адресу Webhook, так что если он будет неактивен, то все перестанет работать": "Viber periodically knocks on the Webhook address, so if it is inactive, everything will stop working",
+"Выполняет запрос \/getUpdates, возвращающий информацию о событиях бота. Используется при работе в polling режиме": "Executes a request \/getUpdates, returning information about bot events. Used in polling mode",
+"СоздатьСобытие": "",
+"НазваниеФайла2": "",
+"ОтправитьГифку": "",
+"ОтправитьАудио": "",
+"ОТПРАВИТЬАУДИО": "",
+"Отправка данных": "",
+"ОТПРАВИТЬССЫЛКУ": "",
+"ОтправитьСсылку": "",
+"ПОЛУЧИТЬСОБЫТИЕ": "",
+"ВводныйПараметр": "",
+"ПолучитьСобытие": "",
+"УДАЛИТЬПОДБОРКУ": "",
+"СОЗДАТЬСТРАНИЦУ": "",
+"Работа с базами": "",
+"ТекущееОписание": "",
+"СОКРАТИТЬССЫЛКУ": "",
+"ПеременнаяСреды": "",
+"СоздатьСтраницу": "",
+"Работа с тегами": "",
+"УДАЛИТЬКАРТИНКУ": "",
+"Работа с полями": "",
+"ТекстВыполнения": "",
+"ИзменитьСобытие": "",
+"ИЗМЕНИТЬСОБЫТИЕ": "",
+"ПолучитьТаблицу": "",
+"ИЗМЕНИТЬТАБЛИЦУ": "",
+"СОЗДАТЬКАЛЕНДАРЬ": "",
+"СОЗДАТЬТВИТОПРОС": "",
+"СОЗДАТЬТВИТВИДЕО": "",
+"УДАЛИТЬКАЛЕНДАРЬ": "",
+"СоздатьКалендарь": "",
+"МБ был записан в": "",
+"Работа с книгами": "",
+"УдалитьКалендарь": "",
+"Получение токена": "",
+"ОТПРАВИТЬЛОКАЦИЮ": "",
+"СОЗДАТЬТВИТГИФКИ": "",
+"ОтправитьЛокацию": "",
+"Выполняет запрос": "",
+"Работа с файлами": "",
+"ОТПРАВИТЬКОНТАКТ": "",
+"ПОЛУЧИТЬПОЛЕДАТЫ": "",
+"УдалитьСообщение": "",
+"ДобавитьПараметр": "",
+"Работа с группой": "",
+"Работа с данными": "",
+"Работа с блоками": "",
+"Работа с листами": "",
+"КопироватьОбъект": "",
+"ОбъектПроцессора": "",
+"УДАЛИТЬСООБЩЕНИЕ": "",
+"ПОЛУЧИТЬСТРАНИЦУ": "",
+"ПолучитьСтраницу": "",
+"КОПИРОВАТЬОБЪЕКТ": "",
+"НеобходимаяДлина": "",
+"СОЗДАТЬТЕМУФОРУМА": "",
+"ИЗМЕНИТЬСООБЩЕНИЕ": "",
+"Работа с каналами": "",
+"СКОПИРОВАТЬОБЪЕКТ": "",
+"ЗначениеПараметра": "",
+"УстановитьКоманду": "",
+"СообщитьРезультат": "",
+"КаталогИсходников": "",
+"СОЗДАТЬБАЗУДАННЫХ": "",
+"Работа с товарами": "",
+"ПОЛУЧИТЬПОЛЕПОЧТЫ": "",
+"АРХИВИРОВАТЬКАНАЛ": "",
+"Работа с записями": "",
+"УдалитьТемуФорума": "",
+"УДАЛИТЬТЕМУФОРУМА": "",
+"ЗАКРЫТЬТЕМУФОРУМА": "",
+"УстановитьWebhook": "",
+"УСТАНОВИТЬWEBHOOK": "",
+"ПереместитьОбъект": "",
+"ПЕРЕМЕСТИТЬОБЪЕКТ": "",
+"Работа с заказами": "",
+"ОТПРАВИТЬКАРТИНКУ": "",
+"НачальнаяФигурная": "",
+"ОтправитьДокумент": "",
+"ОТПРАВИТЬДОКУМЕНТ": "",
+"ОпубликоватьПапку": "",
+"ОПУБЛИКОВАТЬПАПКУ": "",
+"НАПИСАТЬСООБЩЕНИЕ": "",
+"АрхивироватьКанал": "",
+"ПоследняяФигурная": "",
+"НаписатьСообщение": "",
+"ОТКРЫТЬТЕМУФОРУМА": "",
+"Администрирование": "",
+"ОТКРЫТЬОБСУЖДЕНИЕ": "",
+"ЗАКРЫТЬОБСУЖДЕНИЕ": "",
+"ПОЛУЧИТЬСПИСОКБАЗ": "",
+"СОЗДАТЬОБСУЖДЕНИЕ": "",
+"ПЕРЕИМЕНОВАТЬКАНАЛ": "",
+"ПереименоватьКанал": "",
+"Команда CLI: tools": "",
+"НачальнаяТабуляция": "",
+"СОЗДАТЬКОММЕНТАРИЙ": "",
+"СоздатьКомментарий": "",
+"ИзменитьТемуФорума": "",
+"ПолучитьБазуДанных": "",
+"ПОЛУЧИТЬБАЗУДАННЫХ": "",
+"ОПУБЛИКОВАТЬОБЪЕКТ": "",
+"ОпубликоватьОбъект": "",
+"СкоприроватьОбъект": "",
+"Отправка сообщений": "",
+"Работа с таблицами": "",
+"ПОЛУЧИТЬПОЛЕССЫЛКИ": "",
+"ЗАКРЕПИТЬСООБЩЕНИЕ": "",
+"ПОЛУЧИТЬПОЛЕФЛАЖКА": "",
+"ПОЛУЧИТЬПОЛЕНОМЕРА": "",
+"ПОЛУЧИТЬТОВАРЫПОИД": "",
+"ПереслатьСообщение": "",
+"ОТПРАВИТЬСООБЩЕНИЕ": "",
+"ПОЛУЧИТЬСТАТИСТИКУ": "",
+"ЗакрепитьСообщение": "",
+"УдалитьКомментарий": "",
+"УДАЛИТЬКОММЕНТАРИЙ": "",
+"Работа с событиями": "",
+"ПереместитьСобытие": "",
+"ПЕРЕМЕСТИТЬСОБЫТИЕ": "",
+"ОткрепитьСообщение": "",
+"УДАЛИТЬВНЕШНИЙФАЙЛ": "",
+"ОТКРЕПИТЬСООБЩЕНИЕ": "",
+"ЗагрузитьФайлПоURL": "",
+"ЗАГРУЗИТЬФАЙЛПОURL": "",
+"ЗначенияПараметров": "",
+"ТекущаяВложенность": "",
+"Данные и настройка": "",
+"ПОЛУЧИТЬОБНОВЛЕНИЯ": "",
+"ПЕРЕСЛАТЬСООБЩЕНИЕ": "",
+"ИЗМЕНИТЬТЕМУФОРУМА": "",
+"Работа с диалогами": "",
+"СГРУППИРОВАТЬТОВАРЫ": "",
+"СОЗДАТЬТВИТКАРТИНКИ": "",
+"ПОЛУЧИТЬТАБЛИЦЫБАЗЫ": "",
+"Формирование блоков": "",
+"ПолучитьТаблицыБазы": "",
+"СоздатьКопиюОбъекта": "",
+"ИЗМЕНИТЬКОММЕНТАРИЙ": "",
+"ИзменитьКомментарий": "",
+"СОЗДАТЬКОПИЮОБЪЕКТА": "",
+"ПОЛУЧИТЬСПИСОКТЕГОВ": "",
+"ДОБАВИТЬВНЕШНИЙФАЙЛ": "",
+"ДобавитьВнешнийФайл": "",
+"json (необяз. по ум": "",
+"ПОЛУЧИТЬВНЕШНИЙФАЙЛ": "",
+"ПОЛУЧИТЬДАННЫЕФАЙЛА": "",
+"ПОЛУЧИТЬКОММЕНТАРИИ": "",
+"НАПИСАТЬВОБСУЖДЕНИЕ": "",
+"СписокПользователей": "",
+"НАПИСАТЬКОММЕНТАРИЙ": "",
+"ПОЛУЧИТЬТОКЕНПОКОДУ": "",
+"СПИСОКПОЛЬЗОВАТЕЛЕЙ": "",
+"ПолучитьКомментарий": "",
+"ПолучитьТокенПоКоду": "",
+"ПОЛУЧИТЬКОММЕНТАРИЙ": "",
+"СДЕЛАТЬФАЙЛПРИВАТНЫМ": "",
+"ПОЛУЧИТЬПОДБОРКИПОИД": "",
+"УстановитьТемуКанала": "",
+"ВЕРНУТЬДОЧЕРНИЕБЛОКИ": "",
+"ИнформацияОПрогрессе": "",
+"СДЕЛАТЬФАЙЛПУБЛИЧНЫМ": "",
+"СделатьФайлПубличным": "",
+"СделатьФайлПриватным": "",
+"УСТАНОВИТЬТЕМУКАНАЛА": "",
+"СоздатьСтраницуВБазу": "",
+"УстановитьЦельКанала": "",
+"УСТАНОВИТЬЦЕЛЬКАНАЛА": "",
+"ОТПРАВИТЬВНЕШНИЙФАЙЛ": "",
+"Работа с сообщениями": "",
+"ПОЛУЧИТЬСПИСОКФАЙЛОВ": "",
+"ОтправитьМедиагруппу": "",
+"СОЗДАТЬСОСТАВНОЙПОСТ": "",
+"ИЗМЕНИТЬСВОЙСТВАБАЗЫ": "",
+"СОЗДАТЬСТРАНИЦУВБАЗУ": "",
+"Работа со страницами": "",
+"ВернутьДочерниеБлоки": "",
+"Изменение публикации": "",
+"ВозвращаемоеЗначение": "",
+"СОЗДАТЬТЕКСТОВЫЙТВИТ": "",
+"СоздатьСоставнойПост": "",
+"ПОЛУЧИТЬПОЛЕТЕЛЕФОНА": "",
+"ОТПРАВИТЬМЕДИАГРУППУ": "",
+"ПОЛУЧИТЬПОЛЕВЛОЖЕНИЯ": "",
+"ПОЛУЧИТЬСПИСОККАНАЛОВ": "",
+"ЗАГРУЗИТЬФОТОНАСЕРВЕР": "",
+"Аккаунт и авторизация": "",
+"Программный интерфейс": "",
+"ПОЛУЧИТЬСПИСОКЗАПИСЕЙ": "",
+"УДАЛИТЬСВОЙСТВОТОВАРА": "",
+"ПОЛУЧИТЬСПИСОКТОВАРОВ": "",
+"ПОЛУЧИТЬСПИСОКЗАКАЗОВ": "",
+"ПолучитьИсториюКанала": "",
+"СОЗДАТЬСВОЙСТВОТОВАРА": "",
+"ПОЛУЧИТЬСПИСОКСОБЫТИЙ": "",
+"ПолучитьСписокСобытий": "",
+"ПОЛУЧИТЬПОЛЕСТРОКОВОЕ": "",
+"ПОЛУЧИТЬИСТОРИЮКАНАЛА": "",
+"ПОЛУЧИТЬЗНАЧЕНИЯЯЧЕЕК": "",
+"Работа с обсуждениями": "",
+"ПОЛУЧИТЬСПИСОКСВОЙСТВ": "",
+"УДАЛИТЬТОВАРИЗПОДБОРКИ": "",
+"ПОЛУЧИТЬИНФОРМАЦИЮБОТА": "",
+"ПолучитьИнформациюБота": "",
+"Работа с базами данных": "",
+"Работа с комментариями": "",
+"ЗАГРУЗИТЬВИДЕОНАСЕРВЕР": "",
+"ПОЛУЧИТЬСПИСОКПОДБОРОК": "",
+"Интерактивные действия": "",
+"ИЗМЕНИТЬСВОЙСТВОТОВАРА": "",
+"СформироватьКлавиатуру": "",
+"Настройки и информация": "",
+"СОЗДАТЬПОДБОРКУТОВАРОВ": "",
+"Работа с темами форума": "",
+"ПреобразоватьКодВТокен": "",
+"ДОБАВИТЬТОВАРВПОДБОРКУ": "",
+"ПРЕОБРАЗОВАТЬКОДВТОКЕН": "",
+"СФОРМИРОВАТЬКЛАВИАТУРУ": "",
+"Управление и настройки": "",
+"ОтменитьПубликациюПапки": "",
+"УстановитьЗначенияЯчеек": "",
+"ОбеспечитьПустойКаталог": "",
+"ПолучитьЧислоУчастников": "",
+"ПОЛУЧИТЬЧИСЛОУЧАСТНИКОВ": "",
+"ПОЛУЧИТЬПУБЛИЧНЫЙОБЪЕКТ": "",
+"Непредвиденная ошибка!:": "",
+"ОТПРАВИТЬМЕСТОПОЛОЖЕНИЕ": "",
+"Не найден входной файл!": "",
+"ПолучитьПубличныйОбъект": "",
+"УСТАНОВИТЬЗНАЧЕНИЯЯЧЕЕК": "",
+"ОТМЕНИТЬПУБЛИКАЦИЮФАЙЛА": "",
+"ИзменитьКалендарьСписка": "",
+"ИЗМЕНИТЬПОДБОРКУТОВАРОВ": "",
+"ОтменитьПубликациюФайла": "",
+"СкрытьГлавнуюТемуФорума": "",
+"ИЗМЕНИТЬКАЛЕНДАРЬСПИСКА": "",
+"ПОЛУЧИТЬИНФОРМАЦИЮОБОТЕ": "",
+"ПОЛУЧИТЬКАЛЕНДАРЬСПИСКА": "",
+"ПолучитьКалендарьСписка": "",
+"Изменяет наименование и": "",
+"ПОЛУЧИТЬСПИСОККАТАЛОГОВ": "",
+"ОТМЕНИТЬПУБЛИКАЦИЮПАПКИ": "",
+"ПолучитьИнформациюОБоте": "",
+"СКРЫТЬГЛАВНУЮТЕМУФОРУМА": "",
+"СФОРМИРОВАТЬБЛОККАРТИНКУ": "",
+"СОЗДАТЬССЫЛКУПРИГЛАШЕНИЕ": "",
+"УДАЛИТЬКАЛЕНДАРЬИЗСПИСКА": "",
+"УдалитьКалендарьИзСписка": "",
+"ИзменитьСвойстваСтраницы": "",
+"ИЗМЕНИТЬСВОЙСТВАСТРАНИЦЫ": "",
+"ПОЛУЧИТЬСПИСОККАЛЕНДАРЕЙ": "",
+"ПОЛУЧИТЬСТАТИСТИКУПОСТОВ": "",
+"СоздатьСсылкуПриглашение": "",
+"ДобавитьКалендарьВСписок": "",
+"ПолучитьСписокКалендарей": "",
+"СОЗДАТЬРЕКЛАМНУЮКАМПАНИЮ": "",
+"ДОБАВИТЬКАЛЕНДАРЬВСПИСОК": "",
+"ПОЛУЧИТЬКОДПОДТВЕРЖДЕНИЯ": "",
+"ПолучитьКодПодтверждения": "",
+"СОХРАНИТЬКАРТИНКУВАЛЬБОМ": "",
+"ПолучитьИнформациюОДиске": "",
+"ПОЛУЧИТЬИНФОРМАЦИЮОДИСКЕ": "",
+"ВосстановитьОбъектКВерсии": "",
+"ПоказатьГлавнуюТемуФорума": "",
+"ПОКАЗАТЬГЛАВНУЮТЕМУФОРУМА": "",
+"ПолучитьИнформациюОКанале": "",
+"ПОЛУЧИТЬИНФОРМАЦИЮОКАНАЛЕ": "",
+"Dropbox_ПереместитьОбъект": "",
+"ОчиститьОсновнойКалендарь": "",
+"ОЧИСТИТЬОСНОВНОЙКАЛЕНДАРЬ": "",
+"ОтменитьПубликациюОбъекта": "",
+"ИЗМЕНИТЬНАИМЕНОВАНИЕКНИГИ": "",
+"ИзменитьНаименованиеКниги": "",
+"ПОЛУЧИТЬССЫЛКУНАСООБЩЕНИЕ": "",
+"СоответствиеКомандМодулей": "",
+"ПОЛУЧИТЬССЫЛКУАВТОРИЗАЦИИ": "",
+"ОТМЕНИТЬПУБЛИКАЦИЮОБЪЕКТА": "",
+"ПолучитьСсылкуНаСообщение": "",
+"ВОССТАНОВИТЬОБЪЕКТКВЕРСИИ": "",
+"ПОЛУЧИТЬСПИСОКФАЙЛОВПАПКИ": "",
+"ВывестиСообщениеИсключения": "",
+"ПолучитьСписокКомментариев": "",
+"ДобавитьПользователяКФайлу": "",
+"ПолучитьЗначенияРекурсивно": "",
+"Работа с файлами и папками": "",
+"СоздатьРекламноеОбъявление": "",
+"ПолучитьДанныеПользователя": "",
+"ЧислоСтандартныхПараметров": "",
+"ПОЛУЧИТЬСПИСОККОММЕНТАРИЕВ": "",
+"ПОЛУЧИТЬДАННЫЕПОЛЬЗОВАТЕЛЯ": "",
+"СОЗДАТЬРЕКЛАМНОЕОБЪЯВЛЕНИЕ": "",
+"Работа с подборками товаров": "",
+"ПолучитьОнлайнПользователей": "",
+"ОТПРАВИТЬТЕКСТОВОЕСООБЩЕНИЕ": "",
+"ОтправитьТекстовоеСообщение": "",
+"ПОЛУЧИТЬОНЛАЙНПОЛЬЗОВАТЕЛЕЙ": "",
+"ПолучитьСтатусЗагрузкиПоURL": "",
+"ПОЛУЧИТЬСТАТУСЗАГРУЗКИПОURL": "",
+"ИЗМЕНИТЬМЕТАДАННЫЕКАЛЕНДАРЯ": "",
+"Работа с удаленными файлами": "",
+"ВЫГНАТЬПОЛЬЗОВАТЕЛЯИЗКАНАЛА": "",
+"ВыгнатьПользователяИзКанала": "",
+"ИзменитьМетаданныеКалендаря": "",
+"ОТПРАВИТЬЭФЕМЕРНОЕСООБЩЕНИЕ": "",
+"ДобавитьПользователейКПапке": "",
+"ПолучитьСсылкуДляСкачивания": "",
+"Разложить JSON на параметры": "",
+"ПолучитьИнформациюОбОбъекте": "",
+"ДОБАВИТЬПОЛЬЗОВАТЕЛЕЙКФАЙЛУ": "",
+"ПОЛУЧИТЬМЕТАДАННЫЕКАЛЕНДАРЯ": "",
+"ДобавитьПараметрФлагКоманды": "",
+"ДобавитьПользователейКФайлу": "",
+"ПОЛУЧИТЬСПИСОКВЕРСИЙОБЪЕКТА": "",
+"ДОБАВИТЬПОЛЬЗОВАТЕЛЕЙКПАПКЕ": "",
+"ОтправитьЭфемерноеСообщение": "",
+"ПОЛУЧИТЬСПИСОКПОЛЬЗОВАТЕЛЕЙ": "",
+"ПолучитьСписокВерсийОбъекта": "",
+"ПОЛУЧИТЬСПИСОКВНЕШНИХФАЙЛОВ": "",
+"ПОЛУЧИТЬССЫЛКУДЛЯСКАЧИВАНИЯ": "",
+"ПолучитьМетаданныеКалендаря": "",
+"Создать\/Удалить кооментарий": "",
+"ПОЛУЧИТЬИНФОРМАЦИЮОБОБЪЕКТЕ": "",
+"ПреобразоватьBase64ВДвоичные": "",
+"ПРЕОБРАЗОВАТЬBASE64ВДВОИЧНЫЕ": "",
+"СоздатьСсылкуПолученияТокена": "",
+"Получение данных и настройка": "",
+"ПОЛУЧИТЬИНФОРМАЦИЮОБАККАУНТЕ": "",
+"Работа со свойствами товаров": "",
+"Работа со списком календарей": "",
+"ИЗМЕНИТЬИМЯГЛАВНОЙТЕМЫФОРУМА": "",
+"ПолучитьСписокИконокАватаров": "",
+"Работа с рекламным кабинетом": "",
+"ИзменитьИмяГлавнойТемыФорума": "",
+"ПОЛУЧИТЬСПИСОКИКОНОКАВАТАРОВ": "",
+"УДАЛИТЬВАРИАНТСВОЙСТВАТОВАРА": "",
+"СОЗДАТЬССЫЛКУПОЛУЧЕНИЯТОКЕНА": "",
+"ПОЛУЧИТЬСПИСОКРАБОЧИХОБЛАСТЕЙ": "",
+"Работа с файлами и каталогами": "",
+"Настройки совместного доступа": "",
+"ДОБАВИТЬВАРИАНТСВОЙСТВАТОВАРА": "",
+"ПРИГЛАСИТЬПОЛЬЗОВАТЕЛЕЙВКАНАЛ": "",
+"ИЗМЕНИТЬВАРИАНТСВОЙСТВАТОВАРА": "",
+"ПригласитьПользователейВКанал": "",
+"Управление публичным доступом": "",
+"СОХРАНИТЬПУБЛИЧНЫЙОБЪЕКТНАДИСК": "",
+"МаксимальныйУровеньВложенности": "",
+"ПОЛУЧИТЬСПИСОККАТЕГОРИЙТОВАРОВ": "",
+"Работа с метаданными календарей": "",
+"Служебный программный интерфейс": "",
+"СФОРМИРОВАТЬССЫЛКУПОЛУЧЕНИЯКОДА": "",
+"Двоичные данные или пути к фото": "",
+"СформироватьСсылкуПолученияКода": "",
+"Функция вернула пустое значение": "",
+"ПРИОСТАНОВИТЬРЕКЛАМНОЕОБЪЯВЛЕНИЕ": "",
+"ПОЛУЧИТЬСПИСОКРЕКЛАМНЫХКАТЕГОРИЙ": "",
+"ПОЛУЧИТЬСПИСОКОТВЕТОВНАСООБЩЕНИЕ": "",
+"ПОЛУЧИТЬСПИСОКОТЛОЖЕННЫХСООБЩЕНИЙ": "",
+"ПОЛУЧИТЬСПИСОКПОЛЬЗОВАТЕЛЕЙКАНАЛА": "",
+"ДобавитьИменованныйПараметрКоманды": "",
+"ДобавитьПозиционныйПараметрКоманды": "",
+"ПОЛУЧИТЬСТАТУСАСИНХРОННОГОИЗМЕНЕНИЯ": "",
+"ПолучитьСтатусАсинхронногоИзменения": "",
+"под записью (необяз. по ум. - Пустое": "",
+"ПОЛУЧИТЬСПИСОКОПУБЛИКОВАННЫХОБЪЕКТОВ": "",
+"ПолучитьСписокОпубликованныхОбъектов": "",
+"СФОРМИРОВАТЬКЛАВИАТУРУПОМАССИВУКНОПОК": "",
+"СформироватьКлавиатуруПоМассивуКнопок": "",
+"См.СформироватьКлавиатуру (необяз. по": "",
+"СФОРМИРОВАТЬКЛАВИАТУРУИЗМАССИВАКНОПОК": "",
+"Главная, если не заполнено (необяз. по": "",
+"ПолучитьДанныеИспользованияПространства": "",
+"ОЧИСТИТЬСПИСОКЗАКРЕПЛЕННЫХСООБЩЕНИЙТЕМЫ": "",
+"ПОЛУЧИТЬДАННЫЕИСПОЛЬЗОВАНИЯПРОСТРАНСТВА": "",
+"ПолучитьСписокИконокАватаров (необяз. по": "",
+"ПОЛУЧИТЬССЫЛКУСКАЧИВАНИЯПУБЛИЧНОГООБЪЕКТА": "",
+"Кодировка, в которой записаны JSON данные": "",
+"Ошибка преобразовани данных параметра JSON": "",
+"конкретное значение при указании имени поля": "",
+"Похоже, что в ответе пришли двоичные данные!": "",
+"Необязателен, если указан курсор (необяз. по": "",
+"Преобразует файл с Base64 строкой в бинарный": "",
+"Не удалось получить информацию из json медиа!": "",
+"Созвращает список дочерних блоков блока-родителя": "",
+"Некорректный метод! Проверьте правильность ввода": "",
+"Выводит весь список, если не указано (необяз. по": "",
+"СформироватьКлавиатуруИзМассиваКнопок (необяз. по": "",
+"Преобразует файл с Base64 строкой в бинарный файл": "",
+"Некорректная команда! Проверьте правильность ввода": "",
+"Текущий аккаунт токена, если не заполнено (необяз. по": "",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_YandexDisk.os": "",
+"Имя поля для получения. Выводит весь список, если не указано": "",
+"вложенности разбора. На всю глубину по умолчанию (необяз. по": "",
+"Ограничение на ур. вложенности разбора. На всю глубину по умолчанию": "",
+"В следующий раз используйте опцию --out для указания пути их сохранения": "",
+"Полную документацию можно найти по адресу: (https:\/\/openintegrations.dev": "",
+"Если не заполнен > определяется автоматически скачиванием файла (необяз. по": "",
+"Показывает значения, которые можно получить из переданного JSON и возвращает": "",
+"Файл не был записан! Используйте флаг --debug для получения дополнительной информации": ""
+}
diff --git a/service/dictionaries/en.json b/service/dictionaries/en.json
new file mode 100644
index 0000000000..991849d6d7
--- /dev/null
+++ b/service/dictionaries/en.json
@@ -0,0 +1,2804 @@
+{
+"В": "In",
+"т": "t",
+"И": "And",
+"о": "o",
+"д": "d",
+"в": "in",
+"Н": "N",
+"и": "and",
+"к": "to",
+"с": "with",
+"не": "not",
+"то": "that",
+"из": "from",
+"МБ": "MB",
+"Из": "Of",
+"же": "same",
+"ВК": "VK",
+"он": "he",
+"ПС": "PS",
+"по": "by",
+"Не": "Not",
+"ДД": "DD",
+"ФС": "FS",
+"См": "See",
+"на": "to",
+"БД": "DB",
+"ИВФ": "AndVF",
+"Вес": "Weight",
+"Код": "Code",
+"так": "so",
+"для": "for",
+"что": "what",
+"без": "without",
+"тип": "type",
+"все": "all",
+"они": "they",
+"Чат": "Chat",
+"Тип": "Type",
+"Час": "Hour",
+"или": "or",
+"Это": "This",
+"это": "this",
+"ОТД": "OTD",
+"Лев": "Left",
+"Для": "For",
+"имя": "name",
+"Или": "Or",
+"Хэш": "Hash",
+"при": "at",
+"осн": "main",
+"Бан": "Ban",
+"БАН": "BAN",
+"Нет": "No",
+"НПП": "NPP",
+"доп": "add",
+"Вид": "View",
+"Имя": "Name",
+"Тег": "Tag",
+"поля": "fields",
+"Пути": "Paths",
+"Куда": "To",
+"Файл": "File",
+"Сайт": "Website",
+"типа": "type",
+"Тест": "Test",
+"быть": "be",
+"Цикл": "Loop",
+"Пока": "While",
+"цены": "price",
+"путь": "path",
+"фото": "photo",
+"Цвет": "Color",
+"Поля": "Fields",
+"базы": "databases",
+"файл": "file",
+"Цель": "Purpose",
+"Тема": "Topic",
+"Блок": "Block",
+"Лист": "Sheet",
+"Линк": "Link",
+"Путь": "Path",
+"Пост": "Post",
+"если": "if",
+"Туда": "There",
+"Слак": "Slack",
+"Ключ": "Key",
+"база": "database",
+"есть": "is",
+"Знач": "Value",
+"АирТ": "AirT",
+"вРег": "inReg",
+"Цена": "Price",
+"Ложь": "False",
+"Тело": "Body",
+"Если": "If",
+"Прав": "Right",
+"бота": "bot",
+"Поле": "Field",
+"База": "Base",
+"нРег": "nReg",
+"Лого": "Logo",
+"Фото": "Photo",
+"Вход": "Entry",
+"Дата": "Date",
+"Часть": "Part",
+"вроде": "like",
+"Медиа": "Media",
+"Форум": "Forum",
+"будет": "will",
+"Твиты": "Tweets",
+"имени": "name",
+"новый": "new",
+"ячеек": "cells",
+"типом": "type",
+"Аудио": "Audio",
+"типы:": "types:",
+"боте:": "bot:",
+"нечто": "something",
+"можно": "can",
+"Опции": "Options",
+"ТЗнач": "TValue",
+"Режим": "Mode",
+"Число": "Number",
+"МБайт": "MByte",
+"Метка": "Label",
+"места": "of the venue",
+"Вызов": "Call",
+"Серый": "Gray",
+"Белый": "White",
+"файлу": "file",
+"Дата0": "Date0",
+"Добро": "Welcome",
+"Дата1": "Date1",
+"Отбор": "Filter",
+"файла": "file",
+"Листы": "Sheets",
+"товар": "product",
+"Книга": "Book",
+"через": "through",
+"Почта": "Email",
+"Канал": "Channel",
+"Блоки": "Blocks",
+"Адрес": "Address",
+"новых": "new",
+"Видео": "Video",
+"Части": "Parts",
+"Гифка": "GIF",
+"Номер": "Number",
+"своей": "of its",
+"полей": "fields",
+"текст": "text",
+"Драйв": "Drive",
+"Лист2": "Sheet2",
+"Вывод": "Output",
+"Ответ": "Response",
+"Ноушн": "Notion",
+"ЯДиск": "YDisk",
+"Файлы": "Files",
+"Тогда": "Then",
+"Сдвиг": "Shift",
+"Новый": "New",
+"Шапка": "Header",
+"Файла": "File",
+"ЮТест": "UTest",
+"Равно": "Equal",
+"Синий": "Blue",
+"Опрос": "Poll",
+"Папка": "Folder",
+"Токен": "Token",
+"Лист1": "Sheet1",
+"ЕдИзм": "Unit",
+"Буфер": "Buffer",
+"Текст": "Text",
+"Копия": "Copy",
+"Метод": "Method",
+"путей": "paths",
+"Товар": "Product",
+"Сервер": "Server",
+"Работа": "Work",
+"Это A4": "ThisIsA4",
+"Запрос": "Request",
+"Модуль": "Module",
+"Это A3": "ThisIsA3",
+"Булево": "Boolean",
+"разные": "different",
+"Курсор": "Cursor",
+"Высота": "Height",
+"Это B3": "ThisIsB3",
+"Это B2": "ThisIsB2",
+"Откуда": "From",
+"Ширина": "Width",
+"данных": "data",
+"Это A2": "ThisIsA2",
+"таблиц": "tables",
+"Массив": "Array",
+"Это A1": "ThisIsA1",
+"Книга2": "Book2",
+"Сессия": "Session",
+"Это B1": "ThisIsB1",
+"Это B4": "ThisIsB4",
+"Прочие": "Others",
+"Запись": "Record",
+"метода": "method",
+"Важное": "Important",
+"опции:": "options:",
+"Привет": "Hello",
+"Текст2": "Text2",
+"Желтый": "Yellow",
+"Бирюза": "Turquoise",
+"адресу": "address",
+"стучит": "knocks",
+"Вайбер": "Viber",
+"Записи": "Records",
+"СокрЛП": "ShortLP",
+"ВСпейс": "VSpace",
+"сервис": "service",
+"канале": "channel",
+"СКонца": "FromEnd",
+"Отступ": "Indent",
+"Версия": "Version",
+"важное": "important",
+"типов:": "types:",
+"Список": "List",
+"Рефреш": "Refresh",
+"Статус": "Status",
+"Флажок": "Checkbox",
+"начала": "of start",
+"Коммит": "Commit",
+"только": "only",
+"ТипЗнч": "TypeValue",
+"IDЧата": "ChatID",
+"группе": "group",
+"Данные": "Data",
+"Широта": "Latitude",
+"Формат": "Format",
+"Вопрос": "Question",
+"КудаID": "ToID",
+"Строки": "Strings",
+"IDТемы": "ThreadID",
+"Кнопки": "Buttons",
+"Кнопка": "Button",
+"Ссылка": "Link",
+"Товары": "Products",
+"Альбом": "Album",
+"Должно": "Should",
+"ячейки": "cell",
+"данные": "Data",
+"Ответы": "Answers",
+"булево": "boolean",
+"Дважды": "Twice",
+"IDФото": "PhotoID",
+"ФотоID": "PhotoID",
+"Парсер": "Parser",
+"Диалог": "Dialog",
+"ИДФото": "PhotoID",
+"Строка": "String",
+"корень": "root",
+"тестов": "tests",
+"Истина": "True",
+"полей:": "fields:",
+"Пример": "Example",
+"режиме": "mode",
+"Размер": "Size",
+"Заказы": "Orders",
+"работе": "work",
+"Черный": "Black",
+"Разбан": "Unban",
+"товара": "product",
+"Первый": "First",
+"Ячейка": "Cell",
+"Раздел": "Section",
+"Иконка": "Icon",
+"группы": "groups",
+"Пароль": "Password",
+"Способ": "Method",
+"РАЗБАН": "UNBAN",
+"Синоним": "Synonym",
+"который": "which",
+"Ревизия": "Revision",
+"Таблицы": "Tables",
+"базовую": "basic",
+"обычным": "ordinary",
+"Секунды": "Seconds",
+"Ожидаем": "Awaiting",
+"выбором": "choice",
+"Разделы": "Sections",
+"ЮТТесты": "UTTests",
+"Твиттер": "Twitter",
+"сервере": "server",
+"СНачала": "FromStart",
+"ID темы": "Thread ID",
+"формате": "format",
+"IDПоста": "PostID",
+"ЧатТема": "ChatTopic",
+"запуска": "start",
+"Элемент": "Element",
+"Альбомы": "Albums",
+"Запросы": "Requests",
+"Обложка": "Cover",
+"Удалить": "Delete",
+"ИДБлока": "BlockID",
+"Вариант": "Option",
+"ТипПоля": "FieldType",
+"ДопФото": "AdditionalPhoto",
+"Телефон": "Phone",
+"Отметка": "Timestamp",
+"Скрытая": "Hidden",
+"Каталог": "Directory",
+"Таймаут": "Timeout",
+"граммах": "grams",
+"главным": "main",
+"Долгота": "Longitude",
+"Фамилия": "Last name",
+"Сделать": "Make",
+"свойств": "properties",
+"Счетчик": "Counter",
+"IDСтены": "WallID",
+"История": "Story",
+"ОпросID": "PollID",
+"Подпись": "Signature",
+"Реклама": "Advertisement",
+"Объекты": "Objects",
+"Артикул": "SKU",
+"IDВидео": "VideoID",
+"ИДПоста": "PostID",
+"Признак": "Indication",
+"Глубина": "Depth",
+"ВидеоДД": "VideoDD",
+"Консоль": "Console",
+"Вывести": "Output",
+"Коммент": "Comment",
+"Зеленый": "Green",
+"вызова:": "call:",
+"Каждого": "Each",
+"справку": "help",
+"Символы": "Symbols",
+"Отметки": "Tags",
+"методы:": "methods:",
+"Причина": "Reason",
+"Красный": "Red",
+"Обычный": "Regular",
+"Экспорт": "Export",
+"Функция": "Function",
+"Префикс": "Prefix",
+"изменен": "changed",
+"Активен": "Active",
+"Таблица": "Table",
+"Строка_": "String_",
+"IDПапки": "FolderID",
+"IDФайла": "FileID",
+"Булево_": "Boolean_",
+"Скрытый": "Hidden",
+"Событие": "Event",
+"В офисе": "InOffice",
+"удалено": "deleted",
+"объекта": "object",
+"Аккаунт": "Account",
+"Утилиты": "Utilities",
+"таблицы": "tables",
+"Функции": "Functions",
+"Область": "Region",
+"Справка": "Help",
+"Возврат": "Return",
+"массив:": "array:",
+"<Данные": " ID, Значение > Emoji": "Key > ID, Value > Emoji",
+"Создать товар со свойствами": "Create product with properties",
+"Отправить\/Удалить сообщение": "Send\/Delete message",
+"Путь к файлу для скачивания": "Path to the file for downloading",
+"Получает информацию о файле": "Gets information about the file",
+"СформироватьОписаниеТаблицы": "GenerateTableDescription",
+"Получить ссылку авторизации": "Get authorization link",
+"Создает историю из картинки": "Creates a story from an image",
+"ПолучитьСписокВнешнихФайлов": "GetExternalFileList",
+"URL для перехода в браузере": "URL for browser transition",
+"Отменить публикацию объекта": "Unpublish object",
+"Библиотека: Google Calendar": "Library: Google Calendar",
+"ID стены расположения поста": "ID of the wall where the post is located",
+"Массив каналов для отправки": "Array of channels for sending",
+"Очистить основной календарь": "Clear primary calendar",
+"Изменить наименование книги": "ChangeBookName",
+"разрешение на методы Sheets": "Sheets methods permission",
+"Добавить календарь в список": "Add calendar to list",
+"Удалить календарь из списка": "Remove calendar from list",
+"Массив соответствий событий": "Array of event mappings",
+"Удалить картинку из альбома": "Deletes an image from the album",
+"Отправить\/Удалить эфемерное": "Send\/Delete ephemeral",
+"Телеграм_ПолучитьОбновления": "Telegram_GetUpdates",
+"Код со страницы авторизации": "Code from the authorization page",
+"Получить информацию о диске": "Get disk information",
+"ДропБокс_ЗагрузитьФайлПоURL": "Dropbox_UploadFileByURL",
+"HEX цвет кнопок с # в начале": "HEX color of buttons with # at the beginning",
+"C:\\GDrive\\Мой диск\\data.json": "C:\\GDrive\\My Drive\\data.json",
+"Массив сформированных кнопок": "Array of formed buttons",
+"Восстановить объект к версии": "Restore object to version",
+"Создать рекламное объявление": "Create advertising post",
+"УдалитьВариантСвойстваТовара": "DeleteProductPropertyVariant",
+"ГВ_ПолучитьСсылкуАвторизации": "GV_GetAuthorizationLink",
+"Скрыть\/Показать главную тему": "Hide\/Show main topic",
+"JSON массива описаний блоков": "JSON array of block descriptions",
+"ПолучитьИнформациюОбАккаунте": "GetAccountInformation",
+"Получить список файлов папки": "Get list of folder files",
+"Получает описание поля с URL": "Gets the description of a URL field",
+"Библиотека: Google Workspace": "Library: Google Workspace",
+"Эти токены обновлять не надо": "These tokens do not need to be updated",
+"Массив соответствий подборок": "Array of selection matches",
+"Получить данные пользователя": "Get user data",
+"Показать главную тему форума": "Show main forum thread",
+"Обсуждаем: какой цвет лучше?": "Discussing: Which color is better?",
+"ПолучитьСтандартныеПараметры": "GetStandardParameters",
+"ГД_СоздатьУдалитьКомментарий": "GD_CreateDeleteComment",
+"Создает новую таблицу в базе": "Creates a new table in the base",
+"Получить информацию о канале": "Get channel information",
+"Получить ссылку на сообщение": "Get message link",
+"URL картинки иконки страницы": "URL of the page icon image",
+"Добавляет новый внешний файл": "Adds a new external file",
+"Получить список внеш. файлов": "Get external file list",
+"ПолучитьСоответствиеКартинки": "GetImageCorrespondence",
+"Загрузить\/Удалить внеш. файл": "Upload\/Delete external file",
+"Твиттер_СоздатьТекстовыйТвит": "Twitter_CreateTextTweet",
+"Отправить группу медиафайлов": "Send media group",
+"Слак_ПолучитьИнформациюОБоте": "Slack_GetBotInfo",
+"JSON файлов или путь к .json": "File JSON or path to .json",
+"Получить список комментариев": "Get list of comments",
+"Добавляет новый лист в книгу": "Adds a new sheet to the book",
+"Скрывает главную тему форума": "Hides the main forum thread",
+"Время ожидания новых событий": "Waiting time for new events",
+"Получает информацию о канале": "Gets information about the channel",
+"JSON описание товара или путь": "JSON description of the product or path",
+"разрешение на методы Calendar": "Calendar methods permission",
+"Удаляет ранее созданный товар": "Deletes a previously created product",
+"Слак_СоздатьАрхивироватьКанал": "Slack_CreateArchiveChannel",
+"Закрепить\/Открепить сообщение": "Pin\/Unpin message",
+"URL картинки обложки страницы": "URL of the page cover image",
+"Альтернативный текст картинки": "Alternate text of the image",
+"Получить отложенные сообщения": "Get scheduled messages",
+"Отправить текстовое сообщение": "Send text message",
+"Получить статистику по постам": "Get post statistics",
+"Получает список доступных баз": "Gets the list of available bases",
+"СоздатьЗаголовокАвторизацииV1": "CreateAuthorizationHeaderV1",
+"Телеграм_ОтправитьМедиагруппу": "Telegram_SendMediaGroup",
+"app_id из настроек приложения": "app_id from application settings",
+"Закрывает существующий диалог": "Closes an existing dialog",
+"Соответствие Из КлючИЗначение": "Key-Value Pair",
+"ID подборки, если нужен отбор": "Selection ID, if filtering is needed",
+"Массив соответствий каталогов": "Array of directory mappings",
+"Ошибка в данных описания поля": "Error in field description data",
+"ПолучитьТелоКакДвоичныеДанные": "GetBodyAsBinaryData",
+"Получить ссылку на скачивание": "Get download link",
+"ИзменитьВариантСвойстваТовара": "EditProductPropertyVariant",
+"Изменяет существующее событие": "Edits an existing event",
+"Соответствие из КлючИЗначение": "Map from KeyAndValue",
+"ПолучитьСписокРабочихОбластей": "GetWorkspaceList",
+"Получить данные о базе данных": "Get database information",
+"Удаляет внешний файл из Slack": "Deletes an external file from Slack",
+"Получить онлайн пользователей": "Get online users",
+"Отправить эфемерное сообщение": "Send ephemeral message",
+"ДобавитьВариантСвойстваТовара": "AddProductPropertyVariant",
+"ID блока или сам блок образец": "Block ID or block sample itself",
+"Получить список пользователей": "Get user list",
+"Создает твит с видеовложением": "Creates a tweet with a video attachment",
+"Отбор по ID каталога родителя": "Filter by parent directory ID",
+"Ноушн_ПолучитьИнформациюОБазе": "Notion_GetDatabaseInfo",
+"Твиттер_СоздатьТвитСКартинкой": "Twitter_CreateTweetWithImage",
+"Добавить пользователя к файлу": "Add user to file",
+"JSON описания или путь к .json": "JSON description or path to .json",
+"Слак_ОтправитьУдалитьЭфемерное": "Slack_SendDeleteEphemeral",
+"Получить информацию об объекте": "Get object information",
+"Изменяет ранее созданный товар": "Edits a previously created product",
+"Получить список версий объекта": "Get list of object versions",
+"Получить список опубликованных": "Get published list",
+"Создать\/Удалить составной пост": "Create\/Delete composite post",
+"Размер файла в случае отправке": "File size in case of sending",
+"ПолучитьСтрокуИзДвоичныхДанных": "GetStringFromBinaryData",
+"Добавить пользователей к папке": "Add users to folder",
+"Получить описание файла !NOCLI": "Get file description !NOCLI",
+"ЯДиск_ПолучитьИнформациюОДиске": "YDisk_GetDiskInfo",
+"Удаляет ранее созданный альбом": "Deletes a previously created album",
+"ID события календаря источника": "ID of the source calendar event",
+"Идентификатор удаляемого листа": "IdentifierOfSheetToDelete",
+"ПолучитьДвоичныеДанныеИзСтроки": "GetBinaryDataFromString",
+"Идентификатор записи в таблице": "Record identifier in the table",
+"Слак_ОтправитьУдалитьСообщение": "Slack_SendDeleteMessage",
+"Выгнать пользователя из канала": "Kick user from channel",
+"УправлениеСостояниемТемыФорума": "ManageForumThreadState",
+"СохранитьПубличныйОбъектНаДиск": "SavePublicObjectToDisk",
+"Нельзя замешивать разные типы!": "Different types cannot be mixed!",
+"ДропБокс_ПолучитьОбновитьТокен": "Dropbox_GetUpdateToken",
+"Получить информацию о странице": "Get page info",
+"ПолучитьСписокКатегорийТоваров": "GetProductCategoryList",
+"Структура, Массив из Структура": "Structure, Array of Structures",
+"Путь или набору путей к файлам": "Path or set of paths to the files",
+"Получить список внешних файлов": "Get list of external files",
+"Целевой путь создания каталога": "Target path for creating the directory",
+"Получить ссылку для скачивания": "Get download link",
+"Ноушн_ИзменитьСвойстваСтраницы": "Notion_EditPageProperties",
+"Удаляет файл или каталог по ID": "Deletes file or directory by ID",
+"Создать ссылку получения токена": "Create token retrieval link",
+"Удалить вариант свойства товара": "Delete product property variant",
+"Создает твит с вложением-гифкой": "Creates a tweet with a gif attachment",
+"Двоичные данные или путь к фото": "Binary data or path to photo",
+"Путь назначение для перемещения": "Destination path for moving",
+"Получает информацию об аккаунте": "Gets account information",
+"Не удалось записать файл лога!:": "Failed to write log file!:",
+"Телеграм_ИзменитьИмяГлавнойТемы": "Telegram_ChangeMainTopicName",
+"Получить список иконок-аватаров": "Get avatar icon list",
+"Обновляет двоичные данные файла": "Updates file binary data",
+"Получает список каталогов диска": "Gets the list of drive directories",
+"ЯДиск_ДействияПубличныхОбъектов": "YDisk_PublicObjectActions",
+"Действия с публичными объектами": "Actions with public objects",
+"Получить статус загрузки по URL": "Get upload status by URL",
+"Получает значения ячеек таблицы": "Gets cell values of the table",
+"Получить список аватаров форума": "Get forum avatars list",
+"Создает пустую подборку товаров": "Creates an empty product selection",
+"Загружает файл на сервера Slack": "Uploads a file to Slack servers",
+"только конкретному пользователю": "only to a specific user",
+"ПолучитьСписокСобытийРекурсивно": "GetEventsListRecursively",
+"Удаляет текущего бота из канала": "Removes the current bot from the channel",
+"ID чата оригинального сообщения": "Chat ID of the original message",
+"Массив из Строка,ДвоичныеДанные": "Array from String, BinaryData",
+"Copyright (c) 2019, ООО 1С-Софт": "Copyright (c) 2019, LLC 1C-Soft",
+"Отправка в канал или в чат бота": "Sending to channel or bot chat",
+"См.ПолучитьСтандартныеПараметры": "See GetStandardParameters",
+"Целевой путь для нового объекта": "Target path for the new object",
+"Получить ссылку для авторизации": "Get authorization link",
+"Получить информацию об аккаунте": "Get account information",
+"Добавляет текущего бота в канал": "Adds the current bot to the channel",
+"Создает пустой каталог на диске": "Creates an empty directory on the drive",
+"Загружает файл на облачный диск": "Uploads a file to the cloud drive",
+"Телеграм_ПолучитьИнформациюБота": "Telegram_GetBotInfo",
+"Слак_ПолучитьОтложенныеСообщения": "Slack_GetScheduledMessages",
+"ЯДиск_ПолучитьСсылкуНаСкачивание": "YDisk_GetDownloadLink",
+"ПриостановитьРекламноеОбъявление": "PauseAdvertisingAd",
+"См. ПолучитьСписокИконокАватаров": "See GetAvatarIconList",
+"Ноушн_ПолучитьДанныеПользователя": "Notion_GetUserData",
+"Слак_ПолучитьСписокПользователей": "Slack_GetUserList",
+"Создает страницу в базе-родителе": "Creates a page in the parent database",
+"Получает список подборок товаров": "Gets the list of product selections",
+"Закрывает или удаляет обсуждение": "Close or delete discussion",
+"Удаляет объект по заданному пути": "Deletes an object at the specified path",
+"Количество возвращаемых объектов": "Number of returned objects",
+"Получить описание события !NOCLI": "Get event description !NOCLI",
+"Идентификатор файла или каталога": "Identifier of the file or folder",
+"ВыполнитьЗапросСДвоичнымиДанными": "ExecuteRequestWithBinaryData",
+"Отправляет видео в чат или канал": "Sends a video to a chat or channel",
+"Массив ячеек вида А1 для очистки": "Array of cells like A1 to be cleared",
+"Получить список рабочих областей": "Get workspace list",
+"Путь к удаляемой папке или файлу": "Path to the folder or file to be deleted",
+"Удаляет объект с облачного диска": "Deletes an object from the cloud drive",
+"ПолучитьСписокОтветовНаСообщение": "GetMessageReplyList",
+"Добавить вариант свойства товара": "Add product property variant",
+"Вайбер_ПолучитьИнформациюОКанале": "Viber_GetChannelInfo",
+"Получает описание поля типа дата": "Gets the description of a date field",
+"См.ДобавитьВариантСвойстваТовара": "See AddPropertyVariant",
+"Телеграм_ПолучитьЧислоУчастников": "Telegram_GetMemberCount",
+"Изменяет имя главной темы форума": "Edits the name of the main forum thread",
+"ПолучитьСписокОбъектовРекурсивно": "GetObjectsListRecursively",
+"Телеграм_ОтправитьМестоположение": "Telegram_SendLocation",
+"Обновляет токен по Refresh token": "Updates token by Refresh token",
+"Отправляет гифку в чат или канал": "Sends a GIF to a chat or channel",
+"JSON клавиатуры или путь к .json": "Keyboard JSON or path to .json",
+"Изменить вариант свойства товара": "Edit product property variant",
+"ПолучитьСписокРекламныхКатегорий": "GetAdvertisingCategoryList",
+"Пригласить пользователей в канал": "Invite users to channel",
+"Получить описание товара. !NOCLI": "Get product description. !NOCLI",
+"Изменить имя главной темы форума": "Edit main forum thread name",
+"Ошибка в данных коллекции таблиц": "Error in table collection data",
+"Идентификатор изменяемого товара": "Identifier of the product being edited",
+"Отправка в канал или чат с ботом": "Sending to channel or bot chat",
+"Загрузить массив вложений !NOCLI": "Upload attachments array !NOCLI",
+"Массив из Строка, ДвоичныеДанные": "Array from String, BinaryData",
+"ПолучитьСписокОтложенныхСообщений": "GetDelayedMessageList",
+"Создает опрос с вариантами ответа": "Creates a poll with answer options",
+"Ноушн_ПолучитьИнформациюОСтранице": "Notion_GetPageInfo",
+"Получает информацию о книге по ID": "Gets information about the book by ID",
+"ВыполнитьЗапросМультипартРелэйтед": "ExecuteMultipartRelatedRequest",
+"Получить список категорий товаров": "Get a list of product categories",
+"сериализованный JSON ответа от VK": "Serialized JSON response from VK",
+"Закрепляет сообщение в шапке чата": "Pins a message in the chat header",
+"JSON авторизации или путь к .json": "Authorization JSON or path to .json",
+"Путь помещения загруженного файла": "Path to place the downloaded file",
+"v1.1. Поэтому что-то нужно делать": "v1.1. Therefore, something needs to be done",
+"Запрос, приходящий на http-сервис": "Request coming to the http service",
+"Открепляет сообщение в шапке чата": "Unpins a message in the chat header",
+"Ссылка на страницу сайта магазина": "Link to the store's website page",
+"Вайбер_ПолучитьДанныеПользователя": "Viber_GetUserData",
+"Предпочтительное хранение токенов": "Preferred token storage",
+"ПолучитьСписокПользователейКанала": "GetChannelUserList",
+"Скачивает файл по указанному пути": "Downloads a file at the specified path",
+"Телеграм_СоздатьУдалитьТемуФорума": "Telegram_CreateDeleteForumTopic",
+"Телеграм_СоздатьСсылкуПриглашение": "Telegram_CreateInvitationLink",
+"Твиттер_ПолучитьСсылкуАвторизации": "Twitter_GetAuthorizationLink",
+"Получает список доступных каналов": "Gets a list of available channels",
+"Соответствие изменяемых параметров": "Matching of editable parameters",
+"Скачивает файл с серверов Telegram": "Download file from Telegram servers",
+"См. ПолучитьСписокКатегорийТоваров": "See GetProductCategoryList",
+"Расширение файла в случае отправки": "File extension in case of sending",
+"Массив данных статистики по постам": "Array of post statistics data",
+"что обсуловлено наличием сразу 2-х": "which is due to the presence of two at once",
+"Устанавливает значения ячеек листа": "Sets sheet cell values",
+"Создает твит с картинкой вложением": "Creates a tweet with an image attachment",
+"Идентификатор объекта для удаления": "Identifier of the object to delete",
+"querry из Telegram.WebApp.initData": "Query from Telegram.WebApp.initData",
+"Сохранить публичный объект на диск": "Save public object to disk",
+"Получает описание поля типа булево": "Gets the description of a boolean field",
+"ID целевого чата или IDЧата*IDТемы": "Target chat ID or ChatID*TopicID",
+"ПолучитьСписокКалендарейРекурсивно": "GetCalendarsListRecursively",
+"Путь для сохранение файла на Диске": "Path for saving the file to disk",
+"Временная отметка или ID сообщения": "Timestamp or message ID",
+"Закрывает тему для новых сообщений": "Closes the thread for new messages",
+"ОбработатьДанные Telegram Mini App": "Process Telegram Mini App data",
+"Получает данные пользователя по ID": "Gets user data by ID",
+"Вайбер_ПолучитьОнлайнПользователей": "Viber_GetOnlineUsers",
+"Идентификатор обновляемого объекта": "Identifier of the object to update",
+"Сформировать ссылку получения кода": "Generate code retrieval link",
+"Телеграм_СкрытьПоказатьГлавнуюТему": "Telegram_HideShowMainTopic",
+"Вайбер_ОтправитьТекстовоеСообщение": "Viber_SendTextMessage",
+"Приостановить рекламное объявление": "Pause advertising post",
+"ЯДиск_ПолучитьСписокОпубликованных": "YDisk_GetPublishedList",
+"Изменяет свойства подборки товаров": "Edits the properties of a product selection",
+"Текст лицензии доступен по ссылке:": "License text available at:",
+"Получает список товаров сообщества": "Gets the community's product list",
+"Получить список рекламных категорий": "Get a list of advertising categories",
+"Идентификатор рабочего пространства": "Workspace identifier",
+"Получает информацию событиях канала": "Gets information about channel events",
+"Создает сокращенный URL из обычного": "Creates a shortened URL from a regular one",
+"Строка,Число,Массив из Строка,Число": "String,Number,Array of String,Number",
+"Изменяет свойства существующей базы": "Edits properties of an existing database",
+"Получает основную информацию о боте": "Gets basic information about the bot",
+"Получает информацию о текущем диске": "Gets information about the current disk",
+"Отправляет документ в чат или канал": "Sends a document to a chat or channel",
+"ПолучитьБуферДвоичныхДанныхИзСтроки": "GetBinaryDataBufferFromString",
+"Наименование создаваемого календаря": "Name of the created calendar",
+"Открывает ранее закрытое обсуждение": "Opens a previously closed discussion",
+"Получает массив календарей аккаунта": "Gets an array of account calendars",
+"Типы: audio, document, photo, video": "Types: audio, document, photo, video",
+"ID родительского блока или страницы": "Parent block or page ID",
+"ID темы. Главная, если не заполнено": "Thread ID. Main if not filled",
+"Отправляет картинку в чат или канал": "Sends an image to a chat or channel",
+"Получает информацию о внешнем файле": "Gets information about the external file",
+"Банит пользователя в выбранном чате": "Bans a user in the selected chat",
+"Строка,Соответствие Из КлючИЗначение": "String, Map From KeyAndValue",
+"Телеграм_ЗакрепитьОткрепитьСообщение": "Telegram_PinUnpinMessage",
+"Результат чтения JSON ответа сервера": "Result of reading the JSON response from the server",
+"Устанавливает цель (описание) канала": "Sets the channel purpose (description)",
+"Путь к опубликованному ранее объекту": "Path to the previously published object",
+"Перемещает объект по выбранному пути": "Moves an object to the selected path",
+"Отправляет сообщение в выбранный час": "Sends a message at a selected hour",
+"Отправляет аудиофайл в чат или канал": "Sends an audio file to a chat or channel",
+"Получает ссылку для скачивания файла": "Gets a download link for the file",
+"Отправляет опрос с вариантами ответа": "Sends a poll with answer options",
+"Получает информацию о странице по ID": "Gets information about the page by ID",
+"Возвращает список заказов сообщества": "Returns the community's order list",
+"Получить список пользователей канала": "Get channel user list",
+"Получить список ответов на сообщение": "Get list of message replies",
+"Путь к оригинальному файлу или папке": "Path to the original file or folder",
+"сериализованный JSON ответа от Viber": "serialized JSON response from Viber",
+"сериализованный JSON ответа от Slack": "Serialized JSON response from Slack",
+"Главный в группе, если есть в группе": "Main in the group, if exists in the group",
+"Получает общее число участников чата": "Gets the total number of chat participants",
+"Получить список отложенных сообщений": "Get list of delayed messages",
+"Телеграм_ОтправитьТекстовоеСообщение": "Telegram_SendTextMessage",
+"Удаляет существующее свойство товара": "Deletes the existing product property",
+"Получает статистику в разрезе постов": "Gets statistics in terms of posts",
+"Создает альбом для хранения картинок": "Creates an album to store images",
+"Удаляет комментарий к записи таблицы": "Deletes a comment for a table record",
+"Получает информацию о календаре по ID": "Gets calendar information by ID",
+"Получает статус загрузки файла по URL": "Gets the upload status of the file by URL",
+"сериализованный JSON ответа от Yandex": "serialized JSON response from Yandex",
+"СформироватьКлавиатуруИзМассиваКнопок": "CreateKeyboardFromArrayButton",
+"Телеграм_ПолучитьСписокАватаровФорума": "Telegram_GetForumAvatarsList",
+"Пример структуры\/соответствия свойств": "Example structure\/property map",
+"сериализованный JSON ответа от Notion": "Serialized JSON response from Notion",
+"Массив соответствий данных календарей": "Array of calendar data mappings",
+"Копирует лист из одной книги в другую": "Copies a sheet from one book to another",
+"Получает описание поля числового типа": "Gets the description of a numeric field",
+"Удаляет сообщение канала по timestamp": "Deletes a channel message by timestamp",
+"ID свойства, куда добавляется вариант": "Property ID where the variant is added",
+"ID версии (ревизии) для востановления": "ID of the version (revision) for restoration",
+"Перемещает событие в другой календарь": "Moves an event to another calendar",
+"сериализованный JSON ответа от Google": "serialized JSON response from Google",
+"Получает описание поля файлового типа": "Gets the description of a file field",
+"Изменяет существующее свойство товара": "Edits the existing product property",
+"Для отображения скидки\/изменения цены": "For displaying discount\/changing price",
+"ЯДиск_ЗагрузитьПоАдресуПолучитьОбъект": "YDisk_UploadByUrlAndGetObject",
+"Сохраняет картинку в альбом сообщества": "Saves an image to the community album",
+"Получает список всех событий календаря": "Gets the list of all calendar events",
+"Получить список подборок по массиву ID": "Gets the list of selections by array of IDs",
+"Признак удаления отложенного сообщения": "Indicator of deleting a delayed message",
+"Формирует клавиатуру по массиву кнопок": "Forms a keyboard from an array of buttons",
+"Смещение в списке получаемых сообщений": "Offset in the list of received messages",
+"Создает комментарий к записи в таблице": "Creates a comment for a record in the table",
+"Получить статус асинхронного изменения": "Get asynchronous change status",
+"Получает список тегов выбранных файлов": "Gets the list of tags of the selected files",
+"сериализованный JSON ответа от Dropbox": "serialized JSON response from Dropbox",
+"Сохраняет публичный объект на ваш диск": "Saves the public object to your disk",
+"Получает список файлов бота или канала": "Gets a list of files of the bot or channel",
+"Некорректный статус управления форумом": "Incorrect forum management status",
+"Получает описание поля строкового типа": "Gets the description of a string field",
+"Получает список свойств товаров группы": "Gets the list of properties of group products",
+"Удалить полностью (Истина) или закрыть": "Delete completely (True) or close",
+"сериализованный JSON ответа от Twitter": "serialized JSON response from Twitter",
+"ПолучитьБуферДвоичныхДанныхИзHexСтроки": "GetBinaryDataBufferFromHexString",
+"сериализованный JSON ответа от Airtable": "serialized JSON response from Airtable",
+"ID существующей группы, если необходимо": "ID of the existing group, if needed",
+"Получает список опубликованных объектов": "Gets a list of published objects",
+"ОчиститьСписокЗакрепленныхСообщенийТемы": "ClearThreadPinnedMessagesList",
+"Дата отправки для отложенного сообщения": "Sending date for delayed message",
+"HTTPОтвет, Произвольный, ДвоичныеДанные": "HTTPResponse, Arbitrary, BinaryData",
+"Путь к оригинальному файлу или каталогу": "Path to the original file or directory",
+"сериализованный JSON ответа от Telegram": "Serialized JSON response from Telegram",
+"Изменяет состав существующего сообщения": "Edits the content of an existing message",
+"Перезаписывать файл при конфликте путей": "Overwrite file in case of path conflicts",
+"Получает информацию о файле или каталоге": "Gets information about a file or directory",
+"Создает комментарий к файлу или каталогу": "Creates a comment for a file or directory",
+"Удаляет текстовый тег файла или каталога": "Deletes the text tag of a file or directory",
+"Массив идентификаторов вида photo123_123": "Array of identifiers like photo123_123",
+"Удаляет календарь из списка пользователя": "Removes a calendar from the user's list",
+"Изменяет текст существующего комментария": "Changes the text of an existing comment",
+"Массив вариантов опроса, если необходимо": "Array of poll options, if necessary",
+"Получает список версий (ревизий) объекта": "Gets the list of versions (revisions) of the object",
+"Получает информацию о пользователе по ID": "Gets user information by ID",
+"Изменяет наименование существующей книги": "Changes the name of the existing book",
+"Загружает файл на диск по заданному пути": "Uploads a file to disk at the specified path",
+"Скачивает файл по указанному пути или ID": "Downloads a file by the specified path or ID",
+"Удаляет ранее созданный вариант свойства": "Deletes the previously created product property variant",
+"Добавляет список файлов к полям каталога": "Adds a list of files to the directory fields",
+"Добавляет указанных пользователей в канал": "Adds specified users to the channel",
+"Изменяет свойства существуещего календаря": "Edits properties of an existing calendar",
+"ПолучитьСсылкуСкачиванияПубличногоОбъекта": "GetDownloadLinkForPublicObject",
+"Получает список записей выбранной таблицы": "Gets the list of records of the selected table",
+"Сформировать клавиатуру по массиву кнопок": "Generate keyboard from array of buttons",
+"Удаляет указанного пользователя из канала": "Removes specified user from channel",
+"Получает список всех комментариев объекта": "Gets the list of all comments of the object",
+"Создает комментарий под выбранной записью": "Creates a comment under the selected record",
+"Публикует объект диска в публичный доступ": "Publishes the disk object for public access",
+"Изменяет наименование и|или описание базы": "Changes the name and\/or description of the base",
+"Массив двоичных данных или путей к файлам": "Array of binary data or file paths",
+"Новые или изменяемые свойства базы данных": "New or modified database properties",
+"Сформировать клавиатуру из массива кнопок": "Create a keyboard from an array of buttons",
+"См. СформироватьКлавиатуруПоМассивуКнопок": "See GenerateKeyboardFromArray",
+"действия будут выполняться от лица группы": "actions will be performed on behalf of the group",
+"Возвращает URL для авторизации в браузере": "Returns URL for browser authorization",
+"Создает пустой каталог по выбранному пути": "Creates an empty directory at the selected path",
+"|--------[через 2 ч.]-------------------|": "|--------[after 2 hrs.]-------------------|",
+"См. СформироватьКлавиатуруИзМассиваКнопок": "See CreateKeyboardFromArrayButton",
+"Получает описание поля с номером телефона": "Gets the description of a phone number field",
+"Признак исключения архивированных каналов": "Indicator of excluding archived channels",
+"Отменяет режим общего доступа для каталога": "Cancels the public access mode for the directory",
+"Получает постоянный UTL к сообщению канала": "Gets a permanent URL to the channel message",
+"Получить данные использования пространства": "Get space usage data",
+"ID поста, используемого в качетсве рекламы": "ID of the post used for advertising",
+"Отправляет файл (документ) в чат или канал": "Sends a file (document) to a chat or channel",
+"Добавляет новый товар в каталог сообщества": "Adds a new product to the community's catalog",
+"JSON клавиатуры. См.СформироватьКлавиатуру": "JSON keyboard. See FormKeyboard",
+"Разбанивает забаненного ранее пользователя": "Unbans a previously banned user",
+"Отправляет внейшний файл по списку каналов": "Sends an external file to a list of channels",
+"Очищает список событий основного календаря": "Clears the event list of the primary calendar",
+"Сформировать клавиатуру из массива кнопок:": "Create a keyboard from an array of buttons:",
+"Очистить список закрепленных сообщений темы": "Clear thread's pinned messages list",
+"Получает информацию о папке или файле по ID": "Gets information about a folder or file by ID",
+"Обновляет v2 токен при помощи refresh_token": "Updates the v2 token using the refresh_token",
+"Получает информацию о товарах по массиву ID": "Gets information about products by array of IDs",
+"Красный, желтый, синий или какой-то другой?": "Red, yellow, blue, or some other?",
+"Ошибка получения данных булево из параметра": "Error getting boolean data from parameter",
+"ID файла, к которому предоставляется доступ": "ID of the file to be accessed",
+"Удаляет ранее добавленный товар из подборки": "Removes a previously added product from the selection",
+"Получает описание поля с электронной почтой": "Gets the description of an email field",
+"Получает список отложенных сообщений канала": "Gets a list of delayed channel messages",
+"Создает рекламное объявление на основе поста": "Creates an advertising post based on a post",
+"Копирует файл или каталог по выбранному пути": "Copies a file or directory to the selected path",
+"Загружает файлы на сервер и возвращает их ID": "Uploads files to the server and returns their IDs",
+"Создает ссылку для вступления в закрытый чат": "Creates a link for joining a closed chat",
+"Переводит каталог в режим публичного доступа": "Sets the directory to public access mode",
+"Добавляет вариант для существующего свойства": "Adds a variant for an existing property",
+"Получает новый токен на основе рефреш токена": "Gets a new token based on the refresh token",
+"Показывает ранее скрытую главную тему форума": "Shows a previously hidden main forum thread",
+"Удалить объект без возможности востановления": "Delete object without the possibility of recovery",
+"Приостанавливает показ рекламного объявления": "Pauses the display of the advertising post",
+"Идентификатор новой подборки, если необходимо": "Identifier of the new selection, if needed",
+"Требования: платформа 1С версии 8.3.10 и выше": "Requirements: 1C platform version 8.3.10 and above",
+"Повторно открывает ранее закрытую тему форума": "Reopens a previously closed forum thread",
+"Получить ссылку скачивания публичного объекта": "Get download link for public object",
+"Возвращает структура клавиатуры для сообщений": "Returns a keyboard structure for messages",
+"Получает список пользователей рабочей области": "Gets a list of users in the workspace",
+"Раскомментировать, если выполняется OneScript": "Uncomment if OneScript is executed",
+"Число последних версий объекта для отображения": "Number of the latest versions of the object to display",
+"Формирует ссылку для авторизации через браузер": "Forms a link for authorization via the browser",
+"Отправляет контакт с именем и номером телефона": "Sends a contact with name and phone number",
+"Клавиатура под сообщением или на нижней панели": "Keyboard under the message or on the bottom panel",
+"Получает общую статистику сообщества за период": "Gets the overall community statistics for a period",
+"Отправляет текстовое сообщение в чат или канал": "Sends a text message to a chat or channel",
+"Список адресов почты добавляемых пользователей": "List of email addresses of users being added",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_VK.os": "Location OS: .\/OInt\/core\/Modules\/OPI_VK.os",
+"Ошибка получения двоичных данных из параметра:": "Error getting binary data from parameter:",
+"URL, по которому необходимо перейти в браузере": "URL to go to in the browser",
+"Массив имен для добавления новых листов в книгу": "Array of names to add new sheets to the book",
+"Получает список файлов с или без отбора по типу": "Gets a list of files with or without filtering by type",
+"Путь к объекту, тег которого необходимо удалить": "Path to the object whose tag needs to be deleted",
+"Получает список комментариев к записи в таблице": "Gets the list of comments for a record in the table",
+"Отправляет URL с предпросмотром в чат или канал": "Sends a URL with a preview to a chat or channel",
+"Получает список пользователей указанного канала": "Gets a list of users in the specified channel",
+"Получает календарь из списка пользователя по ID": "Gets a calendar from the user's list by ID",
+"Создает кампанию в выбранном рекламном кабинете": "Creates a campaign in the selected advertising account",
+"Получает токен по коду из авторизации в бразуере": "Gets token by code from browser authorization",
+"Получает данные строки таблицы по идентификатору": "Gets row data of the table by identifier",
+"Создает новый блок на основе существующего блока": "Creates a new block based on an existing block",
+"Добавляет сообщение в обсуждение от имени группы": "Adds a message to the discussion on behalf of the group",
+"Истина > сортировать по дате, Ложь > по алфавиту": "True > sort by date, False > alphabetically",
+"двоичные данные zip архива с содержимым каталога": "binary data of the zip archive with the contents of the directory",
+"Отменяет публикацию ранее опубликованного объекта": "Unpublishes a previously published object",
+"Путь к каталогу. Необязателен, если указан курсор": "Path to the directory. Optional if the cursor is specified",
+"Твиттер не смог обработать загруженное вами видео": "Twitter could not process the video you uploaded",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_Viber.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Viber.os",
+"Идентификатор или массив индентификаторов записей": "Identifier or array of record identifiers",
+"Источник: https:github.com\/vbondarevsky\/Connector": "Source: https:github.com\/vbondarevsky\/Connector",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_Slack.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Slack.os",
+"ID подборка для помещения товара, если необходимо": "Selection ID for placing the product, if needed",
+"Запрещает доступ к файлу для внешних пользователей": "Prohibits access to the file for external users",
+"ID асинхронной работы из ответа ЗагрузитьФайлПоURL": "ID of the asynchronous job from the UploadFileByURL response",
+"Добавляет новый текстовый тег к файлу или каталогу": "Adds a new text tag to a file or directory",
+"ID блока, после которого необходимо встаивть новый": "Block ID after which to insert the new one",
+"Создает новое свойство для использования в товарах": "Creates a new property for use in products",
+"Не удалось привести структуру значений к коллекции": "Failed to convert the structure of values to a collection",
+"Данные заполнения, где ключ это имя ячейки вида A1": "Fill data where the key is the cell name like A1",
+"Удаляет одну или массив записей по идентификаторам": "Deletes one or an array of records by identifiers",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_Notion.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Notion.os",
+"Путь к объекту, для которого необходимо создать тег": "Path to the object for which the tag needs to be created",
+"Смещение для получение объектов не из начала списка": "Offset for getting objects not from the beginning of the list",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_Dropbox.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Dropbox.os",
+"Изменяет свойства календаря из списка пользователей": "Edits the properties of a calendar from the user's list",
+"Коннектор: удобный HTTP-клиент для 1С:Предприятие 8": "Connector: convenient HTTP client for 1C:Enterprise 8",
+"Очищает список закрепленных сообщений в теме форума": "Clears the list of pinned messages in the forum thread",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_Twitter.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Twitter.os",
+"Здесь собрано определение данных для работы с VK API": "Here is a collection of data definitions for working with the VK API",
+"Обрабатывает данные TMA и опредеяет их достоверность": "Processes TMA data and determines its validity",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_Airtable.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Airtable.os",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_Telegram.os": "Location OS: .\/OInt\/core\/Modules\/OPI_Telegram.os",
+"Основное измерение при заполнении диапазона массивом": "Main dimension when filling the array range",
+"Загружает файл на диск, забирая его по заданному URL": "Downloads a file to disk from the specified URL",
+"Истина > кнопки выводятся в столбик, Ложь > в строку": "True > buttons are displayed in a column, False > in a row",
+"Отправляет географические координаты в чат или канал": "Sends geographic coordinates to a chat or channel",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_YandexID.os": "Location OS: .\/OInt\/core\/Modules\/OPI_YandexID.os",
+"Скачивает zip архив с содержимым указанного каталога": "Downloads a zip archive with the contents of the specified directory",
+"Написать сообщение пользователю в диалоге сообщества": "Write a message to a user in the community's dialog",
+"Описание таблиц: Ключ > имя, Значение > массив полей": "Table description: Key > name, Value > array of fields",
+"Определяет доступ к файлу для стороннего пользователя": "Defines access to the file for an external user",
+"Генерирует ссылку авторизации для перехода в браузере": "Generates an authorization link for browser transition",
+"Отправляет контакт с номером телефона в чат или канал": "Sends a contact with a phone number to a chat or channel",
+"Возвращает список пользователей рабочего пространства": "Returns a list of workspace users",
+"Изменяет имя и|или описание существующего поля таблицы": "Changes the name and\/or description of an existing table field",
+"Перемещает объект по заданному пути и пути к оригиналу": "Moves the object to the specified path and path to the original",
+"Добавляет существующий календарь в список пользователя": "Adds an existing calendar to the user's list",
+"Группирует товары на основе одинаковых наборов свойств": "Groups products based on similar sets of properties",
+"ID аккаунта. Текущий аккаунт токена, если не заполнено": "Account ID. Current token account if not filled",
+"Перезаписывать если файл с таким именем уже существует": "Overwrite if a file with the same name already exists",
+"Получает список внешних файлов пользователя или канала": "Gets a list of external files of a user or channel",
+"Получает информацию об объекте диска по заданному пути": "Gets information about a disk object at the specified path",
+"Предоставляет стороннии пользователям доступ к каталогу": "Grants external users access to the directory",
+"Перезаписывать, если файл с таким именем уже существует": "Overwrite if a file with the same name already exists",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleDrive.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleDrive.os",
+"Идентификатор файла или каталога размещения комментария": "Identifier of the file or directory where the comment is located",
+"Изменяет значение варианта существующего свойства товара": "Edits the value of an existing product property variant",
+"Соответствие данных с результатом проверки в поле passed": "Map of data with the result of verification in the passed field",
+"Получает информацию об опубликованном объекте по его URL": "Gets information about the published object by its URL",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleSheets.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleSheets.os",
+"Получает статус асинхронной работы по изменению доступов": "Gets the status of the asynchronous access change job",
+"Отправляет сообщение, которое приходит в канал, но видно": "Sends a message that arrives in the channel but is visible",
+"Получает прямую ссылку для скачивания публичного объекта": "Gets a direct link to download the public object",
+"Добавляет дополнительные поля информации для медиафайлов": "Adds additional information fields for media files",
+"Создает дочернюю страницу над другой страницей-родителем": "Creates a child page above another parent page",
+"Удаляет публичный URL у файла. Требует токен пользователя": "Removes the public URL from the file. Requires user token",
+"Получает список рабочих областей, в которых подключен бот": "Gets a list of workspaces where the bot is connected",
+"Идентификатор объекта, для которого необходим комментарий": "Identifier of the object that needs a comment",
+"Создает новую тему в группе с включенным функционалом тем": "Creates a new thread in the group with theme functionality enabled",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleCalendar.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleCalendar.os",
+"Пересылает сообщение между чатами или в рамках одного чата": "Forwards a message between chats or within a chat",
+"Загружает фото на сервер для его дальнейшего использования": "Uploads photo to server for further use",
+"Запрещает редактирование файла для стороннего пользователя": "Prohibits file editing for the external user",
+"Создает копию объекта по заданному пути и пути к оригиналу": "Creates a copy of the object at the specified path and path to the original",
+"Расположение OS: .\/OInt\/tests\/Modules\/internal\/OPI_Тесты.os": "Location OS: .\/OInt\/tests\/Modules\/internal\/OPI_Tests.os",
+"Вы можете переопределять их, передавая в качестве параметра": "You can override them by passing them as a parameter",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_GoogleWorkspace.os": "Location OS: .\/OInt\/core\/Modules\/OPI_GoogleWorkspace.os",
+"Истина > служебные поля удаляются, остается только сам блок": "True > service fields are deleted, only the block itself remains",
+"Создает публичный URL для файла. Требует токен пользователя": "Creates a public URL for the file. Requires user token",
+"Код, полученный из авторизации См.ПолучитьСсылкуАвторизации": "Code obtained from authorization See GetAuthorizationLink",
+"механизм загрузки файлов и некоторые другие из старой версии": "file upload mechanism and some others from the old version",
+"Смещение для получение вложенных объектов не из начала списка": "Offset for getting nested objects not from the beginning of the list",
+"Указатель из предыдущего запроса, если строк результата > 100": "Pointer from the previous request, if the result rows > 100",
+"Иднтификатор следующей страницы данных из предыдущего запроса": "Next page identifier of data from the previous request",
+"Открывает новый диалог с одним или несколькими пользователями": "Opens a new dialog with one or more users",
+"Строка, Произвольный, HTTPОтвет, ДвоичныеДанные, Неопределено": "String, Arbitrary, HTTPResponse, BinaryData, Undefined",
+"Токен бота чата сообщества, котрый можно получить в настройках": "Community chat bot token, which can be obtained in the settings",
+"Загружает файл на облачный диск, получая его по указанному URL": "Uploads a file to the cloud drive by fetching it from the specified URL",
+"Игнорируем проверку целостности архива, просто читаем результат": "Ignore archive integrity check, just read the result",
+"Получает статус пользователя или нескольких пользователей по ID": "Gets the status of a user or several users by ID",
+"Удаляет URL обработчика событий бота для работы в режиме Webhook": "Deletes the bot event handler URL for webhook operation",
+"Получает массив сообщений, которые являются ответом на указанное": "Gets an array of messages that are replies to the specified",
+"Расположение OS: .\/OInt\/tools\/Modules\/OPI_ПреобразованиеТипов.os": "Location OS: .\/OInt\/tools\/Modules\/OPI_TypeConversion.os",
+"Набор или массив наборов пар Ключ : Значение > Поле : Показатель": "Set or array of sets of Key : Value pairs > Field : Indicator",
+"Клавиатура, если нужна, см. СформироватьКлавиатуруИзМассиваКнопок": "Keyboard, if needed, see CreateKeyboardFromArrayButton",
+"Расположение OS: .\/OInt\/tools\/Modules\/OPI_ПолучениеДанныхТестов.os": "Location OS: .\/OInt\/tools\/Modules\/OPI_TestDataRetrieval.os",
+"Идентификатор следующей страницы списка баз из перыдудщего запроса": "Next page identifier of the base list from the previous request",
+"Совпадающие поля будут перезаписаны с приоритетом параметра функции": "Matching fields will be overwritten with the parameter of the function",
+"Формирует блок с картинкой для добавления в массив блоков сообщения": "Generates a block with an image to add to the message block array",
+"ID пользователя. Для канала > администратора, для бота > получателя": "User ID. For channel > administrator, for bot > recipient",
+"Полеучает токен на основе кода со страницы ПолучитьСсылкуАвторизации": "Gets token based on the code from the GetAuthorizationLink page",
+"Курсор из предыдущего запроса для получения следующего набора файлов": "Cursor from the previous request to get the next set of files",
+"на redirect_uri после авторизации через браузер есть всего 30 секунд": "on redirect_uri after authorization via the browser is only 30 seconds",
+"Загружает видео в группу с возможностью его дальнейшего использования": "Uploads video to the group for further use",
+"access_token нужно будет забрать из параметра в строке адреса браузера": "access_token will need to be taken from the parameter in the browser address bar",
+"Двоичные данные или путь к файлу при указании параметра ПутьСохранения": "Binary data or file path when SavePath parameter is specified",
+"Устанавливает URL обработчика событий бота для работы в режиме Webhook": "Set webhook URL for bot event handling in webhook mode",
+"Получает список ID товарных категорий для указания при создании товара": "Gets a list of product category IDs to specify when creating a product",
+"Получает информацию о количестве использованного дискового пространства": "Gets information on the amount of used disk space",
+"Расположение OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Инструменты.os": "Location OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Tools.os",
+"Получает соответствие ID Emoji для установки в качестве иконок тем форума": "Gets the mapping of Emoji IDs for setting as forum theme icons",
+"Получает список id рекламных категорий для создания рекламного объявления": "Gets a list of advertising category IDs for creating an advertising post",
+"Метод для вставки в http-сервис, адрес которого указывается в redirect_uri": "Method for insertion into an http service, the address of which is specified in redirect_uri",
+"Расположение OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Криптография.os": "Location OS: .\/OInt\/tools\/Modules\/internal\/Modules\/OPI_Cryptography.os",
+"URL вашего http-сервиса (или другого обработчика запросов) для авторизации": "URL of your http service (or other request handler) for authorization",
+"Отправляет местоположение по географической широте и долготе в чат или канал": "Sends location by geographic latitude and longitude to a chat or channel",
+"Из OAuth 2.0 Client ID and Client Secret страницы настроек Twitter Developer": "From OAuth 2.0 Client ID and Client Secret settings page of Twitter Developer",
+"Размер файла. Если не заполнен > определяется автоматически скачиванием файла": "File size. If not filled in > determined automatically by downloading the file",
+"Получает код подтверждения и адрес страницы, на которой его необходимо ввести": "Gets the confirmation code and the address of the page where it needs to be entered",
+"Все права защищены. Эта программа и сопроводительные материалы предоставляются": "All rights reserved. This program and accompanying materials are provided",
+"1, а что-то на 2: вплоть до того что они убрали возможность постить твиты из v1": "1, and something on 2: up to the point that they removed the ability to post tweets from v1",
+"Из Consumer Keys -> Access Token and Secret страницы настроек Twitter Developer": "From Consumer Keys -> Access Token and Secret settings page of Twitter Developer",
+"Создает одну или массив записей по описанию или массиву описаний значений полей": "Creates one or an array of records by description or an array of field value descriptions",
+"id приложения, которое необходимо создать в профиле на странице для разработчиков": "application ID that needs to be created in the profile on the developer page",
+"Вызывает метод получения токена, так как для получения токена из кода, приходящего": "Calls the token acquisition method, as for obtaining a token from the code received",
+"Формирует простую JSON клавиатуру из массив кнопок для сообщения или нижней панели": "Generates a simple JSON keyboard from an array of buttons for a message or bottom panel",
+"Преобразовывает код в токен после ввода кода при выполнении ПолучитьКодПодтверждения": "Converts the code to a token after entering the code when executing GetConfirmationCode",
+"ID пользователя из информации о канале не подойдет для отправки сообщений через бота": "The user ID from channel information is not suitable for sending messages through the bot",
+"|--> ОбновитьТокен() ->|access_token --> Используется в т-нии 2-х часов для запросов": "|--> RefreshToken() ->| access_token --> Used in the interval of 2 hours for requests",
+"Все страницы, которые будут созданы как дочерние, должны иметь свойства базы-родителя": "All pages created as children must have parent base properties",
+"Описание структур см. здесь https:pkware.cachefly.net\/webdocs\/casestudies\/APPNOTE.TXT": "Description of structures see here https:pkware.cachefly.net\/webdocs\/casestudies\/APPNOTE.TXT",
+"id группы с \"-\" в начале. Можно найти в настройках группы ВК или в ее URL, если не был": "group ID with \"-\" at the beginning. Can be found in the settings of the VK group or in its URL if not set",
+"набор разрешений для получаемого ключа. Может быть любой, но offline.access обязателен": "a set of permissions for the received key. Can be any, but offline.access is mandatory",
+"Получение ссылки для интерактивного получения токена (access_token), который необходим": "Getting a link for interactive token retrieval (access_token), which is necessary",
+"можно использовать http-сервис. Туда же будет приходить и информация о новых сообщениях": "you can use an HTTP service. Information about new messages will also be sent there",
+"Из Authentication Tokens -> Access Token and Secret страницы настроек Twitter Developer": "From Authentication Tokens -> Access Token and Secret settings page of Twitter Developer",
+"При следующем обновлении нужно использовать уже новый refresh_token, так что захардкодить": "For the next update, you need to use a new refresh_token, so hardcode",
+"Приходит вместе с access_token и используется для его обновления (время жизни access_token": "Comes together with access_token and is used to refresh it (access_token lifetime",
+"Получает токен по коду, полученному при авторизации по ссылке из ПолучитьСсылкуАвторизации": "Gets the token by the code obtained during authorization via the link from GetAuthorizationLink",
+"Отправляет набор файлов в чат или канал. Варианты типов медиа: audio, document, photo, video": "Sends a set of files to a chat or channel. Media types: audio, document, photo, video",
+"Получает список первых файлов каталога или продолжает получение следующих при указании курсора": "Gets the list of the first files in the directory or continues getting the next ones when the cursor is specified",
+"который будет возвращать 200 и подлинный SSL сертификат. Если есть сертификат и база опубликована": "which will return 200 and a genuine SSL certificate. If there is a certificate and the database is published",
+"что Twitter настаивает на использовании этой актуальной версии, они как-то умудрились не перенести": "that Twitter insists on using this latest version, they somehow managed not to transfer",
+"Тут можно получить ID пользователей канала. ID для бота необходимо получать из прилетов на Webhook": "Here you can get the channel's user IDs. Bot IDs need to be obtained from the Webhook arrivals",
+"но только через нее в твит можно добавить картинку. При этом способы авторизации и токены у них разные": "but only through it you can add a picture to the tweet. At the same time, their authentication methods and tokens are different",
+"Viber периодически стучит по адресу Webhook, так что если он будет неактивен, то все перестанет работать": "Viber periodically knocks on the Webhook address, so if it is inactive, everything will stop working",
+"Выполняет запрос \/getUpdates, возвращающий информацию о событиях бота. Используется при работе в polling режиме": "Executes a request \/getUpdates, returning information about bot events. Used in polling mode",
+"СоздатьСобытие": "",
+"НазваниеФайла2": "",
+"ОтправитьГифку": "",
+"ОтправитьАудио": "",
+"ОТПРАВИТЬАУДИО": "",
+"Отправка данных": "",
+"ОТПРАВИТЬССЫЛКУ": "",
+"ОтправитьСсылку": "",
+"ПОЛУЧИТЬСОБЫТИЕ": "",
+"ВводныйПараметр": "",
+"ПолучитьСобытие": "",
+"УДАЛИТЬПОДБОРКУ": "",
+"СОЗДАТЬСТРАНИЦУ": "",
+"Работа с базами": "",
+"ТекущееОписание": "",
+"СОКРАТИТЬССЫЛКУ": "",
+"ПеременнаяСреды": "",
+"СоздатьСтраницу": "",
+"Работа с тегами": "",
+"УДАЛИТЬКАРТИНКУ": "",
+"Работа с полями": "",
+"ТекстВыполнения": "",
+"ИзменитьСобытие": "",
+"ИЗМЕНИТЬСОБЫТИЕ": "",
+"ПолучитьТаблицу": "",
+"ИЗМЕНИТЬТАБЛИЦУ": "",
+"СОЗДАТЬКАЛЕНДАРЬ": "",
+"СОЗДАТЬТВИТОПРОС": "",
+"СОЗДАТЬТВИТВИДЕО": "",
+"УДАЛИТЬКАЛЕНДАРЬ": "",
+"СоздатьКалендарь": "",
+"МБ был записан в": "",
+"Работа с книгами": "",
+"УдалитьКалендарь": "",
+"Получение токена": "",
+"ОТПРАВИТЬЛОКАЦИЮ": "",
+"СОЗДАТЬТВИТГИФКИ": "",
+"ОтправитьЛокацию": "",
+"Выполняет запрос": "",
+"Работа с файлами": "",
+"ОТПРАВИТЬКОНТАКТ": "",
+"ПОЛУЧИТЬПОЛЕДАТЫ": "",
+"УдалитьСообщение": "",
+"ДобавитьПараметр": "",
+"Работа с группой": "",
+"Работа с данными": "",
+"Работа с блоками": "",
+"Работа с листами": "",
+"КопироватьОбъект": "",
+"ОбъектПроцессора": "",
+"УДАЛИТЬСООБЩЕНИЕ": "",
+"ПОЛУЧИТЬСТРАНИЦУ": "",
+"ПолучитьСтраницу": "",
+"КОПИРОВАТЬОБЪЕКТ": "",
+"НеобходимаяДлина": "",
+"СОЗДАТЬТЕМУФОРУМА": "",
+"ИЗМЕНИТЬСООБЩЕНИЕ": "",
+"Работа с каналами": "",
+"СКОПИРОВАТЬОБЪЕКТ": "",
+"ЗначениеПараметра": "",
+"УстановитьКоманду": "",
+"СообщитьРезультат": "",
+"КаталогИсходников": "",
+"СОЗДАТЬБАЗУДАННЫХ": "",
+"Работа с товарами": "",
+"ПОЛУЧИТЬПОЛЕПОЧТЫ": "",
+"АРХИВИРОВАТЬКАНАЛ": "",
+"Работа с записями": "",
+"УдалитьТемуФорума": "",
+"УДАЛИТЬТЕМУФОРУМА": "",
+"ЗАКРЫТЬТЕМУФОРУМА": "",
+"УстановитьWebhook": "",
+"УСТАНОВИТЬWEBHOOK": "",
+"ПереместитьОбъект": "",
+"ПЕРЕМЕСТИТЬОБЪЕКТ": "",
+"Работа с заказами": "",
+"ОТПРАВИТЬКАРТИНКУ": "",
+"НачальнаяФигурная": "",
+"ОтправитьДокумент": "",
+"ОТПРАВИТЬДОКУМЕНТ": "",
+"ОпубликоватьПапку": "",
+"ОПУБЛИКОВАТЬПАПКУ": "",
+"НАПИСАТЬСООБЩЕНИЕ": "",
+"АрхивироватьКанал": "",
+"ПоследняяФигурная": "",
+"НаписатьСообщение": "",
+"ОТКРЫТЬТЕМУФОРУМА": "",
+"Администрирование": "",
+"ОТКРЫТЬОБСУЖДЕНИЕ": "",
+"ЗАКРЫТЬОБСУЖДЕНИЕ": "",
+"ПОЛУЧИТЬСПИСОКБАЗ": "",
+"СОЗДАТЬОБСУЖДЕНИЕ": "",
+"ПЕРЕИМЕНОВАТЬКАНАЛ": "",
+"ПереименоватьКанал": "",
+"Команда CLI: tools": "",
+"НачальнаяТабуляция": "",
+"СОЗДАТЬКОММЕНТАРИЙ": "",
+"СоздатьКомментарий": "",
+"ИзменитьТемуФорума": "",
+"ПолучитьБазуДанных": "",
+"ПОЛУЧИТЬБАЗУДАННЫХ": "",
+"ОПУБЛИКОВАТЬОБЪЕКТ": "",
+"ОпубликоватьОбъект": "",
+"СкоприроватьОбъект": "",
+"Отправка сообщений": "",
+"Работа с таблицами": "",
+"ПОЛУЧИТЬПОЛЕССЫЛКИ": "",
+"ЗАКРЕПИТЬСООБЩЕНИЕ": "",
+"ПОЛУЧИТЬПОЛЕФЛАЖКА": "",
+"ПОЛУЧИТЬПОЛЕНОМЕРА": "",
+"ПОЛУЧИТЬТОВАРЫПОИД": "",
+"ПереслатьСообщение": "",
+"ОТПРАВИТЬСООБЩЕНИЕ": "",
+"ПОЛУЧИТЬСТАТИСТИКУ": "",
+"ЗакрепитьСообщение": "",
+"УдалитьКомментарий": "",
+"УДАЛИТЬКОММЕНТАРИЙ": "",
+"Работа с событиями": "",
+"ПереместитьСобытие": "",
+"ПЕРЕМЕСТИТЬСОБЫТИЕ": "",
+"ОткрепитьСообщение": "",
+"УДАЛИТЬВНЕШНИЙФАЙЛ": "",
+"ОТКРЕПИТЬСООБЩЕНИЕ": "",
+"ЗагрузитьФайлПоURL": "",
+"ЗАГРУЗИТЬФАЙЛПОURL": "",
+"ЗначенияПараметров": "",
+"ТекущаяВложенность": "",
+"Данные и настройка": "",
+"ПОЛУЧИТЬОБНОВЛЕНИЯ": "",
+"ПЕРЕСЛАТЬСООБЩЕНИЕ": "",
+"ИЗМЕНИТЬТЕМУФОРУМА": "",
+"Работа с диалогами": "",
+"СГРУППИРОВАТЬТОВАРЫ": "",
+"СОЗДАТЬТВИТКАРТИНКИ": "",
+"ПОЛУЧИТЬТАБЛИЦЫБАЗЫ": "",
+"Формирование блоков": "",
+"ПолучитьТаблицыБазы": "",
+"СоздатьКопиюОбъекта": "",
+"ИЗМЕНИТЬКОММЕНТАРИЙ": "",
+"ИзменитьКомментарий": "",
+"СОЗДАТЬКОПИЮОБЪЕКТА": "",
+"ПОЛУЧИТЬСПИСОКТЕГОВ": "",
+"ДОБАВИТЬВНЕШНИЙФАЙЛ": "",
+"ДобавитьВнешнийФайл": "",
+"json (необяз. по ум": "",
+"ПОЛУЧИТЬВНЕШНИЙФАЙЛ": "",
+"ПОЛУЧИТЬДАННЫЕФАЙЛА": "",
+"ПОЛУЧИТЬКОММЕНТАРИИ": "",
+"НАПИСАТЬВОБСУЖДЕНИЕ": "",
+"СписокПользователей": "",
+"НАПИСАТЬКОММЕНТАРИЙ": "",
+"ПОЛУЧИТЬТОКЕНПОКОДУ": "",
+"СПИСОКПОЛЬЗОВАТЕЛЕЙ": "",
+"ПолучитьКомментарий": "",
+"ПолучитьТокенПоКоду": "",
+"ПОЛУЧИТЬКОММЕНТАРИЙ": "",
+"СДЕЛАТЬФАЙЛПРИВАТНЫМ": "",
+"ПОЛУЧИТЬПОДБОРКИПОИД": "",
+"УстановитьТемуКанала": "",
+"ВЕРНУТЬДОЧЕРНИЕБЛОКИ": "",
+"ИнформацияОПрогрессе": "",
+"СДЕЛАТЬФАЙЛПУБЛИЧНЫМ": "",
+"СделатьФайлПубличным": "",
+"СделатьФайлПриватным": "",
+"УСТАНОВИТЬТЕМУКАНАЛА": "",
+"СоздатьСтраницуВБазу": "",
+"УстановитьЦельКанала": "",
+"УСТАНОВИТЬЦЕЛЬКАНАЛА": "",
+"ОТПРАВИТЬВНЕШНИЙФАЙЛ": "",
+"Работа с сообщениями": "",
+"ПОЛУЧИТЬСПИСОКФАЙЛОВ": "",
+"ОтправитьМедиагруппу": "",
+"СОЗДАТЬСОСТАВНОЙПОСТ": "",
+"ИЗМЕНИТЬСВОЙСТВАБАЗЫ": "",
+"СОЗДАТЬСТРАНИЦУВБАЗУ": "",
+"Работа со страницами": "",
+"ВернутьДочерниеБлоки": "",
+"Изменение публикации": "",
+"ВозвращаемоеЗначение": "",
+"СОЗДАТЬТЕКСТОВЫЙТВИТ": "",
+"СоздатьСоставнойПост": "",
+"ПОЛУЧИТЬПОЛЕТЕЛЕФОНА": "",
+"ОТПРАВИТЬМЕДИАГРУППУ": "",
+"ПОЛУЧИТЬПОЛЕВЛОЖЕНИЯ": "",
+"ПОЛУЧИТЬСПИСОККАНАЛОВ": "",
+"ЗАГРУЗИТЬФОТОНАСЕРВЕР": "",
+"Аккаунт и авторизация": "",
+"Программный интерфейс": "",
+"ПОЛУЧИТЬСПИСОКЗАПИСЕЙ": "",
+"УДАЛИТЬСВОЙСТВОТОВАРА": "",
+"ПОЛУЧИТЬСПИСОКТОВАРОВ": "",
+"ПОЛУЧИТЬСПИСОКЗАКАЗОВ": "",
+"ПолучитьИсториюКанала": "",
+"СОЗДАТЬСВОЙСТВОТОВАРА": "",
+"ПОЛУЧИТЬСПИСОКСОБЫТИЙ": "",
+"ПолучитьСписокСобытий": "",
+"ПОЛУЧИТЬПОЛЕСТРОКОВОЕ": "",
+"ПОЛУЧИТЬИСТОРИЮКАНАЛА": "",
+"ПОЛУЧИТЬЗНАЧЕНИЯЯЧЕЕК": "",
+"Работа с обсуждениями": "",
+"ПОЛУЧИТЬСПИСОКСВОЙСТВ": "",
+"УДАЛИТЬТОВАРИЗПОДБОРКИ": "",
+"ПОЛУЧИТЬИНФОРМАЦИЮБОТА": "",
+"ПолучитьИнформациюБота": "",
+"Работа с базами данных": "",
+"Работа с комментариями": "",
+"ЗАГРУЗИТЬВИДЕОНАСЕРВЕР": "",
+"ПОЛУЧИТЬСПИСОКПОДБОРОК": "",
+"Интерактивные действия": "",
+"ИЗМЕНИТЬСВОЙСТВОТОВАРА": "",
+"СформироватьКлавиатуру": "",
+"Настройки и информация": "",
+"СОЗДАТЬПОДБОРКУТОВАРОВ": "",
+"Работа с темами форума": "",
+"ПреобразоватьКодВТокен": "",
+"ДОБАВИТЬТОВАРВПОДБОРКУ": "",
+"ПРЕОБРАЗОВАТЬКОДВТОКЕН": "",
+"СФОРМИРОВАТЬКЛАВИАТУРУ": "",
+"Управление и настройки": "",
+"ОтменитьПубликациюПапки": "",
+"УстановитьЗначенияЯчеек": "",
+"ОбеспечитьПустойКаталог": "",
+"ПолучитьЧислоУчастников": "",
+"ПОЛУЧИТЬЧИСЛОУЧАСТНИКОВ": "",
+"ПОЛУЧИТЬПУБЛИЧНЫЙОБЪЕКТ": "",
+"Непредвиденная ошибка!:": "",
+"ОТПРАВИТЬМЕСТОПОЛОЖЕНИЕ": "",
+"Не найден входной файл!": "",
+"ПолучитьПубличныйОбъект": "",
+"УСТАНОВИТЬЗНАЧЕНИЯЯЧЕЕК": "",
+"ОТМЕНИТЬПУБЛИКАЦИЮФАЙЛА": "",
+"ИзменитьКалендарьСписка": "",
+"ИЗМЕНИТЬПОДБОРКУТОВАРОВ": "",
+"ОтменитьПубликациюФайла": "",
+"СкрытьГлавнуюТемуФорума": "",
+"ИЗМЕНИТЬКАЛЕНДАРЬСПИСКА": "",
+"ПОЛУЧИТЬИНФОРМАЦИЮОБОТЕ": "",
+"ПОЛУЧИТЬКАЛЕНДАРЬСПИСКА": "",
+"ПолучитьКалендарьСписка": "",
+"Изменяет наименование и": "",
+"ПОЛУЧИТЬСПИСОККАТАЛОГОВ": "",
+"ОТМЕНИТЬПУБЛИКАЦИЮПАПКИ": "",
+"ПолучитьИнформациюОБоте": "",
+"СКРЫТЬГЛАВНУЮТЕМУФОРУМА": "",
+"СФОРМИРОВАТЬБЛОККАРТИНКУ": "",
+"СОЗДАТЬССЫЛКУПРИГЛАШЕНИЕ": "",
+"УДАЛИТЬКАЛЕНДАРЬИЗСПИСКА": "",
+"УдалитьКалендарьИзСписка": "",
+"ИзменитьСвойстваСтраницы": "",
+"ИЗМЕНИТЬСВОЙСТВАСТРАНИЦЫ": "",
+"ПОЛУЧИТЬСПИСОККАЛЕНДАРЕЙ": "",
+"ПОЛУЧИТЬСТАТИСТИКУПОСТОВ": "",
+"СоздатьСсылкуПриглашение": "",
+"ДобавитьКалендарьВСписок": "",
+"ПолучитьСписокКалендарей": "",
+"СОЗДАТЬРЕКЛАМНУЮКАМПАНИЮ": "",
+"ДОБАВИТЬКАЛЕНДАРЬВСПИСОК": "",
+"ПОЛУЧИТЬКОДПОДТВЕРЖДЕНИЯ": "",
+"ПолучитьКодПодтверждения": "",
+"СОХРАНИТЬКАРТИНКУВАЛЬБОМ": "",
+"ПолучитьИнформациюОДиске": "",
+"ПОЛУЧИТЬИНФОРМАЦИЮОДИСКЕ": "",
+"ВосстановитьОбъектКВерсии": "",
+"ПоказатьГлавнуюТемуФорума": "",
+"ПОКАЗАТЬГЛАВНУЮТЕМУФОРУМА": "",
+"ПолучитьИнформациюОКанале": "",
+"ПОЛУЧИТЬИНФОРМАЦИЮОКАНАЛЕ": "",
+"Dropbox_ПереместитьОбъект": "",
+"ОчиститьОсновнойКалендарь": "",
+"ОЧИСТИТЬОСНОВНОЙКАЛЕНДАРЬ": "",
+"ОтменитьПубликациюОбъекта": "",
+"ИЗМЕНИТЬНАИМЕНОВАНИЕКНИГИ": "",
+"ИзменитьНаименованиеКниги": "",
+"ПОЛУЧИТЬССЫЛКУНАСООБЩЕНИЕ": "",
+"СоответствиеКомандМодулей": "",
+"ПОЛУЧИТЬССЫЛКУАВТОРИЗАЦИИ": "",
+"ОТМЕНИТЬПУБЛИКАЦИЮОБЪЕКТА": "",
+"ПолучитьСсылкуНаСообщение": "",
+"ВОССТАНОВИТЬОБЪЕКТКВЕРСИИ": "",
+"ПОЛУЧИТЬСПИСОКФАЙЛОВПАПКИ": "",
+"ВывестиСообщениеИсключения": "",
+"ПолучитьСписокКомментариев": "",
+"ДобавитьПользователяКФайлу": "",
+"ПолучитьЗначенияРекурсивно": "",
+"Работа с файлами и папками": "",
+"СоздатьРекламноеОбъявление": "",
+"ПолучитьДанныеПользователя": "",
+"ЧислоСтандартныхПараметров": "",
+"ПОЛУЧИТЬСПИСОККОММЕНТАРИЕВ": "",
+"ПОЛУЧИТЬДАННЫЕПОЛЬЗОВАТЕЛЯ": "",
+"СОЗДАТЬРЕКЛАМНОЕОБЪЯВЛЕНИЕ": "",
+"Работа с подборками товаров": "",
+"ПолучитьОнлайнПользователей": "",
+"ОТПРАВИТЬТЕКСТОВОЕСООБЩЕНИЕ": "",
+"ОтправитьТекстовоеСообщение": "",
+"ПОЛУЧИТЬОНЛАЙНПОЛЬЗОВАТЕЛЕЙ": "",
+"ПолучитьСтатусЗагрузкиПоURL": "",
+"ПОЛУЧИТЬСТАТУСЗАГРУЗКИПОURL": "",
+"ИЗМЕНИТЬМЕТАДАННЫЕКАЛЕНДАРЯ": "",
+"Работа с удаленными файлами": "",
+"ВЫГНАТЬПОЛЬЗОВАТЕЛЯИЗКАНАЛА": "",
+"ВыгнатьПользователяИзКанала": "",
+"ИзменитьМетаданныеКалендаря": "",
+"ОТПРАВИТЬЭФЕМЕРНОЕСООБЩЕНИЕ": "",
+"ДобавитьПользователейКПапке": "",
+"ПолучитьСсылкуДляСкачивания": "",
+"Разложить JSON на параметры": "",
+"ПолучитьИнформациюОбОбъекте": "",
+"ДОБАВИТЬПОЛЬЗОВАТЕЛЕЙКФАЙЛУ": "",
+"ПОЛУЧИТЬМЕТАДАННЫЕКАЛЕНДАРЯ": "",
+"ДобавитьПараметрФлагКоманды": "",
+"ДобавитьПользователейКФайлу": "",
+"ПОЛУЧИТЬСПИСОКВЕРСИЙОБЪЕКТА": "",
+"ДОБАВИТЬПОЛЬЗОВАТЕЛЕЙКПАПКЕ": "",
+"ОтправитьЭфемерноеСообщение": "",
+"ПОЛУЧИТЬСПИСОКПОЛЬЗОВАТЕЛЕЙ": "",
+"ПолучитьСписокВерсийОбъекта": "",
+"ПОЛУЧИТЬСПИСОКВНЕШНИХФАЙЛОВ": "",
+"ПОЛУЧИТЬССЫЛКУДЛЯСКАЧИВАНИЯ": "",
+"ПолучитьМетаданныеКалендаря": "",
+"Создать\/Удалить кооментарий": "",
+"ПОЛУЧИТЬИНФОРМАЦИЮОБОБЪЕКТЕ": "",
+"ПреобразоватьBase64ВДвоичные": "",
+"ПРЕОБРАЗОВАТЬBASE64ВДВОИЧНЫЕ": "",
+"СоздатьСсылкуПолученияТокена": "",
+"Получение данных и настройка": "",
+"ПОЛУЧИТЬИНФОРМАЦИЮОБАККАУНТЕ": "",
+"Работа со свойствами товаров": "",
+"Работа со списком календарей": "",
+"ИЗМЕНИТЬИМЯГЛАВНОЙТЕМЫФОРУМА": "",
+"ПолучитьСписокИконокАватаров": "",
+"Работа с рекламным кабинетом": "",
+"ИзменитьИмяГлавнойТемыФорума": "",
+"ПОЛУЧИТЬСПИСОКИКОНОКАВАТАРОВ": "",
+"УДАЛИТЬВАРИАНТСВОЙСТВАТОВАРА": "",
+"СОЗДАТЬССЫЛКУПОЛУЧЕНИЯТОКЕНА": "",
+"ПОЛУЧИТЬСПИСОКРАБОЧИХОБЛАСТЕЙ": "",
+"Работа с файлами и каталогами": "",
+"Настройки совместного доступа": "",
+"ДОБАВИТЬВАРИАНТСВОЙСТВАТОВАРА": "",
+"ПРИГЛАСИТЬПОЛЬЗОВАТЕЛЕЙВКАНАЛ": "",
+"ИЗМЕНИТЬВАРИАНТСВОЙСТВАТОВАРА": "",
+"ПригласитьПользователейВКанал": "",
+"Управление публичным доступом": "",
+"СОХРАНИТЬПУБЛИЧНЫЙОБЪЕКТНАДИСК": "",
+"МаксимальныйУровеньВложенности": "",
+"ПОЛУЧИТЬСПИСОККАТЕГОРИЙТОВАРОВ": "",
+"Работа с метаданными календарей": "",
+"Служебный программный интерфейс": "",
+"СФОРМИРОВАТЬССЫЛКУПОЛУЧЕНИЯКОДА": "",
+"Двоичные данные или пути к фото": "",
+"СформироватьСсылкуПолученияКода": "",
+"Функция вернула пустое значение": "",
+"ПРИОСТАНОВИТЬРЕКЛАМНОЕОБЪЯВЛЕНИЕ": "",
+"ПОЛУЧИТЬСПИСОКРЕКЛАМНЫХКАТЕГОРИЙ": "",
+"ПОЛУЧИТЬСПИСОКОТВЕТОВНАСООБЩЕНИЕ": "",
+"ПОЛУЧИТЬСПИСОКОТЛОЖЕННЫХСООБЩЕНИЙ": "",
+"ПОЛУЧИТЬСПИСОКПОЛЬЗОВАТЕЛЕЙКАНАЛА": "",
+"ДобавитьИменованныйПараметрКоманды": "",
+"ДобавитьПозиционныйПараметрКоманды": "",
+"ПОЛУЧИТЬСТАТУСАСИНХРОННОГОИЗМЕНЕНИЯ": "",
+"ПолучитьСтатусАсинхронногоИзменения": "",
+"под записью (необяз. по ум. - Пустое": "",
+"ПОЛУЧИТЬСПИСОКОПУБЛИКОВАННЫХОБЪЕКТОВ": "",
+"ПолучитьСписокОпубликованныхОбъектов": "",
+"СФОРМИРОВАТЬКЛАВИАТУРУПОМАССИВУКНОПОК": "",
+"СформироватьКлавиатуруПоМассивуКнопок": "",
+"См.СформироватьКлавиатуру (необяз. по": "",
+"СФОРМИРОВАТЬКЛАВИАТУРУИЗМАССИВАКНОПОК": "",
+"Главная, если не заполнено (необяз. по": "",
+"ПолучитьДанныеИспользованияПространства": "",
+"ОЧИСТИТЬСПИСОКЗАКРЕПЛЕННЫХСООБЩЕНИЙТЕМЫ": "",
+"ПОЛУЧИТЬДАННЫЕИСПОЛЬЗОВАНИЯПРОСТРАНСТВА": "",
+"ПолучитьСписокИконокАватаров (необяз. по": "",
+"ПОЛУЧИТЬССЫЛКУСКАЧИВАНИЯПУБЛИЧНОГООБЪЕКТА": "",
+"Кодировка, в которой записаны JSON данные": "",
+"Ошибка преобразовани данных параметра JSON": "",
+"конкретное значение при указании имени поля": "",
+"Похоже, что в ответе пришли двоичные данные!": "",
+"Необязателен, если указан курсор (необяз. по": "",
+"Преобразует файл с Base64 строкой в бинарный": "",
+"Не удалось получить информацию из json медиа!": "",
+"Созвращает список дочерних блоков блока-родителя": "",
+"Некорректный метод! Проверьте правильность ввода": "",
+"Выводит весь список, если не указано (необяз. по": "",
+"СформироватьКлавиатуруИзМассиваКнопок (необяз. по": "",
+"Преобразует файл с Base64 строкой в бинарный файл": "",
+"Некорректная команда! Проверьте правильность ввода": "",
+"Текущий аккаунт токена, если не заполнено (необяз. по": "",
+"Расположение OS: .\/OInt\/core\/Modules\/OPI_YandexDisk.os": "",
+"Имя поля для получения. Выводит весь список, если не указано": "",
+"вложенности разбора. На всю глубину по умолчанию (необяз. по": "",
+"Ограничение на ур. вложенности разбора. На всю глубину по умолчанию": "",
+"В следующий раз используйте опцию --out для указания пути их сохранения": "",
+"Полную документацию можно найти по адресу: (https:\/\/openintegrations.dev": "",
+"Если не заполнен > определяется автоматически скачиванием файла (необяз. по": "",
+"Показывает значения, которые можно получить из переданного JSON и возвращает": "",
+"Файл не был записан! Используйте флаг --debug для получения дополнительной информации": ""
+}