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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>OPI</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.xtext.ui.shared.xtextBuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.xtext.ui.shared.xtextNature</nature> + <nature>com._1c.g5.v8.dt.core.V8ExtensionNature</nature> + </natures> +</projectDescription> 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/<project>=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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="457991ad-c2ad-49b8-a26a-9fc83c8a7d11"> + <name>OPI_Airtable</name> + <synonym> + <key></key> + <value>OPI airtable</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="66ce7792-41e5-47e4-bfad-2dcff1c96287"> + <name>OPI_Dropbox</name> + <synonym> + <key></key> + <value>OPI dropbox</value> + </synonym> + <synonym> + <key>ru</key> + <value>Drop box</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="d27d4ffb-31c2-4362-bd6d-d785ce171b49"> + <name>OPI_GoogleCalendar</name> + <synonym> + <key></key> + <value>OPI google calendar</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="3bf39c90-a263-4300-b800-7fd85f7c6d40"> + <name>OPI_GoogleDrive</name> + <synonym> + <key></key> + <value>OPI google drive</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="3890523a-552f-495c-ae7d-2991df8bb175"> + <name>OPI_GoogleSheets</name> + <synonym> + <key></key> + <value>OPI google sheets</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="e5bf1867-4c83-4724-91f2-931150325ea0"> + <name>OPI_GoogleWorkspace</name> + <synonym> + <key></key> + <value>OPI google workspace</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="1bef723b-a2a4-4547-b29f-63cf9c78d813"> + <name>OPI_Notion</name> + <synonym> + <key>ru</key> + <value>Методы работы с Notion (ОПИ)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="21b89e7a-e792-4a4c-9d01-c630225fe48a"> + <name>OPI_Slack</name> + <synonym> + <key>ru</key> + <value>Slack</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="fe603e76-e34a-40fd-977d-ee3c2dbc6620"> + <name>OPI_Telegram</name> + <synonym> + <key>ru</key> + <value>Методы интеграции с Telegram (ОПИ)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="748f90c6-8251-482b-a249-b0372df0c72e"> + <name>OPI_Twitter</name> + <synonym> + <key>ru</key> + <value>Методы работы с Twitter (ОПИ)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="1ab0a76a-246d-4037-97c3-212d680aa589"> + <name>OPI_VK</name> + <synonym> + <key>ru</key> + <value>Методы интеграции с VK (ОПИ)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="ece78a60-71c0-4443-a6e4-63dd8a7b10d0"> + <name>OPI_Viber</name> + <synonym> + <key>ru</key> + <value>Методы интеграции с Viber (ОПИ)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="af0b34e8-10fa-414f-a643-915210c6289a"> + <name>OPI_YandexDisk</name> + <synonym> + <key>ru</key> + <value>Методы работы с Yandex Disk (ОПИ)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="32379ca2-0f58-4143-9b34-cb552c54b962"> + <name>OPI_YandexID</name> + <synonym> + <key>ru</key> + <value>Методы работы с Yandex ID (ОПИ)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="e810f1d2-6714-4c85-94b1-c3ce20788e78"> + <name>OPI_Инструменты</name> + <synonym> + <key>ru</key> + <value>OPI инструменты</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="55bb3987-d7ac-4ed7-a6fd-aa4cfeb61c27"> + <name>OPI_Криптография</name> + <synonym> + <key>ru</key> + <value>Криптография (OPI)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="546edcad-c9a0-4823-a44c-fefd7200de6c"> + <name>OPI_ПолучениеДанныхТестов</name> + <synonym> + <key></key> + <value>OPI получение данных тестов</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="e15aee63-1565-4f37-ba54-4d4e79723fc5"> + <name>OPI_ПреобразованиеТипов</name> + <synonym> + <key>ru</key> + <value>Преобразование типов (OPI)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="ca6868b2-8987-4ae3-9d97-50a8becc72df"> + <name>OPI_Тесты</name> + <synonym> + <key></key> + <value>OPI тесты</value> + </synonym> + <synonym> + <key>ru</key> + <value>Тесты для YaxUnit (ОПИ)</value> + </synonym> + <server>true</server> + <externalConnection>true</externalConnection> + <clientOrdinaryApplication>true</clientOrdinaryApplication> +</mdclass:CommonModule> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" xmlns:mdclassExtension="http://g5.1c.ru/v8/dt/metadata/mdclass/extension" uuid="aa51f610-7ed3-4091-8908-8ecccf0aaf0f"> + <name>OpenIntegrations</name> + <synonym> + <key>ru</key> + <value>Открытый пакет интеграций</value> + </synonym> + <objectBelonging>Adopted</objectBelonging> + <extension xsi:type="mdclassExtension:ConfigurationExtension"> + <defaultRunMode>Checked</defaultRunMode> + <usePurposes>Checked</usePurposes> + <interfaceCompatibilityMode>Checked</interfaceCompatibilityMode> + </extension> + <containedObjects classId="9cd510cd-abfc-11d4-9434-004095e12fc7" objectId="12689443-2950-4e3b-b313-9a692b6acac7"/> + <containedObjects classId="9fcd25a0-4822-11d4-9414-008048da11f9" objectId="f6f98fbd-010a-4aba-8f11-01203bbc59c7"/> + <containedObjects classId="e3687481-0a87-462c-a166-9f34594f9bba" objectId="33990ba2-16f0-473d-851f-a9132c777ed6"/> + <containedObjects classId="9de14907-ec23-4a07-96f0-85521cb6b53b" objectId="917bb154-d76e-42a4-b161-336b7c57a1ac"/> + <containedObjects classId="51f2d5d8-ea4d-4064-8892-82951750031e" objectId="793db0b3-8d01-4f55-982c-73cb3d4547da"/> + <containedObjects classId="e68182ea-4237-4383-967f-90c1e3370bc7" objectId="c67ca98f-c017-4f18-8175-02819e09b383"/> + <containedObjects classId="fb282519-d103-4dd3-bc12-cb271d631dfc" objectId="c9ed170a-ffaa-4859-9d92-fd1cbc7051b3"/> + <keepMappingToExtendedConfigurationObjectsByIDs>true</keepMappingToExtendedConfigurationObjectsByIDs> + <namePrefix>OPI_</namePrefix> + <configurationExtensionCompatibilityMode>8.3.9</configurationExtensionCompatibilityMode> + <configurationExtensionPurpose>Customization</configurationExtensionPurpose> + <defaultRunMode>ManagedApplication</defaultRunMode> + <usePurposes>PersonalComputer</usePurposes> + <scriptVariant>Russian</scriptVariant> + <vendor>Bayselonarrend</vendor> + <version>1.9.0</version> + <detailedInformation> + <key>ru</key> + <value>Открытый пакет интеграций - набор библиотек для интеграции с некоторыми популярными API для 1C:Enterprise. Он состоит из общих модулей, каждый из которых отвечает за свой API, а также нескольких модулей-инструментов, общих для всех.</value> + </detailedInformation> + <vendorInformationAddress> + <key>ru</key> + <value>https://github.com/Bayselonarrend</value> + </vendorInformationAddress> + <configurationInformationAddress> + <key>ru</key> + <value>https://github.com/Bayselonarrend/OpenIntegrations</value> + </configurationInformationAddress> + <languages uuid="0e858b44-34f3-4d20-986d-13290bb5ba5a"> + <name>Русский</name> + <objectBelonging>Adopted</objectBelonging> + <extension xsi:type="mdclassExtension:LanguageExtension"> + <languageCode>Checked</languageCode> + </extension> + <languageCode>ru</languageCode> + </languages> + <subsystems>Subsystem.OPI_Интеграция</subsystems> + <commonModules>CommonModule.OPI_Инструменты</commonModules> + <commonModules>CommonModule.OPI_Криптография</commonModules> + <commonModules>CommonModule.OPI_ПреобразованиеТипов</commonModules> + <commonModules>CommonModule.OPI_Telegram</commonModules> + <commonModules>CommonModule.OPI_VK</commonModules> + <commonModules>CommonModule.OPI_Viber</commonModules> + <commonModules>CommonModule.OPI_Twitter</commonModules> + <commonModules>CommonModule.OPI_Notion</commonModules> + <commonModules>CommonModule.OPI_YandexID</commonModules> + <commonModules>CommonModule.OPI_YandexDisk</commonModules> + <commonModules>CommonModule.OPI_GoogleWorkspace</commonModules> + <commonModules>CommonModule.OPI_GoogleCalendar</commonModules> + <commonModules>CommonModule.OPI_GoogleDrive</commonModules> + <commonModules>CommonModule.OPI_GoogleSheets</commonModules> + <commonModules>CommonModule.OPI_Slack</commonModules> + <commonModules>CommonModule.OPI_Airtable</commonModules> + <commonModules>CommonModule.OPI_Dropbox</commonModules> + <commonModules>CommonModule.OPI_Тесты</commonModules> + <commonModules>CommonModule.OPI_ПолучениеДанныхТестов</commonModules> +</mdclass:Configuration> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/> 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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<mdclass:Subsystem xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="86c261d7-2729-405f-9d39-5d9104a56bd1"> + <name>OPI_Интеграция</name> + <synonym> + <key>ru</key> + <value>Интеграция</value> + </synonym> + <includeHelpInContents>true</includeHelpInContents> + <includeInCommandInterface>true</includeInCommandInterface> + <content>CommonModule.OPI_Инструменты</content> + <content>CommonModule.OPI_Криптография</content> + <content>CommonModule.OPI_ПреобразованиеТипов</content> + <content>CommonModule.OPI_VK</content> + <content>CommonModule.OPI_Telegram</content> + <content>CommonModule.OPI_Viber</content> + <content>CommonModule.OPI_Twitter</content> + <content>CommonModule.OPI_Notion</content> + <content>CommonModule.OPI_YandexID</content> + <content>CommonModule.OPI_YandexDisk</content> + <content>CommonModule.OPI_GoogleWorkspace</content> + <content>CommonModule.OPI_GoogleCalendar</content> + <content>CommonModule.OPI_GoogleDrive</content> + <content>CommonModule.OPI_GoogleSheets</content> + <content>CommonModule.OPI_Slack</content> + <content>CommonModule.OPI_Airtable</content> + <content>CommonModule.OPI_Тесты</content> + <content>CommonModule.OPI_ПолучениеДанныхТестов</content> +</mdclass:Subsystem> 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:", +"<Данные": "<Data", +"массива": "array", +"события": "events", +"Команда": "Command", +"Колонки": "Columns", +"Строчный": "StringType", +"Вставить": "Insert", +"Свойства": "Properties", +"параметр": "parameter", +"описания": "descriptions", +"указания": "indications", +"Действие": "Action", +"Свойство": "Property", +"ID блока": "Block ID", +"СтрДлина": "StrLength", +"Основная": "Main", +"ID книги": "BookID", +"ИмяЛиста": "SheetName", +"Добавить": "Add", +"ПоляБазы": "BaseFields", +"Свернуть": "Collapse", +"Подборки": "Selections", +"Числовой": "Numeric", +"В работе": "InProgress", +"Описание": "Description", +"СтрНайти": "StrFind", +"ТипМедиа": "MediaType", +"название": "name", +"ТипЧисло": "TypeNumber", +"значения": "values", +"Вариант1": "Option1", +"ИмеетТип": "HasType", +"Вариант2": "Option2", +"Вложения": "Attachments", +"Вложение": "Attachment", +"ключевой": "key", +"Страница": "Page", +"страницы": "pages", +"Кнопка 1": "Button 1", +"описание": "description", +"Кнопка 2": "Button 2", +"событиях": "events", +"IDРаботы": "JobID", +"URLФайла": "FileURL", +"НовоеИмя": "NewName", +"Оригинал": "Original", +"ЭтоКанал": "IsChannel", +"Подробно": "Detailed", +"Кнопка 3": "Button 3", +"ВКорзину": "ToCart", +"загрузки": "upload", +"ИДТовара": "ProductID", +"Точность": "Precision", +"описаний": "descriptions", +"IDКанала": "ChannelID", +"каталога": "directory", +"варианты": "variants", +"Параметр": "Parameter", +"ОткудаID": "FromID", +"IDИконки": "IconID", +"JSONДата": "JSONDate", +"действий": "actions", +"Максимум": "Maximum", +"Родитель": "Parent", +"ЭтотФайл": "ThisFile", +"ИмяМедиа": "MediaName", +"отправки": "of sending", +"подойдет": "suit", +"ДропБокс": "Dropbox", +"Приемник": "Receiver", +"Источник": "Source", +"работать": "work", +"ОбъектВК": "VKObject", +"Получить": "Get", +"Загрузка": "Upload", +"НЕ JSON:": "NOT JSON:", +"СтрВсего": "StrTotal", +"указании": "indication", +"ПутьФайл": "FilePath", +"Записать": "Write", +"значение": "value", +"Не JSON:": "Not JSON:", +"ID поста": "Post ID", +"ДатаСтоп": "EndDate", +"Документ": "Document", +"Значения": "Values", +"МассивИД": "IDArray", +"Название": "Name", +"магазина": "store", +"страницу": "page", +"ИмяФайла": "FileName", +"Двоичные": "Binary", +"ФайлСлак": "SlackFile", +"Смещение": "Offset", +"СтрокаТЗ": "DataString", +"Разметка": "Markup", +"ИДРаботы": "WorkID", +"Картинка": "Image", +"Сообщить": "Notify", +"Значение": "Value", +"Телеграм": "Telegram", +"Подборка": "Selection", +"Свойства_": "Properties_", +"СтрШаблон": "StrTemplate", +"Изменение": "Change", +"ПутьКСтат": "PathToStat", +"Значение:": "Value:", +"Сигнатура": "Signature", +"IDАльбома": "AlbumID", +"ВерсияАпи": "APIVersion", +"Выражение": "Expression", +"Константы": "Constants", +"Результат": "Result", +"Приватный": "Private", +"параметра": "parameter", +"ID канала": "Channel ID", +"изменения": "change", +"Рекламный": "Advertising", +"Анонимный": "Anonymous", +"отражения": "reflection", +"Подборки_": "Selections_", +"ДатаСтарт": "StartDate", +"В корзину": "To cart", +"ТекущийИД": "CurrentID", +"ИДОбъекта": "ObjectID", +"URLФайла2": "URLFile2", +"Категории": "Categories", +"ИмяПакета": "PackageName", +"ПутьКопии": "CopyPath", +"Вариант 2": "Option 2", +"Категория": "Category", +"Удаленный": "Remote", +"ИмяМетода": "MethodName", +"Доступные": "Available", +"неактивен": "inactive", +"Строковое": "String", +"ИДАльбома": "AlbumID", +"ВидеоПуть": "VideoPath", +"АудиоПуть": "AudioPath", +"Выполнить": "Execute", +"ГифкаПуть": "GifPath", +"ПутьЛогов": "LogPath", +"Структура": "Structure", +"URLФайла1": "URLFile1", +"сообщений": "messages", +"URL файла": "File URL", +"доступных": "available", +"ID товара": "Product ID", +"ИначеЕсли": "ElseIf", +"НовыйТест": "NewTest", +"Процедура": "Procedure", +"Имя папки": "Folder name", +"ВКонтакте": "VK", +"Кодировка": "Encoding", +"Вариант 1": "Option 1", +"Параметр_": "Parameter_", +"HTTPОтвет": "HTTPResponse", +"Значение2": "Value2", +"Значение1": "Value1", +"Заголовок": "Title", +"ИДЖелтого": "YellowID", +"Параметры": "Parameters", +"ТокенБота": "BotToken", +"Заполнено": "Filled", +"ТипСтрока": "TypeString", +"подлинный": "genuine", +"Календарь": "Calendar", +"добавлять": "add", +"окончания": "of end", +"Коллекция": "Collection", +"Картинка1": "Image1", +"Картинка2": "Image2", +"приходить": "come", +"Заголовки": "Headers", +"НовыйЛист": "NewSheet", +"Сообщение": "Message", +"ТипДанных": "DataType", +"возвращать": "return", +"дальнейших": "further", +"на сервере": "on the server", +"информация": "information", +"сертификат": "certificate", +"информации": "information", +"Параметры_": "Parameters_", +"перестанет": "will stop", +"сообщениях": "messages", +"Разрешения": "Permissions", +"МассивЧата": "ChatArray", +"участникам": "to participants", +"возвращает": "returns", +"Статистика": "Statistics", +"ФорматДаты": "DateFormat", +"информацию": "information", +"проведения": "of the event", +"Соединение": "Connection", +"Расширение": "Extension", +"Файл видео": "Video file", +"Файл аудио": "Audio file", +"Параметры:": "Parameters:", +"Файл гифки": "GIF file", +"ДанныеПоля": "FieldData", +"ID альбома": "Album ID", +"ПутьКФайлу": "FilePath", +"библиотек:": "libraries:", +"параметров": "parameters", +"библиотеки": "libraries", +"Текст тега": "Tag text", +"УдалитьТег": "DeleteTag", +"УДАЛИТЬТЕГ": "DELETETAG", +"пожаловать": "welcome", +"ВидЗапроса": "RequestType", +"Клавиатура": "Keyboard", +"СтараяЦена": "OldPrice", +"ID диалога": "Dialog ID", +"конкретное": "specific", +"они разные": "they are different", +"Токен бота": "Bot token", +"Имя товара": "Product name", +"ИДКартинки": "ImageID", +"Приложение": "Application", +"НовяИконка": "NewIcon", +"ИмяТаблицы": "TableName", +"Новый файл": "NewFile", +"Библиотека": "Library", +"ООО Вектор": "LLC Vector", +"ИДКаталога": "CatalogID", +"ДатаНачала": "StartDate", +"ТокенКанал": "ChannelToken", +"ИДВарианта": "VariantID", +"ЦветКнопок": "ButtonColor", +"ИДКабинета": "CabinetID", +"ИмеетДлину": "HasLength", +"ОжидаетЧто": "ExpectsThat", +"ИДПодборки": "SelectionID", +"ПолныйПуть": "FullPath", +"МассивФото": "PhotoArray", +"Доуступные": "Available", +"ID события": "Event ID", +"Информация": "Information", +"Объявление": "Ad", +"Назначение": "Destination", +"Сохранение": "Save", +"ФайлОтвета": "ResponseFile", +"СтрПроцент": "StrPercentage", +"Бан\/Разбан": "Ban\/Unban", +"Количество": "Quantity", +"СтрТекущее": "StrCurrent", +"HTTPЗапрос": "HTTPRequest", +"IDКабинета": "AccountID", +"IDКартинки": "ImageID", +"Твит с гиф": "Tweet with gif", +"ID Родителя": "Parent ID", +"Новое видео": "NewVideo", +"Удалить тег": "Delete tag", +"АдресаПочты": "EmailAddresses", +"ТипКонтента": "ContentType", +"РефрешТокен": "RefreshToken", +"Петр Петров": "Petr Petrov", +"JSONСтрокой": "JSONString", +"ОписаниеИзм": "EditedDescription", +"НомерГруппы": "GroupNumber", +"Фон истории": "Story background", +"возможность": "possibility", +"Токен Viber": "Viber Token", +"ТекущаяДата": "CurrentDate", +"ID страницы": "Page ID", +"ЗаписатьЛог": "WriteLog", +"Для Asserts": "For Asserts", +"уведомлений": "notifications", +"Для YaxUnit": "For YAxUnit", +"Текст твита": "Tweet text", +"авторизации": "authorization", +"ЗаменаТочки": "DotReplacement", +"РазмерБлока": "BlockSize", +"Уведомления": "Notifications", +"ОбщийРазмер": "TotalSize", +"ПолныйОтвет": "FullResponse", +"МассивПолей": "FieldArray", +"УДАЛИТЬПОСТ": "DELETEPOST", +"ID картинки": "Image ID", +"УдалитьПост": "DeletePost", +"СтрЗаменить": "StringReplace", +"Текст поста": "Post text", +"МассивПутей": "PathsArray", +"ID подборок": "Selection IDs", +"ID подборки": "Selection ID", +"ID свойства": "Property ID", +"ID варианта": "Variant ID", +"ЦелевойПуть": "TargetPath", +"СОЗДАТЬПОСТ": "CREATEPOST", +"СоздатьПост": "CreatePost", +"ДОБАВИТЬТЕГ": "ADDTAG", +"Комментарий": "Comment", +"Медиагруппа": "MediaGroup", +"Стандартные": "Standard", +"ТекстОтвета": "ReplyText", +"ОбщийДоступ": "PublicAccess", +"медиагруппы": "media groups", +"ОбщийМодуль": "CommonModule", +"МетодПоиска": "SearchMethod", +"НоваяСтрока": "NewLine", +"УдалитьЛист": "DeleteSheet", +"УДАЛИТЬЛИСТ": "DELETESHEET", +"СоздатьБазу": "CreateDatabase", +"СОЗДАТЬБАЗУ": "CREATEDATABASE", +"СКАЧАТЬФАЙЛ": "DOWNLOADFILE", +"СкачатьФайл": "DownloadFile", +"ДобавитьТег": "AddTag", +"ИмяКонтакта": "ContactName", +"JSON данные": "JSON data", +"СОЗДАТЬПОЛЕ": "CREATEFIELD", +"ТекущийКлюч": "Current key", +"ИмяСодержит": "NameContains", +"миллиметрах": "millimeters", +"ПолеОтметки": "TimestampField", +"ДанныеСхемы": "SchemaData", +"ТипВложений": "AttachmentsType", +"ТекущийФайл": "CurrentFile", +"УДАЛИТЬФАЙЛ": "DELETEFILE", +"Разделитель": "Delimiter", +"УдалитьФайл": "DeleteFile", +"СоздатьПоле": "CreateField", +"указывается": "specified", +"МассивВидео": "Video array", +"МассивГифок": "Gif array", +"МассивМедиа": "MediaArray", +"МассивСвязи": "LinkArray", +"Тема канала": "Channel topic", +"конкретному": "specific", +"УдалитьБлок": "DeleteBlock", +"ВЕРНУТЬБЛОК": "RETURNBLOCK", +"МассивЯчеек": "Cell array", +"СтрокаФайла": "FileString", +"ОтборПоТипу": "FilterByType", +"ТекстКнопки": "ButtonText", +"Остаток. -1": "Balance. -1", +"расширением": "extension", +"ОтборСтрока": "FilterString", +"СоздатьБлок": "CreateBlock", +"IDСообщения": "MessageID", +"РазмерЧасти": "ChunkSize", +"СОЗДАТЬБЛОК": "CREATEBLOCK", +"Сортировать": "Sort", +"Авторизация": "Authorization", +"Цель канала": "Channel purpose", +"ОтветМассив": "ResponseArray", +"ВернутьБлок": "ReturnBlock", +"Цена товара": "Product price", +"УДАЛИТЬБЛОК": "DELETEBLOCK", +"Новый товар": "New product", +"IDОригинала": "OriginalID", +"ИмяПараметра": "ParameterName", +"МассивКнопок": "ButtonArray", +"IDОбъявления": "AdID", +"УдалитьТовар": "DeleteProduct", +"УДАЛИТЬТОВАР": "DELETEITEM", +"ID, Значение": "ID, Value", +"ТекущийТовар": "CurrentProduct", +"СписокКоманд": "CommandList", +"ЦветнойВывод": "ColorOutput", +"ОсновноеФото": "MainPhoto", +"ОднаПодОдной": "OneByOne", +"ЦелеваяСтена": "Target wall", +"СОЗДАТЬОПРОС": "CREATEPOLL", +"Создать пост": "Create post", +"Удалить пост": "Delete post", +"КодировкаURL": "URLencoding", +"РазмерДанных": "DataSize", +"ЗаписьТекста": "TextRecord", +"ТипКоллекции": "CollectionType", +"опубликована": "published", +"использовать": "use", +"ID календаря": "Calendar ID", +"КлючКартинка": "ImageKey", +"Base64Строка": "Base64String", +"Тип вложений": "Attachments type", +"периодически": "periodically", +"ОтборКоманды": "CommandSelection", +"Длительность": "Duration", +"пользователя": "user", +"ОписаниеТипа": "TypeDescription", +"IDОбсуждения": "DiscussionID", +"Твит с видео": "Tweet with video", +"МассивНабора": "Array of Sets", +"ДневнойЛимит": "DailyLimit", +"Соответствие": "Match", +"СоздатьОпрос": "CreatePoll", +"СтрокаВызова": "CallString", +"ИДОбсуждения": "DiscussionID", +"ПараметрыURL": "URLParameters", +"Файл размера": "File size", +"Удалить блок": "Delete block", +"ТолькоОснова": "OnlyBase", +"формирования": "formation", +"СтруктураURL": "URLStructure", +"МассивБлоков": "BlockArray", +"Создать блок": "Create block", +"ОбъектИконка": "Icon object", +"Архивирована": "Archived", +"БезВозвратно": "Irrecoverable", +"Скачать файл": "Download file", +"Добавить тег": "Add tag", +"Неопределено": "Undefined", +"МассивДанных": "Data array", +"Удалить лист": "DeleteSheet", +"Рефреш токен": "Refresh token", +"СтрРазделить": "StrSplit", +"ОсновнойЦвет": "PrimaryColor", +"ЧислоВСтроку": "NumberToString", +"ДопЗаголовки": "AdditionalHeaders", +"МассивФайлов": "ArrayOfFiles", +"ОтветСтрокой": "ResponseString", +"загружаемого": "uploading", +"Существующее": "Existing", +"РодительБаза": "ParentBase", +"СтрокаДанных": "DataString", +"СоздатьПапку": "CreateFolder", +"Число,Строка": "Number, String", +"Строка,Число": "String, Number", +"ДокументПуть": "DocumentPath", +"КартинкаПуть": "ImagePath", +"Удалить файл": "Delete file", +"ИЗМЕНИТЬПОЛЕ": "CHANGEFIELD", +"ИзменитьПоле": "ModifyField", +"ПолучитьФайл": "GetFile", +"ТекстСправки": "HelpText", +"Пользователь": "User", +"ДатаОтправки": "Sending date", +"СтрСоединить": "StrJoin", +"МассивТекста": "TextArray", +"ЭтоКоллекция": "ThisIsCollection", +"Дублирования": "duplicates", +"СКАЧАТЬПАПКУ": "DOWNLOADFOLDER", +"НовыйПрефикс": "NewPrefix", +"СкачатьПапку": "DownloadFolder", +"МассивЛишних": "ExtraArray", +"МассивЛистов": "SheetArray", +"ДобавитьПоле": "AddField", +"Создать базу": "Create base", +"МассивТаблиц": "TableArray", +"Создать поле": "Create field", +"СОЗДАТЬПАПКУ": "CREATEFOLDER", +"пустой ответ": "empty response", +"Использовать": "Use", +"Пользователи": "Users", +"ОбновитьФайл": "UpdateFile", +"ОБНОВИТЬФАЙЛ": "UPDATEFILE", +"СОЗДАТЬКАНАЛ": "CREATECHANNEL", +"СоздатьКанал": "CreateChannel", +"Имя контакта": "Contact name", +"СоздатьКнигу": "CreateBook", +"URL картинки": "Image URL", +"СОЗДАТЬКНИГУ": "CREATEBOOK", +"Наименование": "Name", +"пользователю": "to user", +"ДобавитьЛист": "AddSheet", +"ID чата темы": "Thread chat ID", +"ДОБАВИТЬЛИСТ": "ADDSHEET", +"возвращающий": "returning", +"Используется": "Used", +"ПолучитьКнигу": "GetBook", +"Новая таблица": "NewTable", +"КодУстройства": "DeviceCode", +"Вопрос опроса": "Poll question", +"ОТПРАВИТЬФАЙЛ": "SENDFILE", +"ОтправитьФайл": "SendFile", +"ОбновитьТокен": "RefreshToken", +"Создать опрос": "Create poll", +"ОтветПроверки": "CheckResponse", +"КартинкаПоста": "PostImage", +"Массив кнопок": "Array of buttons", +"ОБНОВИТЬТОКЕН": "UPDATETOKEN", +"UnixИстечение": "UnixExpiration", +"ПОЛУЧИТЬКНИГУ": "GETBOOK", +"ID обсуждения": "Discussion ID", +"СвойстваЛиста": "Sheet properties", +"ТекущиеДанные": "Current data", +"РазмерТекущих": "CurrentSize", +"НомерТелефона": "PhoneNumber", +"ТекущийМассив": "Current array", +"ЗагрузкаВидео": "VideoUpload", +"ПоставитьЛайк": "LikePost", +"ВладелецВидео": "VideoOwner", +"АдресЗагрузки": "UploadURL", +"ТекущийСтатус": "CurrentStatus", +"СДЕЛАТЬРЕПОСТ": "MAKEREPOST", +"СделатьРепост": "MakeRepost", +"Массив файлов": "Files array", +"ПолучитьКанал": "GetChannel", +"ТаблицаТестов": "TestTable", +"Тестовая база": "TestDatabase", +"ПутьОригинала": "OriginalPath", +"НовыйРодитель": "NewParent", +"Тестовая цель": "TestGoal", +"существующего": "existing", +"УдалитьАльбом": "DeleteAlbum", +"УДАЛИТЬАЛЬБОМ": "DELETEALBUM", +"ДОБАВИТЬТОВАР": "ADDITEM", +"ДатаОкончания": "EndDate", +"ДобавитьТовар": "AddProduct", +"ИДКомментария": "CommentID", +"СписокТоваров": "ProductList", +"УДАЛИТЬОБЪЕКТ": "DELETEOBJECT", +"ID объявления": "Ad ID", +"УдалитьОбъект": "DeleteObject", +"Создать папку": "Create folder", +"Администратор": "Administrator", +"Создать книгу": "CreateBook", +"Строка, Число": "String, Number", +"Скачать папку": "Download folder", +"СОЗДАТЬАЛЬБОМ": "CREATEALBUM", +"не ограничено": "unlimited", +"Тестовая тема": "TestTopic", +"Обновить файл": "Update file", +"СтрокаНомеров": "NumbersString", +"НомерКампании": "CampaignNumber", +"ТекущийОбъект": "CurrentObject", +"ПОЛУЧИТЬКАНАЛ": "GETCHANNEL", +"СоздатьАльбом": "CreateAlbum", +"Дата создания": "CreationDate", +"СтрокаТоваров": "ProductsString", +"Удалить товар": "Delete product", +"МассивТоваров": "Array of products", +"ИЗМЕНИТЬТОВАР": "CHANGEITEM", +"ИзменитьТовар": "EditProduct", +"Тестовый лист": "TestSheet", +"Добавить лист": "AddSheet", +"Идентификатор": "Identifier", +"ПОСТАВИТЬЛАЙК": "PUTLIKE", +"ЗагрузитьФайл": "UploadFile", +"ПокинутьКанал": "LeaveChannel", +"ПолучитьТокен": "GetToken", +"СтруктураДаты": "DateStructure", +"ВозможныеПути": "PossiblePaths", +"ДФ=yyyy-MM-dd": "DF=yyyy-MM-dd", +"РазложитьJSON": "ParseJSON", +"РАЗЛОЖИТЬJSON": "PARSEJSON", +"ЭтоОтложенное": "IsDelayed", +"ОТКРЫТЬДИАЛОГ": "OPENDIALOG", +"Блок картинки": "Image block", +"МассивКаналов": "ChannelArray", +"ЗАГРУЗИТЬФАЙЛ": "UPLOADFILE", +"Создать канал": "Create channel", +"СоздатьЗапрос": "CreateRequest", +"Число, Строка": "Number, String", +"НомерСтраницы": "PageNumber", +"ОткрытьДиалог": "OpenDialog", +"ОбъектОбложка": "Cover object", +"пустая строка": "empty string", +"ВставитьПосле": "InsertAfter", +"ОписаниеТипов": "TypeDescription", +"Новое событие": "New event", +"ТекущийРаздел": "CurrentSection", +"Файл с Base64": "Base64 File", +"ПОЛУЧИТЬТОКЕН": "GETTOKEN", +"Экранирование": "Escaping", +"Метод,Область": "Method,Region", +"ПОКИНУТЬКАНАЛ": "LEAVECHANNEL", +"СтрокаЗаписей": "RecordString", +"Версия: 2.4.8": "Version: 2.4.8", +"УдалитьЗаписи": "DeletePosts", +"Адрес объекта": "Object address", +"СОЗДАТЬЗАПИСИ": "CREATEPOSTS", +"ВыборЗначения": "ValueSelection", +"МассивСобытий": "ArrayOfEvents", +"СтруктураПоля": "FieldStructure", +"СоздатьЗаписи": "CreatePosts", +"ДатаИстечения": "ExpirationDate", +"Файл картинки": "Image file", +"ВывестиСтроку": "PrintString", +"Изменить поле": "Modify field", +"УДАЛИТЬЗАПИСИ": "DELETERECORDS", +"ПодСообщением": "UnderMessage", +"Описание поля": "Field description", +"ЗАКРЫТЬДИАЛОГ": "CLOSEDIALOG", +"МассивОтветов": "AnswersArray", +"ЗакрытьДиалог": "CloseDialog", +"МассивТоваров_": "Array_of_Products", +"Покинуть канал": "Leave channel", +"ПараметрыТеста": "TestParameters", +"РабочийКаталог": "WorkingDirectory", +"Получить канал": "Get channel", +"Новое описание": "New description", +"Получить книгу": "GetBook", +"Изменяет имя и": "Changes name and", +"ID базы данных": "Database ID", +"ОТПРАВИТЬВИДЕО": "SENDVIDEO", +"ОтправитьВидео": "SendVideo", +"СоздатьТаблицу": "CreateTable", +"СОЗДАТЬТАБЛИЦУ": "CREATETABLE", +"МассивПодборок": "SelectionArray", +"Удалить записи": "Delete records", +"СтрНачинаетсяС": "StringStartsWith", +"СОЗДАТЬСОБЫТИЕ": "CREATEEVENT", +"ИДПользователя": "UserID", +"СтрокаПодборок": "SelectionsString", +"СтрОбщийРазмер": "StrTotalSize", +"Удалить объект": "Delete object", +"СтруктураФайла": "FileStructure", +"СтруктураОпций": "OptionsStructure", +"ГлавныйВГруппе": "MainInGroup", +"Создать записи": "Create records", +"Обновить токен": "Refresh token", +"Изменить товар": "Edit product", +"Библиотека: VK": "Library: VK", +"ВСТУПИТЬВКАНАЛ": "JOINCHANNEL", +"Файл, Значение": "File, Value", +"КлючПриложения": "AppKey", +"Тип клавиатуры": "KeyboardType", +"ВступитьВКанал": "JoinChannel", +"Отправить файл": "SendFile", +"ОтправкаВКанал": "SendingToChannel", +"IDПользователя": "UserID", +"ТекущаяОбласть": "CurrentRegion", +"ОтправитьОпрос": "SendPoll", +"Получить токен": "Get token", +"ПолучитьЗапись": "GetRecord", +"ПОЛУЧИТЬЗАПИСЬ": "GETRECORD", +"ОТПРАВИТЬОПРОС": "SENDPOLL", +"УДАЛИТЬWEBHOOK": "DELETEWEBHOOK", +"ПолноеИмяМедиа": "FullMediaName", +"СтруктураМедиа": "MediaStructure", +"МассивКартинок": "ImageArray", +"УдалитьWebhook": "DeleteWebhook", +"ПОЛУЧИТЬОБЪЕКТ": "GETOBJECT", +"СтрокаВложений": "AttachmentsString", +"ПараметрМетода": "MethodParameter", +"Новое название": "New name", +"ОписаниеТовара": "ProductDescription", +"Добавить товар": "Add product", +"МассивЗапросов": "ArrayOfRequests", +"Закрыть диалог": "Close dialog", +"МассивСтруктур": "Array of Structures", +"Перезаписывать": "Overwrite", +"НомерКатегории": "CategoryNumber", +"МассивИДПостов": "Array of post IDs", +"Номер страницы": "Page number", +"Загрузить файл": "Upload file", +"Файл документа": "Document file", +"МассивОписания": "DescriptionArray", +"Сделать репост": "Make repost", +"ТекущийЭлемент": "CurrentElement", +"ОТПРАВИТЬГИФКУ": "SENDGIF", +"Поставить лайк": "Like", +"МассивОтправки": "SendArray", +"Описание видео": "Video description", +"ОписаниеЗаписи": "RecordDescription", +"Удалить альбом": "Delete album", +"Создать альбом": "Create album", +"Открыть диалог": "Open dialog", +"ПолучитьОбъект": "GetObject", +"Путь к объекту": "Path to the object", +"СтруктураЯчеек": "CellStructure", +"Номер телефона": "Phone number", +"КартинкаЗамены": "ReplacementImage", +"Тестовая папка": "TestFolder", +"ТолькоПросмотр": "ViewOnly", +"НазваниеФайла1": "FileName1", +"Твит с опросом": "Tweet with poll", +"ЗаписатьСтроку": "WriteString", +"ТекущаяКоманда": "CurrentCommand", +"HTTPСоединение": "HTTPConnection", +"ТекущеВложение": "CurrentAttachment", +"АТ_СоздатьПоле": "AT_CreateField", +"ТекущаяПозиция": "CurrentPosition", +"УдалитьСобытие": "DeleteEvent", +"УДАЛИТЬСОБЫТИЕ": "DELETEEVENT", +"ТаблицаСостава": "CompositionTable", +"АТ_СоздатьБазу": "AT_CreateDatabase", +"ОЧИСТИТЬЯЧЕЙКИ": "CLEARCELLS", +"Тестовый товар": "TestProduct", +"ПолучитьПревью": "GetPreview", +"СтрочныйМассив": "StringArray", +"МассивВложений": "AttachmentsArray", +"КОПИРОВАТЬЛИСТ": "COPYSHEET", +"КопироватьЛист": "CopySheet", +"Тестовый твитт": "TestTweet", +"Отбор по имени": "Filter by name", +"Это новый файл": "This is a new file", +"Новый файл.jpg": "New file.jpg", +"ПутьСохранения": "SavePath", +"ОписаниеМетода": "MethodDescription", +"ОписаниеОшибки": "ErrorDescription", +"ОчиститьЯчейки": "ClearCells", +"Описание файла": "File description", +"ДвоичныеДанные": "BinaryData", +"Текстовый твит": "Text tweet", +"ПОЛУЧИТЬПРЕВЬЮ": "GETPREVIEW", +"МассивОбъектов": "ArrayOfObjects", +"СОЗДАТЬИСТОРИЮ": "CREATEHISTORY", +"Заголовок темы": "Thread title", +"СоздатьИсторию": "CreateStory", +"Копировать лист": "CopySheet", +"ЗагруженныйФайл": "UploadedFile", +"ОписаниеТаблицы": "TableDescription", +"МассивРодителей": "ArrayOfParents", +"Сокращенный URL": "Shortened URL", +"Массив картинок": "Array of images", +"УдалитьПодборку": "DeleteSelection", +"Очистить ячейки": "Clear cells", +"Номер,Строковое": "Number,String", +"Создать историю": "Create story", +"Новый заголовок": "New title", +"ВК_СоздатьОпрос": "VK_CreatePoll", +"Загрузить видео": "Upload video", +"JSON клавиатуры": "Keyboard JSON", +"ID пользователя": "User ID", +"Массив ID медиа": "Media ID array", +"ЗависимостиГугл": "GoogleDependencies", +"ОригиналныйПуть": "OriginalPath", +"IDИнициализации": "InitializationID", +"СтатусОбработки": "ProcessingStatus", +"Отправить опрос": "Send poll", +"СтрокаСигнатуры": "SignatureString", +"ТекущаяДатаUNIX": "CurrentUNIXDate", +"Получить превью": "Get preview", +"СтруктураФайлов": "FileStructure", +"Отправить гифку": "Send GIF", +"СтруктураКнопки": "ButtonStructure", +"Отправить аудио": "Send audio", +"Отправить видео": "Send video", +"ОдиночнаяЗапись": "SingleRecord", +"Команда CLI: vk": "CLI Command: vk", +"МассивУдаляемых": "ArrayOfDeletions", +"ОписаниеСтроки2": "RowDescription2", +"Удалить событие": "Delete event", +"Картинка опроса": "Poll image", +"ЗапросИзменения": "ChangeRequest", +"Удалить Webhook": "Delete webhook", +"ОписаниеСтроки1": "RowDescription1", +"IDПользователей": "UserIDs", +"Текст сообщения": "Message text", +"Создать каталог": "Create folder", +"СократитьСсылку": "ShortenLink", +"ID целевой базы": "Target database ID", +"МассивВариантов": "OptionArray", +"Ключ приложения": "Application key", +"КоллекцияТаблиц": "TableCollection", +"УдалитьКартинку": "DeleteImage", +"установлен свой": "set your", +"Создать таблицу": "Create table", +"Создать событие": "Create event", +"ЗаписатьЦелое16": "WriteInt16", +"МестоПроведения": "Venue", +"СтруктураДанных": "DataStructure", +"Получить объект": "Get object", +"Получить запись": "Get record", +"ПовторитьСтроку": "RepeatString", +"ТипСоответствие": "TypeMatch", +"СтруктураТекста": "TextStructure", +"ИзменитьТаблицу": "ModifyTable", +"ОписаниеСобытия": "EventDescription", +"OPI_Инструменты": "OPI_Tools", +"ЗначенияСвойств": "PropertyValues", +"ЗаголовокПотока": "StreamHeader", +"СтруктураВыбора": "ChoiceStructure", +"Описание товара": "Product description", +"ID целевого чата": "Target chat ID", +"Массив ID постов": "Array of post IDs", +"ВладелецКартинки": "ImageOwner", +"ПараметрыФункции": "FunctionParameters", +"МассивРазрешений": "Permissions array", +"ЗагрузкаКартинки": "ImageUpload", +"Загружаемый файл": "File to be uploaded", +"Отправить ссылку": "SendLink", +"Твит с картинкой": "Tweet with image", +"Коллекция файлов": "File collection", +"СтруктураФормата": "FormatStructure", +"РазделительСтрок": "LineSeparator", +"Code из браузера": "Code from browser", +"Описание таблицы": "Table description", +"ЗапятаяВКавычках": "CommaInQuotes", +"Изменить таблицу": "Modify table", +"Описание события": "Event description", +"ПолучитьДвоичные": "GetBinary", +"СекретПриложения": "AppSecret", +"ПараметрыЗапроса": "RequestParameters", +"HTTPСервисЗапрос": "HTTPServiceRequest", +"ГВ_ПолучитьТокен": "GV_GetToken", +"ГВ_ОбновитьТокен": "GV_UpdateToken", +"Телефон контакта": "Contact phone number", +"Фамилия контакта": "Contact last name", +"Получить таблицу": "Get table", +"ПолучитьПолеДаты": "GetDateField", +"СоответствиеMIME": "MIMETypeMapping", +"УправлениеФайлом": "FileManagement", +"KeyИнициализации": "InitializationKey", +"ИмяФайлаОтправки": "SendingFileName", +"ОтправитьКонтакт": "SendContact", +"Создать страницу": "Create page", +"ПолучитьПараметр": "GetParameter", +"МетодХэширования": "HashingMethod", +"КодироватьСтроку": "EncodeString", +"Массив Из Строка": "Array From String", +"Получить событие": "Get event", +"Тестовый товар 2": "TestProduct2", +"СоздатьТвитВидео": "CreateVideoTweet", +"УдалитьПолностью": "Delete completely", +"превью документа": "document preview", +"СоздатьТвитГифки": "CreateGifTweet", +"МассивКлавиатуры": "KeyboardArray", +"ОписаниеКартинки": "ImageDescription", +"Сократить ссылку": "Shorten link", +"МассивКалендарей": "ArrayOfCalendars", +"МассивСтатистики": "Array of Statistics", +"Канал для отбора": "Channel for selection", +"СтрокаПараметров": "ParameterString", +"Массив из Строка": "Array of Strings", +"Тестовая таблица": "TestTable", +"Вступить в канал": "Join channel", +"ДоступныйОстаток": "AvailableBalance", +"СтрокаФотографий": "PhotoString", +"Удалить картинку": "Delete image", +"Удалить подборку": "DeleteSelection", +"Неактивный : red": "Inactive : red", +"МассивИнформации": "ArrayOfInformation", +"СсылкаПодЗаписью": "LinkUnderPost", +"URLВКодировкеURL": "URLInURLEncoding", +"СоздатьТвитОпрос": "CreatePollTweet", +"МассивИменЛистов": "ArrayOfSheetNames", +"Изменить событие": "Edit event", +"СмещениеОтНачала": "OffsetFromStart", +"ЗаписатьПараметр": "WriteParameter", +"СтруктураСтатуса": "StatusStructure", +"Расширение файла": "File extension", +"МассивПараметров": "ParameterArray", +"Описание альбома": "Album description", +"ВызватьHTTPМетод": "CallHTTPMethod", +"Имя файла в Slack": "File name in Slack", +"ПреобразоватьДату": "ConvertDate", +"Отправить контакт": "Send contact", +"СоответствиеПолей": "FieldMapping", +"ВК_ЗагрузитьВидео": "VK_UploadVideo", +"ЗначениеЗаполнено": "ValueFilled", +"СтруктураРодителя": "ParentStructure", +"ОтправитьКартинку": "SendImage", +"ТаблицаПараметров": "ParametersTable", +"ЗакрытьТемуФорума": "CloseForumThread", +"КалендарьИсточник": "SourceCalendar", +"ГД_СоздатьКаталог": "GD_CreateCatalog", +"СоздатьСоединение": "CreateConnection", +"ГТ_СоздатьТаблицу": "GT_CreateTable", +"Библиотека: Slack": "Library: Slack", +"Удалить календарь": "Delete calendar", +"Текст комментария": "Comment text", +"Удалить сообщение": "Delete message", +"Путь или ID файла": "Path or ID of the file", +"КалендарьПриемник": "TargetCalendar", +"АТ_СоздатьТаблицу": "AT_CreateTable", +"Дата : date": "Date : date", +"Скрытый календарь": "Hidden calendar", +"НаправлениеПоиска": "SearchDirection", +"ОткрытьТемуФорума": "OpenForumThread", +"СтруктураВозврата": "ReturnStructure", +"Файл для загрузки": "File for upload", +"ПараметрЛокальный": "LocalParameter", +"СоответствиеФайла": "FileMapping", +"Массив ID товаров": "Array of product IDs", +"УправлениеТоваром": "ProductManagement", +"Библиотека: Viber": "Library: Viber", +"ИзменитьСообщение": "EditMessage", +"ID целевого поста": "ID of the target post", +"Копировать объект": "Copy object", +"СоздатьБазуДанных": "CreateDatabase", +"Отправить локацию": "SendLocation", +"ВызватьИсключение": "RaiseException", +"ПолучитьСписокБаз": "GetListOfBases", +"ЗакрытьОбсуждение": "CloseDiscussion", +"Данные для API v2": "Data for API v2", +"Строка, Структура": "String, Structure", +"ID блока родителя": "Parent block ID", +"ОткрытьОбсуждение": "OpenDiscussion", +"ОсновнаяСтруктура": "MainStructure", +"ОтветСоответствие": "ResponseCorrespondence", +"Значение свойства": "Property value", +"Новое имя объекта": "New object name", +"Наименование поля": "Field name", +"ОпросСоответствие": "PollCorrespondence", +"Новый комментарий": "NewComment", +"Название свойства": "Property name", +"При отправке URL": "When sending URL", +"Описание картинки": "Image description", +"Тестовая подборка": "TestCollection", +"Получить страницу": "Get page", +"Тестовая кампания": "TestCampaign", +"ВК_СоздатьИсторию": "VK_CreateStory", +"ОсновноеИзмерение": "MajorDimension", +"ЗагруженныеДанные": "UploadedData", +"СоздатьОбсуждение": "CreateDiscussion", +"СтруктураКампании": "CampaignStructure", +"СортироватьПоДате": "SortByDate", +"Название подборки": "Selection name", +"Картинка автотест": "AutoTestImage", +"ПолучитьПолеПочты": "GetEmailField", +"Пост из автотеста": "Post from autotest", +"СоздатьТемуФорума": "CreateForumThread", +"Создать календарь": "Create calendar", +"Наш первый клиент": "OurFirstClient", +"СкопироватьОбъект": "CopyObject", +"Тестовое описание": "TestDescription", +"Секрет приложения": "Application secret", +"СтруктураВарианта": "OptionStructure", +"СтрЗаканчиваетсяНа": "StrEndsWith", +"СуществующаяГруппа": "ExistingGroup", +"ID книги источника": "SourceBookID", +"УправлениеДиалогом": "DialogManagement", +"Идентификатор базы": "Base identifier", +"Архивировать канал": "Archive channel", +"Идентификатор поля": "Field identifier", +"Удаляет пост по id": "Deletes a post by ID", +"URL для сокращения": "URL for shortening", +"Изменить календарь": "Edit calendar", +"ДополнительныеФото": "AdditionalPhotos", +"ПолучитьПолеСсылки": "GetLinkField", +"ПолучитьПолеНомера": "GetNumberField", +"Заголовок страницы": "Page title", +"Тестовое сообщение": "TestMessage", +"ЧЦ=10; ЧДЦ=0; ЧГ=0": "HC=10; HDC=0; HG=0", +"Наименование видео": "Video name", +"Переместить объект": "Move object", +"ID книги приемника": "DestinationBookID", +"ДанныеПользователя": "UserData", +"Тестовый календарь": "TestCalendar", +"ПолучитьСтатистику": "GetStatistics", +"ПолучитьИДКартинки": "GetImageID", +"Команда CLI: slack": "CLI command: slack", +"ПолучитьТоварыПоИД": "GetProductsByID", +"Изменить сообщение": "Edit message", +"Удаляет блок по ID": "Deletes block by ID", +"МассивКлючЗначение": "KeyValueArray", +"ОтправитьСообщение": "SendMessage", +"Тестовая таблица 2": "TestTable2", +"Новое наименование": "New name", +"Анонимность опроса": "Poll anonymity", +"Создать твит опрос": "Create poll tweet", +"ГТ_ПолучитьТаблицу": "GT_GetTable", +"Создать твит видео": "Create video tweet", +"Создать твит гифки": "Create gif tweet", +"СтруктураПараметра": "ParameterStructure", +"СоответствиеИконки": "Icon match", +"Библиотека: Notion": "Library: Notion", +"ДлительностьОпроса": "PollDuration", +"Телеграм_БанРазбан": "Telegram_BanUnban", +"ЛимитПользователей": "UserLimit", +"ПолучитьПолеФлажка": "GetCheckboxField", +"ЗагрузитьМалыйФайл": "UploadSmallFile", +"Имя : title": "Name : title", +"Опубликовать папку": "Publish folder", +"Получить календарь": "Get calendar", +"ЯДиск_СоздатьПапку": "YDisk_CreateFolder", +"Команда CLI: viber": "CLI Command: viber", +"'Желтый','Зеленый'": "'Yellow','Green'", +"СоответствиеФайлов": "FileMapping", +"Работа с доступами": "Access management", +"ИдентификаторФайла": "FileID", +"ПолеИдентификатора": "IdentifierField", +"URL источник файла": "URL source of the file", +"Написать сообщение": "Write a message", +"Открыть обсуждение": "Open discussion", +"Закрыть обсуждение": "Close discussion", +"ДополнительныйЦвет": "SecondaryColor", +"Создать обсуждение": "Create discussion", +"Установить Webhook": "Set Webhook", +"ПараметрВКоллекцию": "ParameterToCollection", +"Активный : green": "Active : green", +"УправлениеСобытием": "EventManagement", +"Отправить картинку": "Send image", +"УдалитьВнешнийФайл": "DeleteExternalFile", +"Токен пользователя": "User token", +"Отправить документ": "Send document", +"Тестовый заголовок": "TestTitle", +"ПолучитьОбновления": "GetUpdates", +"Удалить комментарий": "Delete comment", +"ПолучитьДанныеФайла": "GetFileData", +"МассивПользователей": "ArrayOfUsers", +"Переместить событие": "Move event", +"Создать комментарий": "Create comment", +"Новое описание базы": "New database description", +"Архив : yellow": "Archive : yellow", +"Библиотека: Dropbox": "Library: Dropbox", +"Команда CLI: google": "CLI command: google", +"Скоприровать объект": "Copy object", +"СоответствиеОбложки": "Cover match", +"Команда CLI: gdrive": "CLI Command: gdrive", +"Количество : number": "Quantity : number", +"Структура Из Строка": "Structure From String", +"Создать базу данных": "Create database", +"ПолучитьВнешнийФайл": "GetExternalFile", +"Команда CLI: notion": "CLI command: notion", +"СтруктураПараметров": "ParametersStructure", +"Массив файлов видео": "Video files array", +"Длительность опроса": "Poll duration", +"СгруппироватьТовары": "GroupProducts", +"Получить статистику": "Get statistics", +"Получает файл по ID": "Gets file by ID", +"СтруктураЗаголовков": "HeadersStructure", +"СтруктураКлавиатуры": "KeyboardStructure", +"Массив из Структура": "Array of Structure", +"Массив файлов гифок": "Gif files array", +"Данные для API v1.1": "Data for API v1.1", +"Создает новый канал": "Creates a new channel", +"Наименование канала": "Channel name", +"СоздатьТвитКартинки": "Create image tweet", +"Создать\/Удалить тег": "Create\/Delete tag", +"Структура из Строка": "Structure from String", +"Библиотека: Twitter": "Library: Twitter", +"СоответствиеМетодов": "MethodCorrespondence", +"Команда CLI: yadisk": "CLI command: yadisk", +"Отбор по типу файла": "Filter by file type", +"Опубликовать объект": "Publish object", +"Альбом из автотеста": "AlbumFromAutoTest", +"Создает новую книгу": "Creates a new book", +"Отправляемая ссылка": "SentLink", +"Идентификатор книги": "BookIdentifier", +"ПолучитьТекущуюДату": "GetCurrentDate", +"СоответствиеСобытия": "EventMatch", +"СоответствиеСвойств": "PropertyMatch", +"Удалить тему форума": "Delete forum thread", +"ВК_МетодыОбсуждений": "VK_DiscussionMethods", +"НаписатьВОбсуждение": "WriteInDiscussion", +"Ставит лайк на пост": "Likes a post", +"НаписатьКомментарий": "WriteComment", +"Создает базу данных": "Creates a database", +"Дата начала периода": "Start date of the period", +"Команда CLI: yandex": "CLI Command: yandex", +"Путь внутри объекта": "Path inside the object", +"Измененная подборка": "EditedCollection", +"Открыть тему форума": "Open forum thread", +"Идентификатор файла": "File identifier", +"ПутьЛоговБиблиотеки": "LibraryLogPath", +"Получить список баз": "Get list of bases", +"АльтернативныйТекст": "AlternateText", +"Получить обновления": "Get updates", +"Переименовать канал": "Rename channel", +"ЗаменитьСпецСимволы": "ReplaceSpecialCharacters", +"ПолучитьСписокТегов": "GetTagList", +"РабочееПространство": "Workspace", +"ПолучитьКомментарии": "GetComments", +"Отправить сообщение": "Send message", +"ПолучитьОбщийМодуль": "GetCommonModule", +"Закрепить сообщение": "Pin message", +"Открепить сообщение": "Unpin message", +"Массив Из Структура": "Array of Structures", +"Удаляет тему форума": "Deletes a forum thread", +"Создать тему форума": "Create forum thread", +"Переслать сообщение": "Forward message", +"Закрыть тему форума": "Close forum thread", +"ПолучитьПолеВложения": "GetAttachmentField", +"ответ сервера Google": "Google server response", +"Путь или ID каталога": "Path or ID of the directory", +"Делает репост записи": "Reposts the record", +"ID родительской базы": "Parent database ID", +"Соответствие свойств": "Properties match", +"Получить комментарии": "Get comments", +"ВК_ЛайкРепостКоммент": "VK_LikeRepostComment", +"ЗагрузитьБольшойФайл": "UploadLargeFile", +"ПолучитьПолеТелефона": "GetPhoneField", +"Наименование альбома": "Album name", +"Создать\/Удалить пост": "Create\/Delete post", +"URL к внешнему файлу": "URL to external file", +"Обновленный файл.jpg": "UpdatedFile.jpg", +"Изменить комментарий": "Modify comment", +"Получить комментарий": "Get comment", +"ОтправитьВнешнийФайл": "SendExternalFile", +"ID копируемого листа": "CopiedSheetID", +"Проверка_НоушнОбъект": "Check_NotionObject", +"СоответствиеСимволов": "CharacterMapping", +"Тестовое сообщение 1": "TestMessage1", +"Тестовое сообщение 2": "TestMessage2", +"Список пользователей": "User list", +"Тестовый комментарий": "TestComment", +"Библиотека: Airtable": "Library: Airtable", +"ID страницы родителя": "Parent page ID", +"Изменить тему форума": "Edit forum thread", +"Библиотека: Telegram": "Library: Telegram", +"Свойства базы данных": "Database properties", +"Команда CLI: twitter": "CLI Command: twitter", +"Пустой макет события": "Empty event template", +"ЗаголовокАвторизации": "AuthorizationHeader", +"Аннотация к картинке": "Image annotation", +"Создать\/Удалить блок": "Create\/Delete block", +"Команда CLI: dropbox": "CLI Command: dropbox", +"СоответствиеВозврата": "ReturnMapping", +"МассивСтруктурКнопок": "ArrayOfButtonStructures", +"СтруктураОтправителя": "SenderStructure", +"СоздатьТекстовыйТвит": "CreateTextTweet", +"Написать комментарий": "Write a comment", +"Команда CLI: gsheets": "CLI Command: gsheets", +"Идентификатор канала": "Channel ID", +"ПолучитьПодборкиПоИД": "GetSelectionsByID", +"СоответствиеВарианта": "OptionMap", +"Новый заголовок базы": "New database title", +"Вайбер_ОтправитьФайл": "Viber_SendFile", +"Сгруппировать товары": "Group products", +"Описание нового поля": "Description of the new field", +"Получить базу данных": "Get database", +"Удалить внешний файл": "Delete external file", +"ИзменитьСвойстваБазы": "EditDatabaseProperties", +"СоответствиеЗначений": "ValueMapping", +"ПодчиненнаяСтруктура": "SubordinateStructure", +"ПолучитьСписокФайлов": "GetFilesList", +"Отправить медиагруппу": "Send media group", +"ВыполнитьЗапросСТелом": "ExecuteRequestWithBody", +"ВК_ОтправитьСообщение": "VK_SendMessage", +"Создать\/Изменить поле": "Create\/Edit field", +"Ноушн_СоздатьСтраницу": "Notion_CreatePage", +"Слак_ПолучитьСписокВФ": "Slack_GetExternalFileList", +"ВК_СоздатьУдалитьПост": "VK_CreateDeletePost", +"Твиттер_ОбновитьТокен": "Twitter_UpdateToken", +"Создать\/Изменить базу": "Create\/Edit database", +"Удаляет событие по ID": "Deletes an event by ID", +"ВК_ПолучитьСтатистику": "VK_GetStatistics", +"Создать копию объекта": "Create object copy", +"Идентификатор объекта": "Object identifier", +"ПреобразованныеДанные": "ConvertedData", +"МассивВариантовВыбора": "ChoiceOptionArray", +"Новый текст сообщения": "New message text", +"Новое название канала": "New channel name", +"Строка,ДвоичныеДанные": "String, BinaryData", +"Удаляет файл на Slack": "Deletes a file on Slack", +"Получить данные файла": "Get file data", +"Получить внешний файл": "Get external file", +"Команда CLI: telegram": "CLI command: telegram", +"Заголовок приглашения": "Invitation title", +"В работе : checkbox": "In progress : checkbox", +"МассивВариантовОпроса": "PollOptionsArray", +"Создать твит картинки": "Create image tweet", +"ПолучитьСписокЗаписей": "GetListOfRecords", +"ДвоичныеДанные,Строка": "BinaryData,String", +"СоответствиеЗаголовка": "HeaderMapping", +"ПолучитьСписокКаналов": "GetChannelList", +"ТекстПервогоСообщения": "Text of the first message", +"Написать в обсуждение": "Write in discussion", +"СоответствиеКатегорий": "CategoryCorrespondence", +"Получить товары по ID": "Get products by ID", +"Идентификатор таблицы": "Table identifier", +"Массив описаний полей": "Array of field descriptions", +"Заголовок базы данных": "Database title", +"Библиотека: Yandex ID": "Library: Yandex ID", +"Создает новое событие": "Creates a new event", +"ПолучитьПолеСтроковое": "GetStringField", +"ПолучитьЗначенияЯчеек": "GetCellValues", +"Удаляет лист из книги": "Deletes a sheet from the book", +"Путь сохранения файла": "File save path", +"Ссылка получения кода": "Code retrieval link", +"Добавить внешний файл": "Add external file", +"ОтправлятьУведомления": "SendNotifications", +"ID асинхронной работы": "AsynchronousJobID", +"ID пользователя Viber": "Viber User ID", +"ЗагрузитьФотоНаСервер": "UploadPhotoToServer", +"Получить список тегов": "Get list of tags", +"Получить таблицы базы": "Get base tables", +"Наименование кампании": "Campaign name", +"ПолучитьСписокЗаказов": "GetOrderList", +"ID рекламной кампании": "Advertising campaign ID", +"Команда CLI: airtable": "CLI Command: airtable", +"Загрузить файл по URL": "Upload file by URL", +"СтруктураПользователя": "UserStructure", +"ID целевого сообщения": "Target message ID", +"УдалитьСвойствоТовара": "DeleteProductProperty", +"СоздатьСвойствоТовара": "CreateProductProperty", +"Географическая широта": "Geographic latitude", +"ПолучитьСписокСвойств": "GetPropertyList", +"двоичные данные файла": "binary data of the file", +"ID чата создания темы": "Thread creation chat ID", +"ПолучитьСписокТоваров": "GetProductList", +"ДобавитьТоварВПодборку": "AddProductToSelection", +"Соответствие Из Строка": "Correspondence From String", +"ДропБокс_ЗагрузитьФайл": "Dropbox_UploadFile", +"ЗагрузитьВидеоНаСервер": "UploadVideoToServer", +"ID рекламного кабинета": "Advertising account ID", +"Сделать файл публичным": "Make file public", +"Соответствие из Строка": "Map from String", +"ВК_СоздатьСсылкуТокена": "VK_CreateTokenLink", +"ПолучитьМассивПодборок": "GetSelectionArray", +"Создать составной пост": "Create composite post", +"Путь к папке или файлу": "Path to folder or file", +"Создает твит с опросом": "Creates a tweet with a poll", +"Вайбер_ОтправитьСсылку": "Viber_SendLink", +"СоответствиеПараметров": "ParameterMap", +"Строка, ДвоичныеДанные": "String, BinaryData", +"ВыполнитьЗапросБезТела": "ExecuteRequestWithoutBody", +"Массив описаний блоков": "Array of block descriptions", +"Дневной лимит в рублях": "Daily limit in rubles", +"Новое описание события": "New event description", +"Сделать файл приватным": "Make file private", +"Загружает файл на диск": "Uploads a file to the drive", +"Получить пользователей": "Get users", +"СоздатьПодборкуТоваров": "CreateProductCollection", +"Отправить внешний файл": "Send external file", +"Новое имя главной темы": "New main thread name", +"Загрузить\/Удалить файл": "Upload\/Delete file", +"УдалитьТоварИзПодборки": "RemoveProductFromSelection", +"НаименованиеИзмененное": "EditedName", +"ИзменитьСвойствоТовара": "EditProductProperty", +"Вернуть дочерние блоки": "Return child blocks", +"Массив из Произвольный": "Array of Arbitrary", +"Сообщение из автотеста": "Message from autotest", +"Удаляет подборку по ID": "Deletes the selection by ID", +"Дата окончания периода": "End date of the period", +"Описание : rich_text": "Description : rich_text", +"Возвращаемое значение:": "Return value:", +"Загрузить\/Удалить Файл": "Upload\/Delete file", +"Изменить свойства базы": "Edit database properties", +"Установить цель канала": "Set channel purpose", +"и почитать комментарии": "and read comments", +"Установить тему канала": "Set channel topic", +"Массив файлов картинок": "Image files array", +"Получить токен по коду": "Get token by code", +"Получает список файлов": "Gets the list of files", +"ID изменяемой страницы": "ID of the page being modified", +"Получает событие по ID": "Gets an event by ID", +"ID календаря приемника": "ID of the target calendar", +"Получить список файлов": "Get list of files", +"Создать\/Удалить записи": "Create\/Delete records", +"СтандартныеЗависимости": "StandardDependencies", +"Массив из Строка,Число": "Array of String,Number", +"ПолучитьСписокПодборок": "GetSelectionList", +"Создать текстовый твит": "Create text tweet", +"ID календаря источника": "ID of the source calendar", +"Географическая долгота": "Geographic longitude", +"Команда CLI: gcalendar": "CLI Command: gcalendar", +"Открыть\/Закрыть диалог": "Open\/Close dialog", +"ID файла для скачивания": "File ID for downloading", +"ВК_СоздатьСоставнойПост": "VK_CreateCompositePost", +"Получить список товаров": "Get product list", +"СоздатьПроизвольныйТвит": "CreateCustomTweet", +"УникальныйИдентификатор": "UniqueIdentifier", +"ПолучитьСписокКаталогов": "GetDirectoriesList", +"Путь к объекту удаления": "Path to the object to delete", +"Путь к созаваемой папке": "Path to the created folder", +"Создать страницу в базу": "Create page in database", +"Пустое описание товара:": "Empty product description:", +"Телеграм_ОтправитьОпрос": "Telegram_SendPoll", +"Удаляет календарь по ID": "Deletes a calendar by ID", +"ГД_ЗагрузитьУдалитьФайл": "GD_UploadDeleteFile", +"Наименование новой базы": "New base name", +"Твиттер_СоздатьТвитСГиф": "Twitter_CreateTweetWithGif", +"Наименование обсуждения": "Discussion name", +"МассивURLФайловВложений": "ArrayOfAttachmentURLs", +"Создать\/Удалить событие": "Create\/Delete event", +"Получить значения ячеек": "Get cell values", +"Имя файла с расширением": "File name with extension", +"Идентификатор базы База": "Base identifier Base", +"Текст первого сообщения": "Text of the first message", +"СпособКодированияСтроки": "StringEncodingMethod", +"Какой ваш любимый цвет?": "What's your favorite color?", +"Получить список записей": "Get list of records", +"Создать\/Удалить каталог": "Create\/Delete catalog", +"ЗагрузитьМассивВложений": "Upload attachments array", +"Получить список каналов": "Get channel list", +"Новое название подборки": "New selection name", +"ИсключатьАрхивированные": "ExcludeArchived", +"ПараметрыЗапросаВСтроку": "RequestParametersToString", +"Получить список свойств": "Get property list", +"Создать свойство товара": "Create product property", +"Телеграм_ОтправитьГифку": "Telegram_SendGIF", +"Получить\/Обновить токен": "Get\/Update token", +"Создать канал приватным": "Create channel as private", +"Удалить свойство товара": "Delete product property", +"Библиотека: Yandex Disk": "Library: Yandex Disk", +"Получить историю канала": "Get channel history", +"АТ_СоздатьУдалитьЗаписи": "AT_CreateDeleteRecords", +"Лайк\/Репост\/Комментарий": "Like\/Repost\/Comment", +"ДФ=yyyy-MM-ddTHH:mm:ssZ": "DF=yyyy-MM-ddTHH:mm:ssZ", +"ИзменитьПодборкуТоваров": "EditProductCollection", +"ВК_СоздатьТоварПодборку": "VK_CreateProductSelection", +"Сформировать клавиатуру": "Create keyboard", +"Новый текст комментария": "New comment text", +"ОтправитьМестоположение": "SendLocation", +"Слак_ЗагрузитьУдалитьВФ": "Slack_UploadDeleteExternalFile", +"Массив из Строка, Число": "Array of string, number", +"Получить список заказов": "Get order list", +"Новая картинка подборки": "New selection image", +"Получить подборки по ID": "Get selections by ID", +"ДФ=yyyy-MM-ddThh:mm:ssZ": "ISO8601Datetime", +"ЯДиск_ПереместитьОбъект": "YDisk_MoveObject", +"Получить список событий": "Get list of events", +"Массив вариантов ответа": "Array of answer options", +"Массив ID пользователей": "User ID Array", +"Произвольный, HTTPОтвет": "Arbitrary, HTTP Response", +"Скопированный файл.jpeg": "CopiedFile.jpeg", +"Новое значение свойства": "New property value", +"Массив вариантов опроса": "Poll options array", +"Вайбер_ОтправитьКонтакт": "Viber_SendContact", +"Телеграм_ОтправитьАудио": "Telegram_SendAudio", +"Телеграм_ОтправитьВидео": "Telegram_SendVideo", +"Действия с обсуждениями": "Actions with discussions", +"Вайбер_ОтправитьЛокацию": "Viber_SendLocation", +"ДропБокс_СоздатьКаталог": "Dropbox_CreateFolder", +"для дальнейших действий": "for further actions", +"Получить список областей": "Get region list", +"Набор тестов для YAxUnit": "Test suite for YAxUnit", +"Изменяет название канала": "Changes the name of the channel", +"Ноушн_СоздатьУдалитьБлок": "Notion_CreateDeleteBlock", +"Получить информацию бота": "Get bot information", +"Получить данные аккаунта": "Get account data", +"Изменить свойство товара": "Edit product property", +"Создать\/Изменить таблицу": "Create\/Edit table", +"Отправить местоположение": "Send location", +"ПолучитьСтатистикуПостов": "GetPostStatistics", +"Строка, Массив из Строка": "String, Array of Strings", +"ОписаниеПримитивногоПоля": "PrimitiveFieldDescription", +"СоздатьРекламнуюКампанию": "CreateAdvertisingCampaign", +"Создает пустой календарь": "Creates an empty calendar", +"ДропБокс_ПолучитьАккаунт": "Dropbox_GetAccount", +"Файл источник обновления": "File source for update", +"Вайбер_ОтправитьКартинку": "Viber_SendImage", +"Получить список подборок": "Get selection list", +"ID целевого пользователя": "Target user ID", +"Создать подборку товаров": "Create product selection", +"Путь к целевому каталогу": "Path to the target directory", +"Библиотека: Google Drive": "Library: Google Drive", +"Новый тестовый заголовок": "NewTestTitle", +"Загрузить фото на сервер": "Upload photo to server", +"ГК_ПолучитьСписокСобытий": "GC_GetEventList", +"Создать товар и подборку": "Create product and selection", +"ГК_СоздатьУдалитьСобытие": "GC_CreateDeleteEvent", +"ПолучитьЗаголовкиЗапроса": "GetRequestHeaders", +"Наименование нового поля": "New field name", +"Ссылка (URL) под записью": "Link (URL) under the post", +"ПолучитьСписокРазрешений": "GetPermissionsList", +"СформироватьБлокКартинку": "GenerateImageBlock", +"ID пользователя адресата": "Recipient user ID", +"Создает новое обсуждение": "Creates a new discussion", +"СохранитьКартинкуВАльбом": "SaveImageToAlbum", +"Массив заголовков кнопок": "Array of button titles", +"ВК_ПолучитьСписокСвойств": "VK_GetPropertyList", +"Путь к объекту оригинала": "Path to the original object", +"Новый каталог размещения": "New parent directory", +"D:\\GD\\Мой диск\\data.json": "D:\\GD\\My Drive\\data.json", +"Создает каталог на диске": "Creates a directory on the disk", +"Массив товаров или товар": "Array of products or product", +"Новое описание календаря": "New calendar description", +"ВК_ПолучитьСписокЗаказов": "VK_GetOrderList", +"Признак рекламного поста": "Sign of an advertising post", +"Данные файл для загрузки": "Data file for upload", +"Строка, Массив Из Строка": "String, Array of Strings", +"ВК_ПолучитьСписокТоваров": "VK_GetProductList", +"Получить число участников": "Get participant count", +"ВыполнитьЗапросМультипарт": "ExecuteMultipartRequest", +"Отменить публикацию папки": "Unpublish folder", +"ЯДиск_СоздатьКопиюОбъекта": "YDisk_CreateObjectCopy", +"ПолучитьСписокФайловПапки": "GetListOfFolderFiles", +"Получить публичный объект": "Get public object", +"Копирует файл или каталог": "Copies file or directory", +"Заголовок файла для Slack": "File title for Slack", +"Создает твит без вложений": "Creates a tweet without attachments", +"ПолучитьСсылкуАвторизации": "GetAuthorizationLink", +"Загрузить видео на сервер": "Upload video to server", +"Идентификатор комментария": "Comment identifier", +"Получить список каталогов": "Get list of directories", +"Отменить публикацию файла": "Unpublish file", +"ID пользователей(я) Viber": "Viber User(s) ID", +"Изменить подборку товаров": "Edit product selection", +"Ноушн_СоздатьИзменитьБазу": "Notion_CreateEditDatabase", +"Номер рекламной категории": "Advertising category number", +"См. ПолучитьОписаниеФайла": "See GetFileDescription", +"Добавить товар в подборку": "Add product to selection", +"Удалить товар из подборки": "Remove product from selection", +"Добавить\/Удалить картинку": "Add\/Delete image", +"Библиотека: Google Sheets": "Library: Google Sheets", +"ВК_ПолучитьСписокПодборок": "VK_GetSelectionList", +"Создать произвольный твит": "Create custom tweet", +"См.ПолучитьОписаниеТовара": "See GetProductDescription", +"Устанавливает тему канала": "Sets the channel topic", +"Изменить имя главной темы": "Change main topic name", +"URL для установки Webhook": "URL for setting up Webhook", +"Телеграм_ОтправитьКонтакт": "Telegram_SendContact", +"Некорректный вид отправки": "Incorrect sending view", +"Твиттер_СоздатьТвитСВидео": "Twitter_CreateTweetWithVideo", +"Создает новую базу данных": "Creates a new database", +"Новый альбом из автотеста": "NewAlbumFromAutoTest", +"Преобразовать код в токен": "Convert code to token", +"Слак_ОткрытьЗакрытьДиалог": "Slack_OpenCloseDialog", +"Удаляет комментарий по ID": "Deletes comment by ID", +"Идентификатор базы данных": "Database identifier", +"Путь назначения для копии": "Destination path for the copy", +"Изменить календарь списка": "Edit list calendar", +"Слак_ПолучитьСписокФайлов": "Slack_GetFileList", +"Наименование нового листа": "NewSheetName", +"Статус : Соответствие": "Status : Map", +"Архивирует активный канал": "Archives an active channel", +"Слак_ЗагрузитьУдалитьФайл": "Slack_UploadDeleteFile", +"OPI_ПолучениеДанныхТестов": "OPI_GetTestData", +"Тестовый товар измененный": "EditedTestProduct", +"Заполнить\/Очистить ячейки": "Fill\/Clear cells", +"Установить значения ячеек": "SetCellValues", +"Создать\/Удалить календарь": "Create\/Delete calendar", +"Получить календарь списка": "Get list calendar", +"ДропБокс_РаботаСДоступами": "Dropbox_AccessManagement", +"Создает пост с картинками": "Creates a post with images", +"Добавляет товар в подборку": "Adds a product to the selection", +"Получает схему таблиц базы": "Gets the schema of base tables", +"Слак_ПолучитьСписокКаналов": "Slack_GetChannelList", +"Телеграм_УстановитьWebhook": "Telegram_SetWebhook", +"Массив соответствий файлов": "Array of file mappings", +"Создать\/Архивировать канал": "Create\/Archive channel", +"Получить статистику постов": "Get post statistics", +"Получить список календарей": "Get list of calendars", +"Получить информацию о базе": "Get database info", +"Получить категории товаров": "Get product categories", +"Ноушн_СоздатьСтраницуВБазу": "Notion_CreatePageInDatabase", +"Сформировать блок картинку": "Generate image block", +"Изменить свойства страницы": "Edit page properties", +"ГТ_ЗаполнитьОчиститьЯчейки": "GT_FillClearCells", +"Телеграм_ОтправитьКартинку": "Telegram_SendImage", +"Получает комментарий по ID": "Gets comment by ID", +"ID оригинального сообщения": "Original message ID", +"разрешение на методы Drive": "Drive methods permission", +"ГД_ПолучитьСписокКаталогов": "GD_GetCatalogList", +"Число знаков после запятой": "Number of decimal places", +"Получить код подтверждения": "Get confirmation code", +"ПолучитьИмяВременногоФайла": "GetTempFileName", +"Получить информацию канала": "Get channel info", +"Структура Из КлючИЗначение": "Structure of Key-Value", +"Наименование новой таблицы": "New table name", +"Путь сохранения на Dropbox": "Save path on Dropbox", +"Телеграм_ОтправитьДокумент": "Telegram_SendDocument", +"Скрыть главную тему форума": "Hide main forum thread", +"ЯДиск_ПолучитьСписокФайлов": "YDisk_GetFileList", +"ГК_СоздатьУдалитьКалендарь": "GC_CreateDeleteCalendar", +"Мне больше нравится желтый": "I like yellow more", +"Получить информацию о боте": "Get bot information", +"ЯДиск_ЗагрузитьУдалитьФайл": "YDisk_UploadDeleteFile", +"Очищает значение в ячейках": "Clears the value in cells", +"Создать рекламную кампанию": "Create advertising campaign", +"ДропБокс_СоздатьУдалитьТег": "Dropbox_CreateDeleteTag", +"Описание тестового события": "TestEventDescription", +"Создать ссылку-приглашение": "Create invitation link", +"Телеграм_ПереслатьСообщение": "Telegram_ForwardMessage", +"Временная отметка сообщения": "Message timestamp", +"Слак_ПолучитьСписокОбластей": "Slack_GetRegionList", +"ПолучитьСписокПользователей": "GetUserList", +"ВК_СохранитьУдалитьКартинку": "VK_SaveDeleteImage", +"Загрузить по URL и получить": "Upload by URL and get", +"ВК_ПолучитьСтатистикуПостов": "VK_GetPostStatistics", +"Создет новое поле в таблице": "Creates a new field in the table", +"Путь к публикуемому объекту": "Path to the object to be published", +"ID целевой стены или группы": "ID of the target wall or group", +"Создать\/Удалить тему форума": "Create\/Delete forum topic", +"Ноушн_ПолучитьПользователей": "Notion_GetUsers", +"URL для кнопки под историей": "URL for button under the story", +"Массив соответствий товаров": "Array of product matches", +"Тип отправляемого сообщения": "TypeOfSentMessage", +"ВК_СоздатьТоварСоСвойствами": "VK_CreateProductWithProperties", +"Твиттер_СоздатьТвитСОпросом": "Twitter_CreateTweetWithPoll", +"Сохранить картинку в альбом": "Save image to album", +"ВК_СоздатьРекламнуюКампанию": "VK_CreateAdCampaign", +"ID альбома, если необходимо": "Album ID, if necessary", +"ВК_ПолучитьКатегорииТоваров": "VK_GetProductCategories", +"ГК_ПолучитьСписокКалендарей": "GC_GetCalendarList", +"Ключ > 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:", +"<Данные": "<Data", +"массива": "array", +"события": "events", +"Команда": "Command", +"Колонки": "Columns", +"Строчный": "StringType", +"Вставить": "Insert", +"Свойства": "Properties", +"параметр": "parameter", +"описания": "descriptions", +"указания": "indications", +"Действие": "Action", +"Свойство": "Property", +"ID блока": "Block ID", +"СтрДлина": "StrLength", +"Основная": "Main", +"ID книги": "BookID", +"ИмяЛиста": "SheetName", +"Добавить": "Add", +"ПоляБазы": "BaseFields", +"Свернуть": "Collapse", +"Подборки": "Selections", +"Числовой": "Numeric", +"В работе": "InProgress", +"Описание": "Description", +"СтрНайти": "StrFind", +"ТипМедиа": "MediaType", +"название": "name", +"ТипЧисло": "TypeNumber", +"значения": "values", +"Вариант1": "Option1", +"ИмеетТип": "HasType", +"Вариант2": "Option2", +"Вложения": "Attachments", +"Вложение": "Attachment", +"ключевой": "key", +"Страница": "Page", +"страницы": "pages", +"Кнопка 1": "Button 1", +"описание": "description", +"Кнопка 2": "Button 2", +"событиях": "events", +"IDРаботы": "JobID", +"URLФайла": "FileURL", +"НовоеИмя": "NewName", +"Оригинал": "Original", +"ЭтоКанал": "IsChannel", +"Подробно": "Detailed", +"Кнопка 3": "Button 3", +"ВКорзину": "ToCart", +"загрузки": "upload", +"ИДТовара": "ProductID", +"Точность": "Precision", +"описаний": "descriptions", +"IDКанала": "ChannelID", +"каталога": "directory", +"варианты": "variants", +"Параметр": "Parameter", +"ОткудаID": "FromID", +"IDИконки": "IconID", +"JSONДата": "JSONDate", +"действий": "actions", +"Максимум": "Maximum", +"Родитель": "Parent", +"ЭтотФайл": "ThisFile", +"ИмяМедиа": "MediaName", +"отправки": "of sending", +"подойдет": "suit", +"ДропБокс": "Dropbox", +"Приемник": "Receiver", +"Источник": "Source", +"работать": "work", +"ОбъектВК": "VKObject", +"Получить": "Get", +"Загрузка": "Upload", +"НЕ JSON:": "NOT JSON:", +"СтрВсего": "StrTotal", +"указании": "indication", +"ПутьФайл": "FilePath", +"Записать": "Write", +"значение": "value", +"Не JSON:": "Not JSON:", +"ID поста": "Post ID", +"ДатаСтоп": "EndDate", +"Документ": "Document", +"Значения": "Values", +"МассивИД": "IDArray", +"Название": "Name", +"магазина": "store", +"страницу": "page", +"ИмяФайла": "FileName", +"Двоичные": "Binary", +"ФайлСлак": "SlackFile", +"Смещение": "Offset", +"СтрокаТЗ": "DataString", +"Разметка": "Markup", +"ИДРаботы": "WorkID", +"Картинка": "Image", +"Сообщить": "Notify", +"Значение": "Value", +"Телеграм": "Telegram", +"Подборка": "Selection", +"Свойства_": "Properties_", +"СтрШаблон": "StrTemplate", +"Изменение": "Change", +"ПутьКСтат": "PathToStat", +"Значение:": "Value:", +"Сигнатура": "Signature", +"IDАльбома": "AlbumID", +"ВерсияАпи": "APIVersion", +"Выражение": "Expression", +"Константы": "Constants", +"Результат": "Result", +"Приватный": "Private", +"параметра": "parameter", +"ID канала": "Channel ID", +"изменения": "change", +"Рекламный": "Advertising", +"Анонимный": "Anonymous", +"отражения": "reflection", +"Подборки_": "Selections_", +"ДатаСтарт": "StartDate", +"В корзину": "To cart", +"ТекущийИД": "CurrentID", +"ИДОбъекта": "ObjectID", +"URLФайла2": "URLFile2", +"Категории": "Categories", +"ИмяПакета": "PackageName", +"ПутьКопии": "CopyPath", +"Вариант 2": "Option 2", +"Категория": "Category", +"Удаленный": "Remote", +"ИмяМетода": "MethodName", +"Доступные": "Available", +"неактивен": "inactive", +"Строковое": "String", +"ИДАльбома": "AlbumID", +"ВидеоПуть": "VideoPath", +"АудиоПуть": "AudioPath", +"Выполнить": "Execute", +"ГифкаПуть": "GifPath", +"ПутьЛогов": "LogPath", +"Структура": "Structure", +"URLФайла1": "URLFile1", +"сообщений": "messages", +"URL файла": "File URL", +"доступных": "available", +"ID товара": "Product ID", +"ИначеЕсли": "ElseIf", +"НовыйТест": "NewTest", +"Процедура": "Procedure", +"Имя папки": "Folder name", +"ВКонтакте": "VK", +"Кодировка": "Encoding", +"Вариант 1": "Option 1", +"Параметр_": "Parameter_", +"HTTPОтвет": "HTTPResponse", +"Значение2": "Value2", +"Значение1": "Value1", +"Заголовок": "Title", +"ИДЖелтого": "YellowID", +"Параметры": "Parameters", +"ТокенБота": "BotToken", +"Заполнено": "Filled", +"ТипСтрока": "TypeString", +"подлинный": "genuine", +"Календарь": "Calendar", +"добавлять": "add", +"окончания": "of end", +"Коллекция": "Collection", +"Картинка1": "Image1", +"Картинка2": "Image2", +"приходить": "come", +"Заголовки": "Headers", +"НовыйЛист": "NewSheet", +"Сообщение": "Message", +"ТипДанных": "DataType", +"возвращать": "return", +"дальнейших": "further", +"на сервере": "on the server", +"информация": "information", +"сертификат": "certificate", +"информации": "information", +"Параметры_": "Parameters_", +"перестанет": "will stop", +"сообщениях": "messages", +"Разрешения": "Permissions", +"МассивЧата": "ChatArray", +"участникам": "to participants", +"возвращает": "returns", +"Статистика": "Statistics", +"ФорматДаты": "DateFormat", +"информацию": "information", +"проведения": "of the event", +"Соединение": "Connection", +"Расширение": "Extension", +"Файл видео": "Video file", +"Файл аудио": "Audio file", +"Параметры:": "Parameters:", +"Файл гифки": "GIF file", +"ДанныеПоля": "FieldData", +"ID альбома": "Album ID", +"ПутьКФайлу": "FilePath", +"библиотек:": "libraries:", +"параметров": "parameters", +"библиотеки": "libraries", +"Текст тега": "Tag text", +"УдалитьТег": "DeleteTag", +"УДАЛИТЬТЕГ": "DELETETAG", +"пожаловать": "welcome", +"ВидЗапроса": "RequestType", +"Клавиатура": "Keyboard", +"СтараяЦена": "OldPrice", +"ID диалога": "Dialog ID", +"конкретное": "specific", +"они разные": "they are different", +"Токен бота": "Bot token", +"Имя товара": "Product name", +"ИДКартинки": "ImageID", +"Приложение": "Application", +"НовяИконка": "NewIcon", +"ИмяТаблицы": "TableName", +"Новый файл": "NewFile", +"Библиотека": "Library", +"ООО Вектор": "LLC Vector", +"ИДКаталога": "CatalogID", +"ДатаНачала": "StartDate", +"ТокенКанал": "ChannelToken", +"ИДВарианта": "VariantID", +"ЦветКнопок": "ButtonColor", +"ИДКабинета": "CabinetID", +"ИмеетДлину": "HasLength", +"ОжидаетЧто": "ExpectsThat", +"ИДПодборки": "SelectionID", +"ПолныйПуть": "FullPath", +"МассивФото": "PhotoArray", +"Доуступные": "Available", +"ID события": "Event ID", +"Информация": "Information", +"Объявление": "Ad", +"Назначение": "Destination", +"Сохранение": "Save", +"ФайлОтвета": "ResponseFile", +"СтрПроцент": "StrPercentage", +"Бан\/Разбан": "Ban\/Unban", +"Количество": "Quantity", +"СтрТекущее": "StrCurrent", +"HTTPЗапрос": "HTTPRequest", +"IDКабинета": "AccountID", +"IDКартинки": "ImageID", +"Твит с гиф": "Tweet with gif", +"ID Родителя": "Parent ID", +"Новое видео": "NewVideo", +"Удалить тег": "Delete tag", +"АдресаПочты": "EmailAddresses", +"ТипКонтента": "ContentType", +"РефрешТокен": "RefreshToken", +"Петр Петров": "Petr Petrov", +"JSONСтрокой": "JSONString", +"ОписаниеИзм": "EditedDescription", +"НомерГруппы": "GroupNumber", +"Фон истории": "Story background", +"возможность": "possibility", +"Токен Viber": "Viber Token", +"ТекущаяДата": "CurrentDate", +"ID страницы": "Page ID", +"ЗаписатьЛог": "WriteLog", +"Для Asserts": "For Asserts", +"уведомлений": "notifications", +"Для YaxUnit": "For YAxUnit", +"Текст твита": "Tweet text", +"авторизации": "authorization", +"ЗаменаТочки": "DotReplacement", +"РазмерБлока": "BlockSize", +"Уведомления": "Notifications", +"ОбщийРазмер": "TotalSize", +"ПолныйОтвет": "FullResponse", +"МассивПолей": "FieldArray", +"УДАЛИТЬПОСТ": "DELETEPOST", +"ID картинки": "Image ID", +"УдалитьПост": "DeletePost", +"СтрЗаменить": "StringReplace", +"Текст поста": "Post text", +"МассивПутей": "PathsArray", +"ID подборок": "Selection IDs", +"ID подборки": "Selection ID", +"ID свойства": "Property ID", +"ID варианта": "Variant ID", +"ЦелевойПуть": "TargetPath", +"СОЗДАТЬПОСТ": "CREATEPOST", +"СоздатьПост": "CreatePost", +"ДОБАВИТЬТЕГ": "ADDTAG", +"Комментарий": "Comment", +"Медиагруппа": "MediaGroup", +"Стандартные": "Standard", +"ТекстОтвета": "ReplyText", +"ОбщийДоступ": "PublicAccess", +"медиагруппы": "media groups", +"ОбщийМодуль": "CommonModule", +"МетодПоиска": "SearchMethod", +"НоваяСтрока": "NewLine", +"УдалитьЛист": "DeleteSheet", +"УДАЛИТЬЛИСТ": "DELETESHEET", +"СоздатьБазу": "CreateDatabase", +"СОЗДАТЬБАЗУ": "CREATEDATABASE", +"СКАЧАТЬФАЙЛ": "DOWNLOADFILE", +"СкачатьФайл": "DownloadFile", +"ДобавитьТег": "AddTag", +"ИмяКонтакта": "ContactName", +"JSON данные": "JSON data", +"СОЗДАТЬПОЛЕ": "CREATEFIELD", +"ТекущийКлюч": "Current key", +"ИмяСодержит": "NameContains", +"миллиметрах": "millimeters", +"ПолеОтметки": "TimestampField", +"ДанныеСхемы": "SchemaData", +"ТипВложений": "AttachmentsType", +"ТекущийФайл": "CurrentFile", +"УДАЛИТЬФАЙЛ": "DELETEFILE", +"Разделитель": "Delimiter", +"УдалитьФайл": "DeleteFile", +"СоздатьПоле": "CreateField", +"указывается": "specified", +"МассивВидео": "Video array", +"МассивГифок": "Gif array", +"МассивМедиа": "MediaArray", +"МассивСвязи": "LinkArray", +"Тема канала": "Channel topic", +"конкретному": "specific", +"УдалитьБлок": "DeleteBlock", +"ВЕРНУТЬБЛОК": "RETURNBLOCK", +"МассивЯчеек": "Cell array", +"СтрокаФайла": "FileString", +"ОтборПоТипу": "FilterByType", +"ТекстКнопки": "ButtonText", +"Остаток. -1": "Balance. -1", +"расширением": "extension", +"ОтборСтрока": "FilterString", +"СоздатьБлок": "CreateBlock", +"IDСообщения": "MessageID", +"РазмерЧасти": "ChunkSize", +"СОЗДАТЬБЛОК": "CREATEBLOCK", +"Сортировать": "Sort", +"Авторизация": "Authorization", +"Цель канала": "Channel purpose", +"ОтветМассив": "ResponseArray", +"ВернутьБлок": "ReturnBlock", +"Цена товара": "Product price", +"УДАЛИТЬБЛОК": "DELETEBLOCK", +"Новый товар": "New product", +"IDОригинала": "OriginalID", +"ИмяПараметра": "ParameterName", +"МассивКнопок": "ButtonArray", +"IDОбъявления": "AdID", +"УдалитьТовар": "DeleteProduct", +"УДАЛИТЬТОВАР": "DELETEITEM", +"ID, Значение": "ID, Value", +"ТекущийТовар": "CurrentProduct", +"СписокКоманд": "CommandList", +"ЦветнойВывод": "ColorOutput", +"ОсновноеФото": "MainPhoto", +"ОднаПодОдной": "OneByOne", +"ЦелеваяСтена": "Target wall", +"СОЗДАТЬОПРОС": "CREATEPOLL", +"Создать пост": "Create post", +"Удалить пост": "Delete post", +"КодировкаURL": "URLencoding", +"РазмерДанных": "DataSize", +"ЗаписьТекста": "TextRecord", +"ТипКоллекции": "CollectionType", +"опубликована": "published", +"использовать": "use", +"ID календаря": "Calendar ID", +"КлючКартинка": "ImageKey", +"Base64Строка": "Base64String", +"Тип вложений": "Attachments type", +"периодически": "periodically", +"ОтборКоманды": "CommandSelection", +"Длительность": "Duration", +"пользователя": "user", +"ОписаниеТипа": "TypeDescription", +"IDОбсуждения": "DiscussionID", +"Твит с видео": "Tweet with video", +"МассивНабора": "Array of Sets", +"ДневнойЛимит": "DailyLimit", +"Соответствие": "Match", +"СоздатьОпрос": "CreatePoll", +"СтрокаВызова": "CallString", +"ИДОбсуждения": "DiscussionID", +"ПараметрыURL": "URLParameters", +"Файл размера": "File size", +"Удалить блок": "Delete block", +"ТолькоОснова": "OnlyBase", +"формирования": "formation", +"СтруктураURL": "URLStructure", +"МассивБлоков": "BlockArray", +"Создать блок": "Create block", +"ОбъектИконка": "Icon object", +"Архивирована": "Archived", +"БезВозвратно": "Irrecoverable", +"Скачать файл": "Download file", +"Добавить тег": "Add tag", +"Неопределено": "Undefined", +"МассивДанных": "Data array", +"Удалить лист": "DeleteSheet", +"Рефреш токен": "Refresh token", +"СтрРазделить": "StrSplit", +"ОсновнойЦвет": "PrimaryColor", +"ЧислоВСтроку": "NumberToString", +"ДопЗаголовки": "AdditionalHeaders", +"МассивФайлов": "ArrayOfFiles", +"ОтветСтрокой": "ResponseString", +"загружаемого": "uploading", +"Существующее": "Existing", +"РодительБаза": "ParentBase", +"СтрокаДанных": "DataString", +"СоздатьПапку": "CreateFolder", +"Число,Строка": "Number, String", +"Строка,Число": "String, Number", +"ДокументПуть": "DocumentPath", +"КартинкаПуть": "ImagePath", +"Удалить файл": "Delete file", +"ИЗМЕНИТЬПОЛЕ": "CHANGEFIELD", +"ИзменитьПоле": "ModifyField", +"ПолучитьФайл": "GetFile", +"ТекстСправки": "HelpText", +"Пользователь": "User", +"ДатаОтправки": "Sending date", +"СтрСоединить": "StrJoin", +"МассивТекста": "TextArray", +"ЭтоКоллекция": "ThisIsCollection", +"Дублирования": "duplicates", +"СКАЧАТЬПАПКУ": "DOWNLOADFOLDER", +"НовыйПрефикс": "NewPrefix", +"СкачатьПапку": "DownloadFolder", +"МассивЛишних": "ExtraArray", +"МассивЛистов": "SheetArray", +"ДобавитьПоле": "AddField", +"Создать базу": "Create base", +"МассивТаблиц": "TableArray", +"Создать поле": "Create field", +"СОЗДАТЬПАПКУ": "CREATEFOLDER", +"пустой ответ": "empty response", +"Использовать": "Use", +"Пользователи": "Users", +"ОбновитьФайл": "UpdateFile", +"ОБНОВИТЬФАЙЛ": "UPDATEFILE", +"СОЗДАТЬКАНАЛ": "CREATECHANNEL", +"СоздатьКанал": "CreateChannel", +"Имя контакта": "Contact name", +"СоздатьКнигу": "CreateBook", +"URL картинки": "Image URL", +"СОЗДАТЬКНИГУ": "CREATEBOOK", +"Наименование": "Name", +"пользователю": "to user", +"ДобавитьЛист": "AddSheet", +"ID чата темы": "Thread chat ID", +"ДОБАВИТЬЛИСТ": "ADDSHEET", +"возвращающий": "returning", +"Используется": "Used", +"ПолучитьКнигу": "GetBook", +"Новая таблица": "NewTable", +"КодУстройства": "DeviceCode", +"Вопрос опроса": "Poll question", +"ОТПРАВИТЬФАЙЛ": "SENDFILE", +"ОтправитьФайл": "SendFile", +"ОбновитьТокен": "RefreshToken", +"Создать опрос": "Create poll", +"ОтветПроверки": "CheckResponse", +"КартинкаПоста": "PostImage", +"Массив кнопок": "Array of buttons", +"ОБНОВИТЬТОКЕН": "UPDATETOKEN", +"UnixИстечение": "UnixExpiration", +"ПОЛУЧИТЬКНИГУ": "GETBOOK", +"ID обсуждения": "Discussion ID", +"СвойстваЛиста": "Sheet properties", +"ТекущиеДанные": "Current data", +"РазмерТекущих": "CurrentSize", +"НомерТелефона": "PhoneNumber", +"ТекущийМассив": "Current array", +"ЗагрузкаВидео": "VideoUpload", +"ПоставитьЛайк": "LikePost", +"ВладелецВидео": "VideoOwner", +"АдресЗагрузки": "UploadURL", +"ТекущийСтатус": "CurrentStatus", +"СДЕЛАТЬРЕПОСТ": "MAKEREPOST", +"СделатьРепост": "MakeRepost", +"Массив файлов": "Files array", +"ПолучитьКанал": "GetChannel", +"ТаблицаТестов": "TestTable", +"Тестовая база": "TestDatabase", +"ПутьОригинала": "OriginalPath", +"НовыйРодитель": "NewParent", +"Тестовая цель": "TestGoal", +"существующего": "existing", +"УдалитьАльбом": "DeleteAlbum", +"УДАЛИТЬАЛЬБОМ": "DELETEALBUM", +"ДОБАВИТЬТОВАР": "ADDITEM", +"ДатаОкончания": "EndDate", +"ДобавитьТовар": "AddProduct", +"ИДКомментария": "CommentID", +"СписокТоваров": "ProductList", +"УДАЛИТЬОБЪЕКТ": "DELETEOBJECT", +"ID объявления": "Ad ID", +"УдалитьОбъект": "DeleteObject", +"Создать папку": "Create folder", +"Администратор": "Administrator", +"Создать книгу": "CreateBook", +"Строка, Число": "String, Number", +"Скачать папку": "Download folder", +"СОЗДАТЬАЛЬБОМ": "CREATEALBUM", +"не ограничено": "unlimited", +"Тестовая тема": "TestTopic", +"Обновить файл": "Update file", +"СтрокаНомеров": "NumbersString", +"НомерКампании": "CampaignNumber", +"ТекущийОбъект": "CurrentObject", +"ПОЛУЧИТЬКАНАЛ": "GETCHANNEL", +"СоздатьАльбом": "CreateAlbum", +"Дата создания": "CreationDate", +"СтрокаТоваров": "ProductsString", +"Удалить товар": "Delete product", +"МассивТоваров": "Array of products", +"ИЗМЕНИТЬТОВАР": "CHANGEITEM", +"ИзменитьТовар": "EditProduct", +"Тестовый лист": "TestSheet", +"Добавить лист": "AddSheet", +"Идентификатор": "Identifier", +"ПОСТАВИТЬЛАЙК": "PUTLIKE", +"ЗагрузитьФайл": "UploadFile", +"ПокинутьКанал": "LeaveChannel", +"ПолучитьТокен": "GetToken", +"СтруктураДаты": "DateStructure", +"ВозможныеПути": "PossiblePaths", +"ДФ=yyyy-MM-dd": "DF=yyyy-MM-dd", +"РазложитьJSON": "ParseJSON", +"РАЗЛОЖИТЬJSON": "PARSEJSON", +"ЭтоОтложенное": "IsDelayed", +"ОТКРЫТЬДИАЛОГ": "OPENDIALOG", +"Блок картинки": "Image block", +"МассивКаналов": "ChannelArray", +"ЗАГРУЗИТЬФАЙЛ": "UPLOADFILE", +"Создать канал": "Create channel", +"СоздатьЗапрос": "CreateRequest", +"Число, Строка": "Number, String", +"НомерСтраницы": "PageNumber", +"ОткрытьДиалог": "OpenDialog", +"ОбъектОбложка": "Cover object", +"пустая строка": "empty string", +"ВставитьПосле": "InsertAfter", +"ОписаниеТипов": "TypeDescription", +"Новое событие": "New event", +"ТекущийРаздел": "CurrentSection", +"Файл с Base64": "Base64 File", +"ПОЛУЧИТЬТОКЕН": "GETTOKEN", +"Экранирование": "Escaping", +"Метод,Область": "Method,Region", +"ПОКИНУТЬКАНАЛ": "LEAVECHANNEL", +"СтрокаЗаписей": "RecordString", +"Версия: 2.4.8": "Version: 2.4.8", +"УдалитьЗаписи": "DeletePosts", +"Адрес объекта": "Object address", +"СОЗДАТЬЗАПИСИ": "CREATEPOSTS", +"ВыборЗначения": "ValueSelection", +"МассивСобытий": "ArrayOfEvents", +"СтруктураПоля": "FieldStructure", +"СоздатьЗаписи": "CreatePosts", +"ДатаИстечения": "ExpirationDate", +"Файл картинки": "Image file", +"ВывестиСтроку": "PrintString", +"Изменить поле": "Modify field", +"УДАЛИТЬЗАПИСИ": "DELETERECORDS", +"ПодСообщением": "UnderMessage", +"Описание поля": "Field description", +"ЗАКРЫТЬДИАЛОГ": "CLOSEDIALOG", +"МассивОтветов": "AnswersArray", +"ЗакрытьДиалог": "CloseDialog", +"МассивТоваров_": "Array_of_Products", +"Покинуть канал": "Leave channel", +"ПараметрыТеста": "TestParameters", +"РабочийКаталог": "WorkingDirectory", +"Получить канал": "Get channel", +"Новое описание": "New description", +"Получить книгу": "GetBook", +"Изменяет имя и": "Changes name and", +"ID базы данных": "Database ID", +"ОТПРАВИТЬВИДЕО": "SENDVIDEO", +"ОтправитьВидео": "SendVideo", +"СоздатьТаблицу": "CreateTable", +"СОЗДАТЬТАБЛИЦУ": "CREATETABLE", +"МассивПодборок": "SelectionArray", +"Удалить записи": "Delete records", +"СтрНачинаетсяС": "StringStartsWith", +"СОЗДАТЬСОБЫТИЕ": "CREATEEVENT", +"ИДПользователя": "UserID", +"СтрокаПодборок": "SelectionsString", +"СтрОбщийРазмер": "StrTotalSize", +"Удалить объект": "Delete object", +"СтруктураФайла": "FileStructure", +"СтруктураОпций": "OptionsStructure", +"ГлавныйВГруппе": "MainInGroup", +"Создать записи": "Create records", +"Обновить токен": "Refresh token", +"Изменить товар": "Edit product", +"Библиотека: VK": "Library: VK", +"ВСТУПИТЬВКАНАЛ": "JOINCHANNEL", +"Файл, Значение": "File, Value", +"КлючПриложения": "AppKey", +"Тип клавиатуры": "KeyboardType", +"ВступитьВКанал": "JoinChannel", +"Отправить файл": "SendFile", +"ОтправкаВКанал": "SendingToChannel", +"IDПользователя": "UserID", +"ТекущаяОбласть": "CurrentRegion", +"ОтправитьОпрос": "SendPoll", +"Получить токен": "Get token", +"ПолучитьЗапись": "GetRecord", +"ПОЛУЧИТЬЗАПИСЬ": "GETRECORD", +"ОТПРАВИТЬОПРОС": "SENDPOLL", +"УДАЛИТЬWEBHOOK": "DELETEWEBHOOK", +"ПолноеИмяМедиа": "FullMediaName", +"СтруктураМедиа": "MediaStructure", +"МассивКартинок": "ImageArray", +"УдалитьWebhook": "DeleteWebhook", +"ПОЛУЧИТЬОБЪЕКТ": "GETOBJECT", +"СтрокаВложений": "AttachmentsString", +"ПараметрМетода": "MethodParameter", +"Новое название": "New name", +"ОписаниеТовара": "ProductDescription", +"Добавить товар": "Add product", +"МассивЗапросов": "ArrayOfRequests", +"Закрыть диалог": "Close dialog", +"МассивСтруктур": "Array of Structures", +"Перезаписывать": "Overwrite", +"НомерКатегории": "CategoryNumber", +"МассивИДПостов": "Array of post IDs", +"Номер страницы": "Page number", +"Загрузить файл": "Upload file", +"Файл документа": "Document file", +"МассивОписания": "DescriptionArray", +"Сделать репост": "Make repost", +"ТекущийЭлемент": "CurrentElement", +"ОТПРАВИТЬГИФКУ": "SENDGIF", +"Поставить лайк": "Like", +"МассивОтправки": "SendArray", +"Описание видео": "Video description", +"ОписаниеЗаписи": "RecordDescription", +"Удалить альбом": "Delete album", +"Создать альбом": "Create album", +"Открыть диалог": "Open dialog", +"ПолучитьОбъект": "GetObject", +"Путь к объекту": "Path to the object", +"СтруктураЯчеек": "CellStructure", +"Номер телефона": "Phone number", +"КартинкаЗамены": "ReplacementImage", +"Тестовая папка": "TestFolder", +"ТолькоПросмотр": "ViewOnly", +"НазваниеФайла1": "FileName1", +"Твит с опросом": "Tweet with poll", +"ЗаписатьСтроку": "WriteString", +"ТекущаяКоманда": "CurrentCommand", +"HTTPСоединение": "HTTPConnection", +"ТекущеВложение": "CurrentAttachment", +"АТ_СоздатьПоле": "AT_CreateField", +"ТекущаяПозиция": "CurrentPosition", +"УдалитьСобытие": "DeleteEvent", +"УДАЛИТЬСОБЫТИЕ": "DELETEEVENT", +"ТаблицаСостава": "CompositionTable", +"АТ_СоздатьБазу": "AT_CreateDatabase", +"ОЧИСТИТЬЯЧЕЙКИ": "CLEARCELLS", +"Тестовый товар": "TestProduct", +"ПолучитьПревью": "GetPreview", +"СтрочныйМассив": "StringArray", +"МассивВложений": "AttachmentsArray", +"КОПИРОВАТЬЛИСТ": "COPYSHEET", +"КопироватьЛист": "CopySheet", +"Тестовый твитт": "TestTweet", +"Отбор по имени": "Filter by name", +"Это новый файл": "This is a new file", +"Новый файл.jpg": "New file.jpg", +"ПутьСохранения": "SavePath", +"ОписаниеМетода": "MethodDescription", +"ОписаниеОшибки": "ErrorDescription", +"ОчиститьЯчейки": "ClearCells", +"Описание файла": "File description", +"ДвоичныеДанные": "BinaryData", +"Текстовый твит": "Text tweet", +"ПОЛУЧИТЬПРЕВЬЮ": "GETPREVIEW", +"МассивОбъектов": "ArrayOfObjects", +"СОЗДАТЬИСТОРИЮ": "CREATEHISTORY", +"Заголовок темы": "Thread title", +"СоздатьИсторию": "CreateStory", +"Копировать лист": "CopySheet", +"ЗагруженныйФайл": "UploadedFile", +"ОписаниеТаблицы": "TableDescription", +"МассивРодителей": "ArrayOfParents", +"Сокращенный URL": "Shortened URL", +"Массив картинок": "Array of images", +"УдалитьПодборку": "DeleteSelection", +"Очистить ячейки": "Clear cells", +"Номер,Строковое": "Number,String", +"Создать историю": "Create story", +"Новый заголовок": "New title", +"ВК_СоздатьОпрос": "VK_CreatePoll", +"Загрузить видео": "Upload video", +"JSON клавиатуры": "Keyboard JSON", +"ID пользователя": "User ID", +"Массив ID медиа": "Media ID array", +"ЗависимостиГугл": "GoogleDependencies", +"ОригиналныйПуть": "OriginalPath", +"IDИнициализации": "InitializationID", +"СтатусОбработки": "ProcessingStatus", +"Отправить опрос": "Send poll", +"СтрокаСигнатуры": "SignatureString", +"ТекущаяДатаUNIX": "CurrentUNIXDate", +"Получить превью": "Get preview", +"СтруктураФайлов": "FileStructure", +"Отправить гифку": "Send GIF", +"СтруктураКнопки": "ButtonStructure", +"Отправить аудио": "Send audio", +"Отправить видео": "Send video", +"ОдиночнаяЗапись": "SingleRecord", +"Команда CLI: vk": "CLI Command: vk", +"МассивУдаляемых": "ArrayOfDeletions", +"ОписаниеСтроки2": "RowDescription2", +"Удалить событие": "Delete event", +"Картинка опроса": "Poll image", +"ЗапросИзменения": "ChangeRequest", +"Удалить Webhook": "Delete webhook", +"ОписаниеСтроки1": "RowDescription1", +"IDПользователей": "UserIDs", +"Текст сообщения": "Message text", +"Создать каталог": "Create folder", +"СократитьСсылку": "ShortenLink", +"ID целевой базы": "Target database ID", +"МассивВариантов": "OptionArray", +"Ключ приложения": "Application key", +"КоллекцияТаблиц": "TableCollection", +"УдалитьКартинку": "DeleteImage", +"установлен свой": "set your", +"Создать таблицу": "Create table", +"Создать событие": "Create event", +"ЗаписатьЦелое16": "WriteInt16", +"МестоПроведения": "Venue", +"СтруктураДанных": "DataStructure", +"Получить объект": "Get object", +"Получить запись": "Get record", +"ПовторитьСтроку": "RepeatString", +"ТипСоответствие": "TypeMatch", +"СтруктураТекста": "TextStructure", +"ИзменитьТаблицу": "ModifyTable", +"ОписаниеСобытия": "EventDescription", +"OPI_Инструменты": "OPI_Tools", +"ЗначенияСвойств": "PropertyValues", +"ЗаголовокПотока": "StreamHeader", +"СтруктураВыбора": "ChoiceStructure", +"Описание товара": "Product description", +"ID целевого чата": "Target chat ID", +"Массив ID постов": "Array of post IDs", +"ВладелецКартинки": "ImageOwner", +"ПараметрыФункции": "FunctionParameters", +"МассивРазрешений": "Permissions array", +"ЗагрузкаКартинки": "ImageUpload", +"Загружаемый файл": "File to be uploaded", +"Отправить ссылку": "SendLink", +"Твит с картинкой": "Tweet with image", +"Коллекция файлов": "File collection", +"СтруктураФормата": "FormatStructure", +"РазделительСтрок": "LineSeparator", +"Code из браузера": "Code from browser", +"Описание таблицы": "Table description", +"ЗапятаяВКавычках": "CommaInQuotes", +"Изменить таблицу": "Modify table", +"Описание события": "Event description", +"ПолучитьДвоичные": "GetBinary", +"СекретПриложения": "AppSecret", +"ПараметрыЗапроса": "RequestParameters", +"HTTPСервисЗапрос": "HTTPServiceRequest", +"ГВ_ПолучитьТокен": "GV_GetToken", +"ГВ_ОбновитьТокен": "GV_UpdateToken", +"Телефон контакта": "Contact phone number", +"Фамилия контакта": "Contact last name", +"Получить таблицу": "Get table", +"ПолучитьПолеДаты": "GetDateField", +"СоответствиеMIME": "MIMETypeMapping", +"УправлениеФайлом": "FileManagement", +"KeyИнициализации": "InitializationKey", +"ИмяФайлаОтправки": "SendingFileName", +"ОтправитьКонтакт": "SendContact", +"Создать страницу": "Create page", +"ПолучитьПараметр": "GetParameter", +"МетодХэширования": "HashingMethod", +"КодироватьСтроку": "EncodeString", +"Массив Из Строка": "Array From String", +"Получить событие": "Get event", +"Тестовый товар 2": "TestProduct2", +"СоздатьТвитВидео": "CreateVideoTweet", +"УдалитьПолностью": "Delete completely", +"превью документа": "document preview", +"СоздатьТвитГифки": "CreateGifTweet", +"МассивКлавиатуры": "KeyboardArray", +"ОписаниеКартинки": "ImageDescription", +"Сократить ссылку": "Shorten link", +"МассивКалендарей": "ArrayOfCalendars", +"МассивСтатистики": "Array of Statistics", +"Канал для отбора": "Channel for selection", +"СтрокаПараметров": "ParameterString", +"Массив из Строка": "Array of Strings", +"Тестовая таблица": "TestTable", +"Вступить в канал": "Join channel", +"ДоступныйОстаток": "AvailableBalance", +"СтрокаФотографий": "PhotoString", +"Удалить картинку": "Delete image", +"Удалить подборку": "DeleteSelection", +"Неактивный : red": "Inactive : red", +"МассивИнформации": "ArrayOfInformation", +"СсылкаПодЗаписью": "LinkUnderPost", +"URLВКодировкеURL": "URLInURLEncoding", +"СоздатьТвитОпрос": "CreatePollTweet", +"МассивИменЛистов": "ArrayOfSheetNames", +"Изменить событие": "Edit event", +"СмещениеОтНачала": "OffsetFromStart", +"ЗаписатьПараметр": "WriteParameter", +"СтруктураСтатуса": "StatusStructure", +"Расширение файла": "File extension", +"МассивПараметров": "ParameterArray", +"Описание альбома": "Album description", +"ВызватьHTTPМетод": "CallHTTPMethod", +"Имя файла в Slack": "File name in Slack", +"ПреобразоватьДату": "ConvertDate", +"Отправить контакт": "Send contact", +"СоответствиеПолей": "FieldMapping", +"ВК_ЗагрузитьВидео": "VK_UploadVideo", +"ЗначениеЗаполнено": "ValueFilled", +"СтруктураРодителя": "ParentStructure", +"ОтправитьКартинку": "SendImage", +"ТаблицаПараметров": "ParametersTable", +"ЗакрытьТемуФорума": "CloseForumThread", +"КалендарьИсточник": "SourceCalendar", +"ГД_СоздатьКаталог": "GD_CreateCatalog", +"СоздатьСоединение": "CreateConnection", +"ГТ_СоздатьТаблицу": "GT_CreateTable", +"Библиотека: Slack": "Library: Slack", +"Удалить календарь": "Delete calendar", +"Текст комментария": "Comment text", +"Удалить сообщение": "Delete message", +"Путь или ID файла": "Path or ID of the file", +"КалендарьПриемник": "TargetCalendar", +"АТ_СоздатьТаблицу": "AT_CreateTable", +"Дата : date": "Date : date", +"Скрытый календарь": "Hidden calendar", +"НаправлениеПоиска": "SearchDirection", +"ОткрытьТемуФорума": "OpenForumThread", +"СтруктураВозврата": "ReturnStructure", +"Файл для загрузки": "File for upload", +"ПараметрЛокальный": "LocalParameter", +"СоответствиеФайла": "FileMapping", +"Массив ID товаров": "Array of product IDs", +"УправлениеТоваром": "ProductManagement", +"Библиотека: Viber": "Library: Viber", +"ИзменитьСообщение": "EditMessage", +"ID целевого поста": "ID of the target post", +"Копировать объект": "Copy object", +"СоздатьБазуДанных": "CreateDatabase", +"Отправить локацию": "SendLocation", +"ВызватьИсключение": "RaiseException", +"ПолучитьСписокБаз": "GetListOfBases", +"ЗакрытьОбсуждение": "CloseDiscussion", +"Данные для API v2": "Data for API v2", +"Строка, Структура": "String, Structure", +"ID блока родителя": "Parent block ID", +"ОткрытьОбсуждение": "OpenDiscussion", +"ОсновнаяСтруктура": "MainStructure", +"ОтветСоответствие": "ResponseCorrespondence", +"Значение свойства": "Property value", +"Новое имя объекта": "New object name", +"Наименование поля": "Field name", +"ОпросСоответствие": "PollCorrespondence", +"Новый комментарий": "NewComment", +"Название свойства": "Property name", +"При отправке URL": "When sending URL", +"Описание картинки": "Image description", +"Тестовая подборка": "TestCollection", +"Получить страницу": "Get page", +"Тестовая кампания": "TestCampaign", +"ВК_СоздатьИсторию": "VK_CreateStory", +"ОсновноеИзмерение": "MajorDimension", +"ЗагруженныеДанные": "UploadedData", +"СоздатьОбсуждение": "CreateDiscussion", +"СтруктураКампании": "CampaignStructure", +"СортироватьПоДате": "SortByDate", +"Название подборки": "Selection name", +"Картинка автотест": "AutoTestImage", +"ПолучитьПолеПочты": "GetEmailField", +"Пост из автотеста": "Post from autotest", +"СоздатьТемуФорума": "CreateForumThread", +"Создать календарь": "Create calendar", +"Наш первый клиент": "OurFirstClient", +"СкопироватьОбъект": "CopyObject", +"Тестовое описание": "TestDescription", +"Секрет приложения": "Application secret", +"СтруктураВарианта": "OptionStructure", +"СтрЗаканчиваетсяНа": "StrEndsWith", +"СуществующаяГруппа": "ExistingGroup", +"ID книги источника": "SourceBookID", +"УправлениеДиалогом": "DialogManagement", +"Идентификатор базы": "Base identifier", +"Архивировать канал": "Archive channel", +"Идентификатор поля": "Field identifier", +"Удаляет пост по id": "Deletes a post by ID", +"URL для сокращения": "URL for shortening", +"Изменить календарь": "Edit calendar", +"ДополнительныеФото": "AdditionalPhotos", +"ПолучитьПолеСсылки": "GetLinkField", +"ПолучитьПолеНомера": "GetNumberField", +"Заголовок страницы": "Page title", +"Тестовое сообщение": "TestMessage", +"ЧЦ=10; ЧДЦ=0; ЧГ=0": "HC=10; HDC=0; HG=0", +"Наименование видео": "Video name", +"Переместить объект": "Move object", +"ID книги приемника": "DestinationBookID", +"ДанныеПользователя": "UserData", +"Тестовый календарь": "TestCalendar", +"ПолучитьСтатистику": "GetStatistics", +"ПолучитьИДКартинки": "GetImageID", +"Команда CLI: slack": "CLI command: slack", +"ПолучитьТоварыПоИД": "GetProductsByID", +"Изменить сообщение": "Edit message", +"Удаляет блок по ID": "Deletes block by ID", +"МассивКлючЗначение": "KeyValueArray", +"ОтправитьСообщение": "SendMessage", +"Тестовая таблица 2": "TestTable2", +"Новое наименование": "New name", +"Анонимность опроса": "Poll anonymity", +"Создать твит опрос": "Create poll tweet", +"ГТ_ПолучитьТаблицу": "GT_GetTable", +"Создать твит видео": "Create video tweet", +"Создать твит гифки": "Create gif tweet", +"СтруктураПараметра": "ParameterStructure", +"СоответствиеИконки": "Icon match", +"Библиотека: Notion": "Library: Notion", +"ДлительностьОпроса": "PollDuration", +"Телеграм_БанРазбан": "Telegram_BanUnban", +"ЛимитПользователей": "UserLimit", +"ПолучитьПолеФлажка": "GetCheckboxField", +"ЗагрузитьМалыйФайл": "UploadSmallFile", +"Имя : title": "Name : title", +"Опубликовать папку": "Publish folder", +"Получить календарь": "Get calendar", +"ЯДиск_СоздатьПапку": "YDisk_CreateFolder", +"Команда CLI: viber": "CLI Command: viber", +"'Желтый','Зеленый'": "'Yellow','Green'", +"СоответствиеФайлов": "FileMapping", +"Работа с доступами": "Access management", +"ИдентификаторФайла": "FileID", +"ПолеИдентификатора": "IdentifierField", +"URL источник файла": "URL source of the file", +"Написать сообщение": "Write a message", +"Открыть обсуждение": "Open discussion", +"Закрыть обсуждение": "Close discussion", +"ДополнительныйЦвет": "SecondaryColor", +"Создать обсуждение": "Create discussion", +"Установить Webhook": "Set Webhook", +"ПараметрВКоллекцию": "ParameterToCollection", +"Активный : green": "Active : green", +"УправлениеСобытием": "EventManagement", +"Отправить картинку": "Send image", +"УдалитьВнешнийФайл": "DeleteExternalFile", +"Токен пользователя": "User token", +"Отправить документ": "Send document", +"Тестовый заголовок": "TestTitle", +"ПолучитьОбновления": "GetUpdates", +"Удалить комментарий": "Delete comment", +"ПолучитьДанныеФайла": "GetFileData", +"МассивПользователей": "ArrayOfUsers", +"Переместить событие": "Move event", +"Создать комментарий": "Create comment", +"Новое описание базы": "New database description", +"Архив : yellow": "Archive : yellow", +"Библиотека: Dropbox": "Library: Dropbox", +"Команда CLI: google": "CLI command: google", +"Скоприровать объект": "Copy object", +"СоответствиеОбложки": "Cover match", +"Команда CLI: gdrive": "CLI Command: gdrive", +"Количество : number": "Quantity : number", +"Структура Из Строка": "Structure From String", +"Создать базу данных": "Create database", +"ПолучитьВнешнийФайл": "GetExternalFile", +"Команда CLI: notion": "CLI command: notion", +"СтруктураПараметров": "ParametersStructure", +"Массив файлов видео": "Video files array", +"Длительность опроса": "Poll duration", +"СгруппироватьТовары": "GroupProducts", +"Получить статистику": "Get statistics", +"Получает файл по ID": "Gets file by ID", +"СтруктураЗаголовков": "HeadersStructure", +"СтруктураКлавиатуры": "KeyboardStructure", +"Массив из Структура": "Array of Structure", +"Массив файлов гифок": "Gif files array", +"Данные для API v1.1": "Data for API v1.1", +"Создает новый канал": "Creates a new channel", +"Наименование канала": "Channel name", +"СоздатьТвитКартинки": "Create image tweet", +"Создать\/Удалить тег": "Create\/Delete tag", +"Структура из Строка": "Structure from String", +"Библиотека: Twitter": "Library: Twitter", +"СоответствиеМетодов": "MethodCorrespondence", +"Команда CLI: yadisk": "CLI command: yadisk", +"Отбор по типу файла": "Filter by file type", +"Опубликовать объект": "Publish object", +"Альбом из автотеста": "AlbumFromAutoTest", +"Создает новую книгу": "Creates a new book", +"Отправляемая ссылка": "SentLink", +"Идентификатор книги": "BookIdentifier", +"ПолучитьТекущуюДату": "GetCurrentDate", +"СоответствиеСобытия": "EventMatch", +"СоответствиеСвойств": "PropertyMatch", +"Удалить тему форума": "Delete forum thread", +"ВК_МетодыОбсуждений": "VK_DiscussionMethods", +"НаписатьВОбсуждение": "WriteInDiscussion", +"Ставит лайк на пост": "Likes a post", +"НаписатьКомментарий": "WriteComment", +"Создает базу данных": "Creates a database", +"Дата начала периода": "Start date of the period", +"Команда CLI: yandex": "CLI Command: yandex", +"Путь внутри объекта": "Path inside the object", +"Измененная подборка": "EditedCollection", +"Открыть тему форума": "Open forum thread", +"Идентификатор файла": "File identifier", +"ПутьЛоговБиблиотеки": "LibraryLogPath", +"Получить список баз": "Get list of bases", +"АльтернативныйТекст": "AlternateText", +"Получить обновления": "Get updates", +"Переименовать канал": "Rename channel", +"ЗаменитьСпецСимволы": "ReplaceSpecialCharacters", +"ПолучитьСписокТегов": "GetTagList", +"РабочееПространство": "Workspace", +"ПолучитьКомментарии": "GetComments", +"Отправить сообщение": "Send message", +"ПолучитьОбщийМодуль": "GetCommonModule", +"Закрепить сообщение": "Pin message", +"Открепить сообщение": "Unpin message", +"Массив Из Структура": "Array of Structures", +"Удаляет тему форума": "Deletes a forum thread", +"Создать тему форума": "Create forum thread", +"Переслать сообщение": "Forward message", +"Закрыть тему форума": "Close forum thread", +"ПолучитьПолеВложения": "GetAttachmentField", +"ответ сервера Google": "Google server response", +"Путь или ID каталога": "Path or ID of the directory", +"Делает репост записи": "Reposts the record", +"ID родительской базы": "Parent database ID", +"Соответствие свойств": "Properties match", +"Получить комментарии": "Get comments", +"ВК_ЛайкРепостКоммент": "VK_LikeRepostComment", +"ЗагрузитьБольшойФайл": "UploadLargeFile", +"ПолучитьПолеТелефона": "GetPhoneField", +"Наименование альбома": "Album name", +"Создать\/Удалить пост": "Create\/Delete post", +"URL к внешнему файлу": "URL to external file", +"Обновленный файл.jpg": "UpdatedFile.jpg", +"Изменить комментарий": "Modify comment", +"Получить комментарий": "Get comment", +"ОтправитьВнешнийФайл": "SendExternalFile", +"ID копируемого листа": "CopiedSheetID", +"Проверка_НоушнОбъект": "Check_NotionObject", +"СоответствиеСимволов": "CharacterMapping", +"Тестовое сообщение 1": "TestMessage1", +"Тестовое сообщение 2": "TestMessage2", +"Список пользователей": "User list", +"Тестовый комментарий": "TestComment", +"Библиотека: Airtable": "Library: Airtable", +"ID страницы родителя": "Parent page ID", +"Изменить тему форума": "Edit forum thread", +"Библиотека: Telegram": "Library: Telegram", +"Свойства базы данных": "Database properties", +"Команда CLI: twitter": "CLI Command: twitter", +"Пустой макет события": "Empty event template", +"ЗаголовокАвторизации": "AuthorizationHeader", +"Аннотация к картинке": "Image annotation", +"Создать\/Удалить блок": "Create\/Delete block", +"Команда CLI: dropbox": "CLI Command: dropbox", +"СоответствиеВозврата": "ReturnMapping", +"МассивСтруктурКнопок": "ArrayOfButtonStructures", +"СтруктураОтправителя": "SenderStructure", +"СоздатьТекстовыйТвит": "CreateTextTweet", +"Написать комментарий": "Write a comment", +"Команда CLI: gsheets": "CLI Command: gsheets", +"Идентификатор канала": "Channel ID", +"ПолучитьПодборкиПоИД": "GetSelectionsByID", +"СоответствиеВарианта": "OptionMap", +"Новый заголовок базы": "New database title", +"Вайбер_ОтправитьФайл": "Viber_SendFile", +"Сгруппировать товары": "Group products", +"Описание нового поля": "Description of the new field", +"Получить базу данных": "Get database", +"Удалить внешний файл": "Delete external file", +"ИзменитьСвойстваБазы": "EditDatabaseProperties", +"СоответствиеЗначений": "ValueMapping", +"ПодчиненнаяСтруктура": "SubordinateStructure", +"ПолучитьСписокФайлов": "GetFilesList", +"Отправить медиагруппу": "Send media group", +"ВыполнитьЗапросСТелом": "ExecuteRequestWithBody", +"ВК_ОтправитьСообщение": "VK_SendMessage", +"Создать\/Изменить поле": "Create\/Edit field", +"Ноушн_СоздатьСтраницу": "Notion_CreatePage", +"Слак_ПолучитьСписокВФ": "Slack_GetExternalFileList", +"ВК_СоздатьУдалитьПост": "VK_CreateDeletePost", +"Твиттер_ОбновитьТокен": "Twitter_UpdateToken", +"Создать\/Изменить базу": "Create\/Edit database", +"Удаляет событие по ID": "Deletes an event by ID", +"ВК_ПолучитьСтатистику": "VK_GetStatistics", +"Создать копию объекта": "Create object copy", +"Идентификатор объекта": "Object identifier", +"ПреобразованныеДанные": "ConvertedData", +"МассивВариантовВыбора": "ChoiceOptionArray", +"Новый текст сообщения": "New message text", +"Новое название канала": "New channel name", +"Строка,ДвоичныеДанные": "String, BinaryData", +"Удаляет файл на Slack": "Deletes a file on Slack", +"Получить данные файла": "Get file data", +"Получить внешний файл": "Get external file", +"Команда CLI: telegram": "CLI command: telegram", +"Заголовок приглашения": "Invitation title", +"В работе : checkbox": "In progress : checkbox", +"МассивВариантовОпроса": "PollOptionsArray", +"Создать твит картинки": "Create image tweet", +"ПолучитьСписокЗаписей": "GetListOfRecords", +"ДвоичныеДанные,Строка": "BinaryData,String", +"СоответствиеЗаголовка": "HeaderMapping", +"ПолучитьСписокКаналов": "GetChannelList", +"ТекстПервогоСообщения": "Text of the first message", +"Написать в обсуждение": "Write in discussion", +"СоответствиеКатегорий": "CategoryCorrespondence", +"Получить товары по ID": "Get products by ID", +"Идентификатор таблицы": "Table identifier", +"Массив описаний полей": "Array of field descriptions", +"Заголовок базы данных": "Database title", +"Библиотека: Yandex ID": "Library: Yandex ID", +"Создает новое событие": "Creates a new event", +"ПолучитьПолеСтроковое": "GetStringField", +"ПолучитьЗначенияЯчеек": "GetCellValues", +"Удаляет лист из книги": "Deletes a sheet from the book", +"Путь сохранения файла": "File save path", +"Ссылка получения кода": "Code retrieval link", +"Добавить внешний файл": "Add external file", +"ОтправлятьУведомления": "SendNotifications", +"ID асинхронной работы": "AsynchronousJobID", +"ID пользователя Viber": "Viber User ID", +"ЗагрузитьФотоНаСервер": "UploadPhotoToServer", +"Получить список тегов": "Get list of tags", +"Получить таблицы базы": "Get base tables", +"Наименование кампании": "Campaign name", +"ПолучитьСписокЗаказов": "GetOrderList", +"ID рекламной кампании": "Advertising campaign ID", +"Команда CLI: airtable": "CLI Command: airtable", +"Загрузить файл по URL": "Upload file by URL", +"СтруктураПользователя": "UserStructure", +"ID целевого сообщения": "Target message ID", +"УдалитьСвойствоТовара": "DeleteProductProperty", +"СоздатьСвойствоТовара": "CreateProductProperty", +"Географическая широта": "Geographic latitude", +"ПолучитьСписокСвойств": "GetPropertyList", +"двоичные данные файла": "binary data of the file", +"ID чата создания темы": "Thread creation chat ID", +"ПолучитьСписокТоваров": "GetProductList", +"ДобавитьТоварВПодборку": "AddProductToSelection", +"Соответствие Из Строка": "Correspondence From String", +"ДропБокс_ЗагрузитьФайл": "Dropbox_UploadFile", +"ЗагрузитьВидеоНаСервер": "UploadVideoToServer", +"ID рекламного кабинета": "Advertising account ID", +"Сделать файл публичным": "Make file public", +"Соответствие из Строка": "Map from String", +"ВК_СоздатьСсылкуТокена": "VK_CreateTokenLink", +"ПолучитьМассивПодборок": "GetSelectionArray", +"Создать составной пост": "Create composite post", +"Путь к папке или файлу": "Path to folder or file", +"Создает твит с опросом": "Creates a tweet with a poll", +"Вайбер_ОтправитьСсылку": "Viber_SendLink", +"СоответствиеПараметров": "ParameterMap", +"Строка, ДвоичныеДанные": "String, BinaryData", +"ВыполнитьЗапросБезТела": "ExecuteRequestWithoutBody", +"Массив описаний блоков": "Array of block descriptions", +"Дневной лимит в рублях": "Daily limit in rubles", +"Новое описание события": "New event description", +"Сделать файл приватным": "Make file private", +"Загружает файл на диск": "Uploads a file to the drive", +"Получить пользователей": "Get users", +"СоздатьПодборкуТоваров": "CreateProductCollection", +"Отправить внешний файл": "Send external file", +"Новое имя главной темы": "New main thread name", +"Загрузить\/Удалить файл": "Upload\/Delete file", +"УдалитьТоварИзПодборки": "RemoveProductFromSelection", +"НаименованиеИзмененное": "EditedName", +"ИзменитьСвойствоТовара": "EditProductProperty", +"Вернуть дочерние блоки": "Return child blocks", +"Массив из Произвольный": "Array of Arbitrary", +"Сообщение из автотеста": "Message from autotest", +"Удаляет подборку по ID": "Deletes the selection by ID", +"Дата окончания периода": "End date of the period", +"Описание : rich_text": "Description : rich_text", +"Возвращаемое значение:": "Return value:", +"Загрузить\/Удалить Файл": "Upload\/Delete file", +"Изменить свойства базы": "Edit database properties", +"Установить цель канала": "Set channel purpose", +"и почитать комментарии": "and read comments", +"Установить тему канала": "Set channel topic", +"Массив файлов картинок": "Image files array", +"Получить токен по коду": "Get token by code", +"Получает список файлов": "Gets the list of files", +"ID изменяемой страницы": "ID of the page being modified", +"Получает событие по ID": "Gets an event by ID", +"ID календаря приемника": "ID of the target calendar", +"Получить список файлов": "Get list of files", +"Создать\/Удалить записи": "Create\/Delete records", +"СтандартныеЗависимости": "StandardDependencies", +"Массив из Строка,Число": "Array of String,Number", +"ПолучитьСписокПодборок": "GetSelectionList", +"Создать текстовый твит": "Create text tweet", +"ID календаря источника": "ID of the source calendar", +"Географическая долгота": "Geographic longitude", +"Команда CLI: gcalendar": "CLI Command: gcalendar", +"Открыть\/Закрыть диалог": "Open\/Close dialog", +"ID файла для скачивания": "File ID for downloading", +"ВК_СоздатьСоставнойПост": "VK_CreateCompositePost", +"Получить список товаров": "Get product list", +"СоздатьПроизвольныйТвит": "CreateCustomTweet", +"УникальныйИдентификатор": "UniqueIdentifier", +"ПолучитьСписокКаталогов": "GetDirectoriesList", +"Путь к объекту удаления": "Path to the object to delete", +"Путь к созаваемой папке": "Path to the created folder", +"Создать страницу в базу": "Create page in database", +"Пустое описание товара:": "Empty product description:", +"Телеграм_ОтправитьОпрос": "Telegram_SendPoll", +"Удаляет календарь по ID": "Deletes a calendar by ID", +"ГД_ЗагрузитьУдалитьФайл": "GD_UploadDeleteFile", +"Наименование новой базы": "New base name", +"Твиттер_СоздатьТвитСГиф": "Twitter_CreateTweetWithGif", +"Наименование обсуждения": "Discussion name", +"МассивURLФайловВложений": "ArrayOfAttachmentURLs", +"Создать\/Удалить событие": "Create\/Delete event", +"Получить значения ячеек": "Get cell values", +"Имя файла с расширением": "File name with extension", +"Идентификатор базы База": "Base identifier Base", +"Текст первого сообщения": "Text of the first message", +"СпособКодированияСтроки": "StringEncodingMethod", +"Какой ваш любимый цвет?": "What's your favorite color?", +"Получить список записей": "Get list of records", +"Создать\/Удалить каталог": "Create\/Delete catalog", +"ЗагрузитьМассивВложений": "Upload attachments array", +"Получить список каналов": "Get channel list", +"Новое название подборки": "New selection name", +"ИсключатьАрхивированные": "ExcludeArchived", +"ПараметрыЗапросаВСтроку": "RequestParametersToString", +"Получить список свойств": "Get property list", +"Создать свойство товара": "Create product property", +"Телеграм_ОтправитьГифку": "Telegram_SendGIF", +"Получить\/Обновить токен": "Get\/Update token", +"Создать канал приватным": "Create channel as private", +"Удалить свойство товара": "Delete product property", +"Библиотека: Yandex Disk": "Library: Yandex Disk", +"Получить историю канала": "Get channel history", +"АТ_СоздатьУдалитьЗаписи": "AT_CreateDeleteRecords", +"Лайк\/Репост\/Комментарий": "Like\/Repost\/Comment", +"ДФ=yyyy-MM-ddTHH:mm:ssZ": "DF=yyyy-MM-ddTHH:mm:ssZ", +"ИзменитьПодборкуТоваров": "EditProductCollection", +"ВК_СоздатьТоварПодборку": "VK_CreateProductSelection", +"Сформировать клавиатуру": "Create keyboard", +"Новый текст комментария": "New comment text", +"ОтправитьМестоположение": "SendLocation", +"Слак_ЗагрузитьУдалитьВФ": "Slack_UploadDeleteExternalFile", +"Массив из Строка, Число": "Array of string, number", +"Получить список заказов": "Get order list", +"Новая картинка подборки": "New selection image", +"Получить подборки по ID": "Get selections by ID", +"ДФ=yyyy-MM-ddThh:mm:ssZ": "ISO8601Datetime", +"ЯДиск_ПереместитьОбъект": "YDisk_MoveObject", +"Получить список событий": "Get list of events", +"Массив вариантов ответа": "Array of answer options", +"Массив ID пользователей": "User ID Array", +"Произвольный, HTTPОтвет": "Arbitrary, HTTP Response", +"Скопированный файл.jpeg": "CopiedFile.jpeg", +"Новое значение свойства": "New property value", +"Массив вариантов опроса": "Poll options array", +"Вайбер_ОтправитьКонтакт": "Viber_SendContact", +"Телеграм_ОтправитьАудио": "Telegram_SendAudio", +"Телеграм_ОтправитьВидео": "Telegram_SendVideo", +"Действия с обсуждениями": "Actions with discussions", +"Вайбер_ОтправитьЛокацию": "Viber_SendLocation", +"ДропБокс_СоздатьКаталог": "Dropbox_CreateFolder", +"для дальнейших действий": "for further actions", +"Получить список областей": "Get region list", +"Набор тестов для YAxUnit": "Test suite for YAxUnit", +"Изменяет название канала": "Changes the name of the channel", +"Ноушн_СоздатьУдалитьБлок": "Notion_CreateDeleteBlock", +"Получить информацию бота": "Get bot information", +"Получить данные аккаунта": "Get account data", +"Изменить свойство товара": "Edit product property", +"Создать\/Изменить таблицу": "Create\/Edit table", +"Отправить местоположение": "Send location", +"ПолучитьСтатистикуПостов": "GetPostStatistics", +"Строка, Массив из Строка": "String, Array of Strings", +"ОписаниеПримитивногоПоля": "PrimitiveFieldDescription", +"СоздатьРекламнуюКампанию": "CreateAdvertisingCampaign", +"Создает пустой календарь": "Creates an empty calendar", +"ДропБокс_ПолучитьАккаунт": "Dropbox_GetAccount", +"Файл источник обновления": "File source for update", +"Вайбер_ОтправитьКартинку": "Viber_SendImage", +"Получить список подборок": "Get selection list", +"ID целевого пользователя": "Target user ID", +"Создать подборку товаров": "Create product selection", +"Путь к целевому каталогу": "Path to the target directory", +"Библиотека: Google Drive": "Library: Google Drive", +"Новый тестовый заголовок": "NewTestTitle", +"Загрузить фото на сервер": "Upload photo to server", +"ГК_ПолучитьСписокСобытий": "GC_GetEventList", +"Создать товар и подборку": "Create product and selection", +"ГК_СоздатьУдалитьСобытие": "GC_CreateDeleteEvent", +"ПолучитьЗаголовкиЗапроса": "GetRequestHeaders", +"Наименование нового поля": "New field name", +"Ссылка (URL) под записью": "Link (URL) under the post", +"ПолучитьСписокРазрешений": "GetPermissionsList", +"СформироватьБлокКартинку": "GenerateImageBlock", +"ID пользователя адресата": "Recipient user ID", +"Создает новое обсуждение": "Creates a new discussion", +"СохранитьКартинкуВАльбом": "SaveImageToAlbum", +"Массив заголовков кнопок": "Array of button titles", +"ВК_ПолучитьСписокСвойств": "VK_GetPropertyList", +"Путь к объекту оригинала": "Path to the original object", +"Новый каталог размещения": "New parent directory", +"D:\\GD\\Мой диск\\data.json": "D:\\GD\\My Drive\\data.json", +"Создает каталог на диске": "Creates a directory on the disk", +"Массив товаров или товар": "Array of products or product", +"Новое описание календаря": "New calendar description", +"ВК_ПолучитьСписокЗаказов": "VK_GetOrderList", +"Признак рекламного поста": "Sign of an advertising post", +"Данные файл для загрузки": "Data file for upload", +"Строка, Массив Из Строка": "String, Array of Strings", +"ВК_ПолучитьСписокТоваров": "VK_GetProductList", +"Получить число участников": "Get participant count", +"ВыполнитьЗапросМультипарт": "ExecuteMultipartRequest", +"Отменить публикацию папки": "Unpublish folder", +"ЯДиск_СоздатьКопиюОбъекта": "YDisk_CreateObjectCopy", +"ПолучитьСписокФайловПапки": "GetListOfFolderFiles", +"Получить публичный объект": "Get public object", +"Копирует файл или каталог": "Copies file or directory", +"Заголовок файла для Slack": "File title for Slack", +"Создает твит без вложений": "Creates a tweet without attachments", +"ПолучитьСсылкуАвторизации": "GetAuthorizationLink", +"Загрузить видео на сервер": "Upload video to server", +"Идентификатор комментария": "Comment identifier", +"Получить список каталогов": "Get list of directories", +"Отменить публикацию файла": "Unpublish file", +"ID пользователей(я) Viber": "Viber User(s) ID", +"Изменить подборку товаров": "Edit product selection", +"Ноушн_СоздатьИзменитьБазу": "Notion_CreateEditDatabase", +"Номер рекламной категории": "Advertising category number", +"См. ПолучитьОписаниеФайла": "See GetFileDescription", +"Добавить товар в подборку": "Add product to selection", +"Удалить товар из подборки": "Remove product from selection", +"Добавить\/Удалить картинку": "Add\/Delete image", +"Библиотека: Google Sheets": "Library: Google Sheets", +"ВК_ПолучитьСписокПодборок": "VK_GetSelectionList", +"Создать произвольный твит": "Create custom tweet", +"См.ПолучитьОписаниеТовара": "See GetProductDescription", +"Устанавливает тему канала": "Sets the channel topic", +"Изменить имя главной темы": "Change main topic name", +"URL для установки Webhook": "URL for setting up Webhook", +"Телеграм_ОтправитьКонтакт": "Telegram_SendContact", +"Некорректный вид отправки": "Incorrect sending view", +"Твиттер_СоздатьТвитСВидео": "Twitter_CreateTweetWithVideo", +"Создает новую базу данных": "Creates a new database", +"Новый альбом из автотеста": "NewAlbumFromAutoTest", +"Преобразовать код в токен": "Convert code to token", +"Слак_ОткрытьЗакрытьДиалог": "Slack_OpenCloseDialog", +"Удаляет комментарий по ID": "Deletes comment by ID", +"Идентификатор базы данных": "Database identifier", +"Путь назначения для копии": "Destination path for the copy", +"Изменить календарь списка": "Edit list calendar", +"Слак_ПолучитьСписокФайлов": "Slack_GetFileList", +"Наименование нового листа": "NewSheetName", +"Статус : Соответствие": "Status : Map", +"Архивирует активный канал": "Archives an active channel", +"Слак_ЗагрузитьУдалитьФайл": "Slack_UploadDeleteFile", +"OPI_ПолучениеДанныхТестов": "OPI_GetTestData", +"Тестовый товар измененный": "EditedTestProduct", +"Заполнить\/Очистить ячейки": "Fill\/Clear cells", +"Установить значения ячеек": "SetCellValues", +"Создать\/Удалить календарь": "Create\/Delete calendar", +"Получить календарь списка": "Get list calendar", +"ДропБокс_РаботаСДоступами": "Dropbox_AccessManagement", +"Создает пост с картинками": "Creates a post with images", +"Добавляет товар в подборку": "Adds a product to the selection", +"Получает схему таблиц базы": "Gets the schema of base tables", +"Слак_ПолучитьСписокКаналов": "Slack_GetChannelList", +"Телеграм_УстановитьWebhook": "Telegram_SetWebhook", +"Массив соответствий файлов": "Array of file mappings", +"Создать\/Архивировать канал": "Create\/Archive channel", +"Получить статистику постов": "Get post statistics", +"Получить список календарей": "Get list of calendars", +"Получить информацию о базе": "Get database info", +"Получить категории товаров": "Get product categories", +"Ноушн_СоздатьСтраницуВБазу": "Notion_CreatePageInDatabase", +"Сформировать блок картинку": "Generate image block", +"Изменить свойства страницы": "Edit page properties", +"ГТ_ЗаполнитьОчиститьЯчейки": "GT_FillClearCells", +"Телеграм_ОтправитьКартинку": "Telegram_SendImage", +"Получает комментарий по ID": "Gets comment by ID", +"ID оригинального сообщения": "Original message ID", +"разрешение на методы Drive": "Drive methods permission", +"ГД_ПолучитьСписокКаталогов": "GD_GetCatalogList", +"Число знаков после запятой": "Number of decimal places", +"Получить код подтверждения": "Get confirmation code", +"ПолучитьИмяВременногоФайла": "GetTempFileName", +"Получить информацию канала": "Get channel info", +"Структура Из КлючИЗначение": "Structure of Key-Value", +"Наименование новой таблицы": "New table name", +"Путь сохранения на Dropbox": "Save path on Dropbox", +"Телеграм_ОтправитьДокумент": "Telegram_SendDocument", +"Скрыть главную тему форума": "Hide main forum thread", +"ЯДиск_ПолучитьСписокФайлов": "YDisk_GetFileList", +"ГК_СоздатьУдалитьКалендарь": "GC_CreateDeleteCalendar", +"Мне больше нравится желтый": "I like yellow more", +"Получить информацию о боте": "Get bot information", +"ЯДиск_ЗагрузитьУдалитьФайл": "YDisk_UploadDeleteFile", +"Очищает значение в ячейках": "Clears the value in cells", +"Создать рекламную кампанию": "Create advertising campaign", +"ДропБокс_СоздатьУдалитьТег": "Dropbox_CreateDeleteTag", +"Описание тестового события": "TestEventDescription", +"Создать ссылку-приглашение": "Create invitation link", +"Телеграм_ПереслатьСообщение": "Telegram_ForwardMessage", +"Временная отметка сообщения": "Message timestamp", +"Слак_ПолучитьСписокОбластей": "Slack_GetRegionList", +"ПолучитьСписокПользователей": "GetUserList", +"ВК_СохранитьУдалитьКартинку": "VK_SaveDeleteImage", +"Загрузить по URL и получить": "Upload by URL and get", +"ВК_ПолучитьСтатистикуПостов": "VK_GetPostStatistics", +"Создет новое поле в таблице": "Creates a new field in the table", +"Путь к публикуемому объекту": "Path to the object to be published", +"ID целевой стены или группы": "ID of the target wall or group", +"Создать\/Удалить тему форума": "Create\/Delete forum topic", +"Ноушн_ПолучитьПользователей": "Notion_GetUsers", +"URL для кнопки под историей": "URL for button under the story", +"Массив соответствий товаров": "Array of product matches", +"Тип отправляемого сообщения": "TypeOfSentMessage", +"ВК_СоздатьТоварСоСвойствами": "VK_CreateProductWithProperties", +"Твиттер_СоздатьТвитСОпросом": "Twitter_CreateTweetWithPoll", +"Сохранить картинку в альбом": "Save image to album", +"ВК_СоздатьРекламнуюКампанию": "VK_CreateAdCampaign", +"ID альбома, если необходимо": "Album ID, if necessary", +"ВК_ПолучитьКатегорииТоваров": "VK_GetProductCategories", +"ГК_ПолучитьСписокКалендарей": "GC_GetCalendarList", +"Ключ > 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 для получения дополнительной информации": "" +}